Technical Capabilities
Having trouble finding what you need?
Get in touch with us, so we can answer your specific questions directly.
Get In Touch

SYS$ – SYS$ Interface Routines

Overview

VX/SYS$ is a call-compatible implementation of the OpenVMS SYS$ system services for x86 and ARM Linux. It lets migrated OpenVMS applications perform system-level work such as device and resource management, process creation and control, event flags and locks, logical names, timers, privilege checks, and interprocess communication, while preserving the exact call signatures and VMS condition codes the original code depends on. VX/SYS$ is delivered inside VX/RT and links straight into the recompiled program, so there is no system-service process to install or administer.

Each service is written once as an inner worker and exported under its OpenVMS names through linker aliases, so recompiled C, Fortran, and COBOL programs call the same routines, pass the same arguments, and read back the same status values as they did on VMS. The SYS$ module itself provides more than 110 system-service entry points; together with the RMS file services and lock-manager services linked from the same runtime, an application sees the full OpenVMS SYS$ callable surface of over 150 routines. Services with no equivalent on a host operating system are documented plainly, so migration planners know exactly where behaviour differs.

Architecture and the callable surface

VX/SYS$ is a linked runtime library, not a server or a daemon. It is archived into libvxrt.a, the same runtime archive shared with the other VX/TOOLS routines, and linked directly into the migrated application. Every call is serviced in-process by the library, which presents the OpenVMS system-service callable interface on top of ordinary host facilities: files, sockets, threads, and clocks.

No service to administer. VX/SYS$ has no privileged executive to install and no system-service process to manage. The library runs in the address space of the migrated program, so deployment is a link step rather than a service install.

The callable surface

The SYS$ module itself exports more than 110 system-service entry points. A migrated application, however, sees a wider callable surface of over 150 SYS$ routines, because the file and record services and the lock-manager services are provided by sibling modules linked from the same runtime. Those siblings are documented on their own pages: the RMS-shaped services such as SYS$OPEN, SYS$READ, and SYS$CONNECT live in VX/RMS, and the lock services SYS$ENQ, SYS$DEQ, and SYS$GETLKI live in VX/LCKMGR. This page covers the system-service routines implemented in the SYS$ module itself.

Layering

The runtime sits between the unchanged application and the host operating system:

Caller
Migrated applicationUnchanged SYS$ calls
Runtime
VX/SYS$ in libvxrt.aRoutes each in-process call to the matching service family.
01Timers and timeClock, timer, and time conversion services.
02Event flagsEvent flag allocation, state, and synchronization.
03Queued I/O driversDisk, terminal, network, mailbox, Ethernet, and TCP/IP device I/O.
04Process and informationProcess, memory, and system information services.
Host
Host operating systemFiles, sockets, threads, and clocks.

The queued I/O driver subsystem

The I/O services are not a flat call table. SYS$QIO and SYS$QIOW validate the channel, then forward to an inner executive worker that routes the request to a per-device-class driver. Each driver is compiled into libvxrt.a and runs on a dedicated POSIX thread, with ASTs delivered by queuing onto the per-process AST dispatcher.

VMS device classDriverBuilt by defaultRole
DiskQIODSKDRVyesBlock and file disk I/O.
TerminalQIOTRMDRVyesTerminal and TTY I/O.
MailboxQIOMBOXyesMailbox interprocess communication over a FIFO.
NetworkQIONETDRVyesDECnet-style network I/O.
EthernetQIOETHERopt-inRaw Ethernet I/O, enabled at build time.
TCP/IP (UCX)QIOUCXopt-inTCP/IP and DECnet via UCX, enabled at build time.

A shared support layer and the driver-thread module provide the asynchronous plumbing behind the whole QIO family, so a queued read or write behaves as it did on VMS regardless of the underlying host device.

Name forms and the alias model

Each routine is compiled once as a canonical internal symbol, then exported under the names the original application used through alias macros. A single implementation is therefore reachable from C, Fortran, and COBOL under the exact spellings that appear in the legacy source, with no per-language shim to write or maintain.

