diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/stack/DebuggerStackProvider.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/stack/DebuggerStackProvider.java index 6df95e2abe..bd8fa7f4fa 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/stack/DebuggerStackProvider.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/stack/DebuggerStackProvider.java @@ -343,16 +343,24 @@ public class DebuggerStackProvider extends ComponentProviderAdapter { } private void rowActivated(StackFrameRow row) { + if (row == null) { + return; + } TraceStackFrame frame = row.frame; + if (frame == null) { + return; + } TraceThread thread = frame.getStack().getThread(); Trace trace = thread.getTrace(); TraceRecorder recorder = modelService.getRecorder(trace); - if (recorder != null) { - TargetStackFrame targetFrame = recorder.getTargetStackFrame(thread, frame.getLevel()); - if (targetFrame != null && targetFrame.isValid()) { - DebugModelConventions.requestActivation(targetFrame); - } + if (recorder == null) { + return; } + TargetStackFrame targetFrame = recorder.getTargetStackFrame(thread, frame.getLevel()); + if (targetFrame == null || !targetFrame.isValid()) { + return; + } + DebugModelConventions.requestActivation(targetFrame); } protected void createActions() { diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/thread/DebuggerThreadsProvider.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/thread/DebuggerThreadsProvider.java index 8bb047e2f1..0860e3c8b7 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/thread/DebuggerThreadsProvider.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/gui/thread/DebuggerThreadsProvider.java @@ -521,15 +521,20 @@ public class DebuggerThreadsProvider extends ComponentProviderAdapter { } private void rowActivated(ThreadRow row) { + if (row == null) { + return; + } TraceThread thread = row.getThread(); Trace trace = thread.getTrace(); TraceRecorder recorder = modelService.getRecorder(trace); - if (recorder != null) { - TargetThread targetThread = recorder.getTargetThread(thread); - if (targetThread != null && targetThread.isValid()) { - DebugModelConventions.requestActivation(targetThread); - } + if (recorder == null) { + return; } + TargetThread targetThread = recorder.getTargetThread(thread); + if (targetThread == null || !targetThread.isValid()) { + return; + } + DebugModelConventions.requestActivation(targetThread); } protected void buildMainPanel() { diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/emulation/ProgramEmulationUtils.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/emulation/ProgramEmulationUtils.java index b0719d43cb..e4dc9e6c65 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/emulation/ProgramEmulationUtils.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/app/plugin/core/debug/service/emulation/ProgramEmulationUtils.java @@ -152,10 +152,10 @@ public enum ProgramEmulationUtils { String modName = getModuleName(program); // TODO: Do I populate modules, since the mapping will already be done? + String path = "Modules[" + modName + "].Sections[" + block.getName() + "-" + + block.getStart() + "]"; trace.getMemoryManager() - .createRegion( - "Modules[" + modName + "].Sections[" + block.getName() + "]", - snapshot.getKey(), range, getRegionFlags(block)); + .createRegion(path, snapshot.getKey(), range, getRegionFlags(block)); } DebuggerStaticMappingUtils.addMapping( new DefaultTraceLocation(trace, null, Range.atLeast(snapshot.getKey()), min), diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/pcode/exec/AsyncWrappedPcodeArithmetic.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/pcode/exec/AsyncWrappedPcodeArithmetic.java index dbe14e5c51..097df3e6a6 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/pcode/exec/AsyncWrappedPcodeArithmetic.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/pcode/exec/AsyncWrappedPcodeArithmetic.java @@ -27,6 +27,7 @@ public class AsyncWrappedPcodeArithmetic implements PcodeArithmetic(BytesPcodeArithmetic.BIG_ENDIAN); public static final AsyncWrappedPcodeArithmetic BYTES_LE = new AsyncWrappedPcodeArithmetic<>(BytesPcodeArithmetic.LITTLE_ENDIAN); + @Deprecated(forRemoval = true) // TODO: Not getting used public static final AsyncWrappedPcodeArithmetic BIGINT = new AsyncWrappedPcodeArithmetic<>(BigIntegerPcodeArithmetic.INSTANCE); @@ -63,8 +64,8 @@ public class AsyncWrappedPcodeArithmetic implements PcodeArithmetic fromConst(BigInteger value, int size) { - return CompletableFuture.completedFuture(arithmetic.fromConst(value, size)); + public CompletableFuture fromConst(BigInteger value, int size, boolean isContextreg) { + return CompletableFuture.completedFuture(arithmetic.fromConst(value, size, isContextreg)); } @Override @@ -76,10 +77,10 @@ public class AsyncWrappedPcodeArithmetic implements PcodeArithmetic cond) { + public BigInteger toConcrete(CompletableFuture cond, boolean isContextreg) { if (!cond.isDone()) { throw new AssertionError("You need a better 8-ball"); } - return arithmetic.toConcrete(cond.getNow(null)); + return arithmetic.toConcrete(cond.getNow(null), isContextreg); } } diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/pcode/exec/trace/TraceMemoryStatePcodeArithmetic.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/pcode/exec/trace/TraceMemoryStatePcodeArithmetic.java index ebe7b286ec..c8a65cda85 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/pcode/exec/trace/TraceMemoryStatePcodeArithmetic.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/pcode/exec/trace/TraceMemoryStatePcodeArithmetic.java @@ -46,7 +46,7 @@ public enum TraceMemoryStatePcodeArithmetic implements PcodeArithmetic implements PcodeThread { assignContext(context); state.setVar(contextreg, arithmetic.fromConst( this.context.getUnsignedValueIgnoreMask(), - contextreg.getMinimumByteSize())); + contextreg.getMinimumByteSize(), true)); } @Override @@ -215,7 +215,7 @@ public class DefaultPcodeThread implements PcodeThread { if (contextreg != Register.NO_CONTEXT) { try { - BigInteger ctx = arithmetic.toConcrete(state.getVar(contextreg)); + BigInteger ctx = arithmetic.toConcrete(state.getVar(contextreg), true); assignContext(new RegisterValue(contextreg, ctx)); } catch (AccessPcodeExecutionException e) { diff --git a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/AddressOfPcodeArithmetic.java b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/AddressOfPcodeArithmetic.java index cfcbcfc1ae..497f9bcf45 100644 --- a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/AddressOfPcodeArithmetic.java +++ b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/AddressOfPcodeArithmetic.java @@ -42,7 +42,7 @@ public enum AddressOfPcodeArithmetic implements PcodeArithmetic
{ } @Override - public Address fromConst(BigInteger value, int size) { + public Address fromConst(BigInteger value, int size, boolean isContextreg) { return null; } @@ -52,7 +52,7 @@ public enum AddressOfPcodeArithmetic implements PcodeArithmetic
{ } @Override - public BigInteger toConcrete(Address value) { + public BigInteger toConcrete(Address value, boolean isContextreg) { throw new AssertionError("Should not attempt to concretize 'address of'"); } } diff --git a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/BigIntegerPcodeArithmetic.java b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/BigIntegerPcodeArithmetic.java index 0a510f289b..942d0e09d1 100644 --- a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/BigIntegerPcodeArithmetic.java +++ b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/BigIntegerPcodeArithmetic.java @@ -20,6 +20,7 @@ import java.math.BigInteger; import ghidra.pcode.opbehavior.BinaryOpBehavior; import ghidra.pcode.opbehavior.UnaryOpBehavior; +@Deprecated(forRemoval = true) // TODO: Not getting used public enum BigIntegerPcodeArithmetic implements PcodeArithmetic { INSTANCE; @@ -40,7 +41,7 @@ public enum BigIntegerPcodeArithmetic implements PcodeArithmetic { } @Override - public BigInteger fromConst(BigInteger value, int size) { + public BigInteger fromConst(BigInteger value, int size, boolean isContextreg) { return value; } @@ -50,7 +51,7 @@ public enum BigIntegerPcodeArithmetic implements PcodeArithmetic { } @Override - public BigInteger toConcrete(BigInteger value) { + public BigInteger toConcrete(BigInteger value, boolean isContextreg) { return value; } } diff --git a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/BytesPcodeArithmetic.java b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/BytesPcodeArithmetic.java index bacf1baa9e..4e1816c6e4 100644 --- a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/BytesPcodeArithmetic.java +++ b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/BytesPcodeArithmetic.java @@ -76,8 +76,8 @@ public enum BytesPcodeArithmetic implements PcodeArithmetic { } @Override - public byte[] fromConst(BigInteger value, int size) { - return Utils.bigIntegerToBytes(value, size, isBigEndian); + public byte[] fromConst(BigInteger value, int size, boolean isContextreg) { + return Utils.bigIntegerToBytes(value, size, isBigEndian || isContextreg); } @Override @@ -91,7 +91,7 @@ public enum BytesPcodeArithmetic implements PcodeArithmetic { } @Override - public BigInteger toConcrete(byte[] value) { - return Utils.bytesToBigInteger(value, value.length, isBigEndian, false); + public BigInteger toConcrete(byte[] value, boolean isContextreg) { + return Utils.bytesToBigInteger(value, value.length, isBigEndian || isContextreg, false); } } diff --git a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PairedPcodeArithmetic.java b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PairedPcodeArithmetic.java index e10d3ff3d4..f99567478d 100644 --- a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PairedPcodeArithmetic.java +++ b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PairedPcodeArithmetic.java @@ -66,9 +66,9 @@ public class PairedPcodeArithmetic implements PcodeArithmetic> } @Override - public Pair fromConst(BigInteger value, int size) { - return new ImmutablePair<>(leftArith.fromConst(value, size), - rightArith.fromConst(value, size)); + public Pair fromConst(BigInteger value, int size, boolean isContextreg) { + return new ImmutablePair<>(leftArith.fromConst(value, size, isContextreg), + rightArith.fromConst(value, size, isContextreg)); } @Override @@ -77,8 +77,8 @@ public class PairedPcodeArithmetic implements PcodeArithmetic> } @Override - public BigInteger toConcrete(Pair value) { - return leftArith.toConcrete(value.getLeft()); + public BigInteger toConcrete(Pair value, boolean isContextreg) { + return leftArith.toConcrete(value.getLeft(), isContextreg); } public PcodeArithmetic getLeft() { diff --git a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PcodeArithmetic.java b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PcodeArithmetic.java index 735aa42593..eef7fc1d91 100644 --- a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PcodeArithmetic.java +++ b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PcodeArithmetic.java @@ -23,6 +23,7 @@ import ghidra.pcode.opbehavior.UnaryOpBehavior; public interface PcodeArithmetic { PcodeArithmetic BYTES_BE = BytesPcodeArithmetic.BIG_ENDIAN; PcodeArithmetic BYTES_LE = BytesPcodeArithmetic.LITTLE_ENDIAN; + @Deprecated(forRemoval = true) // TODO: Not getting used PcodeArithmetic BIGINT = BigIntegerPcodeArithmetic.INSTANCE; T unaryOp(UnaryOpBehavior op, int sizeout, int sizein1, T in1); @@ -31,7 +32,11 @@ public interface PcodeArithmetic { T fromConst(long value, int size); - T fromConst(BigInteger value, int size); + T fromConst(BigInteger value, int size, boolean isContextreg); + + default T fromConst(BigInteger value, int size) { + return fromConst(value, size, false); + } /** * Make concrete, if possible, the given abstract condition to a boolean value @@ -49,7 +54,24 @@ public interface PcodeArithmetic { * exception to throw and/or establish a hierarchy of checked exceptions. * * @param value the abstract value + * @param isContextreg true to indicate the value is from the disassembly context register. If + * {@code T} represents bytes, and the value is the contextreg, then the bytes are in + * big endian, no matter the machine language's endianness. * @return the concrete value */ - BigInteger toConcrete(T value); + BigInteger toConcrete(T value, boolean isContextreg); + + /** + * Make concrete, if possible, the given abstract value + * + *

+ * If the conversion is not possible, throw an exception. TODO: Decide on conventions of which + * exception to throw and/or establish a hierarchy of checked exceptions. + * + * @param value the abstract value + * @return the concrete value + */ + default BigInteger toConcrete(T value) { + return toConcrete(value, false); + } }