summaryrefslogtreecommitdiffstats
path: root/tools/guest-diag/bpz7.py
blob: 02f29ed94caa77d238ab48a6172a122e43b8090e (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
57
58
59
60
61
62
63
64
65
66
67
68
69
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) 2026 Open-IOV contributors
# gdb script: split the membar-WAR hook failure into lookup vs ucode-load.
#
# The remap table at file 0x3dc5b80 maps (chip=7,rev=5)->(7,0) (real Turing
# CC7.5), so FUN_0035a4d0(0x13,7,5) should succeed on the static table as it
# does on the host oracle (verified: type 0x13 (7,5) -> non-NULL on the real
# TU104). FUN_005d7e70 then calls FUN_00e21850 to load the blob; either step
# can set 999. Break before/after both calls.
#
# Run: sudo gdb -p <cdt-pid> -batch -x /tmp/bpz7.py
import gdb
import time

out = gdb.execute("info proc mappings", to_string=True)
base = None
for line in out.splitlines():
    if "libcuda" in line and "r-xp" in line:
        f = line.split()
        base = int(f[0], 16) - int(f[3], 16)
        break
print("BASE=0x%x" % (base or 0))
if base is None:
    raise SystemExit

gdb.execute("set pagination off")
gdb.execute("set confirm off")
SITES = [
    (0x4d7eb2, "LOOKUP_CALL"),
    (0x4d7eb7, "LOOKUP_RET"),
    (0x4d7ece, "LOAD_CALL"),
    (0x4d7ed3, "LOAD_RET"),
    (0x4d7ed7, "SET999"),
]
for off, name in SITES:
    gdb.execute("break *0x%x" % (base + off))

t0 = time.time()
for hit in range(30):
    try:
        gdb.execute("continue")
    except gdb.error as e:
        print("CONTINUE_END %s" % e)
        break
    rip = int(gdb.parse_and_eval("$rip")) & 0xffffffffffffffff
    off = rip - base
    name = dict(SITES).get(off, "?")
    try:
        rax = int(gdb.parse_and_eval("$rax")) & 0xffffffffffffffff
        esi = int(gdb.parse_and_eval("$esi")) & 0xffffffff
        edx = int(gdb.parse_and_eval("$edx")) & 0xffffffff
        edi = int(gdb.parse_and_eval("$edi")) & 0xffffffff
    except Exception:
        rax = esi = edx = edi = 0
    print("HIT t=%.3f off=0x%x %s rax=0x%x esi=0x%x edx=0x%x edi=0x%x" %
          (time.time() - t0, off, name, rax, esi, edx, edi))
    if off in (0x4d7eb7, 0x4d7ed3, 0x4d7ed7):
        if (off != 0x4d7eb7 and (rax & 0xffffffff) != 0) or (off == 0x4d7eb7 and rax == 0):
            print("  >>> FAILURE POINT %s" % name)
            try:
                print(gdb.execute("bt 8", to_string=True))
            except Exception as e:
                print("bt_fail %s" % e)
            break

try:
    gdb.execute("detach")
except Exception:
    pass