From 39c0a83c0c4540b0776ef2e8fd8c2c7fb966d55c Mon Sep 17 00:00:00 2001 From: Dan <46821332+nsadeveloper789@users.noreply.github.com> Date: Mon, 28 Jul 2025 15:48:40 +0000 Subject: [PATCH] GP-5877: Fix Patch Instruction action in some Harvard architectures. --- .../program/disassemble/ReDisassembler.java | 15 ++-- Ghidra/Processors/Toy/certification.manifest | 1 + .../Processors/Toy/data/languages/toy.ldefs | 11 +++ Ghidra/Processors/Toy/data/languages/toy.sinc | 2 + .../languages/toy64_be_harvard_rev.slaspec | 16 ++++ .../disassemble/ReDisassemblerTest.java | 76 +++++++++++++++++++ 6 files changed, 114 insertions(+), 7 deletions(-) create mode 100644 Ghidra/Processors/Toy/data/languages/toy64_be_harvard_rev.slaspec create mode 100644 Ghidra/Test/IntegrationTest/src/test/java/ghidra/program/disassemble/ReDisassemblerTest.java 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 c4d9fbaa8b..d30d887919 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 @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -21,7 +21,8 @@ import ghidra.app.util.PseudoInstruction; import ghidra.program.model.address.*; import ghidra.program.model.lang.*; import ghidra.program.model.listing.*; -import ghidra.program.model.mem.*; +import ghidra.program.model.mem.DumbMemBufferImpl; +import ghidra.program.model.mem.MemBuffer; import ghidra.program.model.util.CodeUnitInsertionException; import ghidra.program.util.ProgramContextImpl; import ghidra.util.Msg; @@ -85,8 +86,7 @@ public class ReDisassembler { protected class ReDisState { protected final TaskMonitor monitor; - protected final MemBuffer progMemBuffer = - new DumbMemBufferImpl(program.getMemory(), program.getMemory().getMinAddress()); + 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,8 +121,9 @@ public class ReDisassembler { } protected MemBuffer createBuffer(Address at) { - return new WrappedMemBuffer(progMemBuffer, 20, - (int) at.subtract(progMemBuffer.getAddress())); + return progMemBuffers.computeIfAbsent(at.getAddressSpace(), space -> { + return new DumbMemBufferImpl(program.getMemory(), space.getMinAddress()); + }); } /** diff --git a/Ghidra/Processors/Toy/certification.manifest b/Ghidra/Processors/Toy/certification.manifest index 4491cd011a..cf44180f39 100644 --- a/Ghidra/Processors/Toy/certification.manifest +++ b/Ghidra/Processors/Toy/certification.manifest @@ -19,6 +19,7 @@ data/languages/toy64-long8.cspec||GHIDRA||||END| data/languages/toy64.cspec||GHIDRA||||END| data/languages/toy64_be.slaspec||GHIDRA||||END| data/languages/toy64_be_harvard.slaspec||GHIDRA||||END| +data/languages/toy64_be_harvard_rev.slaspec||GHIDRA||||END| data/languages/toy64_le.slaspec||GHIDRA||||END| data/languages/toyInstructions.sinc||GHIDRA||||END| data/languages/toyPosStack.cspec||GHIDRA||||END| diff --git a/Ghidra/Processors/Toy/data/languages/toy.ldefs b/Ghidra/Processors/Toy/data/languages/toy.ldefs index 7bd3ec76cd..fee62d447a 100644 --- a/Ghidra/Processors/Toy/data/languages/toy.ldefs +++ b/Ghidra/Processors/Toy/data/languages/toy.ldefs @@ -79,6 +79,17 @@ Toy (test) processor 64-bit big-endian Harvard + + Toy (test) processor 64-bit big-endian Harvard + +