HP OpenVMS Systems Documentation |
OpenVMS Alpha Guide to 64-Bit Addressing and VLM Features
2.3.1 Regions Within P0 Space and P1 SpaceThere is one process-permanent virtual region for all of P0 space that starts at virtual address 0 and ends at virtual address 0.3FFFFFFF16. This is called the program region. There is also one process-permanent region for all of P1 space that starts at virtual address 0.4000000016 and ends at virtual address 0.7FFFFFFF16. This is called the control region. The program and control regions are considered to be owned by kernel mode and have a create mode of user, because user mode callers can create virtual address space within these virtual regions. This is upwardly compatible with OpenVMS Alpha releases prior to Version 7.0.
These program and control regions cannot be deleted. They are
considered to be process-permanent.
P2 space has a densely expandable virtual region starting at the lowest virtual address of P2 space, 0.8000000016. This region is called the 64-bit program region. Having a 64-bit program region in P2 space allows an application that does not need to take advantage of explicit virtual regions to avoid incurring the overhead of creating a virtual region in P2 space. This virtual region always exists, so addresses can be created within P2 space immediately. As described in Section 2.3.3, a user can create a virtual region in otherwise unoccupied P2 space. If the user-defined virtual region is specified to start at the lowest address of the 64-bit program region, then any subsequent attempt to allocate virtual memory within the region will fail. The region has a user create mode associated with it, that is, any access mode can create virtual address space within it.
The 64-bit program region cannot be deleted. It is considered to be
process-permanent and survives image rundown. Note that all created
address space within the 64-bit program region is deleted and the
region is reset to encompass all of P2 space as a result of image
rundown.
A user-defined virtual region is a virtual region created by calling the new OpenVMS SYS$CREATE_REGION_64 system service. The location at which a user-defined virtual region is created is generally unpredictable. In order to maximize the expansion room for the 64-bit program region, OpenVMS memory management allocates virtual regions starting at the highest available virtual address in P2 space that is lower than any existing user-defined virtual region. For maximum control of the process-private address space, the application programmer can specify the starting virtual address when creating a virtual region. This is useful in situations when it is imperative that the user be able to specify exact virtual memory layout. Virtual regions can be created so that allocation occurs with either increasing addresses or decreasing virtual addresses. This allows applications with stacklike structures to create virtual address space and expand naturally. Virtual region creation gives OpenVMS subsystems and the application programmer the ability to reserve virtual address space for expansion. For example, an application can create a large virtual region and then create some virtual addresses within that virtual region. Later, when the application requires more virtual address space, it can expand within the virtual region and create more address space in a virtually contiguous manner to the previous addresses allocated within that virtual region. Virtual regions can also be created within P0 and P1 space by specifying VA$M_P0_SPACE or VA$M_P1_SPACE in the flags argument to the SYS$CREATE_REGION_64 service. If you do not explicitly delete a virtual region with the SYS$DELETE_REGION_64 system service, the user-defined virtual region along with all created address space is deleted when the image exits.
Chapter 3
|
Service | Arguments |
---|---|
Alignment System Services | |
$GET_ALIGN_FAULT_DATA | buffer_64, buffer_size, return_size_64 |
$GET_SYS_ALIGN_FAULT_DATA | buffer_64, buffer_size, return_size_64 |
$INIT_SYS_ALIGN_FAULT_REPORT | match_table_64, buffer_size, flags |
AST System Service | |
$DCLAST | astadr_64, astprm_64, acmode |
Condition Handling System Services | |
$FAO | ctrstr_64, outlen_64, outbuf_64, p1_64...pn_64 |
$FAOL | ctrstr_64, outlen_64, outbuf_64, long_prmlst_64 |
$FAOL_64 | ctrstr_64, outlen_64, outbuf_64, quad_prmlst_64 |
$GETMSG | msgid, msglen_64, bufadr_64, flags, outadr_64 |
$PUTMSG | msgvec_64, actrtn_64, facnam_64, actprm_64 |
$SIGNAL_ARRAY_64 | mcharg, sigarg_64 |
CPU Scheduling System Services | |
$CPU_CAPABILITIES | cpu_id, select_mask, modify_mask, prev_mask, flags |
$FREE_USER_CAPABILITY | cap_num, prev_mask, flags |
$GET_USER_CAPABILITY | cap_num, select_num, select_mask, prev_mask, flags |
$PROCESS_AFFINITY | pidadr, prcnam, select_mask, modify_mask, prev_mask, flags |
$PROCESS_CAPABILITIES | pidadr, prcnam, select_mask, modify_mask, prev_mask, flags |
$SET_IMPLICIT_AFFINITY | pidadr, prcnam, state, cpu_id, prev_mask |
Event Flag System Service | |
$READEF | efn, state_64 |
Fast-I/O System Services | |
$IO_CLEANUP | fandle |
$IO_PERFORM | fandle, chan, iosadr, bufadr, buflen, porint |
$IO_PERFORMW | fandle, chan, iosadr, bufadr, buflen, porint |
$IO_SETUP | func, bufobj, iosobj, astadr, flags, return_fandle |
I/O System Services | |
$QIO(W) 1 | efn, chan, func, iosb_64, astadr_64, astprm_64, p1_64, p2_64, p3_64, p4_64, p5_64, p6_64 |
$SYNCH | efn, iosb_64 |
Locking System Services | |
$DEQ | lkid, vablk_64, acmode, flags |
$ENQ(W) | efn, lkmode, lksb_64, flags, resnam_64, parid, astadr_64, astprm_64, blkast_64, acmode |
Logical Name System Services | |
$CRELNM | attr, tabnam, lognam, acmode, itmlst |
$CRELNT | ttr, resnam, reslen, quota, promsk, tabnam, partab, acmode |
$DELLNM | tabnam, lognam, acmode |
$TRNLNM | attr, tabnam, lognam, acmode, itmlst |
Memory Management System Services | |
$ADJWSL | pagcnt, wsetlm_64 |
$CREATE_BUFOBJ_64 | start_va_64, length_64, acmode, flags, return_va_64, return_length_64, return_buffer_handle_64 |
$CREATE_GDZRO | gsdnam_64, ident_64, prot, length_64, acmode, flags, ... |
$CRMPSC_GDZRO_64 | gsdnam_64, ident_64, prot, length_64, region_id_64, section_offset_64, acmode, flags, return_va_64, return_length_64, ... |
$CREATE_GFILE | gsdnam_64, ident_64, file_offset_64, length_64, chan, acmode, flags, return_length_64, ... |
$CREATE_GPFILE | gsdnam_64, ident_64, prot, length_64, acmode, flags |
$CREATE_GPFN | gsdnam_64, ident_64, prot, start_pfn, page_count, acmode, flags |
$CREATE_REGION_64 | length_64, region_prot, flags, return_region_id_64, return_va_64, return_length_64, ... |
$CRETVA_64 | region_id_64, start_va_64, length_64, acmode, flags, return_va_64, return_length_64 |
$CRMPSC_FILE_64 | region_id_64, file_offset_64, length_64, chan, acmode, flags, return_va_64, return_length_64, ... |
$CRMPSC_GFILE_64 | gsdnam_64, ident_64, file_offset_64, length_64, chan, region_id_64, section_offset, acmode, flags, return_va_64, return_length_64, ... |
$CRMPSC_GPFILE_64 | gsdnam_64, ident_64, prot, length_64, region_id_64, section_offset_64, acmode, flags, return_va_64, return_length_64, ... |
$CRMPSC_GPFN_64 | gsdnam_64, ident_64, prot, start_pfn, page_count, region_id_64, relative_page, acmode, flags, return_va_64, return_length_64, ... |
$CRMPSC_PFN_64 | region_id_64, start_pfn, page_count, acmode, flags, return_va_64, return_length_64, ... |
$DELETE_BUFOBJ | buffer_handle_64 |
$DELETE_REGION_64 | region_id_64, acmode, return_va_64, return_length_64 |
$DELTVA_64 | region_id_64, start_va_64, length_64, acmode, return_va_64, return_length_64 |
$DGBLSC | flags, gsdnam_64, ident_64 |
$EXPREG_64 | region_id_64, length_64, acmode, flags, return_va_64, return_length_64 |
$GET_REGION_INFO | function_code, region_id_64, start_va_64, ,buffer_length, buffer_address_64, return_length_64 |
$LCKPAG_64 | start_va_64, length_64, acmode, return_va_64, return_length_64 |
$LKWSET_64 | start_va_64, length_64, acmode, return_va_64, return_length_64 |
$MGBLSC_64 | gsdnam_64, ident_64, region_id_64, section_offset_64, length_64, acmode, flags, return_va_64, return_length_64, ... |
$MGBLSC_GPFN_64 | gsdnam_64, ident_64, region_id_64, relative_page, page_count, acmode, flags, return_va_64, return_length_64, ... |
$PURGE_WS | start_va_64, length_64 |
$SETPRT_64 | start_va_64, length_64, acmode, prot, return_va_64, return_length_64, return_prot_64 |
$ULKPAG_64 | start_va_64, length_64, acmode, return_va_64, return_length_64 |
$ULWSET_64 | start_va_64, length_64, acmode, return_va_64, return_length_64 |
$UPDSEC_64(W) | start_va_64, length_64, acmode, updflg, efn, iosa_64, return_va_64, return_length_64, ... |
Process Control System Services | |
$GETJPI(W) | efn, pidadr, prcnam, itmlst, iosb, astadr, astprm |
$PROCESS_SCAN | pidctx, itmlst |
Time System Services | |
$ASCTIM | timlen, timbuf, timadr, cvtflg |
$ASCUTC | timlen, timbuf, utcadr, cvtflg |
$BINTIM | timbuf, timadr |
$BINUTC | timbuf, utcadr |
$CANTIM | reqidt_64, acmode |
$GETTIM | timadr_64 |
$GETUTC | utcadr |
$NUMTIM | timbuf, timadr |
$NUMUTC | timbuf, utcadr |
$SETIME | timadr |
$SETIMR | efn, daytim_64, astadr_64, reqidt_64, flags |
$TIMCON | timadr, utcadr, cvtflg |
Other System Services | |
$CMEXEC_64 | routine_64, quad_arglst_64 |
$CMKRNL_64 | routine_64, quad_arglst_64 |
$GETSYI(W) | efn, csidadr, nodename, itmlst, iosb, astadr, astprm |
$IDTOASC | id, namlen, nambuf, resid, attrib, contxt |
OpenVMS system services not listed in Table 3-1 and all user-written
system services that are not explicitly enhanced to accept 64-bit
addresses will receive sign-extension checking. Any argument passed to
these services that is not properly sign-extended will cause the error
status SS$_ARG_GTR_32_BITS to be returned.
3.4 Language Support for 64-Bit System Services
C function prototypes for system services are available in SYS$LIBRARY:SYS$STARLET_C.TLB (or STARLET).
No 64-bit MACRO-32 macros are available for system services. The
MACRO-32 caller must use the AMACRO built-in EVAX_CALLG_64 or the
$CALL64 macro. For more information about MACRO-32 programming support
for 64-bit addressing, see Chapter 12.
3.5 NEW STARLET Definitions for C
As of OpenVMS Alpha Version 7.0, SYS$LIBRARY:SYS$STARLET_C.TLB (or STARLET) provides C function prototypes for system services, as well as new and enhanced data structure definitions. The new definitions are more consistent with the OpenVMS C language coding conventions and definitions (typedefs) used in SYS$LIBRARY:SYS$LIB_C.TLB.
To maintain source compatibility for existing users of STARLET.H, the old style function declarations and definitions are still provided by default. To take advantage of the new system service function prototypes and type definitions, you must explicitly enable them.
You can define the __NEW_STARLET symbol with a DEC C command line qualifier or include the definition directly in your source program. For example:
/DEFINE=(__NEW_STARLET=1) |
#define __NEW_STARLET 1 #include <starlet.h> #include <vadef.h> |
To see the currently available system service function prototypes in STARLET.H, you can use the Librarian Utility, as shown in the following example:
$ LIBRARY/OUTPUT=STARLET.H SYS$LIBRARY:SYS$STARLET_C.TLB/EXTRACT=STARLET |
The following example shows a new system service function prototype as it is defined in STARLET.H:
#pragma __required_pointer_size __long int sys$expreg_64( struct _generic_64 *region_id_64, unsigned __int64 length_64, unsigned int acmode, unsigned int flags, void *(*(return_va_64)), unsigned __int64 *return_length_64); #pragma __required_pointer_size __short |
For more information about DEC C pointer size pragmas, see the DEC C User's Guide for OpenVMS Systems.
The following source code example shows the sys$expreg_64 function prototype referenced in a program.
#define __NEW_STARLET 1 /* Enable "New Starlet" features */ #include <starlet.h> /* Declare prototypes for system services */ #include <gen64def.h> /* Define GENERIC_64 type */ #include <vadef.h> /* Define VA$ constants */ #include <ints.h> /* Define 64-bit integer types */ #include <far_pointers.h> /* Define 64-bit pointer types */ { int status; /* Ubiquitous VMS status value */ GENERIC_64 region = { VA$C_P2 }; /* Expand in "default" P2 region */ VOID_PQ p2_va; /* Returned VA in P2 space */ uint64 length; /* Allocated size in bytes */ extern uint64 page_size; /* Page size in bytes */ status = sys$expreg_64( ®ion, request_size, 0, 0, &p2_va, &length ); ... } |
Table 3-2 lists the data structures that are used by the new function prototypes.
Structure Used by Prototype | Defined by Header File | Common Prefix for Structure Member Names | Description |
---|---|---|---|
struct _cluevthndl | cluevtdef.h | cluevthndl$ | Cluster event handle |
struct _fabdef | fabdef.h | fab$ | File access block |
struct _generic_64 | gen64def.h | gen64$ | Generic quadword structure |
struct _ieee | ieeedef.h | ieee$ | IEEE floating point control structure |
struct _ile2 1 | iledef.h | ile2$ | Item list entry 2 |
struct _ile3 1 | iledef.h | ile3$ | Item list entry 3 |
struct _ilea_64 1 | ilea_64$ | iledef.h | 64-bit item list entry A structure |
struct _ileb_64 1 | ileb_64$ | iledef.h | 64-bit item list entry B structure |
struct _iosa | iosadef.h | iosa$ | I/O status area |
struct _iosb | iosbdef.h | iosb$ | I/O status block |
struct _lksb | lksbdef.h | lksb$ | Lock status block |
struct _rabdef | rabdef.h | rab$ | RMS record access block |
struct _secid | seciddef.h | secid$ | Global section identifier |
struct _va_range | va_rangedef.h | va_range$ | 32-bit virtual address range |
Previous | Next | Contents | Index |