diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/model/property/TracePropertyMapSpace.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/model/property/TracePropertyMapSpace.java index 762479ce2b..8f0609a25e 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/model/property/TracePropertyMapSpace.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/model/property/TracePropertyMapSpace.java @@ -69,6 +69,20 @@ public interface TracePropertyMapSpace extends TracePropertyMapOperations set(getTrace().getPlatformManager().getHostPlatform(), lifespan, register, value); } + /** + * Get all entries intersecting the given register and lifespan + * + * @param platform the platform defining the register + * @param lifespan the range of snaps + * @param register the register + * @return the entries + */ + default Collection> getEntries(TracePlatform platform, + Lifespan lifespan, Register register) { + AddressRange range = platform.getConventionalRegisterRange(getAddressSpace(), register); + return getEntries(lifespan, range); + } + /** * Get all entries intersecting the given register and lifespan * @@ -78,7 +92,7 @@ public interface TracePropertyMapSpace extends TracePropertyMapOperations */ default Collection> getEntries(Lifespan lifespan, Register register) { - return getEntries(lifespan, TraceRegisterUtils.rangeForRegister(register)); + return getEntries(getTrace().getPlatformManager().getHostPlatform(), lifespan, register); } /** diff --git a/Ghidra/Debug/TaintAnalysis/src/test/java/ghidra/pcode/emu/taint/full/TaintDebuggerPcodeEmulatorTest.java b/Ghidra/Debug/TaintAnalysis/src/test/java/ghidra/pcode/emu/taint/full/TaintDebuggerPcodeEmulatorTest.java index c228304b2d..c8f8a8b942 100644 --- a/Ghidra/Debug/TaintAnalysis/src/test/java/ghidra/pcode/emu/taint/full/TaintDebuggerPcodeEmulatorTest.java +++ b/Ghidra/Debug/TaintAnalysis/src/test/java/ghidra/pcode/emu/taint/full/TaintDebuggerPcodeEmulatorTest.java @@ -15,7 +15,8 @@ */ package ghidra.pcode.emu.taint.full; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.util.Set; @@ -34,7 +35,6 @@ import ghidra.app.services.DebuggerStaticMappingService; import ghidra.debug.api.emulation.DebuggerPcodeMachine; import ghidra.pcode.emu.taint.trace.TaintTracePcodeEmulatorTest; import ghidra.pcode.emu.taint.trace.TaintTracePcodeExecutorStatePiece; -import ghidra.program.model.address.AddressSpace; import ghidra.program.model.util.StringPropertyMap; import ghidra.program.util.ProgramLocation; import ghidra.trace.database.ToyDBTraceBuilder.ToySchemaBuilder; @@ -65,15 +65,24 @@ public class TaintDebuggerPcodeEmulatorTest extends AbstractGhidraHeadedDebugger .count()); } + protected SchemaContext buildContext() { + return new ToySchemaBuilder() + .noRegisterGroups() + .useRegistersPerFrame() + .build(); + } + @Test public void testFactoryCreate() throws Exception { emuService.setEmulatorFactory(new TaintDebuggerPcodeEmulatorFactory()); createAndOpenTrace(); + TraceThread thread; try (Transaction tx = tb.startTransaction()) { tb.createRootObject(buildContext(), "Target"); - tb.getOrAddThread("Threads[0]", 0); + thread = tb.getOrAddThread("Threads[0]", 0); + tb.createObjectsFramesAndRegs(thread, Lifespan.nowOn(0), tb.host, 1); } traceManager.activateTrace(tb.trace); @@ -86,7 +95,7 @@ public class TaintDebuggerPcodeEmulatorTest extends AbstractGhidraHeadedDebugger public TickStep nextSlice(Trace trace) { // Expect decode of uninitialized memory immediately assertEquals(0, calls++); - return new TickStep(1, 1); + return new TickStep(thread.getKey(), 1); } }); @@ -94,7 +103,7 @@ public class TaintDebuggerPcodeEmulatorTest extends AbstractGhidraHeadedDebugger assertTrue(emu instanceof TaintDebuggerPcodeEmulator); } - //@Test + @Test public void testReadsProgramUsrProperties() throws Exception { emuService.setEmulatorFactory(new TaintDebuggerPcodeEmulatorFactory()); @@ -106,13 +115,12 @@ public class TaintDebuggerPcodeEmulatorTest extends AbstractGhidraHeadedDebugger programManager.openProgram(program); - AddressSpace rs = tb.language.getAddressFactory().getRegisterSpace(); TraceThread thread; try (Transaction tx = tb.startTransaction()) { + tb.createRootObject(buildContext(), "Target"); mappingService.addMapping( new DefaultTraceLocation(tb.trace, null, Lifespan.nowOn(0), tb.addr(0x55550000)), new ProgramLocation(program, tb.addr(0x00400000)), 0x1000, false); - tb.createRootObject(buildContext(), "Target"); thread = tb.getOrAddThread("Threads[0]", 0); tb.createObjectsFramesAndRegs(thread, Lifespan.nowOn(0), tb.host, 1); tb.exec(0, thread, 0, "RIP = 0x55550000;"); @@ -135,24 +143,16 @@ public class TaintDebuggerPcodeEmulatorTest extends AbstractGhidraHeadedDebugger asm.assemble(tb.addr(0x00400000), "MOV RAX, qword ptr [0x00400800]"); } - TraceSchedule time = TraceSchedule.parse("0:t1-1"); + TraceSchedule time = TraceSchedule.parse("0:t%d-1".formatted(thread.getKey())); long scratch = emuService.emulate(tb.trace, time, TaskMonitor.DUMMY); TracePropertyMap traceTaintMap = tb.trace.getAddressPropertyManager() .getPropertyMap(TaintTracePcodeExecutorStatePiece.NAME, String.class); TracePropertyMapSpace taintRegSpace = - traceTaintMap.getPropertyMapRegisterSpace(thread, 0, true); + traceTaintMap.getPropertyMapRegisterSpace(thread, 0, false); assertEquals(TaintTracePcodeEmulatorTest.makeTaintEntries(tb.trace, - Lifespan.span(scratch, -1), rs, Set.of(0L), "test_0"), + Lifespan.span(scratch, -1), taintRegSpace.getAddressSpace(), Set.of(0L), "test_0"), Set.copyOf(taintRegSpace.getEntries(Lifespan.at(scratch), tb.reg("RAX")))); } - - SchemaContext buildContext() { - return new ToySchemaBuilder() - .noRegisterGroups() - .useRegistersPerFrame() - .build(); - } - } diff --git a/Ghidra/Debug/TaintAnalysis/src/test/java/ghidra/pcode/emu/taint/trace/TaintTracePcodeEmulatorTest.java b/Ghidra/Debug/TaintAnalysis/src/test/java/ghidra/pcode/emu/taint/trace/TaintTracePcodeEmulatorTest.java index fe25d5e0f0..4387924161 100644 --- a/Ghidra/Debug/TaintAnalysis/src/test/java/ghidra/pcode/emu/taint/trace/TaintTracePcodeEmulatorTest.java +++ b/Ghidra/Debug/TaintAnalysis/src/test/java/ghidra/pcode/emu/taint/trace/TaintTracePcodeEmulatorTest.java @@ -154,7 +154,6 @@ public class TaintTracePcodeEmulatorTest extends AbstractTracePcodeEmulatorTest @Test public void testWriteStateRegister() throws Throwable { try (ToyDBTraceBuilder tb = new ToyDBTraceBuilder("Test", "x86:LE:64:default")) { - AddressSpace rs = tb.language.getAddressFactory().getRegisterSpace(); TraceThread thread = initTrace(tb, "", List.of()); TaintTracePcodeEmulator emu = new TaintTracePcodeEmulator(tb.host, 0); @@ -176,7 +175,8 @@ public class TaintTracePcodeEmulatorTest extends AbstractTracePcodeEmulatorTest // TODO: Might be nice to coalesce identical values // Becomes the 2D cover optimization problem. Still could do some easy cases. assertEquals( - makeTaintEntries(tb.trace, Lifespan.nowOn(1), rs, Set.of(0L, 1L, 2L, 3L), "test_0"), + makeTaintEntries(tb.trace, Lifespan.nowOn(1), mapSpace.getAddressSpace(), + Set.of(0L, 1L, 2L, 3L), "test_0"), Set.copyOf(mapSpace.getEntries(Lifespan.at(1), tb.reg("RAX")))); } }