|
HP OpenVMS System Services Reference Manual
$LKWSET
Locks a range of pages in the working set; if the pages are not already
in the working set, it brings them in and locks them. A page locked in
the working set does not become a candidate for replacement.
Format
SYS$LKWSET inadr ,[retadr] ,[acmode]
C Prototype
int sys$lkwset (struct _va_range *inadr, struct _va_range *retadr,
unsigned int acmode);
Arguments
inadr
OpenVMS usage: |
address_range |
type: |
longword (unsigned) |
access: |
read only |
mechanism: |
by reference |
Starting and ending virtual addresses of the range of pages to be
locked in the working set. The inadr argument is the
address of a 2-longword array containing, in order, the starting and
ending process virtual addresses. Only the virtual page number portion
of each virtual address is used; the low-order byte-within-page bits
are ignored.
On VAX systems, if the starting and ending virtual addresses are the
same, a single page is locked.
On Alpha and I64 systems, if the first address in the 2-longword array
is within an image mapped to your process, the entire image specified
by the address is locked in the working set.
Be sure to check calls to the SYS$LKWSET and SYS$LKWSET_64 system
services for correct arguments. This affects only process based code
running above IPL2. Compiler and linker defferences might cause your
program layout to change from Alpha, resulting in incorrectly
calculated starting and ending addresses for calls to SYS$LKWSET and
SYS$LKWSET_64. Calling these services with incorrect arguments and then
executing this code above IPL2 could cause PGFIPLHI bugchecks. Note
that SYS$LKWSET and SYS$LKWSET_64 automatically lock linker-generated
short data sections associated with code sections locked in the working
set.
retadr
OpenVMS usage: |
address_range |
type: |
longword (unsigned) |
access: |
write only |
mechanism: |
by reference |
Starting and ending process virtual addresses of the range of pages
actually locked by $LKWSET. The retadr argument is the
address of a 2-longword array containing, in order, the starting and
ending process virtual addresses.
On Alpha and I64 systems, if the inadr argument
specifies an address within an image mapped to your process,
retadr specifies only one range of pages locked in the
working set. Many ranges of pages might be locked.
acmode
OpenVMS usage: |
access_mode |
type: |
longword (unsigned) |
access: |
read only |
mechanism: |
by value |
Access mode to be associated with the pages to be locked. The
acmode argument is a longword containing the access
mode. The $PSLDEF macro defines the four access modes.
The most privileged access mode used is the access mode of the caller.
For the $LKWSET service to complete successfully, the resultant access
mode must be equal to or more privileged than the access mode already
associated with the pages to be locked.
Description
The Lock Pages in Working Set service locks a range of pages in the
working set; if the pages are not already in the working set, it brings
them in and locks them. A page locked in the working set does not
become a candidate for replacement.
If more than one page is being locked and you need to determine
specifically which pages were previously locked, the pages should be
locked one at a time.
If an error occurs while the $LKWSET service is locking pages, the
return array, if requested, indicates the pages that were successfully
locked before the error occurred. If no pages are locked, both
longwords in the return address array contain the value --1.
Global pages with write access cannot be locked into the working set.
On Alpha and I64 systems, if the first address specified to SYS$LKWSET
is within an image mapped to your process, a success status indicates
that the entire image containing the specified address is locked in the
working set. This behavior helps to ensure that privileged processes
entering kernel mode and raising IPL higher than IPL 2 do not access an
invalid page and cause a PGFIPLHI bugcheck. The system keeps a count of
the number of times each image within your process is locked in the
working set. This count is maintained so that calls to SYS$ULWSET
unlock the image only when it has been called the same number of times
as SYS$LKWSET.
If an attempt to lock an image in the working set returns
SS$_LKWSETFUL, you might consider moving all kernel mode code within
the image to a separate, smaller sharable image. Otherwise, you might
consider increasing the working set quota of the process.
The LIBRTL routine LIB$LOCK_IMAGE and LIB$UNLOCK_IMAGE are preferable
to SYS$LKWSET and SYS$ULKWSET for locking code and related data in the
working set. For more information about locking images in the working
set, refer to the LIBRTL manual and the descriptions of LIB$LOCK_IMAGE
and LIB$UNLOCK_IMAGE.
Required Access or Privileges
None
Required Quota
None
Related Services
You can unlock pages locked in the working set with the Unlock Page
from Working Set ($ULWSET) service.
For more information, refer to the chapter on memory management in the
OpenVMS Programming Concepts Manual.
Condition Values Returned
SS$_WASCLR
|
The service completed successfully. All of the specified pages were
previously unlocked. The entire image might have been locked in the
working set.
|
SS$_WASSET
|
The service completed successfully. At least one of the specified pages
was previously locked in the working set. If the image has been locked
in the working set, the count of times the image has been locked in the
working set has been incremented.
|
SS$_ACCVIO
|
The input address array cannot be read; the output address array cannot
be written; a page in the specified range is inaccessible or
nonexistent; or an attempt was made to lock pages by a caller whose
access mode is less privileged than the access mode associated with the
pages.
|
SS$_LKWSETFUL
|
The locked working set is full. If any more pages are locked, not
enough dynamic pages will be available to continue execution. If the
image is being locked in the working set, the image is too large to be
entirely locked in the working set.
|
SS$_NOPRIV
|
A page in the specified range is in the system address space, or a
global page with write access was specified.
|
SS$_PAGOWNVIO
|
The pages could not be locked because the access mode associated with
the call to $LKWSET was less privileged than the access mode associated
with the pages that were to be locked.
|
$LKWSET_64 (Alpha and I64)
On Alpha and I64 systems, locks a range of virtual addresses in the
working set. If the pages are not already in the working set, the
service brings them in and locks them. A page locked in the working set
does not become a candidate for replacement.
This service accepts 64-bit addresses.
Format
SYS$LKWSET_64 start_va_64 ,length_64 ,acmode ,return_va_64
,return_length_64
C Prototype
int sys$lkwset_64 (void *start_va_64, unsigned __int64 length_64,
unsigned int acmode, void *(*(return_va_64)), unsigned __int64
*return_length_64);
Arguments
start_va_64
OpenVMS usage: |
address |
type: |
quadword address |
access: |
read only |
mechanism: |
by value |
The starting virtual address of the pages to be locked in the working
set. The specified virtual address will be rounded down to a
CPU-specific page boundary.
length_64
OpenVMS usage: |
byte count |
type: |
quadword (unsigned) |
access: |
read only |
mechanism: |
by value |
Length of the virtual address space to be locked in the working set.
The specified length will be rounded up to a CPU-specific page boundary
so that it includes all CPU-specific pages in the requested range.
acmode
OpenVMS usage: |
access_mode |
type: |
longword (unsigned) |
access: |
read only |
mechanism: |
by value |
Access mode associated with the pages to be locked. The
acmode argument is a longword containing the access
mode.
The $PSLDEF macro in STARLET.MLB and the file PSLDEF.H in
SYS$STARLET_C.TLB define the following symbols and their values for the
four access modes:
Value |
Symbolic Name |
Access Mode |
0
|
PSL$C_KERNEL
|
Kernel
|
1
|
PSL$C_EXEC
|
Executive
|
2
|
PSL$C_SUPER
|
Supervisor
|
3
|
PSL$C_USER
|
User
|
The most privileged access mode used is the access mode of the caller.
For the $LKWSET_64 service to complete successfully, the resultant
access mode must be equal to or more privileged than the access mode
already associated with the pages to be locked.
return_va_64
OpenVMS usage: |
address |
type: |
quadword address |
access: |
write only |
mechanism: |
by 32- or 64-bit reference |
The lowest process virtual address of the pages locked in the working
set. The return_va_64 argument is the 32- or 64-bit
virtual address of a naturally aligned quadword into which the service
returns the virtual address.
return_length_64
OpenVMS usage: |
byte count |
type: |
quadword (unsigned) |
access: |
write only |
mechanism: |
by 32- or 64-bit reference |
The length of the virtual address range locked in the working set. The
return_length_64 argument is the 32- or 64-bit virtual
address of a naturally aligned quadword into which the service returns
the length of the virtual address range in bytes.
Description
The Lock Pages in Working Set service locks a range of pages in the
working set; if the pages are not already in the working set, it brings
them in and locks them. A page locked in the working set does not
become a candidate for replacement.
If the condition value SS$_ACCVIO is returned by this service, a value
cannot be returned in the memory locations pointed to by the
return_va_64 and return_length_64
arguments. If a condition value other than SS$_ACCVIO is returned, the
returned address and returned length indicate the pages that were
successfully locked before the error occurred. If no pages were locked,
the return_va_64 argument will contain the value -1,
and a value cannot be returned in the memory location pointed
to by the return_length_64 argument.
Global pages with write access cannot be locked into the working set.
Be sure to check calls to the SYS$LKWSET and SYS$LKWSET_64 system
services for correct arguments. This affects only process based code
running above IPL2. Compiler and linker defferences might cause your
program layout to change from Alpha, resulting in incorrectly
calculated starting and ending addresses for calls to SYS$LKWSET and
SYS$LKWSET_64. Calling these services with incorrect arguments and then
executing this code above IPL2 could cause PGFIPLHI bugchecks. Note
that SYS$LKWSET and SYS$LKWSET_64 automatically lock linker-generated
short data sections associated with code sections locked in the working
set.
On Alpha and I64 systems, if the first address specified to
SYS$LKWSET_64 is within an image mapped to your process, a success
status indicates that the entire image containing the specified address
is locked in the working set. This behavior helps to ensure that
privileged processes entering kernel mode and raising IPL higher than
IPL 2 do not access an invalid page and cause a PGFIPLHI bugcheck. The
system keeps a count of the number of times each image within your
process is locked in the working set. This count is maintained so that
calls to SYS$ULWSET_64 unlock the image only when it has been called
the same number of times as SYS$LKWSET_64.
If an attempt to lock an image in the working set returns
SS$_LKWSETFUL, you might consider moving all kernel mode code within
the image to a separate, smaller sharable image. Otherwise, you might
consider increasing the working set quota of the process.
The LIBRTL routine LIB$LOCK_IMAGE and LIB$UNLOCK_IMAGE are preferable
to SYS$LKWSET_64 and SYS$ULKWSET_64 for locking code and related data
in the working set. For more information about locking images in the
working set, refer to the LIBRTL manual and the descriptions of
LIB$LOCK_IMAGE and LIB$UNLOCK_IMAGE.
Required Privileges
None
Required Quota
None
Related Services
$LKWSET, $ULWSET, $ULWSET_64
Condition Values Returned
SS$_WASCLR
|
The service completed successfully. All of the specified pages were
previously unlocked. The entire image might have been locked in the
working set.
|
SS$_WASSET
|
The service completed successfully. At least one of the specified pages
was previously locked in the working set. If the image has been locked
in the working set, the count of times the image has been locked in the
working set has been incremented.
|
SS$_ACCVIO
|
The
return_va_64 or
return_length_64 argument cannot be written by the
caller, or an attempt was made to lock pages by a caller whose access
mode is less privileged than the access mode associated with the pages.
|
SS$_LKWSETFUL
|
The locked working set is full. If any more pages are locked, not
enough dynamic pages will be available to continue execution. If the
image is being locked in the working set, the image is too large to be
entirely locked in the working set.
|
SS$_NOPRIV
|
No privilege; global pages with write access cannot be locked into the
working set.
|
SS$_PAGNOTINREG
|
A page in the specified range is not within the specified region.
|
SS$_PAGOWNVIO
|
The pages could not be locked because the access mode associated with
the call to $LKWSET_64 was less privileged than the access mode
associated with the pages that were to be locked.
|
$MGBLSC
Establishes a correspondence between pages (maps) in the virtual
address space of the process and physical pages occupied by a global
section.
Format
SYS$MGBLSC inadr ,[retadr] ,[acmode] ,[flags] ,gsdnam ,[ident] ,[relpag]
C Prototype
int sys$mgblsc (struct _va_range *inadr, struct _va_range *retadr,
unsigned int acmode, unsigned int flags, void *gsdnam, struct _secid
*ident, unsigned int relpag);
Arguments
inadr
OpenVMS usage: |
address_range |
type: |
longword (unsigned) |
access: |
read only |
mechanism: |
by reference |
Starting and ending virtual addresses into which the section is to be
mapped. The inadr argument is the address of a
2-longword array containing, in order, the starting and ending process
virtual addresses. Only the virtual page number portion of each virtual
address is used to specify which pages are to be mapped; the low-order
byte-within-page bits are ignored for this purpose.
The interpretation of the inadr argument depends on
the setting of SEC$M_EXPREG in the flags argument and
on whether you are using an Alpha, an I64, or a VAX system. These
system types are discussed separately in this section.
Alpha and I64 System Usage
On Alpha and I64 systems, if you do not set the SEC$M_EXPREG
flag, the inadr argument specifies the starting and
ending virtual addresses of the region to be mapped. Addresses in
system space are not allowed. The addresses must be aligned on
CPU-specific pages; no rounding to CPU-specific pages occurs. The lower
address of the inadr argument must be on a
CPU-specific page boundary and the higher address of the
inadr argument must be 1 less than a CPU-specific
boundary, thus forming a range, from lowest to highest, of address
bytes. You can use the SYI$_PAGE_SIZE item code in the $GETSYI system
service to set the inadr argument to the proper
values. You do this to avoid programming errors that might arise
because of incorrect programming assumptions about page sizes.
If, on the other hand, you do set the SEC$M_EXPREG flag,
indicating that the mapping should take place using the first available
space in a particular region, the inadr argument is
used only to indicate the desired region: the program region (P0) or
the control region (P1).
Caution
Mapping into the P1 region is generally discouraged, but, if done, must
be executed with extreme care. Since the user stack is mapped in P1, it
is possible that references to the user stack might inadvertently read
or write the pages mapped with $CRMPSC.
|
When the SEC$M_EXPREG flag is set, the second inadr
longword is ignored, while bit 30 (the second most significant bit) of
the first inadr longword is used to determine the
region of choice. If the bit is clear, P0 is chosen; if the bit is set,
P1 is chosen. On Alpha and I64 systems, bit 31 (the most significant
bit) of the first inadr longword must be 0.
To ensure compatibility between VAX and Alpha or I64 systems when you
choose a region, HP recommends that you specify, for the first
inadr longword, any virtual address in the desired
region.
VAX System Usage
On VAX systems, if you do not set the SEC$M_EXPREG flag, the
inadr argument specifies the starting and ending
virtual addresses of the region to be mapped. Addresses in system space
are not allowed. If the starting and ending virtual addresses are the
same, a single page is mapped.
Note
If the SEC$M_EXPREG flag is not set, HP recommends that the
inadr argument always specify the entire virtual
address range, from starting byte address to ending byte address. This
ensures compatibility between VAX and Alpha or I64 systems.
|
If, on the other hand, you do set the SEC$M_EXPREG flag,
indicating that the mapping should take place using the first available
space in a particular region, the inadr argument is
used only to indicate the desired region: the program region (P0) or
the control region (P1).
Caution
Mapping into the P1 region is generally discouraged, but, if done, must
be executed with extreme care. Since the user stack is mapped in P1, it
is possible that references to the user stack might inadvertently read
or write the pages mapped with $CRMPSC.
|
When the SEC$M_EXPREG flag is set, the second inadr
longword is ignored, while bit 30 (the second most significant bit) of
the first inadr longword is used to determine the
region of choice. If the bit is clear, P0 is chosen; if the bit is set,
P1 is chosen. On VAX systems, bit 31 (the most significant bit) of the
first inadr longword is ignored. To ensure
compatibility between VAX and Alpha or I64 systems when you choose a
region, HP recommends that you specify, for the first
inadr longword, any virtual address in the desired
region.
retadr
OpenVMS usage: |
address_range |
type: |
longword (unsigned) |
access: |
write only |
mechanism: |
by reference |
Starting and ending process virtual addresses into which the section
was actually mapped by $MGBLSC. The retadr argument is
the address of a 2-longword array containing, in order, the starting
and ending process virtual addresses.
On Alpha and I64 systems, the retadr argument returns
the starting and ending addresses of the usable range of
addresses. This might differ from the total amount mapped. The
retadr argument is required when the
relpag argument is specified. If the section being
mapped does not completely fill the last page used to map the section,
the retadr argument indicates the highest address that
actually maps the section. If the relpag argument is
used to specify an offset into the section, the retadr
argument reflects the offset.
acmode
OpenVMS usage: |
access_mode |
type: |
longword (unsigned) |
access: |
read only |
mechanism: |
by value |
Access mode to be associated with the pages mapped into the process
virtual address space. The acmode argument is a
longword containing the access mode. The $PSLDEF macro defines symbols
for the four access modes.
The most privileged access mode used is the access mode of the caller.
flags
OpenVMS usage: |
mask_longword |
type: |
longword (unsigned) |
access: |
read only |
mechanism: |
by value |
Flag mask specifying options for the operation. The
flags argument is a longword bit vector wherein a bit
when set specifies the corresponding option.
The $SECDEF macro defines symbolic names for the flag bits. You
construct the flags argument by specifying the
symbolic names of each desired option in a logical OR operation.
The following table describes each flag option:
Flag Option |
Description |
SEC$M_WRT
|
Map the section with read/write access. By default, the section is
mapped with read-only access. If SEC$M_WRT is specified and the section
is not copy-on-reference, write access is required.
|
SEC$M_SYSGBL
|
Map a system global section. By default, the section is a group global
section.
|
SEC$M_EXPREG
|
Map the section into the first available virtual address range. By
default, the section is mapped into the range specified by the
inadr argument.
See the
inadr argument description for a complete explanation
of how to set the SEC$M_EXPREG flag.
|
gsdnam
OpenVMS usage: |
section_name |
type: |
character-coded text string |
access: |
read only |
mechanism: |
by descriptor--fixed-length string descriptor |
Name of the global section. The gsdnam argument is the
address of a character string descriptor pointing to this name string.
For group global sections, the operating system interprets the group
UIC as part of the global section name; thus, the names of global
sections are unique to UIC groups. Further, all global section names
are implicitly qualified by their identification fields.
You can specify any name from 1 to 43 characters. All processes mapping
to the same global section must specify the same name. Note that the
name is case sensitive.
Use of characters valid in logical names is strongly encouraged. Valid
values include alphanumeric characters, the dollar sign ($), and the
underscore (_). If the name string begins with an underscore (_), the
underscore is stripped and the resultant string is considered to be the
actual name. Use of the colon (:) is not permitted.
Names are first subject to a logical name translation, after the
application of the prefix GBL$ to the name. If the result translates,
it is used as the name of the section. If the resulting name does not
translate, the name specified by the caller is used as the name of the
section.
Additional information on logical name translations and on section name
processing is available in the OpenVMS Programming Concepts Manual.
ident
OpenVMS usage: |
section_id |
type: |
quadword (unsigned) |
access: |
read only |
mechanism: |
by reference |
Identification value specifying the version number of a global section
and, for processes mapping to an existing global section, the criteria
for matching the identification. The ident argument is
the address of a quadword structure containing three fields.
|