summaryrefslogtreecommitdiffstats
path: root/tools/ghidra/gsp-fwimage-570.144/scripts/DecompileFunctions.java
diff options
context:
space:
mode:
authorOpen-IOV <dev@open-iov.org>2026-09-23 05:44:08 -0400
committerOpen-IOV <dev@open-iov.org>2026-09-23 05:46:43 -0400
commit68cdd7728a7cc6715bbbff7decfe2b11c3bdf558 (patch)
tree3dc8ce2e6af313a97ec6852f5c663a9a93665d2e /tools/ghidra/gsp-fwimage-570.144/scripts/DecompileFunctions.java
downloadopen-iov-68cdd7728a7cc6715bbbff7decfe2b11c3bdf558.tar.gz
open-iov-68cdd7728a7cc6715bbbff7decfe2b11c3bdf558.zip
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.
Diffstat (limited to 'tools/ghidra/gsp-fwimage-570.144/scripts/DecompileFunctions.java')
-rw-r--r--tools/ghidra/gsp-fwimage-570.144/scripts/DecompileFunctions.java88
1 files changed, 88 insertions, 0 deletions
diff --git a/tools/ghidra/gsp-fwimage-570.144/scripts/DecompileFunctions.java b/tools/ghidra/gsp-fwimage-570.144/scripts/DecompileFunctions.java
new file mode 100644
index 0000000..da522cd
--- /dev/null
+++ b/tools/ghidra/gsp-fwimage-570.144/scripts/DecompileFunctions.java
@@ -0,0 +1,88 @@
+import ghidra.app.script.GhidraScript;
+import ghidra.program.model.address.Address;
+import ghidra.program.model.listing.Function;
+import ghidra.program.model.listing.FunctionManager;
+import ghidra.app.decompiler.DecompInterface;
+import ghidra.app.decompiler.DecompileResults;
+import ghidra.util.task.TaskMonitor;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.PrintWriter;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public class DecompileFunctions extends GhidraScript {
+ private static final String OUTPUT_DIR = "/home/rmcore/Git/integdev_gpu_drv/open-iov/firmware/570-GSP/decompiled/";
+
+ @Override
+ protected void run() throws Exception {
+ File outDir = new File(OUTPUT_DIR);
+ if (!outDir.exists()) {
+ outDir.mkdirs();
+ }
+
+ String[] args = getScriptArgs();
+ if (args.length == 0) {
+ println("No addresses provided. Usage: <addr1>,<addr2>,...");
+ return;
+ }
+
+ Set<Address> targetAddresses = new HashSet<>();
+ for (String arg : args) {
+ String[] addrs = arg.split(",");
+ for (String addrStr : addrs) {
+ addrStr = addrStr.trim();
+ if (addrStr.startsWith("0x")) {
+ addrStr = addrStr.substring(2);
+ }
+ Address addr = toAddr(addrStr);
+ if (addr != null) {
+ targetAddresses.add(addr);
+ println("Target: " + addr);
+ }
+ }
+ }
+
+ FunctionManager fm = currentProgram.getFunctionManager();
+ DecompInterface decompiler = new DecompInterface();
+ decompiler.openProgram(currentProgram);
+
+ for (Address addr : targetAddresses) {
+ Function func = fm.getFunctionAt(addr);
+ if (func == null) {
+ println("No function at " + addr + ", creating...");
+ func = createFunction(addr, null);
+ }
+ if (func != null) {
+ decompileAndSave(func, decompiler);
+ } else {
+ println("Failed to create function at " + addr);
+ }
+ }
+
+ decompiler.dispose();
+ }
+
+ private void decompileAndSave(Function func, DecompInterface decompiler) throws Exception {
+ String name = func.getName();
+ Address entry = func.getEntryPoint();
+ String safeName = name.replaceAll("[^a-zA-Z0-9_]", "_");
+ File outFile = new File(OUTPUT_DIR, safeName + "_" + entry.toString().replace(":", "_") + ".c");
+
+ DecompileResults results = decompiler.decompileFunction(func, 60, TaskMonitor.DUMMY);
+ if (results.decompileCompleted()) {
+ String code = results.getDecompiledFunction().getC();
+ try (PrintWriter pw = new PrintWriter(new FileWriter(outFile))) {
+ pw.println("// Function: " + name);
+ pw.println("// Address: " + entry);
+ pw.println("// Size: " + func.getBody().getNumAddresses() + " bytes");
+ pw.println();
+ pw.print(code);
+ }
+ println("Decompiled: " + name + " @ " + entry + " -> " + outFile.getName());
+ } else {
+ println("Decompilation failed for " + name + " @ " + entry + ": " + results.getErrorMessage());
+ }
+ }
+} \ No newline at end of file