Name formExampleWho calls it
SYS_D_xxxxSYS_D_QIOWCanonical internal symbol: the real routine body.
SYS$xxxx (upper)SYS$QIOWVMS-style C and C++ callers.
sys$xxxx (lower)sys$qiowVMS-style C and C++ callers.
F4_SYS_D_xxxxF4_SYS_D_QIOWFortran callers, with trailing string-length arguments.

Two alias macros wire these up. __AliasF binds the three C names to one symbol for routines that take no string arguments. __AliasF4 binds all four names and adds the Fortran trampoline for routines that take descriptors, so F77 string-length arguments are unpacked correctly.

// no string arguments: three C names, one symbol
__AliasF  (SYS_D_GETTIM, SYS$GETTIM, sys$gettim);

// takes descriptors: adds the Fortran name and trampoline
__AliasF4 (SYS_D_QIOW, F4_SYS_D_QIOW, SYS$QIOW, sys$qiow);

Cross-language re-aliases

A small set of routines carry extra prefixes for callers generated in other languages:

  • COB$xxxx re-exports let generated COBOL issue CALL "COB$xxxx". These are identical wrappers of their SYS$ counterparts, covering information and job-control services such as COB$GETJPI, COB$GETSYI, COB$SNDJBC, and COB$TRNLNM.
  • EXE$xxxx exports expose the inner executive workers directly. Unlike the COBOL re-aliases, these are not identical wrappers: the SYS$ form wraps the inner worker in the runtime trace scope, while the EXE$ form is the bare inner call. The routines with both forms are CANCEL, GETQUI, GETTIM, QIO, and SYNCH.
The executive seam is a separate page. The inner EXE$ executive entry points that these system services wrap are documented in detail on EXE$ Operating System Interface. Use this page for the SYS$ system-service surface, and the EXE$ page for the executive workers underneath it.

SYS$ routine families

The system services group into the same functional areas an OpenVMS programmer already knows. The tables below list representative routines from each family; most carry an operative implementation, and the specific services that are accepted for source compatibility but do not perform their native function are listed separately under Stubs and unimplemented services.

Where file and lock services live. The RMS-shaped file and record verbs (SYS$OPEN, SYS$CLOSE, SYS$READ, SYS$WRITE, SYS$CONNECT, SYS$PARSE and their siblings) are provided by VX/RMS, and the lock services (SYS$ENQ, SYS$DEQ, SYS$GETLKI) by VX/LCKMGR. They are callable from the same runtime but documented on those pages.

Device, resource, and channel management

SYS$ routinePurpose
SYS$ASSIGN / SYS$DASSGNAssign or deassign an I/O channel to a device.
SYS$ALLOC / SYS$DALLOCAllocate or deallocate a device or resource, with advisory locks for multi-process use.
SYS$QIO / SYS$QIOWQueue an asynchronous I/O request, or queue and wait for completion.
SYS$CANCELCancel an outstanding I/O request on a channel.
SYS$GETDVI / SYS$GETDVIWGet device and volume information.
SYS$GETCHNGet the channel number assigned to a device.

Process control and ASTs

SYS$ routinePurpose
SYS$CREPRC / SYS$DELPRCCreate or delete a process.
SYS$SUSPND / SYS$RESUMESuspend or resume a process.
SYS$HIBER / SYS$WAKEHibernate the current process, or wake a hibernating process.
SYS$SETPRI / SYS$SETPRNSet process priority or process name.
SYS$FORCEX / SYS$EXITForce another process to exit, or exit the current image.
SYS$DCLAST / SYS$SETASTDeclare an AST, or enable and disable AST delivery.
SYS$DCLEXH / SYS$CANEXHDeclare or cancel an exit handler.
SYS$PROCESS_SCANBuild a process-scan context for the information services.

Memory and virtual address space

SYS$ routinePurpose
SYS$EXPREGExpand the program region.
SYS$CRETVA / SYS$DELTVACreate or delete virtual address space.
SYS$CRETVA_64 / SYS$DELTVA_64Create or delete a 64-bit virtual address space.
SYS$CRMPSC / SYS$MGBLSCCreate and map a section, or map a global section, backed by memory mapping.
SYS$MGBLSC_64Map a 64-bit global section.

Event flags, timers, and synchronization

