From 68cdd7728a7cc6715bbbff7decfe2b11c3bdf558 Mon Sep 17 00:00:00 2001 From: Open-IOV Date: Wed, 23 Sep 2026 05:44:08 -0400 Subject: Open-IOV: initial public release Open-IOV virtualizes NVIDIA GPUs so that unmodified guest drivers run with real GPU functionality - CUDA first, 3D and video to follow - on unmodified hosts, without a proprietary vGPU license and without patching any driver, firmware or hypervisor. Core principle: emulate the interface, pass through the work. kernel/ open-iov-vfio.ko - host VFIO mdev driver: virtual GPU device (PCI config space, BAR shadows, MSI-X), GSP boot emulation, GSP-RM message-queue/RPC emulation, memory model (GPU-VA to guest-PA discovery) and the semaphore-completion service that advances guest UVM progress. userspace/ libiov.so management API and examples. tools/ guest diagnostics, firmware analysis wrappers, RM probes. scripts/ stack manager, VM harness, build/load/test automation. config/ hardware/version profiles (the portability surface). docs/ documentation tree - start at docs/README.md. wiki/ long-form firmware and protocol deep dives. Status: initialization works end to end for a stock 570.144 Linux guest on Turing (TU104): driver probe, nvidia-smi, the full GSP-RM control battery, object creation and the early CUDA/UVM start-up path. GPU work forwarding - the step that makes CUDA kernels execute on real hardware - is the active work item; see docs/04-implementation/01-known-knowns-and-unknowns.md. License: BSD-3-Clause for the project; GPL-2.0 for kernel modules that link GPL-only kernel interfaces. See LICENSE and docs/09-reference/legal-and-licensing.md. --- tools/ghidra/analyze_gsp_firmware.sh | 97 ++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100755 tools/ghidra/analyze_gsp_firmware.sh (limited to 'tools/ghidra/analyze_gsp_firmware.sh') diff --git a/tools/ghidra/analyze_gsp_firmware.sh b/tools/ghidra/analyze_gsp_firmware.sh new file mode 100755 index 0000000..b2e40d5 --- /dev/null +++ b/tools/ghidra/analyze_gsp_firmware.sh @@ -0,0 +1,97 @@ +#!/bin/bash +# Full GSP firmware analysis pipeline +# Usage: ./analyze_gsp_firmware.sh [output_dir] + +set -euo pipefail + +FIRMWARE_BIN="${1:-~/Git/nvidia-linux-firmware/nvidia/tu102/gsp/gsp-570.144.bin}" +OUTPUT_DIR="${2:-/home/rmcore/Git/integdev_gpu_drv/open-iov/firmware/570-GSP}" +PROJECT_DIR="/home/rmcore/Git/integdev_gpu_drv/open-iov/tools/ghidra/gsp-tu104-570.144" +PROJECT_NAME="gsp-tu104-570.144" + +FIRMWARE_BIN=$(eval echo $FIRMWARE_BIN) + +echo "=== GSP Firmware Analysis Pipeline ===" +echo "Firmware: $FIRMWARE_BIN" +echo "Output: $OUTPUT_DIR" +echo "Project: $PROJECT_DIR/$PROJECT_NAME" +echo "" + +# Step 1: Extract .fwimage section +echo "Step 1: Extracting .fwimage section..." +FWIMAGE_BIN="$OUTPUT_DIR/gsp-570.144.fwimage.bin" +objcopy -O binary -j .fwimage "$FIRMWARE_BIN" "$FWIMAGE_BIN" +echo " Saved to $FWIMAGE_BIN ($(stat -c%s "$FWIMAGE_BIN") bytes)" + +# Step 2: Extract version +echo "Step 2: Extracting version..." +VERSION=$(readelf -x .fwversion "$FIRMWARE_BIN" | grep -A1 "Hex dump" | tail -1 | awk '{print $2$3$4$5}' | xxd -r -p) +echo " Version: $VERSION" +echo "$VERSION" > "$OUTPUT_DIR/gsp_version.txt" + +# Step 3: Extract signatures +echo "Step 3: Extracting signatures..." +for i in 0 1 2; do + objcopy -O binary -j ".fwsignature$i" "$FIRMWARE_BIN" "$OUTPUT_DIR/gsp-570.144.fwsignature$i.bin" 2>/dev/null || true +done + +# Step 4: Create Ghidra project for ELF container +echo "Step 4: Creating Ghidra project for ELF container..." +/snap/ghidra/47/ghidra/support/analyzeHeadless "$PROJECT_DIR" "$PROJECT_NAME" \ + -import "$FIRMWARE_BIN" \ + -processor "RISCV:LE:64:default" \ + -cspec "gcc" \ + -overwrite \ + -scriptPath "$PROJECT_DIR/scripts" \ + -postScript "extract_fwimage.py" + +# Step 5: Create Ghidra project for .fwimage binary +echo "Step 5: Creating Ghidra project for .fwimage binary..." +FWIMAGE_PROJECT_DIR="/home/rmcore/Git/integdev_gpu_drv/open-iov/tools/ghidra/gsp-fwimage-570.144" +FWIMAGE_PROJECT_NAME="gsp-fwimage-570.144" +mkdir -p "$FWIMAGE_PROJECT_DIR/scripts" +cp "$PROJECT_DIR/scripts/analyze_gsp_fwimage.py" "$FWIMAGE_PROJECT_DIR/scripts/" + +/snap/ghidra/47/ghidra/support/analyzeHeadless "$FWIMAGE_PROJECT_DIR" "$FWIMAGE_PROJECT_NAME" \ + -import "$FWIMAGE_BIN" \ + -processor "RISCV:LE:64:default" \ + -cspec "gcc" \ + -overwrite \ + -scriptPath "$FWIMAGE_PROJECT_DIR/scripts" \ + -postScript "analyze_gsp_fwimage.py" + +# Step 6: Also analyze bootloader and booter +echo "Step 6: Analyzing bootloader and booter..." +BOOTLOADER_BIN="$OUTPUT_DIR/bootloader-570.144.bin" +BOOTER_LOAD_BIN="$OUTPUT_DIR/booter_load-570.144.bin" +BOOTER_UNLOAD_BIN="$OUTPUT_DIR/booter_unload-570.144.bin" + +cp ~/Git/nvidia-linux-firmware/nvidia/tu102/gsp/bootloader-570.144.bin "$BOOTLOADER_BIN" +cp ~/Git/nvidia-linux-firmware/nvidia/tu102/gsp/booter_load-570.144.bin "$BOOTER_LOAD_BIN" +cp ~/Git/nvidia-linux-firmware/nvidia/tu102/gsp/booter_unload-570.144.bin "$BOOTER_UNLOAD_BIN" + +for name in bootloader booter_load booter_unload; do + bin_file="$OUTPUT_DIR/${name}-570.144.bin" + proj_dir="/home/rmcore/Git/integdev_gpu_drv/open-iov/tools/ghidra/gsp-${name}-570.144" + proj_name="gsp-${name}-570.144" + mkdir -p "$proj_dir/scripts" + cp "$PROJECT_DIR/scripts/analyze_gsp_fwimage.py" "$proj_dir/scripts/analyze_${name}.py" + + # Modify script for raw binary + sed -i 's/program = getCurrentProgram()/program = getCurrentProgram()\n# Raw binary - set base address to 0/' "$proj_dir/scripts/analyze_${name}.py" + + /snap/ghidra/47/ghidra/support/analyzeHeadless "$proj_dir" "$proj_name" \ + -import "$bin_file" \ + -processor "RISCV:LE:64:default" \ + -cspec "gcc" \ + -overwrite \ + -scriptPath "$proj_dir/scripts" \ + -postScript "analyze_${name}.py" 2>&1 | tail -20 +done + +echo "" +echo "=== Analysis Complete ===" +echo "Results in: $OUTPUT_DIR" +echo "" +echo "Key files:" +ls -la "$OUTPUT_DIR"/*.json "$OUTPUT_DIR"/*.txt "$OUTPUT_DIR"/*.c 2>/dev/null | head -20 \ No newline at end of file -- cgit v1.2.3