import gdb gr = gdb.execute def u32(a): return int(gdb.parse_and_eval("*(unsigned int*)0x%x" % a)) def u64(a): return int(gdb.parse_and_eval("*(unsigned long*)0x%x" % a)) state = {"hits": {}} class HB(gdb.Breakpoint): def __init__(self, pa, tag, quiet_after=8): super().__init__("*0x%x" % pa, type=gdb.BP_BREAKPOINT, internal=False) self.tag = tag self.quiet_after = quiet_after self.silent = True def stop(self): n = state["hits"].get(self.tag, 0) + 1 state["hits"][self.tag] = n try: rdi = int(gdb.parse_and_eval("$rdi")) rsi = int(gdb.parse_and_eval("$rsi")) rdx = int(gdb.parse_and_eval("$rdx")) rcx = int(gdb.parse_and_eval("$rcx")) r8 = int(gdb.parse_and_eval("$r8")) r9 = int(gdb.parse_and_eval("$r9")) if n <= self.quiet_after or self.tag in ("PRED", "COMPR"): print("HIT %s #%d rdi=0x%x rsi=0x%x rdx=0x%x rcx=0x%x r8=0x%x r9=0x%x" % (self.tag, n, rdi, rsi, rdx, rcx, r8, r9), flush=True) except Exception as e: print("err", e, flush=True) return False HB(0xffffffffc0c403b0, "VIDH") HB(0xffffffffc0d667a0, "PMA", 4) HB(0xffffffffc0d6ae30, "PRED") HB(0xffffffffc0d57d60, "COMPR", 16) HB(0xffffffffc0d607f0, "SCRUB", 4) print("HB-SET", flush=True) gr("continue") print("T112B-DONE %s" % state["hits"], flush=True)