From 237b7c00d12d43a3e9fa609a27cd930c9b0d1fca Mon Sep 17 00:00:00 2001 From: Dan <46821332+nsadeveloper789@users.noreply.github.com> Date: Tue, 24 Aug 2021 08:20:42 -0400 Subject: [PATCH] GP-1161: Including uniques in thread-local state, and renaming things by those terms. --- .../emulation/DebuggerTracePcodeEmulator.java | 4 +- .../pcode/exec/trace/TracePcodeEmulator.java | 16 +++---- .../trace/model/time/TraceScheduleTest.java | 4 +- .../pcode/emu/AbstractPcodeMachine.java | 14 +++--- .../ghidra/pcode/emu/DefaultPcodeThread.java | 12 ++--- .../java/ghidra/pcode/emu/PcodeMachine.java | 4 +- .../java/ghidra/pcode/emu/PcodeThread.java | 2 +- .../pcode/emu/ThreadPcodeExecutorState.java | 46 ++++++++++--------- 8 files changed, 53 insertions(+), 49 deletions(-) diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/emulation/DebuggerTracePcodeEmulator.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/emulation/DebuggerTracePcodeEmulator.java index 2a99ee316e..1600f47d8f 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/emulation/DebuggerTracePcodeEmulator.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/emulation/DebuggerTracePcodeEmulator.java @@ -70,13 +70,13 @@ public class DebuggerTracePcodeEmulator extends TracePcodeEmulator { } @Override - protected PcodeExecutorState createMemoryState() { + protected PcodeExecutorState createSharedState() { return new ReadsTargetMemoryPcodeExecutorState(tool, trace, snap, null, 0, recorder); } @Override - protected PcodeExecutorState createRegisterState(PcodeThread emuThread) { + protected PcodeExecutorState createLocalState(PcodeThread emuThread) { TraceThread traceThread = trace.getThreadManager().getLiveThreadByPath(snap, emuThread.getName()); return new ReadsTargetRegistersPcodeExecutorState(tool, trace, snap, traceThread, 0, diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/pcode/exec/trace/TracePcodeEmulator.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/pcode/exec/trace/TracePcodeEmulator.java index 02ea8060b0..b361d0f379 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/pcode/exec/trace/TracePcodeEmulator.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/pcode/exec/trace/TracePcodeEmulator.java @@ -55,12 +55,12 @@ public class TracePcodeEmulator extends AbstractPcodeEmulator { } @Override - protected PcodeExecutorState createMemoryState() { + protected PcodeExecutorState createSharedState() { return newState(null); } @Override - protected PcodeExecutorState createRegisterState(PcodeThread emuThread) { + protected PcodeExecutorState createLocalState(PcodeThread emuThread) { return newState(trace.getThreadManager().getLiveThreadByPath(snap, emuThread.getName())); } @@ -79,13 +79,13 @@ public class TracePcodeEmulator extends AbstractPcodeEmulator { * @param synthesizeStacks true to synthesize the innermost stack frame of each thread */ public void writeDown(Trace trace, long destSnap, long threadsSnap, boolean synthesizeStacks) { - TraceCachedWriteBytesPcodeExecutorState ms = - (TraceCachedWriteBytesPcodeExecutorState) getMemoryState(); - ms.writeCacheDown(trace, destSnap, null, 0); + TraceCachedWriteBytesPcodeExecutorState ss = + (TraceCachedWriteBytesPcodeExecutorState) getSharedState(); + ss.writeCacheDown(trace, destSnap, null, 0); TraceThreadManager threadManager = trace.getThreadManager(); for (PcodeThread emuThread : threads.values()) { - TraceCachedWriteBytesPcodeExecutorState rs = - (TraceCachedWriteBytesPcodeExecutorState) emuThread.getState().getRegisterState(); + TraceCachedWriteBytesPcodeExecutorState ls = + (TraceCachedWriteBytesPcodeExecutorState) emuThread.getState().getLocalState(); TraceThread traceThread = threadManager.getLiveThreadByPath( threadsSnap, emuThread.getName()); if (traceThread == null) { @@ -93,7 +93,7 @@ public class TracePcodeEmulator extends AbstractPcodeEmulator { "Given trace does not have thread with name/path '" + emuThread.getName() + "' at snap " + destSnap); } - rs.writeCacheDown(trace, destSnap, traceThread, 0); + ls.writeCacheDown(trace, destSnap, traceThread, 0); if (synthesizeStacks) { TraceStack stack = trace.getStackManager().getStack(traceThread, destSnap, true); stack.getFrame(0, true).setProgramCounter(emuThread.getCounter()); diff --git a/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/trace/model/time/TraceScheduleTest.java b/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/trace/model/time/TraceScheduleTest.java index 654f00fc11..a856f6882e 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/trace/model/time/TraceScheduleTest.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/trace/model/time/TraceScheduleTest.java @@ -385,12 +385,12 @@ public class TraceScheduleTest extends AbstractGhidraHeadlessIntegrationTest { } @Override - protected PcodeExecutorState createMemoryState() { + protected PcodeExecutorState createSharedState() { return null; } @Override - protected PcodeExecutorState createRegisterState(PcodeThread thread) { + protected PcodeExecutorState createLocalState(PcodeThread thread) { return null; } } diff --git a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/AbstractPcodeMachine.java b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/AbstractPcodeMachine.java index 41a2f4424e..58435ddf2a 100644 --- a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/AbstractPcodeMachine.java +++ b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/AbstractPcodeMachine.java @@ -34,7 +34,7 @@ public abstract class AbstractPcodeMachine implements PcodeMachine { protected final SleighUseropLibrary stubLibrary; /* for abstract thread access */ PcodeStateInitializer initializer; - private PcodeExecutorState memoryState; + private PcodeExecutorState sharedState; protected final Map> threads = new LinkedHashMap<>(); protected final Map injects = new HashMap<>(); @@ -55,9 +55,9 @@ public abstract class AbstractPcodeMachine implements PcodeMachine { this.initializer = getPluggableInitializer(language); } - protected abstract PcodeExecutorState createMemoryState(); + protected abstract PcodeExecutorState createSharedState(); - protected abstract PcodeExecutorState createRegisterState(PcodeThread thread); + protected abstract PcodeExecutorState createLocalState(PcodeThread thread); protected SleighUseropLibrary createThreadStubLibrary() { return new DefaultPcodeThread.SleighEmulationLibrary(null); @@ -113,12 +113,12 @@ public abstract class AbstractPcodeMachine implements PcodeMachine { } @Override - public PcodeExecutorState getMemoryState() { - if (memoryState == null) { - memoryState = createMemoryState(); + public PcodeExecutorState getSharedState() { + if (sharedState == null) { + sharedState = createSharedState(); doPluggableInitialization(); } - return memoryState; + return sharedState; } protected PcodeProgram getInject(Address address) { diff --git a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/DefaultPcodeThread.java b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/DefaultPcodeThread.java index b45db55abb..8535316e3c 100644 --- a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/DefaultPcodeThread.java +++ b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/DefaultPcodeThread.java @@ -114,10 +114,10 @@ public class DefaultPcodeThread implements PcodeThread { this.machine = machine; this.language = machine.language; this.arithmetic = machine.arithmetic; - PcodeExecutorState memoryState = machine.getMemoryState(); - PcodeExecutorState registerState = machine.createRegisterState(this); - this.state = new ThreadPcodeExecutorState<>(memoryState, registerState); - this.decoder = createInstructionDecoder(memoryState); + PcodeExecutorState sharedState = machine.getSharedState(); + PcodeExecutorState localState = machine.createLocalState(this); + this.state = new ThreadPcodeExecutorState<>(sharedState, localState); + this.decoder = createInstructionDecoder(sharedState); this.library = createUseropLibrary(); this.executor = createExecutor(); @@ -135,8 +135,8 @@ public class DefaultPcodeThread implements PcodeThread { this.reInitialize(); } - protected SleighInstructionDecoder createInstructionDecoder(PcodeExecutorState memoryState) { - return new SleighInstructionDecoder(language, memoryState); + protected SleighInstructionDecoder createInstructionDecoder(PcodeExecutorState sharedState) { + return new SleighInstructionDecoder(language, sharedState); } protected SleighUseropLibrary createUseropLibrary() { diff --git a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/PcodeMachine.java b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/PcodeMachine.java index 4e195beed5..1bf169d406 100644 --- a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/PcodeMachine.java +++ b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/PcodeMachine.java @@ -54,7 +54,7 @@ public interface PcodeMachine { PcodeThread getThread(String name, boolean createIfAbsent); /** - * Get the machine's memory state + * Get the machine's shared (memory) state * *

* The returned state will may throw {@link IllegalArgumentException} if the client requests @@ -62,7 +62,7 @@ public interface PcodeMachine { * * @return the memory state */ - PcodeExecutorState getMemoryState(); + PcodeExecutorState getSharedState(); /** * Compile the given SLEIGH code for execution by a thread of this machine diff --git a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/PcodeThread.java b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/PcodeThread.java index cc11195a9c..50e44db14f 100644 --- a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/PcodeThread.java +++ b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/PcodeThread.java @@ -248,7 +248,7 @@ public interface PcodeThread { * *

* The memory part of this state is shared among all threads in the same machine. See - * {@link PcodeMachine#getMemoryState()}. + * {@link PcodeMachine#getSharedState()}. * */ ThreadPcodeExecutorState getState(); diff --git a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/ThreadPcodeExecutorState.java b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/ThreadPcodeExecutorState.java index 54354cc61c..18ba169916 100644 --- a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/ThreadPcodeExecutorState.java +++ b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/emu/ThreadPcodeExecutorState.java @@ -6,57 +6,61 @@ import ghidra.program.model.address.AddressSpace; import ghidra.program.model.mem.MemBuffer; public class ThreadPcodeExecutorState implements PcodeExecutorState { - protected final PcodeExecutorState memoryState; - protected final PcodeExecutorState registerState; + protected final PcodeExecutorState sharedState; + protected final PcodeExecutorState localState; - public ThreadPcodeExecutorState(PcodeExecutorState memoryState, - PcodeExecutorState registerState) { - this.memoryState = memoryState; - this.registerState = registerState; + public ThreadPcodeExecutorState(PcodeExecutorState sharedState, + PcodeExecutorState localState) { + this.sharedState = sharedState; + this.localState = localState; + } + + protected boolean isThreadLocalSpace(AddressSpace space) { + return space.isRegisterSpace() || space.isUniqueSpace(); } @Override public T longToOffset(AddressSpace space, long l) { - if (space.isRegisterSpace()) { - return registerState.longToOffset(space, l); + if (isThreadLocalSpace(space)) { + return localState.longToOffset(space, l); } else { - return memoryState.longToOffset(space, l); + return sharedState.longToOffset(space, l); } } @Override public void setVar(AddressSpace space, T offset, int size, boolean truncateAddressableUnit, T val) { - if (space.isRegisterSpace()) { - registerState.setVar(space, offset, size, truncateAddressableUnit, val); + if (isThreadLocalSpace(space)) { + localState.setVar(space, offset, size, truncateAddressableUnit, val); } else { - memoryState.setVar(space, offset, size, truncateAddressableUnit, val); + sharedState.setVar(space, offset, size, truncateAddressableUnit, val); } } @Override public T getVar(AddressSpace space, T offset, int size, boolean truncateAddressableUnit) { - if (space.isRegisterSpace()) { - return registerState.getVar(space, offset, size, truncateAddressableUnit); + if (isThreadLocalSpace(space)) { + return localState.getVar(space, offset, size, truncateAddressableUnit); } else { - return memoryState.getVar(space, offset, size, truncateAddressableUnit); + return sharedState.getVar(space, offset, size, truncateAddressableUnit); } } @Override public MemBuffer getConcreteBuffer(Address address) { - assert !address.getAddressSpace().isRegisterSpace(); - return memoryState.getConcreteBuffer(address); + assert !isThreadLocalSpace(address.getAddressSpace()); + return sharedState.getConcreteBuffer(address); } - public PcodeExecutorState getMemoryState() { - return memoryState; + public PcodeExecutorState getSharedState() { + return sharedState; } - public PcodeExecutorState getRegisterState() { - return registerState; + public PcodeExecutorState getLocalState() { + return localState; } } \ No newline at end of file