HP OpenVMS Systems Documentation |
Upgrading Privileged-Code Applications on OpenVMS Alpha and OpenVMS I64 Systems
The use of the DIOBM structure by this routine is described in detail in Appendix A. This routine is coded in C and is contained in the new DIOBM.C module.
Routine IOC_STD$FILL_DIOBM is a new routine that is used to derive a 32-bit system virtual address for a specific number of PTEs that are pointed to by a 64-bit process virtual address. This routine employs a previously allocated or embedded "primary" DIOBM structure that must be supplied as one of its inputs. When the derived 32-bit system virtual address is no longer required, the DIOBM must be released by calling the IOC_STD$RELEASE_DIOBM routine. This routine derives a 32-bit system virtual address for the PTEs using one of the following methods:
The interface for IOC_STD$FILL_DIOBM is:
Table B-8 summarizes the use of the arguments.
This routine may require system resources, either nonpaged pool or SPTEs, depending on the number of PTEs that are required to map the buffer. If there are insufficient resources this routine will, by default, place the process (kernel thread) in a kernel mode wait state for nonpaged pool and try again until it succeeds. In this case, the return value of this routine is always SS$_NORMAL because it will not return until it can do so successfully. However, the caller can inhibit this resource wait by setting the DIOBM$M_NORESWAIT option in the flags parameter. When this is done, an error status is returned to the caller if there are insufficient system resources. This capability is intended to be used in contexts where either a resource wait in kernel mode is not acceptable or the caller can readily put the process into a wait state in the requestor's mode. This routine must be called in process context and assumes that it was called at IPL 2, or minimally that it can lower IPL to 2. The use of the DIOBM structure by this routine is described in detail in Appendix
A. The normal version of the IOC_STD$FILL_DIOBM routine makes no assumptions
about the contents of the input DIOBM structure. In contrast, the full checking
version of this routine in the IO_ROUTINES_MON.EXE execlet performs some
initial validation and declares an INCONSTATE bugcheck should this check
fail.
The routine IOC_STD$PTETOPFN allows drivers or other components to obtain the PFN for a page that has been previously locked into memory but the valid bit in its PTE is currently clear. This routine handles transition PTEs and PTEs that have reverted into GPTX format. In releases prior to OpenVMS Alpha Version 7.0, the interface for this routine was:
The new interface for this routine is:
The first interface difference is that IOC_STD$PTETOPFN uses the full 64-bits of the caller's PTE address that is passed by value. The second interface difference is not apparent from the above function prototype. The IOC_STD$PTETOPFN routine has been enhanced to handle the case where thepte$v_valid bit is set in the PTE. Therefore, drivers can use this routine without first checking the valid bit. Both of these are upwardly compatible changes to the interface.
Routine IOC_STD$RELEASE_DIOBM is a new routine that is used to release the PTE mapping resources that were set up by a prior call to either the IOC_STD$CREATE_DIOBM or IOC_STD$FILL_DIOBM routines. The interface for IOC_STD$RELEASE_DIOBM is:
Table B-9 summarizes the use of the arguments.
This routine deallocates any secondary DIOBM that is connected to the primary DIOBM. If this primary DIOBM has a PTE window, the resources used for the window are deallocated. If the primary DIOBM was allocated by IOC_STD$CREATE_DIOBM, the primary DIOBM is deallocated as well. The use of the DIOBM structure by this routine is described in detail in Appendix A. The returned value of this routine is always SS$_NORMAL. This routine does not depend on process context. However, the IPL and spinlocks of the caller must allow this routine to acquire and restore the MMG spinlock. This routine is coded in C and is contained in the new DIOBM.C module.
The routine IOC_STD$SIMREQCOM allows drivers or other components to complete an I/O that does not have a normal IRP associated with it. Because this routine does not have an IRP, the necessary information to signal an I/O completion is passed directly in separate parameters. For example, the user's IOSB address, the event flag value, a pointer to an ACB, and the caller's access mode are among the parameters. In releases prior to OpenVMS Alpha Version 7.0, the interface for this routine was:
The new interface for this routine is:
The first interface difference is that IOC_STD$SIMREQCOM uses the full 64-bits of the caller's IOSB addressiosb_p that is passed by value. The second interface difference is not apparent from the above function prototype. The IOC_STD$SIMREQCOM routine has been enhanced to accept either a pointer to an ACB64 or an ACB structure. Both of these are upwardly compatible changes to the interface.
|