summaryrefslogtreecommitdiffstats
path: root/tools/ghidra/analyze_gsp_firmware.sh
blob: bf5d4f683ae9641e225d8ac0007e4faedd448420 (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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#!/bin/bash
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) 2026 Open-IOV contributors
# Full GSP firmware analysis pipeline
# Usage: ./analyze_gsp_firmware.sh <firmware_bin> [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