#!/usr/bin/env python3 # pdbtick.py - content-locate the GR0 ring page (deterministic first three # GPFIFO entries) in the guest RAM file, then hand the verified # {ring VA -> ring PA} pair to the service (sema_pdb_discover), which # verifies the parked COPY_SERVER_PDES candidates and falls back to the # vidmem walk-root sweep. Runs while the client is alive. import mmap, struct, subprocess, sys, threading, time F = "/dev/shm/vgpu-guest-ram" PARAM = "/sys/module/vgsp/parameters/sema_pdb_discover" PAT = struct.pack("= 0: with lock: res.append(off + i) i = d.find(PAT, i + 1) off += CH - 64 ts = [] for k in range(nthr): a = k * step b = (k + 1) * step if k < nthr - 1 else size t = threading.Thread(target=worker, args=(a, b)); t.start(); ts.append(t) for t in ts: t.join() if not res: print("RING NOT FOUND") return None hits = [gpa_of(x) for x in res] print("ring candidates:", [hex(h) for h in hits], flush=True) for gpa in hits: cmd = "echo 0x%x,0x%x > %s" % (RING_VA, gpa, PARAM) r = subprocess.run(["sudo", "sh", "-c", cmd], capture_output=True) print("sema_pdb_discover 0x%x,0x%x rc=%d" % (RING_VA, gpa, r.returncode), flush=True) return hits def loop(): import time as _t dur = float(sys.argv[1]) if len(sys.argv) > 1 else 120 end = _t.time() + dur fired = set() while _t.time() < end: hits = main() if hits: new = [h for h in hits if h not in fired] if new: fired.update(new) _t.sleep(1.0) print("# pdbtick end", flush=True) loop()