Phase A: DSP FFT plan ID (radix 2/3/5, 1/N inv scale), dispatch-kernel dumps
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
import ghidra.app.script.GhidraScript;
|
||||
import ghidra.app.decompiler.DecompInterface;
|
||||
import ghidra.app.decompiler.DecompileResults;
|
||||
import ghidra.program.model.listing.Function;
|
||||
import ghidra.program.model.listing.FunctionManager;
|
||||
import ghidra.program.model.listing.Instruction;
|
||||
import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.address.AddressSpace;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.BufferedWriter;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Decompile a specific list of addresses given in the FIRST line of a file
|
||||
* (comma-separated hex). Includes tiny functions. Writes C into an output file.
|
||||
*/
|
||||
public class DumpList extends GhidraScript {
|
||||
|
||||
@Override
|
||||
public void run() throws Exception {
|
||||
long LO = 0x180000000L;
|
||||
long HI = 0x182c00000L;
|
||||
String listFile = System.getProperty("DumpList.list",
|
||||
"/home/m/re-tools/focus_list.txt");
|
||||
String outFile = System.getProperty("DumpList.out",
|
||||
"/home/m/re-tools/focus_decomp.txt");
|
||||
|
||||
Set<Long> targets = new LinkedHashSet<>();
|
||||
BufferedReader br = new BufferedReader(new FileReader(listFile));
|
||||
String line;
|
||||
while ((line = br.readLine()) != null) {
|
||||
line = line.trim();
|
||||
if (line.isEmpty()) continue;
|
||||
for (String tok : line.split(",")) {
|
||||
tok = tok.trim();
|
||||
if (tok.isEmpty()) continue;
|
||||
try {
|
||||
targets.add(Long.parseLong(tok.replaceFirst("^0x", ""), 16));
|
||||
} catch (Exception e) { println("bad tok " + tok); }
|
||||
}
|
||||
}
|
||||
br.close();
|
||||
|
||||
FunctionManager fm = currentProgram.getFunctionManager();
|
||||
AddressSpace as = currentProgram.getAddressFactory().getDefaultAddressSpace();
|
||||
DecompInterface di = new DecompInterface();
|
||||
di.openProgram(currentProgram);
|
||||
|
||||
PrintWriter pw = new PrintWriter(new java.io.BufferedWriter(
|
||||
new FileWriter(outFile, false)));
|
||||
for (long a : targets) {
|
||||
if (a < LO || a > HI) continue;
|
||||
Function f = fm.getFunctionAt(as.getAddress(a));
|
||||
if (f == null) {
|
||||
pw.println("############ NO_FUNCTION 0x" + Long.toHexString(a) + " ############");
|
||||
continue;
|
||||
}
|
||||
DecompileResults res = di.decompileFunction(f, 120, monitor);
|
||||
pw.println("############ FUN_ " + Long.toHexString(a) + " size=" +
|
||||
f.getBody().getNumAddresses() + " ############");
|
||||
if (res != null && res.getDecompiledFunction() != null) {
|
||||
pw.println(res.getDecompiledFunction().getC());
|
||||
} else {
|
||||
pw.println("// decompile failed");
|
||||
}
|
||||
pw.println();
|
||||
}
|
||||
pw.close();
|
||||
di.dispose();
|
||||
println("DUMPLIST_DONE n=" + targets.size());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user