summaryrefslogtreecommitdiffstats
path: root/tools/guest-diag/wall2/t104.py
blob: 5a4c059ecdb289f77f3a2dc0c3ac7c2b27d54179 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import gdb, time
gr = gdb.execute
inf = gdb.selected_inferior()
pid = inf.pid
base = None
for line in open("/proc/%d/maps" % pid):
    parts = line.split()
    try:
        lo, hi = [int(x,16) for x in parts[0].split('-')]
    except Exception:
        continue
    if base is None and "libnvidia-eglcore" in line and int(parts[2],16) == 0:
        base = lo
print("BASE 0x%x PID %d" % (base or 0, pid), flush=True)
def u64(a): return int(gdb.parse_and_eval("*(unsigned long*)0x%x" % a))
def u32(a): return int(gdb.parse_and_eval("*(unsigned int*)0x%x" % a))
state = {"chits":0, "cleared":0, "t0":time.time(), "last":time.time()}
class BC(gdb.Breakpoint):
    def __init__(self):
        super().__init__("*0x%x" % (base + 0xB33D30), internal=False)
        self.silent = True
    def stop(self):
        state["chits"] += 1
        try:
            obj = int(gdb.parse_and_eval("$rdi"))
            n = int(gdb.parse_and_eval("$rsi"))
            cnt = u32(obj + 0x22efc)
            for i in range(0, min(cnt, 32)):
                p = u64(obj + 0x1428 + i*8)
                if not p:
                    continue
                tgt = p + n * 0x10
                try:
                    v16 = int(gdb.parse_and_eval("*(unsigned short*)0x%x" % (tgt + 0xe)))
                    if v16 == 0xffff:
                        gr("set {unsigned short}0x%x = 0" % (tgt + 0xe))
                        gr("set {unsigned int}0x%x = 0" % tgt)
                        gr("set {unsigned short}0x%x = 0" % (tgt + 0xc))
                        state["cleared"] += 1
                        state["last"] = time.time()
                        print("CLEAR#%d obj=0x%x n=0x%x tgt=0x%x" % (state["cleared"], obj, n, tgt), flush=True)
                except Exception:
                    pass
        except Exception:
            pass
        if state["cleared"] >= 8 or state["chits"] >= 40 or (time.time() - state["last"]) > 25.0:
            self.enabled = False
            print("BC-EXIT cleaned=%d chits=%d" % (state["cleared"], state["chits"]), flush=True)
            return True
        return False
try:
    BC(); print("BPS-SET", flush=True)
    gr("continue")
except Exception as e:
    print("bpfail %s" % e, flush=True)
print("T104-DONE chits=%d cleared=%d" % (state["chits"], state["cleared"]), flush=True)