|
Upgrading Privileged-Code Applications on OpenVMS Alpha and
OpenVMS I64 Systems
Upgrading Privileged-Code Applications on OpenVMS
Alpha and OpenVMS I64 Systems
4.5.2 Direct I/O
- The caller's virtual address for the buffer is used only in FDT
context.
- Most of the driver identifies buffer start by IRP$L_SVAPTE and
IRP$L_BOFF.
- Driver "layering" in start I/O or fork environments.
- Most drivers use either OpenVMS-supplied upper-level FDT routines
or FDT support routines.
- The moving of the page tables has a significant impact:
- Only the current process's PPTEs are available at any
given time.
This is called the "cross-process PTE access"
problem.
- A 64-bit address is required to access page table entries in page
table space: process, global, and system PTEs.
- Because "SVAPTE, BOFF, BCNT" are used in many device
drivers, the impact of 1 and 2 is not insignificant.
4.5.3 Direct I/O Buffer Map (DIOBM)
Figure 4-3 shows the DIOBM data structure.
Figure 4-3 Direct I/O Buffer Map Data Structure
- Use PTE vector in DIOBM for buffers up to 64 Kb
- Use "secondary" DIOBM for buffers up to 5.2 Mb
- Use PTE window method with DIOBM for larger buffer
- DIOBM embedded in IRP, IRPE, VCRP, DCBE
- MMG_STD$IOLOCK_BUF replaces MMG_STD$IOLOCK
- New DIOBM routines; for example IOC_STD$FILL_DIOBM
- Also of interest to LAN VCI clients
4.5.4 64-Bit AST
Figure 4-4 shows a 64-Bit AST.
Figure 4-4 64-Bit AST
ACB$B_RMOD
|
New ACB$V_FLAGS_VALID bit (last spare bit)
|
|
|
ACB$L_FLAGS
|
Contains ACB$V_64BITS bit (was filler space)
|
|
|
ACB$L_ACB64X
|
Byte offset to ACB64X structure
|
- Both ACB and ACB64X formats are supported.
- ACB packets are self-identifying.
- An ACB64 is an ACB with an immediate ACB64X.
4.5.5 64-Bit ACB Within the IRP
An embedded ACB64 at the start of the IRP is shown in Figure 4-5.
Figure 4-5 Embedded ACB64
An IRP created by the $QIO system service uses the ACB64 layout
unconditionally.
IRP$B_RMOD
|
New ACB$V_FLAGS_VALID bit always set
|
|
|
IRP$L_ACB_FLAGS
|
New ACB$V_64BITS bit always set
|
|
|
IRP$L_ACB64X_OFFSET
|
Contains hex 28
|
4.5.6 I/O Function Definitions
I/O functions are defined as follows:
- Direct I/O, raw data transfer
Functions in this category are
implemented as direct I/O operations and transfer raw data from the
caller's buffer to the device without significant alteration or
interpretation of the data.
- Direct I/O, control data transfer
Functions in this category
are implemented as direct I/O operations and transfer control
information from the caller's buffer to the device driver. The device
driver usually interprets the data or uses it to control the operation
of the device.
Usually these functions do not support 64-bit
addresses. In contrast to the raw data transfers, control data
transfers tend to be smaller and are invoked less frequently. Thus,
there is less need to be able to store such data in a 64-bit
addressable region. The only area impacted in the driver are the
corresponding FDT routines. However, control data often introduces the
problem of embedded 32-bit pointers.
- Buffered I/O, raw data transfer
Functions in this category are
implemented as buffered I/O operations by the device driver but are
otherwise the same type of raw data transfer from the caller's buffer
as the first category.
- Buffered I/O, control data transfer
Functions in this category
are implemented as buffered I/O operations by the device driver but are
otherwise the same type of control data transfer from the caller's
buffer as the second category.
- Control operation, no data transfer, with parameters
Functions
in this category control the device and do not transfer any data
between a caller's buffer and the device. Since there is no caller's
buffer it does not matter whether the function is designated as a
buffered or direct I/O function. The control operation has parameters
that are specified in
p1
through
p6
however these parameters do not point to a buffer.
- Control operation, no data transfer, with no parameters
Functions in this category control the device and do not transfer
any data between a caller's buffer and the device. Since there is no
caller's buffer it does not matter whether the function is designated
as a buffered or direct I/O function. In addition, there are no
parameters for these functions.
Table 4-3 summarizes the I/O functions described in this section.
Table 4-3 Guidelines for 64-Bit Support by I/O Function
Function Type |
64-Bits |
Area of Impact |
|
|
|
Direct I/O, raw data transfer
|
Yes
|
FDT only
|
|
|
|
Direct I/O, control data transfer
|
No
|
FDT only
|
|
|
|
Buffered I/O, raw data transfer
|
No/yes
|
Entire driver, new BUFIO packet
|
|
|
|
Buffered I/O, control data transfer
|
No
|
Entire driver, new BUFIO packet
|
|
|
|
Control, no data transfer, param
|
No
|
Entire path but usually simple
|
|
|
|
Control, no data transfer, no params
|
Moot
|
None
|
|
|
|
4.6 64-Bit Support in Example Driver
This section summarizes changes made to the example device driver
(LRDRIVER.C) to support 64-bit buffer addresses on all I/O functions.
This sample driver is available in the SYS$EXAMPLES directory.
- All functions are declared as capable of supporting a 64-bit P1
parameter.
- The 64-bit buffered I/O packet header defined by bufiodef.h is used
instead of a privately defined structure that corresponds to the 32-bit
buffered I/O packet header.
- The pointer to the caller's set mode buffer is defined as a 64-bit
pointer.
- IRP$Q_QIO_P1 is used instead of IRP$L_QIO_P1.
- The EXE_STD$ALLOC_BUF_64 routine is used instead of
EXE_STD$DEBIT_BYTCNT_ALO to allocate the buffered I/O packet.
No infrastructure changes were necessary to this driver. The original
version could have been simply recompiled and relinked and it would
have worked correctly with 32-bit buffer addresses.