The Direct I/O Buffer Map (DIOBM) is a new structure that is used to solve
  the "cross-process PTE problem" for buffers that have been locked
  into memory for direct I/O.
There are two variants of the DIOBM structure. The first is the primary DIOBM
  structure. The primary DIOBM structure can be used in the following mutually
  exclusive ways:
Each of these methods yields a 32-bit system virtual address for the PTEs
  that map the buffer. This address is valid regardless of process or system
  context.
The fixed-size DIOBM structure contains room for exactly DIOBM$K_PTECNT_FIX
  (9) PTEs and is 88 bytes long. Most primary DIOBM structures are fixed-sized
  and embedded in other structures. For example, the IRP, IRPE, VCRP, and DCBE
  structures all contain an embedded fixed-sized primary DIOBM structure.
Although the offsets and types for both the primary and secondary DIOBM structures
  are identical, for clarity, they are described in separate tables (see Table
  A-6 and Table A-7).
  
  Table A-6 Primary DIOBM Structure
  
  
    | Field  | 
    Type  | 
    Comments  | 
  
  
    |  diobm$ps_aux_diobm  | 
     DIOBM *  | 
     This is a pointer to a secondary DIOBM structure that is valid if and
      only if DIOBM$M_AUX_INUSE in  diobm$l_flags  is
      set. The secondary DIOBM structure contains copies of the PTE that map
      the buffer. When a secondary DIOBM is used, the only use for the primary
      DIOBM is to locate the secondary.  | 
  
  
    |  diobm$l_pte_count  | 
     unsigned int  | 
     If DIOBM$M_PTE_WINDOW is clear in  diobm$l_flags  ,
      this cell contains the count of PTEs that have been copied to the PTE vector  diobm$q_pte_vector  in
      this DIOBM structure.
        If DIOBM$M_PTE_WINDOW is set in  diobm$l_flags  ,
        this cell contains the count of SPTEs that have been allocated for a
        PTE window in S0/S1 space to the actual PTEs that map the buffer.   | 
  
  
    |  diobm$w_size  | 
     unsigned short  | 
     Size of the DIOBM packet in bytes.  | 
  
  
    |  diobm$b_type  | 
     unsigned char  | 
     Nonpaged pool packet type code, DYN$C_MISC  | 
  
  
    |  diobm$b_subtype  | 
     unsigned char  | 
     Nonpaged pool packet subtype code, new DYN$C_MISC subtype code DYN$C_DIOBM  | 
  
  
    |  diobm$l_flags  | 
     unsigned int  | 
     Flag bits.  | 
  
  
    |  diobm$v_rel_dealloc  | 
     bit  | 
     A bit equal to DIOBM$M_REL_DEALLOC in the  diobm$l_flags  cell.
      If set, routine IOC_STD$RELEASE_DIOBM deallocates this DIOBM structure.
      The routine IOC_STD$FILL_DIOBM sets this bit on any secondary DIOBM structure
      that it may allocate. The routine IOC_STD$CREATE_DIOBM sets this bit on
      the primary DIOBM structure that it allocates.  | 
  
  
    |  diobm$v_pte_window  | 
     bit  | 
     A bit equal to DIOBM$M_PTE_WINDOW in the  diobm$l_flags  cell.
      This bit is set if the direct I/O buffer is too large for a DIOBM packet
      (the buffer requires more than ioc$gl_diobm_ptecnt_max PTEs) and a window
      in S0 to its PTEs has been allocated. When this bit is set,  diobm$l_pte_count  contains
      the count of SPTEs that have been allocated and the  diobm$l_ptew_sva  cell
      contains the system virtual address that is mapped by the first SPTE allocated
      for the PTE window. This bit must be clear if  diobm$v_aux_inuse  is
      set.  | 
  
  
    |  diobm$v_aux_inuse  | 
     bit  | 
     A bit equal to DIOBM$M_AUX_INUSE in the  diobm$l_flags  cell.
      The  diobm$ps_aux_diobm  cell contains a
      pointer to a secondary DIOBM structure if and only if the  diobm$v_aux_inuse  bit
      is set. This bit must be clear if  diobm$v_pte_window  is
      set.  | 
  
  
    |  diobm$v_inuse  | 
     bit  | 
     A bit equal to DIOBM$M_INUSE in the  diobm$l_flags  cell.
      This flag is an aid to detecting inproper use of DIOBM structures and is
      used only by the full-checking versions of the routines in the IO_ROUTINES_MON.EXE
      execlet. This flag is set by the IOC_STD$FILL_DIOBM and IOC_STD$CREATE_DIOBM
      routines and is cleared by the IOC_STD$RELEASE_DIOBM routine. Prior to
      setting the flag, the IOC_STD$FILL_DIOBM routine checks this flag if the  diobm$b_type  cell
      contains the DYN$C_MISC value and  diobm$b_subtype  contains
      DYN$C_DIOBM. If the  diobm$v_inuse  flag
      is set under these conditions, the IOC_STD$FILL_DIOBM routine declares
      a INCONSTATE bugcheck.  | 
  
  
    |  diobm$v_s0pte_window  | 
     bit  | 
     A bit equal to DIOBM$M_S0PTE_WINDOW in the  diobm$l_flags  cell.
      This bit is set if the S0/S1 PTE window was used to derive a 32-bit PTE
      address for this buffer. When this bit is set the  diobm$v_pte_window  and  diobm$v_aux_inuse  flags
      must be clear and the  diobm$l_pte_count  cell
      must contain 0.  | 
  
  
    |  DIOBM$K_HDRLEN  | 
     constant  | 
     Size in bytes of the minimal DIOBM packet header excluding the PTE vector.
      This is equal to the byte offset of the  diobm$q_pte_vector[0]  cell
      (16).  | 
  
  
    |  diobm$q_pte_vector  | 
     PTE[diobm$l_pte_count]  | 
     Vector of  diobm$l_pte_count  quadword
      PTEs that are copies of the PTEs that map the buffer that has been locked
      for direct I/O. This vector is valid only if both DIOBM$M_AUX_INUSE and
      DIOBM$M_PTE_WINDOW in  diobm$l_flags  are
      clear.  | 
  
  
    |  DIOBM$K_PTECNT_FIX  | 
     constant  | 
     This constant specifies the number of PTE entries (9) that fit into
      the PTE vector in a fix-sized DIOBM structure.  | 
  
  
    |  DIOBM$K_PTECNT_MAX_UNI  | 
     constant  | 
     This constant specifies the number of PTE entries (94) that fit into
      the PTE vector in the largest allowable DIOBM structure on an uniprocessor
      system.  | 
  
  
    |  DIOBM$K_PTECNT_MAX_SMP  | 
     constant  | 
     This constant specifies the number of PTE entries (430) that fit into
      the PTE vector in the largest allowable DIOBM structure on an SMP system.  | 
  
  
    |  diobm$ps_ptew_sva  | 
     void *  | 
     The lowest S0/S1 space virtual address that is mapped by the PTEs that
      have been allocated for the window onto the direct I/O buffer PTEs. This
      cell is used to deallocate the PTE window. This cell is overlaid on a portion
      of  diobm$q_pte_vector  since its use is
      mutually exclusive. This cell is valid if and only if DIOBM$M_PTE_WINDOW
      in  diobm$l_flags  is set.  | 
  
  
    |  DIOBM$M_NORESWAIT  | 
     constant  | 
     This is an option bit mask for the flags parameter to the IOC_STD$FILL_DIOBM
      and IOC_STD$CREATE_DIOBM routines.
       When this option bit is set and there are insufficient resources for
        the needs of these routines an error status is returned to their callers
        instead of putting the process into a resource wait state.   | 
  
  
  Table A-7 Secondary DIOBM Structure
  
  
    | Field  | 
    Type  | 
    Comments  | 
  
  
    |  diobm$ps_aux_diobm  | 
     DIOBM *  | 
     This cell must be zero in a secondary DIOBM structure.  | 
  
  
    |  diobm$l_pte_count  | 
     unsigned int  | 
     Contains the number of PTEs that can fit into the  diobm$q_pte_vector  in
      this DIOBM structure.  | 
  
  
    |  diobm$w_size  | 
     unsigned short  | 
     Size of the DIOBM packet in bytes.  | 
  
  
    |  diobm$b_type  | 
     unsigned char  | 
     Nonpaged pool packet type code, DYN$C_MISC  | 
  
  
    |  diobm$b_subtype  | 
     unsigned char  | 
     Nonpaged pool packet subtype code, new DYN$C_MISC subtype code DYN$C_DIOBM  | 
  
  
    |  diobm$l_flags  | 
     unsigned int  | 
     Flag bits.  | 
  
  
    |  diobm$v_rel_dealloc  | 
     bit  | 
     A bit equal to DIOBM$M_REL_DEALLOC in the  diobm$l_flags  cell.
      If set, routine IOC_STD$RELEASE_DIOBM deallocates this DIOBM structure.  | 
  
  
    |  diobm$v_pte_window  | 
     bit  | 
     A bit equal to DIOBM$M_PTE_WINDOW in the  diobm$l_flags  cell.
      This bit must be clear in a secondary DIOBM structure.  | 
  
  
    |  diobm$v_aux_inuse  | 
     bit  | 
     A bit equal to DIOBM$M_AUX_INUSE in the  diobm$l_flags  cell.
      This bit must be clear in a secondary DIOBM structure.  | 
  
  
    |  diobm$v_s0pte_window  | 
     bit  | 
     A bit equal to DIOBM$M_S0PTE_WINDOW in the  diobm$l_flags  cell.
      This bit must be clear in a secondary DIOBM structure.  | 
  
  
    |  diobm$q_pte_vector  | 
     PTE[diobm$l_pte_count]  | 
     Vector of  diobm$l_pte_count  quadword
      PTEs that are copies of the PTEs that map the buffer that has been locked
      for direct I/O.  |