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
|
# 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
|