#!/usr/bin/env python3 # r674: find every reference to the push VA 0x4480000 and follow RM structures # (direct-map pointers: PA = ptr - page_offset_base) toward a page list. import numpy as np, struct, os, time, sys RAM="/dev/shm/vgpu-guest-ram" VA=0x4480000 BASE=0xffff8916c0000000 # r674 page_offset_base (from dmesg rebuild #15) img=open(RAM,"rb"); fsz=os.path.getsize(RAM) def gpa2off(pa): if pa<0x80000000: return pa if pa<0x180000000: return 0x80000000+(pa-0x100000000) return None def off2gpa(off): return off if off<0x80000000 else 0x100000000+(off-0x80000000) def rd(pa,n): off=gpa2off(pa) if off is None or off+n>fsz: return None img.seek(off); return img.read(n) def ptr2pa(v): if BASE<=v=8 page-aligned RAM PAs ascending/descending) runs=[]; cur=[] for oo in range(0,0xff8,8): vv=struct.unpack_from("=8: runs.append(cur) cur=[] if len(cur)>=8: runs.append(cur) if runs: print(" ptr +0x%03x -> pa=0x%x has %d PA-run(s):" % (o,pa&~0xfff,len(runs))) for r in runs[:4]: print(" run at +0x%x: %d pages first=0x%x last=0x%x" % (r[0][0],len(r),r[0][1],r[-1][1]))