PROCEDURE dum$display_monitor_faults, display_monitor_fault, dismf (
  core_debugger, cd: boolean = false
  output, o: file = $output
  status)

  " This procedure displays the current tasks monitor faults.
  " If the task is in the system core debugger then the
  " core_debugger_parameter should be specified as TRUE
  "  This requires accessed to debug tables for module tmm$dispatcher and
  " sym$debug if core_debugger=true

  crev segment_access_fault k=string d=1..11
  set_file_attributes output fc=legible pf=continuous pw=78
  segment_access_fault(1) = 'mmc$sac_read_beyond_eoi'
  segment_access_fault(2) = 'mmc$sac_read_write_beyond_msl'
  segment_access_fault(3) = 'mmc$sac_segment_access_error'
  segment_access_fault(4) = 'mmc$sac_key_lock_violation'
  segment_access_fault(5) = 'mmc$sac_ring_violation'
  segment_access_fault(6) = 'mmc$sac_io_read_error'
  segment_access_fault(7) = 'mmc$sac_no_append_permission'
  segment_access_fault(8) = 'mmc$sac_tape_system_failure'
  segment_access_fault(9) = 'mmc$sac_file_server_terminated'
  segment_access_fault(10) = 'mmc$sac_pf_space_limit_exceeded'
  segment_access_fault(11) = 'mmc$sac_tf_space_limit_exceeded'

  current = $current_module
  IF core_debugger THEN
    chadm sym$debug
    p_monitor_faults = $pv(^monitor_faults)
    chadm m=tmm$dispatcher
  ELSE
    chadm m=tmm$dispatcher
    xcb = 0
    dum$get_xcb xcb
    p_monitor_faults = $pv(^?xcb.ost$execution_control_block.monitor_faults)
  IFEND
  "dispv ?p_monitor_faults.tmt$monitor_fault_buffer  o=output
  faults_present = 0
  FOR fault = $pv(lowervalue(0.tmt$monitor_fault_buffers)) TO $pv(uppervalue(0.tmt$monitor_fault_buffers)) DO
    IF $pv(?p_monitor_faults.tmt$monitor_fault_buffer.present[?fault]) THEN
      faults_present = faults_present + 1
      pva = $pv(?p_monitor_faults.tmt$monitor_fault_buffer.buffer[?fault].pva.seg)
      pva = pva*100000000(16)
      pva = pva + $pv(?p_monitor_faults.tmt$monitor_fault_buffer.buffer[?fault].pva.offset)
      disv ' pva '//pva//' '//$trim($module(pva))//' '//$section(pva) o=output.$eoi
      dispv ?p_monitor_faults.tmt$monitor_fault_buffer.buffer[?fault] o=output.$eoi
      IF $pv(?p_monitor_faults.tmt$monitor_fault_buffer.buffer[?fault].identifier) = ..
            mmc$segment_fault_processor_id THEN
        identifier = $pv(..
              ?p_monitor_faults.tmt$monitor_fault_buffer.buffer[?fault].segment_access_fault.identifier)
        IF (identifier >=1) AND (identifier <= 11) THEN
          disv '   -  '//segment_access_fault(identifier) o=output.$eoi
        ELSE
          disv '    - Unrecogized segment fault ' o=output.$eoi
        IFEND
      IFEND
    IFEND
  FOREND
  IF faults_present = 0 THEN
    disv ' No faults present ' o=output.$eoi
  IFEND
  chadm current

PROCEND dum$display_monitor_faults
