From 0e72a0a98b930acf48be4ce02ed6d9b9341d0575 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Rasmusson Date: Sun, 25 Oct 2026 18:01:00 -0400 Subject: wall2: pdbtick.py loops (retry content-location + trigger every 1 s); session 117 evidence: the host-triggered pdb anchoring WORKS end-to-end (sema-pdb-disc -> 'VAS 0xfade0002 page directory registered after verified ring walk (pdb=0x109277000 entries=4 ap=1)'), the small GR pushes decode after the anchor (sema-push: h=0xbeec0100 va=0x4ca096c/0x4ca52c0), but the large ones (976/1432/17316 B) still skip after 210-275 rescues and the fence never releases - next: why the multi-page push reads/plausibility fail for the big pushes (the compute dispatch and the tracker), and give the pump a rewind/replay so already-skipped entries re-decode --- tools/guest-diag/wall2/pdbtick.py | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/tools/guest-diag/wall2/pdbtick.py b/tools/guest-diag/wall2/pdbtick.py index 35b9ab8..d65b79d 100644 --- a/tools/guest-diag/wall2/pdbtick.py +++ b/tools/guest-diag/wall2/pdbtick.py @@ -41,15 +41,29 @@ def main(): 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 1 - # prefer the most recently written: check which page's entries beyond the - # first three match this run's full 16-entry sequence; else take the last + print("RING NOT FOUND") + return None hits = [gpa_of(x) for x in res] - print("ring candidates:", [hex(h) for h in hits]) + 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)) - return 0 + print("sema_pdb_discover 0x%x,0x%x rc=%d" % (RING_VA, gpa, r.returncode), flush=True) + return hits -sys.exit(main()) + +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() -- cgit v1.2.3