Specifications

Data Structures
1.7 Channel Request Block (CRB)
Table 1–8 (Cont.) Contents of Channel Request Block
Field Name Contents
CRB$L_RTINTD* Portion of interrupt transfer vector created at system initialization when
a MicroVAX system implements multilevel device interrupt dispatching.
The code stored in this 12-byte field implements a conditional lowering to
device IPL. See Section 1.7.1 for a description of the contents of the interrupt
transfer vector.
CRB$L_INTD* Portion of the interrupt transfer vector block that stores executable code,
driver entry points, and I/O adapter information. This 10-longword area is
overlaid with the contents of the interrupt transfer vector block that starts at
VEC$L_INTD (offset 16) as described in Section 1.7.1. It contains pointers to
the driver’s controller and unit initialization routines, the interrupt dispatch
block (IDB), and the adapter control block (ADP). It may also contain fields
that describe the disposition of a controllers data paths and map registers.
The interrupt transfer routine is located at the top of the interrupt transfer
vector.
Although certain of the symbolic offsets defined in the data structure
definition macro $VECDEF have negative values, driver code can uniformly
refer to the contents of the VEC structure in the following form:
CRB$L_INTD+VEC$x_symbol.
CRB$L_BUGCHECK2* Bugcheck data used to issue an ILLQBUSCFG bugcheck when the multilevel
interrupt dispatching code (at CRB$L_RTINTD2) determines that the
Q22–bus is illegally configured.
CRB$L_RTINTD2* Portion of second interrupt transfer vector initialized and used if multilevel
interrupt dispatching is enabled in a MicroVAX system. See Section 1.7.1 for
a description of the contents of the interrupt transfer vector.
CRB$L_INTD2* Portion of the second interrupt transfer vector block for devices with multiple
interrupt vectors. The data structure definition macro $CRBDEF supplies
symbolic offsets for only the first two interrupt transfer vector structures.
1.7.1 Interrupt Transfer Vector Block (VEC)
The operating system creates the appropriate number of interrupt transfer vector
blocks (VEC) within a CRB if a driver specifies that the addresses of additional
interrupt service routines be loaded into these structures. For example:
DPT_STORE,CRB,CRB$L_INTD2+VEC$L_ISR,D,isr_for_vec2
DPT_STORE,CRB,CRB$L_INTD+<2*VEC$K_LENGTH>+VEC$L_ISR,D,isr_for_vec3
The offset of the nth vector located in the CRB is equal to the result of the
following formula:
CRB$L_INTD+(n*VEC$K_LENGTH)
The operating system automatically initializes the interrupt dispatching
instructions and the data structure locations from information located in the
primary vector. The number of device vectors and vector structures actually
created can be overridden by the value specified in the /NUMVEC qualifier to the
SYSGEN command CONNECT. A single interrupt transfer vector block (VEC) is
shown in Figure 1–10. Table 1–9 describes the fields in a VEC block.
1–29