#!/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]))