
PROC dum$analyze_page_frame_table, analyze_page_frame_table, anapft (
  output, o: file = $output
  status)

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

  pft_entry_size = $mem($sa(mmv$pft_p)+14 4)
  pagesize = $mem($sa(osv$page_size) 3)
  pftlb = $mem($sa(mmv$pft_p)+10 4)
  pftub = ($mem($sa(mmv$pft_p)+6 4) / pft_entry_size) + pftlb - 1
  pft = $mem($sa(mmv$pft_p) 6)-pftlb*pft_entry_size

  mmt$page_frame_table_entry field=queue_id offset=field_offset length=field_length
  queue_id_offset = field_offset / 8
  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 FRAME TABLE ' o=out.$eoi
  FOR pfti = pftlb to pftub do
    pftp = pft+pft_entry_size*pfti
    queueid = $mem(pftp+queue_id_offset 1)
    pti = $mem(pftp+pti_offset 3)
    ptasid = $mem(pti*8 3) / 16
    ptasid = ptasid - (ptasid / 10000(16)) * 10000(16)
    ptpfti = $mem(pti*8+5 3)
    ptpfti = (ptpfti - (ptpfti / 400000(16)) * 400000(16))*512/pagesize
    pftasid = $mem(pftp+sva_offset 2)

    IF queueid = 0 THEN
      IF pftasid <> 0 then
        putl ' Non-zero ASID in PFT entry in free queue, PFTI = '//$strrep(pfti 16) o=out.$eoi
      IFEND
      IF (ptasid <> 0) AND (ptpfti = pfti) then
        putl ' PT entry still exists but PFT entry in free queue, PFTI = '//$strrep(pfti 16) o=out.$eoi
      IFEND
    ELSEIF pftasid <> 0 THEN
      pftoffset = $mem(pftp+sva_offset+2 4)
      ptoffset = $mem(pti*8+1 7)/400000(16)
      ptoffset = (ptoffset - (ptoffset/400000(16)) * 400000(16)) * 512
      IF (ptasid <> pftasid) OR (ptpfti <> pfti) OR (ptoffset <> pftoffset) THEN
        putl ' PFT/PT mismatch at PFTI = '//$strrep(pfti 16) o=out.$eoi
"       disv (ptasid pftasid ptpfti pfti ptoffset pftoffset) "
      IFEND
    IFEND
  FOREND
  copf out $value(output)

PROCEND dum$analyze_page_frame_table