SYS$ routinePurpose
SYS$SYNCHWait for a queued request to complete using an event flag and I/O status block.
SYS$WAITFRWait for a single event flag.
SYS$WFLAND / SYS$WFLORWait for a logical AND or OR of a set of event flags.
SYS$SETEF / SYS$CLREF / SYS$READEFSet, clear, or read an event flag.
SYS$ASCEFC / SYS$DACEFCAssociate or disassociate a common event flag cluster.
SYS$SETIMR / SYS$CANTIMSet a timer that sets an event flag or delivers an AST, or cancel a pending timer.
SYS$SCHDWK / SYS$CANWAKSchedule or cancel a scheduled process wakeup.

Time and format conversion

SYS$ routinePurpose
SYS$GETTIMReturn the current system time as a 64-bit value in 100 ns units.
SYS$ASCTIMConvert a binary time value to an ASCII string.
SYS$BINTIMConvert an ASCII date and time string to binary format.
SYS$NUMTIMConvert a binary time to a numeric seven-word vector.
SYS$FAO / SYS$FAOLFormatted ASCII output, direct and list form.

Information services

SYS$ routinePurpose
SYS$GETJPI / SYS$GETJPIWGet job and process information.
SYS$GETSYI / SYS$GETSYIWGet system information.
SYS$GETUAI / SYS$GETUAIWGet user authorization information.
SYS$GETQUI / SYS$GETQUIWGet queue information synchronously or asynchronously.
SYS$GETMSG / SYS$PUTMSGRetrieve or format a system message.

Logical names, messaging, and job control

SYS$ routinePurpose
SYS$CRELNM / SYS$DELLNM / SYS$TRNLNMCreate, delete, or translate a logical name.
SYS$CRELNTCreate a logical name table.
SYS$CREMBX / SYS$DELMBXCreate or delete a mailbox for interprocess communication.
SYS$BRDCST / SYS$BRKTHRU / SYS$BRKTHRUWBroadcast or break through a message to one or more terminals.
SYS$SNDJBC / SYS$SNDJBCW / SYS$SNDOPRSend a request to the job controller or to the operator.

Privilege and security

SYS$ routinePurpose
SYS$CHECK_PRIVILEGE / SYS$CHECK_PRIVILEGEWCheck whether a process holds a specific privilege.
SYS$SETPRVSet process privileges.
SYS$SETDDIRSet the default directory for the process.
Wait variants are included. The OpenVMS wait-synchronized W variants ship alongside their base calls, for example SYS$QIO and SYS$QIOW, SYS$GETJPI and SYS$GETJPIW, so code that relies on the original synchronization semantics needs no rework.

Argument passing and status conventions

VX/SYS$ preserves the OpenVMS calling conventions exactly, so recompiled code passes the same argument shapes and reads back the same results. Three conventions matter for a migration: string descriptors, item lists, and the condition-value return model.

String descriptors

All character arguments use the same VMS descriptor model as the STR$ library, in both 32-bit and 64-bit forms, classified automatically at the call. The same descriptor helpers extract or build a descriptor regardless of width, so a routine accepts whichever form the caller passes. The shared descriptor model is documented on STR$ String Interface Routines.

Item lists

The information services and several others take a zero-terminated item-list array. Both the 32-bit and 64-bit item-list layouts are accepted and detected per element:

struct ITL {                   // 32-bit form
    union {
        struct { short Length; short Code; } Item;
        long terminator;       // zero longword ends the list
    } u;
    void  *Address;            // buffer for the item value
    short *Length_Ptr;         // OUT: actual returned length
};

Outputs are stored only when the caller supplies a non-NULL pointer, matching the OpenVMS convention that optional return arguments may be omitted.

Status codes and the return model

Every service returns a 32-bit VMS condition value. VX/SYS$ returns the same SS$_XXX symbols and preserves the VMS severity convention: a successful status is odd, a failure is even, so existing ODD(status) tests behave exactly as they did on VMS. A representative set of the codes the system services use most:

SymbolDecimalMeaning
SS$_NORMAL1Successful completion.
SS$_ACCVIO12Access violation on a call argument.
SS$_INSFARG276Too few call arguments supplied.
SS$_IVCHAN316Invalid channel number.
SS$_IVLOGNAM340Invalid logical name.
SS$_NOLOGNAM444No such logical name.
SS$_TIMEOUT556Timeout period expired.
SS$_SUPERSEDE1585A logical name superseded an existing definition.
SS$_UNSUPPORTED3658Service or sub-function not implemented.

