From d95e9e35d7c2397756a646cbf1dbf72bcf641575 Mon Sep 17 00:00:00 2001 From: Dan <46821332+nsadeveloper789@users.noreply.github.com> Date: Wed, 7 Jan 2026 16:59:27 +0000 Subject: [PATCH 1/2] GP-6295: Fix ReDisassembler: MemBuffer address, avoid equiv prototype replacement. --- .../ghidra/program/disassemble/ReDisassembler.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/ReDisassembler.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/ReDisassembler.java index d30d887919..75ea601050 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/ReDisassembler.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/ReDisassembler.java @@ -86,7 +86,7 @@ public class ReDisassembler { protected class ReDisState { protected final TaskMonitor monitor; - protected final Map progMemBuffers = new HashMap<>(); + protected final Map progMemBuffers = new HashMap<>(); protected final ProgramContext tempContext = new ProgramContextImpl(language); protected final AddressSet visited = new AddressSet(); protected final Deque queue = new LinkedList<>(); @@ -121,9 +121,10 @@ public class ReDisassembler { } protected MemBuffer createBuffer(Address at) { - return progMemBuffers.computeIfAbsent(at.getAddressSpace(), space -> { - return new DumbMemBufferImpl(program.getMemory(), space.getMinAddress()); - }); + DumbMemBufferImpl buffer = progMemBuffers.computeIfAbsent(at.getAddressSpace(), + space -> new DumbMemBufferImpl(program.getMemory(), space.getMinAddress())); + buffer.setPosition(at); + return buffer; } /** @@ -253,6 +254,11 @@ public class ReDisassembler { ReDisassemblerContext ctx = new ReDisassemblerContext(state, flow); try { InstructionPrototype prototype = language.parse(buffer, ctx, false); + Instruction exists = program.getListing().getInstructionAt(flow.to); + if (exists != null && exists.getPrototype().equals(prototype) && + flow.type != FlowType.SEED) { + return null; + } return createInstruction(flow.to, prototype, buffer, ctx); } catch (UnknownInstructionException e) { From a91e6500de8624f03eb984a4b122b11e1fefc28a Mon Sep 17 00:00:00 2001 From: Dan <46821332+nsadeveloper789@users.noreply.github.com> Date: Wed, 7 Jan 2026 19:01:27 +0000 Subject: [PATCH 2/2] GP-6294: Fix P-code Stepper: Trace doesn't store uniques. --- .../ghidra/pcode/exec/trace/TraceEmulationIntegration.java | 3 +++ .../java/ghidra/trace/database/time/DBTraceTimeManager.java | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/pcode/exec/trace/TraceEmulationIntegration.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/pcode/exec/trace/TraceEmulationIntegration.java index 4fc58d32bd..b0c4d1917a 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/pcode/exec/trace/TraceEmulationIntegration.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/pcode/exec/trace/TraceEmulationIntegration.java @@ -795,6 +795,9 @@ public enum TraceEmulationIntegration { return set; } AddressSpace space = set.getMinAddress().getAddressSpace(); + if (space.isUniqueSpace()) { + return set; + } PcodeTraceDataAccess acc = space.isRegisterSpace() ? getRegAccess(thread) : memAccess; return handlerFor(piece).readUninitialized(acc, thread, piece, set); } diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/time/DBTraceTimeManager.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/time/DBTraceTimeManager.java index c5aa671421..6588ea8e38 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/time/DBTraceTimeManager.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/time/DBTraceTimeManager.java @@ -235,13 +235,14 @@ public class DBTraceTimeManager implements TraceTimeManager, DBTraceManager { @Override public TraceSnapshot findSnapshotWithNearestPrefix(TraceSchedule schedule) { long version = trace.getEmulatorCacheVersion(); - Optional exists = getSnapshotsWithSchedule(schedule).stream() + TraceSchedule noPSteps = schedule.dropPSteps(); + Optional exists = getSnapshotsWithSchedule(noPSteps).stream() .filter(s -> s.getVersion() >= version) .findFirst(); if (exists.isPresent()) { return exists.get(); } - return doFindNearest(schedule.dropPSteps(), version); + return doFindNearest(noPSteps, version); } @Override