MODULE iom$device_io;
?? RIGHT := 110 ??

?? NEWTITLE := 'Global Declarations Referenced By This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc oss$mainframe_wired_literal
*copyc osd$default_pragmats
*copyc osd$virtual_address
*copyc dmt$ms_logical_device_address
*copyc iot$completion_status
*copyc iot$disk_request
*copyc iot$io_function
*copyc iot$io_request_type
*copyc iot$rb_device_io
*copyc mmt$buffer_descriptor
*copyc ost$hardware_subranges
*copyc ost$page_size
*copyc syt$monitor_request_code
?? POP ??
*copyc iop$disk_request
*copyc mmp$xtask_pva_to_sva
*copyc mtp$error_stop
*copyc osv$page_size
?? OLDTITLE ??
?? NEWTITLE := 'IOP$IO_PROCESSOR', EJECT ??

  PROCEDURE [XDCL] iop$io_processor
    (VAR request_block: iot$rb_device_io);

    VAR
      m_request_block: iot$rb_device_io,
      pva: ^cell,
      length: ost$byte_count,
      io_function: iot$io_function,
      device_address: dmt$ms_logical_device_address,
      completion: ^iot$completion_status,
      status: syt$monitor_status;

    request_block.status.normal := TRUE;
    m_request_block := request_block;

    pva := m_request_block.pva;
    length := m_request_block.length;
    io_function := m_request_block.io_function;
    device_address := m_request_block.device_address;
    completion := m_request_block.completion;

    iop$device_io (pva, length, io_function, device_address, completion, status);
    request_block.status := status;

  PROCEND iop$io_processor;
?? OLDTITLE ??
?? NEWTITLE := 'IOP$DEVICE_IO', EJECT ??

  PROCEDURE iop$device_io
    (    pva: ^cell;
         length: ost$byte_count;
         io_function: iot$io_function;
         device_address: dmt$ms_logical_device_address;
         completion: ^iot$completion_status;
     VAR status: syt$monitor_status);

    VAR
      v$initial_request_info: [READ, oss$mainframe_wired_literal] iot$request_info := [
{ PRESET_VALUE               } 0,
{ COMMAND_INDEX              } 0,
{ COMMAND_GROUP_COUNT        } 0,
{ LIST_LENGTH                } 0,
{ IO_FUNCTION                } ioc$read_mass_storage,
{ REQUEST_TYPE               } ioc$device_io,
{ JOB_ID                     } [0, 0],
{ SYSTEM_FILE_ID             } [0, gfc$tr_job, 0],
{ BYTE_ADDRESS               } 0,
{ AU_WAS_PREVIOUSLY_WRITTEN  } FALSE,
{ LIST_P                     } NIL,
{ COMPLETION                 } NIL,
{ NEXT_TRACK                 } 0,
{ NEXT_SECTOR                } 0,
{ DATA_MAUS                  } 0,
{ TIME                       } 0,
{ IO_IDENTIFIER              } [
{   SPECIFIED                  } FALSE,
{   IO_FUNCTION                } ioc$read_page,
{   TASKID                     } [0, 0],
{   IOCB_INDEX                 } 0]];

    VAR
      buffer_descriptor: mmt$buffer_descriptor,
      request_info: iot$request_info;

    status.normal := TRUE;
    request_info := v$initial_request_info;

{Translate pva to sva.}
    IF length <> 0 THEN
      mmp$xtask_pva_to_sva (pva, buffer_descriptor.sva, status);
      IF NOT status.normal THEN
        RETURN; {----->
      IFEND;

      request_info.byte_address := buffer_descriptor.sva.offset;
      buffer_descriptor.page_count := ((request_info.byte_address + length + ((osv$page_size * 2) - 1)) DIV
            osv$page_size) - ((request_info.byte_address + osv$page_size) DIV osv$page_size);
    IFEND;

    buffer_descriptor.buffer_descriptor_type := mmc$bd_paging_io;

    request_info.completion := completion;
    request_info.io_function := io_function;

    iop$disk_request (request_info, buffer_descriptor, length, device_address, status);

  PROCEND iop$device_io;
?? OLDTITLE ??
MODEND iom$device_io;
