
PROC dum$analyze_page_table, analyze_page_table, anapt (
  output, o: file = $output
  status)

  crev stat status
  crev field_offset integer
  crev field_length integer
  delf out status=stat
  setfa out fc=list

  ptl = $mem($sa(mmv$pt_length) 8)
  pft = $mem($sa(mmv$pft_p) 6)
  pft_entry_size = $mem($sa(mmv$pft_p)+14 4)
  pftlb = $mem($sa(mmv$pft_p)+10 4)
  pftub = ($mem($sa(mmv$pft_p)+6 4) / pft_entry_size) + pftlb - 1
  pft = pft - pft_entry_size * pftlb

  mmt$page_frame_table_entry field=pti offset=field_offset length=field_length
  pti_offset = field_offset / 8
  mmt$page_frame_table_entry field=sva offset=field_offset length=field_length
  sva_offset = field_offset / 8

  putl ' ANALYZE PAGE TABLE ' o=out.$eoi
  FOR i = 0 TO ptl - 1 DO
    asid = $mem(i*8 3) / 16
    asid = asid - (asid / 10000(16)) * 10000(16)
    IF (asid <> 0) THEN
      pfti = $mod($mem(i*8+5 3) 400000(16)) * 512 / $mem($sa(osv$page_size) 3)
      IF (pfti >= pftlb) AND (pfti <= pftub) THEN
        IF $mem(pft+pft_entry_size*pfti+pti_offset 3) <> i THEN
          putl 'Bad pft index at pfti = '//$strrep(pfti 16)//', pti = '//$strrep(i 16) o=out.$eoi
        IFEND
        IF $mem(pft+pft_entry_size*pfti+sva_offset 2) <> asid THEN
          putl 'Bad ASID at pfti = '//$strrep(pfti 16)//', ASID = '//$strrep(asid 16) o=out.$eoi
        IFEND
      IFEND
    IFEND
  FOREND
  copf out $value(output)

PROCEND dum$analyze_page_table

