mirror of
https://git.k-space.ee/arti/vt1200.git
synced 2026-10-30 12:03:54 +02:00
checkpoint: VT1200 reverse-engineering workspace before board-model work
This commit is contained in:
commit
acb92d3e44
325 files changed
+951894
No files matched your search
@@ -0,0 +1,72 @@
|
||||
// Assert that bit-address pointer constants have been converted to references.
|
||||
// Serves as the failing test for FixPtrConstants.java.
|
||||
//@category VT1200
|
||||
|
||||
import ghidra.app.script.GhidraScript;
|
||||
import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.mem.MemoryBlock;
|
||||
import ghidra.program.model.symbol.Reference;
|
||||
|
||||
public class AssertPtrFix extends GhidraScript {
|
||||
|
||||
// Known constant: 0x3F225CD8 at ROM+0x4A5E -> 'Connection request from user %s on node %s.'
|
||||
private static final long CONST_OFF = 0x4A5EL;
|
||||
private static final long CONST_VAL = 0x3F225CD8L;
|
||||
private static final long TARGET_OFF = 0x4B9BL;
|
||||
|
||||
private int failures = 0;
|
||||
|
||||
private void check(boolean ok, String msg) {
|
||||
println((ok ? "PASS: " : "FAIL: ") + msg);
|
||||
if (!ok) {
|
||||
failures++;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() throws Exception {
|
||||
MemoryBlock rom = null;
|
||||
long best = -1;
|
||||
for (MemoryBlock b : currentProgram.getMemory().getBlocks()) {
|
||||
if (b.isInitialized()) {
|
||||
long len = b.getEnd().getOffset() - b.getStart().getOffset();
|
||||
if (len > best) {
|
||||
best = len;
|
||||
rom = b;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (rom == null) {
|
||||
throw new IllegalStateException("no initialized ROM block");
|
||||
}
|
||||
long base = rom.getStart().getOffset();
|
||||
println(String.format("ROM block base: 0x%08X", base));
|
||||
|
||||
Address from = currentProgram.getAddressFactory().getDefaultAddressSpace()
|
||||
.getAddress(base + CONST_OFF);
|
||||
Address to = currentProgram.getAddressFactory().getDefaultAddressSpace()
|
||||
.getAddress(base + TARGET_OFF);
|
||||
|
||||
byte[] raw = new byte[4];
|
||||
rom.getBytes(from, raw);
|
||||
long value = (raw[0] & 0xFFL) | ((raw[1] & 0xFFL) << 8)
|
||||
| ((raw[2] & 0xFFL) << 16) | ((raw[3] & 0xFFL) << 24);
|
||||
check(value == CONST_VAL,
|
||||
String.format("constant at ROM+0x%X is 0x%08X (got 0x%08X)",
|
||||
CONST_OFF, CONST_VAL, value));
|
||||
|
||||
boolean found = false;
|
||||
for (Reference r : currentProgram.getReferenceManager().getReferencesFrom(from)) {
|
||||
if (r.getToAddress().equals(to)) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
check(found, String.format("reference ROM+0x%X -> ROM+0x%X exists", CONST_OFF, TARGET_OFF));
|
||||
|
||||
if (failures > 0) {
|
||||
throw new AssertionError(failures + " assertion(s) failed");
|
||||
}
|
||||
println("ASSERT: all pointer-fix checks passed");
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user