Most services return the condition value directly. A small number additionally raise conditions as VMS-style signals, catchable with the usual condition-handler establishment or a C++ handler, so code that relies on signalled conditions still works.

Tracing scaffold

Every routine opens with a trace-entry marker and returns through a matching trace-exit marker, so per-thread entry and exit records feed the runtime debug logger. The instrumentation is uniform across the whole service set, which makes a migrated application straightforward to trace end to end during cut-over.

Stubs and unimplemented services

The great majority of the system services carry a real implementation. A specific, enumerated set describes privileged or host-specific operations that have no equivalent on Linux. VX/SYS$ still exports these entry points so existing code links cleanly, but they either return success without acting or report that the function is unsupported. Migration planning should account for the routines below explicitly, because code that depends on their side effects will not get them on the new platform.

SYS$ routinePurpose on VMSBehaviour on Linux
SYS$GETRMIGet resource-management information.unimplemented: aborts if called
SYS$MOUNT / SYS$DISMOUMount or dismount a volume.unimplemented: aborts if called
SYS$GET_SECURITY / SYS$SET_SECURITYGet or set an object's security profile.unimplemented: aborts if called
SYS$CREATE_REGION_64 / SYS$DELETE_REGION_64Create or delete a 64-bit virtual region.unsupported: reports unsupported and exits the image
SYS$LCKPAGLock pages in physical memory.no-op: returns success, pages are not locked
SYS$ADJWSLAdjust the working-set limit.no-op: echoes the requested value, residency unchanged
SYS$CMEXECChange to executive access mode.no-op: returns success, mode unchanged
SYS$SNDSMBSend a request to a symbiont.no-op: returns success, no request sent
SYS$SETRWMSet resource-wait mode.no-op: the flag is stored but not consulted
SYS$DELMBXDelete a mailbox.partial: returns success but does not unlink the underlying FIFO
SYS$START_TRANSW / SYS$END_TRANSW / SYS$ABORT_TRANSWDECdtm distributed transaction control.stub: marks the status block and returns success, no transaction manager
SYS$GRANT_LICENSEGrant a product license through LMF.stub: returns a fixed token, no license manager
Silent success versus hard stop. Most stubs return success so surrounding logic proceeds, but the 64-bit region services exit the image and the resource-management, mount, and security queries abort if called. Confirm during assessment that a migrating application does not rely on any of these services before it reaches production.

Compatibility and deliberate divergences

VX/SYS$ covers the system services that production applications actually depend on, and is explicit about the areas that behave differently because the host is Linux rather than OpenVMS. The matrix below places each capability in exactly one bucket.

CapabilityStatusNote
Device, resource, and channel managementliveAssign, allocate, queued I/O, and device information across disk, terminal, network, and mailbox drivers.
Process control and ASTsliveCreate, delete, suspend, resume, hibernate, wake, and AST delivery.
Event flags, timers, and synchronizationliveLocal and common event flags, wait-for combinations, timers, and scheduled wakeups.
Time and format conversionliveSystem time, ASCII and numeric conversion, and formatted output.
Information servicesliveJob, process, device, system, user, and queue information queries.
Logical names and interprocess servicesliveLogical-name creation and translation, mailboxes, and message formatting.
Memory and virtual address spaceliveRegion expansion, virtual address creation, and section mapping backed by host memory mapping.
Page locking and working-set controlout of scopeAccepted as no-ops; the host kernel manages residency.
64-bit region create and deleteout of scopeReported unsupported; the call exits the image.
Distributed transactions (DECdtm)out of scopeAccepted but inert; there is no transaction manager.
Volume mount and security profilesout of scopeMount, dismount, and the security get/set queries abort if called.

Deliberate divergences from native OpenVMS

