diff options
| author | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-09-23 07:05:45 -0400 |
|---|---|---|
| committer | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-09-23 07:05:45 -0400 |
| commit | 2aafde5cc3679020d8b31277c03d70fd6908384c (patch) | |
| tree | a3d89236459b5586e5a4d0c3b2b1b574fbfb274b /userspace/cuda/570.144/scripts/ghidra_decompile.sh | |
| parent | 7fdbe8713c8cf746cd1a15e93e0de39d333905c7 (diff) | |
| download | open-iov-2aafde5cc3679020d8b31277c03d70fd6908384c.tar.gz open-iov-2aafde5cc3679020d8b31277c03d70fd6908384c.zip | |
userspace/cuda: libcuda analysis tree (debug-focused), guest ioctl tracer
Analysis tooling for debugging CUDA execution in Open-IOV guests:
- userspace/cuda/570.144/: fetch a library from a running guest (nc),
objdump helpers, crash ip -> file vaddr + symbol mapping, and Ghidra
headless import/analysis/decompile scripts (project kept so single
functions decompile in seconds). The purpose is debugging correctness
and performance of CUDA in Open-IOV VMs (not a reimplementation);
extracted binaries and decompiled output are gitignored.
- tools/guest-diag/ioctl_trace.c: ptrace tracker for the NVIDIA driver
ioctls of a child (libcuda issues raw syscalls, so LD_PRELOAD sees
nothing). Decodes RM_ALLOC (class) and RM_CONTROL (cmd) arguments;
this is how the cuCtxCreate crash sequence was captured.
- tools/test/cuda_drv_test.c: unbuffered + per-call markers so a crash
identifies the CUDA call it happened in.
Diffstat (limited to 'userspace/cuda/570.144/scripts/ghidra_decompile.sh')
| -rwxr-xr-x | userspace/cuda/570.144/scripts/ghidra_decompile.sh | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/userspace/cuda/570.144/scripts/ghidra_decompile.sh b/userspace/cuda/570.144/scripts/ghidra_decompile.sh new file mode 100755 index 0000000..bf95e8c --- /dev/null +++ b/userspace/cuda/570.144/scripts/ghidra_decompile.sh @@ -0,0 +1,43 @@ +#!/bin/bash +# SPDX-License-Identifier: BSD-3-Clause +# +# ghidra_decompile.sh - decompile the function containing a file vaddr. +# +# Runs Ghidra headless with -noanalysis: the program is imported, the crash +# address is disassembled and turned into a function on demand, then +# decompiled. That avoids a full auto-analysis pass over a ~70 MB library. +# +# Usage: scripts/ghidra_decompile.sh <binary> <hex-vaddr> [outfile] +# env: GHIDRA_HOME (default: /snap/ghidra/current/ghidra) +# PROJECT_DIR (default: ../run/ghidra-proj) +# +# Output: run/<basename>_<vaddr>.c unless outfile is given. +set -e + +HERE="$(cd "$(dirname "$0")" && pwd)" +ROOT="$(cd "$HERE/.." && pwd)" +RUN="$ROOT/run" +BIN="${1:?usage: $0 <binary> <hex-vaddr> [outfile]}" +VADDR="${2:?usage: $0 <binary> <hex-vaddr> [outfile]}" +OUT="${3:-$RUN/$(basename "$BIN")_${VADDR}.c}" + +GHIDRA_HOME="${GHIDRA_HOME:-/snap/ghidra/current/ghidra}" +ANALYZE="$GHIDRA_HOME/support/analyzeHeadless" +PROJECT_DIR="${PROJECT_DIR:-$RUN/ghidra-proj}" +PROJECT_NAME="${PROJECT_NAME:-cuda-analysis}" + +[ -x "$ANALYZE" ] || { echo "analyzeHeadless not found at $ANALYZE"; exit 1; } +mkdir -p "$PROJECT_DIR" "$RUN" + +echo "[*] decompiling $BIN at $VADDR -> $OUT" +"$ANALYZE" "$PROJECT_DIR" "$PROJECT_NAME" \ + -import "$BIN" \ + -overwrite \ + -noanalysis \ + -scriptPath "$ROOT/ghidra" \ + -postScript DecompileAt.java "$VADDR" "$OUT" \ + -deleteProject \ + 2>&1 | tail -5 + +[ -f "$OUT" ] || { echo "[FAIL] no output produced"; exit 1; } +echo "[ok] $OUT" |
