#!/usr/bin/env python3 """Extract ours tid=1 timeline, focused on the final wedge region. Ours wedges by ~1.7s, so we want the FINAL kernel-call sequence ours emits on tid=1 before the wait that wedges. Compare against canary tid=6 at a matching matched-prefix point. """ import json import os from collections import Counter INPUT = "/home/fabi/RE - Project Sylpheed/xenia-rs/audit-runs/phase-w-wedge-reattack/ours-postfix.jsonl" OUTDIR = os.path.dirname(os.path.abspath(__file__)) TARGET_TID = 1 kernel_calls = [] kernel_returns = [] handle_creates = [] thread_events = [] import_calls = [] wait_events = [] other = [] last_idx = -1 last_host_ns = 0 with open(INPUT, "r") as f: for line in f: try: ev = json.loads(line) except json.JSONDecodeError: continue if ev.get("tid") != TARGET_TID: continue kind = ev.get("kind", "") last_idx = ev.get("tid_event_idx", last_idx) last_host_ns = ev.get("host_ns", last_host_ns) if kind == "kernel.call": kernel_calls.append(ev) elif kind == "kernel.return": kernel_returns.append(ev) elif kind == "handle.create": handle_creates.append(ev) elif kind in ("thread.create", "thread.exit"): thread_events.append(ev) elif kind == "import.call": import_calls.append(ev) elif kind in ("wait.begin", "wait.end", "wait.wake"): wait_events.append(ev) else: other.append(ev) print(f"Ours tid={TARGET_TID} total kernel.call: {len(kernel_calls)}") print(f"Ours tid={TARGET_TID} last tid_event_idx: {last_idx}") print(f"Ours tid={TARGET_TID} last host_ns: {last_host_ns} ({last_host_ns/1e9:.3f} s)") call_counts = Counter() for ev in kernel_calls: call_counts[ev["payload"].get("name", "?")] += 1 # Show LAST 100 events on tid=1 to identify the wedge approach. last_evts = [] for ev in kernel_calls + kernel_returns + wait_events + handle_creates + thread_events: last_evts.append((ev["host_ns"], ev["tid_event_idx"], ev["kind"], ev["payload"])) last_evts.sort() last_evts = last_evts[-150:] with open(os.path.join(OUTDIR, "ours-tid1-final-150.csv"), "w") as f: f.write("host_ns,tid_event_idx,kind,name,detail\n") for host_ns, idx, kind, payload in last_evts: name = payload.get("name", "") detail = json.dumps(payload)[:300].replace('"', '""') f.write(f'{host_ns},{idx},{kind},{name},"{detail}"\n') with open(os.path.join(OUTDIR, "ours-tid1-summary"), "w") as f: f.write(f"Ours tid={TARGET_TID} summary\n") f.write(f"\nTotal kernel.call: {len(kernel_calls)}\n") f.write(f"Last tid_event_idx: {last_idx}\n") f.write(f"Last host_ns: {last_host_ns} ({last_host_ns/1e9:.3f} s)\n") f.write(f"\n=== Top kernel.call by frequency ===\n") for name, c in call_counts.most_common(80): f.write(f" {c:6d} {name}\n") f.write(f"\n=== Unique kernel.call names ===\n") f.write(f" {len(call_counts)}\n") print(f"Wrote ours-tid1-final-150.csv") print(f"Wrote ours-tid1-summary")