These are behaviours that differ by design because the host is Linux rather than OpenVMS:

  • Privilege checks are advisory. Obvious cases return SS$_NOPRIV, but most services do not enforce the full SOGW protection mask the way VMS does.
  • Quotas are not enforced. An exceeded-quota status is documented as possible but is essentially never produced.
  • Clustering is absent. Node arguments are accepted but everything resolves to the local node; wildcard scans end with the no-more-nodes status.
  • ASTs run on a dedicated thread. ASTs are serialized on a per-process dispatcher and cannot pre-empt CPU-bound mainline code without an explicit cancellation point, so code that relies on AST pre-emption sees different scheduling.
  • Process IDs are not host PIDs. Use SYS$GETJPI to read the VMS process identifiers rather than assuming they match the host operating-system process IDs.
  • The exit-status convention is preserved. SYS$EXIT follows the VMS low-bit rule, where an even code signals failure and an odd code signals success, which can surprise callers new to VMS.
  • Access-mode arguments are ignored. An access-mode argument is accepted for prototype compatibility but not honoured, since the host has no VMS access-mode model.

Quick reference

Representative SYS$ services

SYS$ASSIGN
SYS$DASSGN
SYS$ALLOC
SYS$QIO
SYS$QIOW
SYS$CANCEL
SYS$GETDVI
SYS$CREPRC
SYS$DELPRC
SYS$SUSPND
SYS$RESUME
SYS$HIBER
SYS$WAKE
SYS$SETAST
SYS$CRETVA
SYS$CRMPSC
SYS$SETEF
SYS$WAITFR
SYS$SETIMR
SYS$GETTIM
SYS$ASCTIM
SYS$BINTIM
SYS$GETJPI
SYS$GETSYI
SYS$GETQUI
SYS$CRELNM
SYS$TRNLNM
SYS$CREMBX
SYS$BRDCST
SYS$PUTMSG
SYS$SNDJBC
SYS$SETPRV

Name forms and status codes

SYS$XXX
sys$xxx
Fortran F4_SYS_D_XXX
COB$XXX
EXE$XXX
SS$_NORMAL
SS$_ACCVIO
SS$_INSFARG
SS$_IVCHAN
SS$_IVLOGNAM
SS$_TIMEOUT
SS$_UNSUPPORTED

Queue, wait, and release skeleton

A migrated program links this unchanged against libvxrt.a. Note the ODD() status test after each call and the event-flag synchronization after the queued write:

// timestamp and queue a write to the funds-transfer journal device
status = SYS$GETTIM(&now);                       // current system time, 100 ns units
if (!ODD(status)) goto fail;

status = SYS$ASSIGN("BANKING$JOURNAL", &chan, 0, 0);
if (!ODD(status)) goto fail;

status = SYS$QIOW(efn, chan, IO$_WRITEVBLK,      // queue the write and wait for completion
                  &iosb, 0, 0,
                  record, record_len, 0, 0, 0, 0);
if (!ODD(status)) goto fail;

SYS$DASSGN(chan);                                // release the channel
Wait variants fold in the synchronization. SYS$QIOW is SYS$QIO followed by an implicit SYS$SYNCH on the same event flag or I/O status block, so the wait-mode variants need no separate SYS$SYNCH or SYS$WAITFR call.

Frequently Asked Questions

Curious about how Sector7 can facilitate your application migration? Explore our FAQs for expert insights.

What is VX/SYS$ and how does it help with OpenVMS to Linux migration?

VX/SYS$ provides a call-compatible implementation of OpenVMS system service calls for x86 and ARM Linux. It ensures that OpenVMS applications can perform system-level operations such as resource allocation, privilege management, process control, and interprocess communication while maintaining execution compatibility on Linux.

This comprehensive solution preserves OpenVMS system service logic, enabling direct porting of applications without major modifications. For organizations planning their migration strategy, contact us to discuss how VX/SYS$ can streamline your transition.

Which OpenVMS system services does VX/SYS$ support?

VX/SYS$ supports over 150 OpenVMS system service calls including device and resource management, process creation, privilege checking, and system messaging functions.

How does VX/SYS$ handle OpenVMS system calls on Linux?

VX/SYS$ maintains OpenVMS system behavior by providing fully compatible APIs that ensure applications execute as expected without modification on Linux platforms.

What types of system operations can VX/SYS$ handle?

VX/SYS$ handles critical system operations including time conversion, device assignment, memory management, privilege validation, and interprocess communication on Linux.

How does VX/SYS$ integrate with the broader VX/RT ecosystem?

