diff options
| author | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-09-29 09:29:02 -0400 |
|---|---|---|
| committer | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-09-29 09:29:02 -0400 |
| commit | 6135508cc3b043c35d2e0617870f35b18b29b79c (patch) | |
| tree | 94d76962949c03ad0e27ec411da8ad5c9b4e818f /tools/guest-diag/scanerr.py | |
| parent | 9e07277c87351e193f1c03daddb81ba7a76d0745 (diff) | |
| download | open-iov-6135508cc3b043c35d2e0617870f35b18b29b79c.tar.gz open-iov-6135508cc3b043c35d2e0617870f35b18b29b79c.zip | |
tools: cuda_cycle.sh - one-command CUDA bring-up attempt
Restart the VM, push the guest tools, start cdt holding on failure, wait
for the 20 GR channels, register/pin the completion counters and arm
scanerr.py, so each iteration is a single command. scanerr now loops over
scanner hits until a hit carries a non-zero RM error record.
Diffstat (limited to 'tools/guest-diag/scanerr.py')
| -rwxr-xr-x | tools/guest-diag/scanerr.py | 48 |
1 files changed, 27 insertions, 21 deletions
diff --git a/tools/guest-diag/scanerr.py b/tools/guest-diag/scanerr.py index c3af2f5..96c4170 100755 --- a/tools/guest-diag/scanerr.py +++ b/tools/guest-diag/scanerr.py @@ -1,8 +1,8 @@ # gdb script: at the libcuda error-scanner entry (FUN_0054fa00), walk the # context list and dump every non-zero RM error record (magic words, -# errorClass at +0x8, shorts at +0xc/+0xe). This names the source of a -# forced 999: the scanner returns 999 when param_2 != 0 and any record's -# class fields are non-zero. +# errorClass at +0x8, shorts at +0xc/+0xe). The scanner is called often with +# a zeroed record; keep going until a hit has a non-zero record (that is the +# one a forced 999 comes from) and print it with a backtrace. # Run: sudo gdb -p <cdt-pid> -batch -x /tmp/scanerr.py import gdb @@ -20,11 +20,6 @@ if base is None: gdb.execute("set pagination off") gdb.execute("set confirm off") gdb.execute("break *0x%x" % (base + 0x44fa00)) -try: - gdb.execute("continue") -except gdb.error as e: - print("CONTINUE %s" % e) -print("HIT") def rd64(a): @@ -41,12 +36,21 @@ def rd32(a): return None -try: - p1 = int(gdb.parse_and_eval("$rdi")) & 0xffffffffffffffff - p2 = int(gdb.parse_and_eval("$rsi")) & 0xffffffff - print("param_1=0x%x param_2=%d" % (p1, p2)) +for hit in range(400): + try: + gdb.execute("continue") + except gdb.error as e: + print("CONTINUE_END %s" % e) + break + try: + p1 = int(gdb.parse_and_eval("$rdi")) & 0xffffffffffffffff + p2 = int(gdb.parse_and_eval("$rsi")) & 0xffffffff + except Exception: + print("REGS_GONE") + break pl = rd64(p1) n = 0 + found = 0 while pl and n < 64: mgr = rd64(pl + 0x1291 * 8) if mgr: @@ -56,18 +60,20 @@ try: if rec: vals = [rd32(rec + i) or 0 for i in range(0, 0x28, 4)] if any(vals): - print("ENTRY %d ctx=0x%x mgr=0x%x rec=0x%x rec=%s" % - (n, pl, mgr, rec, + print("HIT %d param_2=%d ENTRY %d ctx=0x%x mgr=0x%x rec=0x%x rec=%s" % + (hit, p2, n, pl, mgr, rec, ' '.join('0x%08x' % v for v in vals))) + found = 1 pl = rd64(pl + 0x128e * 8) n += 1 - print("WALKED %d" % n) -except Exception as e: - print("dump_fail %s" % e) -try: - gdb.execute("bt 8", to_string=True) -except Exception: - pass + if found: + print("FOUND") + try: + print(gdb.execute("bt 12", to_string=True)) + except Exception: + pass + break +print("DONE") try: gdb.execute("detach") except Exception: |