VX/SYS$ seamlessly integrates into the VX/RT ecosystem to provide full OpenVMS system service capabilities on x86 and ARM Linux. This integration ensures comprehensive compatibility for OpenVMS applications requiring system-level operations.

Companies like Telstra have successfully leveraged similar integration approaches for their critical system migrations. The VX/RT ecosystem provides a complete foundation for preserving OpenVMS functionality while transitioning to modern Linux infrastructure.

Can VX/SYS$ be customized for specific system requirements?

VX/SYS$ provides full compatibility with OpenVMS SYS$ functions and can be configured to support specific application requirements while maintaining standard OpenVMS behavior.

What challenges does VX/SYS$ solve for OpenVMS migrations?

VX/SYS$ eliminates the need to rewrite system service calls during OpenVMS to Linux migration. It preserves existing application logic and system interactions, reducing migration complexity and development costs.

What are the key benefits of using VX/SYS$ for system migration?

VX/SYS$ delivers significant migration benefits by preserving OpenVMS system service logic and providing full compatibility with SYS$ functions. This ensures seamless execution of system operations on Linux while minimizing development costs and reducing migration risks.

Organizations can maintain their substantial investments in OpenVMS applications while transitioning to modern, scalable Linux infrastructure. Companies like BNY Mellon have successfully modernized critical systems using similar approaches that preserve essential functionality while enhancing performance.

VX/SYS$ supports key OpenVMS system service tasks including device assignment, time conversion, privilege validation, and interprocess communication, ensuring comprehensive compatibility throughout the migration process. To explore how VX/SYS$ can benefit your specific migration requirements, contact our experts.

What is VX/SYS$?

VX/SYS$ is a call-compatible implementation of OpenVMS SYS$ system service calls for x86 and ARM Linux. It lets OpenVMS applications perform system-level operations such as resource allocation, privilege management, process control, and interprocess communication while maintaining execution compatibility on Linux.

How many SYS$ routines does VX/SYS$ provide?

The page lists 151 callable SYS$ routines, spanning device and resource management, process creation and control, privilege checking, memory and virtual-address management, event flags and locks, time and format conversion, and system messaging.

Do I have to change my OpenVMS application code to use VX/SYS$?

In the general case, no. VX/SYS$ is call-compatible with the OpenVMS SYS$ APIs and maintains OpenVMS system behaviour, so applications that rely on SYS$ routines run as expected.

Which hardware platforms does VX/SYS$ run on?

VX/SYS$ runs on x86 and ARM Linux. It integrates with VX/RT to deliver full OpenVMS system-service capabilities on both architectures.

How does VX/SYS$ relate to VX/RT?

VX/SYS$ integrates into the VX/RT ecosystem, which provides the runtime foundation for OpenVMS compatibility on Linux. Together they supply the full set of OpenVMS system services the application expects.

What kinds of system operations are covered?

The routines cover device assignment and resource management (for example SYS$ASSIGN, SYS$ALLOC), process creation and control (SYS$CREPRC, SYS$DELPRC, SYS$SUSPND), privilege checking (SYS$CHECK_PRIVILEGE, SYS$SETPRV), memory and virtual-address management (SYS$CRETVA_64, SYS$CREATE_REGION_64), event flags and locks (SYS$SETEF, SYS$ENQ), time conversion (SYS$ASCTIM, SYS$BINTIM), and system messaging (SYS$BRDCST, SYS$PUTMSG).

Does VX/SYS$ support both synchronous and wait-mode variants of these calls?

Yes. The routine set includes the OpenVMS W wait-synchronized variants alongside their base calls, for example SYS$QIO and SYS$QIOW, SYS$GETJPI and SYS$GETJPIW, and SYS$ENQ and SYS$ENQW, preserving the original synchronization semantics.

Are 64-bit memory and security services included?

Yes. The routine list includes 64-bit variants such as SYS$CREATE_REGION_64, SYS$CRETVA_64, SYS$DELTVA_64, SYS$MGBLSC_64, SYS$UPDSEC_64, and SYS$UPDSEC_64W, so applications using 64-bit address regions and security services carry over.

Transform Your Legacy Software Today!

Get In Touch
Unlock the potential of your legacy software with our expert migration services.