From 93c291ba7281308b8bf8f28337b44d878ecd3444 Mon Sep 17 00:00:00 2001 From: emteere <47253321+emteere@users.noreply.github.com> Date: Thu, 1 Dec 2022 15:56:28 +0000 Subject: [PATCH] GP-2905: Fixed regression in handling of spacebase register values that cause a stack trace in the decompiler for RISCV. Removed unnecessary spacebase settings in tricore, mips, riscv. --- .../program/model/pcode/LocalSymbolMap.java | 24 +++++++++++++++---- .../MIPS/data/languages/mips32_fp64.cspec | 2 -- .../MIPS/data/languages/mips32be.cspec | 2 -- .../MIPS/data/languages/mips32be_eabi.cspec | 2 -- .../MIPS/data/languages/mips32le.cspec | 2 -- .../MIPS/data/languages/mips32le_eabi.cspec | 2 -- .../MIPS/data/languages/mips64.cspec | 2 -- .../MIPS/data/languages/mips64_32_n32.cspec | 2 -- .../MIPS/data/languages/mips64_32_o32.cspec | 2 -- .../MIPS/data/languages/mips64_32_o64.cspec | 2 -- .../core/analysis/MipsAddressAnalyzer.java | 6 +++++ .../RISCV/data/languages/riscv32-fp.cspec | 1 - .../RISCV/data/languages/riscv32.cspec | 1 - .../RISCV/data/languages/riscv64-fp.cspec | 1 - .../RISCV/data/languages/riscv64.cspec | 1 - .../tricore/data/languages/tricore.cspec | 8 +++---- .../tricore/data/languages/tricore.ldefs | 8 +++---- .../tricore/data/languages/tricore.sinc | 12 ++++++++-- 18 files changed, 43 insertions(+), 37 deletions(-) diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/LocalSymbolMap.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/LocalSymbolMap.java index 35aed16f13..5242c4757d 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/LocalSymbolMap.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/LocalSymbolMap.java @@ -26,6 +26,7 @@ import ghidra.program.model.data.DataType; import ghidra.program.model.data.Undefined; import ghidra.program.model.listing.*; import ghidra.program.model.symbol.*; +import ghidra.util.Msg; import ghidra.util.SystemUtilities; /** @@ -576,9 +577,20 @@ public class LocalSymbolMap { } public MappedVarKey(VariableStorage store, Address pcad) { - addr = store.getFirstVarnode().getAddress(); - if (!addr.isStackAddress()) { - // first use not supported for stack + Varnode first = store.getFirstVarnode(); + + if (first != null) { + addr = first.getAddress(); + if (!addr.isStackAddress()) { + // first use not supported for stack + pcaddr = pcad; + } + } + else { + // Hack: first can come back as null if something has gone wrong, such as a + // spacebase without a range. + Msg.warn(this, "First use is null, possible spacebase/global range issue." + + "There will be variable rename issues"); pcaddr = pcad; } } @@ -589,12 +601,14 @@ public class LocalSymbolMap { if (!SystemUtilities.isEqual(pcaddr, op.pcaddr)) { return false; } - return addr.equals(op.addr); + return SystemUtilities.isEqual(addr, op.addr); } @Override public int hashCode() { - int hash1 = addr.hashCode(); + // Hack: addr should not be null, but can be if something in decompiler went wrong + // most likely a spacebase without a corresponding global register range entry + int hash1 = addr != null ? addr.hashCode() : 0; int hash2 = pcaddr != null ? pcaddr.hashCode() : 0; return (hash1 << 4) ^ hash2; } diff --git a/Ghidra/Processors/MIPS/data/languages/mips32_fp64.cspec b/Ghidra/Processors/MIPS/data/languages/mips32_fp64.cspec index 533906075f..2e061b2005 100644 --- a/Ghidra/Processors/MIPS/data/languages/mips32_fp64.cspec +++ b/Ghidra/Processors/MIPS/data/languages/mips32_fp64.cspec @@ -16,9 +16,7 @@ - - diff --git a/Ghidra/Processors/MIPS/data/languages/mips32be.cspec b/Ghidra/Processors/MIPS/data/languages/mips32be.cspec index 2a08a22dc5..1cabab96e4 100644 --- a/Ghidra/Processors/MIPS/data/languages/mips32be.cspec +++ b/Ghidra/Processors/MIPS/data/languages/mips32be.cspec @@ -16,9 +16,7 @@ - - diff --git a/Ghidra/Processors/MIPS/data/languages/mips32be_eabi.cspec b/Ghidra/Processors/MIPS/data/languages/mips32be_eabi.cspec index 12178418ba..7236a93088 100644 --- a/Ghidra/Processors/MIPS/data/languages/mips32be_eabi.cspec +++ b/Ghidra/Processors/MIPS/data/languages/mips32be_eabi.cspec @@ -16,9 +16,7 @@ - - diff --git a/Ghidra/Processors/MIPS/data/languages/mips32le.cspec b/Ghidra/Processors/MIPS/data/languages/mips32le.cspec index 628b8b4756..b8437dde87 100644 --- a/Ghidra/Processors/MIPS/data/languages/mips32le.cspec +++ b/Ghidra/Processors/MIPS/data/languages/mips32le.cspec @@ -16,9 +16,7 @@ - - diff --git a/Ghidra/Processors/MIPS/data/languages/mips32le_eabi.cspec b/Ghidra/Processors/MIPS/data/languages/mips32le_eabi.cspec index 1e15146eb0..f4a6692004 100644 --- a/Ghidra/Processors/MIPS/data/languages/mips32le_eabi.cspec +++ b/Ghidra/Processors/MIPS/data/languages/mips32le_eabi.cspec @@ -16,9 +16,7 @@ - - diff --git a/Ghidra/Processors/MIPS/data/languages/mips64.cspec b/Ghidra/Processors/MIPS/data/languages/mips64.cspec index a3fe61b44d..e654191cc7 100644 --- a/Ghidra/Processors/MIPS/data/languages/mips64.cspec +++ b/Ghidra/Processors/MIPS/data/languages/mips64.cspec @@ -14,9 +14,7 @@ - - diff --git a/Ghidra/Processors/MIPS/data/languages/mips64_32_n32.cspec b/Ghidra/Processors/MIPS/data/languages/mips64_32_n32.cspec index 70e0c816be..255cb362e1 100644 --- a/Ghidra/Processors/MIPS/data/languages/mips64_32_n32.cspec +++ b/Ghidra/Processors/MIPS/data/languages/mips64_32_n32.cspec @@ -35,9 +35,7 @@ - - diff --git a/Ghidra/Processors/MIPS/data/languages/mips64_32_o32.cspec b/Ghidra/Processors/MIPS/data/languages/mips64_32_o32.cspec index 42d9c8fa07..1b01bf46e2 100644 --- a/Ghidra/Processors/MIPS/data/languages/mips64_32_o32.cspec +++ b/Ghidra/Processors/MIPS/data/languages/mips64_32_o32.cspec @@ -40,9 +40,7 @@ - - diff --git a/Ghidra/Processors/MIPS/data/languages/mips64_32_o64.cspec b/Ghidra/Processors/MIPS/data/languages/mips64_32_o64.cspec index 128efbb2c6..bbb7a4594f 100644 --- a/Ghidra/Processors/MIPS/data/languages/mips64_32_o64.cspec +++ b/Ghidra/Processors/MIPS/data/languages/mips64_32_o64.cspec @@ -25,9 +25,7 @@ - - diff --git a/Ghidra/Processors/MIPS/src/main/java/ghidra/app/plugin/core/analysis/MipsAddressAnalyzer.java b/Ghidra/Processors/MIPS/src/main/java/ghidra/app/plugin/core/analysis/MipsAddressAnalyzer.java index 4ee2b5f281..2751dd0967 100644 --- a/Ghidra/Processors/MIPS/src/main/java/ghidra/app/plugin/core/analysis/MipsAddressAnalyzer.java +++ b/Ghidra/Processors/MIPS/src/main/java/ghidra/app/plugin/core/analysis/MipsAddressAnalyzer.java @@ -477,6 +477,12 @@ public class MipsAddressAnalyzer extends ConstantPropagationAnalyzer { coveredSet.add(func.getBody()); amgr.codeDefined(coveredSet); } + else { + // else T9 was set at the beginning of the function + // something within the function must have set it to + // an unknown value, so can continue + return null; + } } catch (ContextChangeException e) { throw new AssertException("Unexpected Exception", e); diff --git a/Ghidra/Processors/RISCV/data/languages/riscv32-fp.cspec b/Ghidra/Processors/RISCV/data/languages/riscv32-fp.cspec index 19f0f17fe1..d2dc46591a 100644 --- a/Ghidra/Processors/RISCV/data/languages/riscv32-fp.cspec +++ b/Ghidra/Processors/RISCV/data/languages/riscv32-fp.cspec @@ -20,7 +20,6 @@ - diff --git a/Ghidra/Processors/RISCV/data/languages/riscv32.cspec b/Ghidra/Processors/RISCV/data/languages/riscv32.cspec index fa59edcfee..4a08e655d9 100644 --- a/Ghidra/Processors/RISCV/data/languages/riscv32.cspec +++ b/Ghidra/Processors/RISCV/data/languages/riscv32.cspec @@ -18,7 +18,6 @@ - diff --git a/Ghidra/Processors/RISCV/data/languages/riscv64-fp.cspec b/Ghidra/Processors/RISCV/data/languages/riscv64-fp.cspec index 97f8869cb9..329cb033b5 100644 --- a/Ghidra/Processors/RISCV/data/languages/riscv64-fp.cspec +++ b/Ghidra/Processors/RISCV/data/languages/riscv64-fp.cspec @@ -20,7 +20,6 @@ - diff --git a/Ghidra/Processors/RISCV/data/languages/riscv64.cspec b/Ghidra/Processors/RISCV/data/languages/riscv64.cspec index 20eab6a2c3..1fe4fe3f9b 100644 --- a/Ghidra/Processors/RISCV/data/languages/riscv64.cspec +++ b/Ghidra/Processors/RISCV/data/languages/riscv64.cspec @@ -18,7 +18,6 @@ - diff --git a/Ghidra/Processors/tricore/data/languages/tricore.cspec b/Ghidra/Processors/tricore/data/languages/tricore.cspec index cc816d9be1..82cccee75a 100644 --- a/Ghidra/Processors/tricore/data/languages/tricore.cspec +++ b/Ghidra/Processors/tricore/data/languages/tricore.cspec @@ -20,12 +20,12 @@ - - - - + + + + diff --git a/Ghidra/Processors/tricore/data/languages/tricore.ldefs b/Ghidra/Processors/tricore/data/languages/tricore.ldefs index 0091bdc820..1c9a575a59 100644 --- a/Ghidra/Processors/tricore/data/languages/tricore.ldefs +++ b/Ghidra/Processors/tricore/data/languages/tricore.ldefs @@ -6,7 +6,7 @@ endian="little" size="32" variant="default" - version="1.6" + version="1.7" slafile="tricore.sla" processorspec="tricore.pspec" manualindexfile="../manuals/tricore2.idx" @@ -19,7 +19,7 @@ endian="little" size="32" variant="TC29x" - version="1.6" + version="1.7" slafile="tricore.sla" processorspec="tc29x.pspec" manualindexfile="../manuals/tricore2.idx" @@ -32,7 +32,7 @@ endian="little" size="32" variant="TC172x" - version="1.3" + version="1.7" slafile="tricore.sla" processorspec="tc172x.pspec" manualindexfile="../manuals/tricore.idx" @@ -45,7 +45,7 @@ endian="little" size="32" variant="TC176x" - version="1.3" + version="1.7" slafile="tricore.sla" processorspec="tc176x.pspec" manualindexfile="../manuals/tricore.idx" diff --git a/Ghidra/Processors/tricore/data/languages/tricore.sinc b/Ghidra/Processors/tricore/data/languages/tricore.sinc index 4c1be52cee..0c4f412d89 100644 --- a/Ghidra/Processors/tricore/data/languages/tricore.sinc +++ b/Ghidra/Processors/tricore/data/languages/tricore.sinc @@ -2893,6 +2893,10 @@ SC: [a10]const0815Z10zz is PCPMode=0 & a10 & const0815Z10zz & op0003=8 & op0404= tmp[0,1] = 0; goto [tmp]; } +:ji a11 is PCPMode=0 & op0811=11 & op0007=0xdc & op1215=0x0 & a11 +{ + return [a11]; +} @endif @if defined(TRICORE_RIDER_B) || defined(TRICORE_RIDER_D) || defined(TRICORE_V2) @@ -2903,13 +2907,17 @@ SC: [a10]const0815Z10zz is PCPMode=0 & a10 & const0815Z10zz & op0003=8 & op0404= tmp[0,1] = 0; goto [tmp]; } +:ji a11 is PCPMode=0 & op0811=11 & op0007=0x2d & op1215=0x0 & a11; op1631=0x30 +{ + return [a11]; +} @endif # JL disp24 (B) :jl off24pc is PCPMode=0 & ( op0007=0x5d ) ... & off24pc { #TODO is this just a call w/o context switching? - a11 = inst_start + 4; + a11 = inst_next; call off24pc; } @@ -2917,7 +2925,7 @@ SC: [a10]const0815Z10zz is PCPMode=0 & a10 & const0815Z10zz & op0003=8 & op0404= :jla off24abs is PCPMode=0 & ( op0007=0xdd ) ... & off24abs { #TODO is this just a call w/o context switching? - a11 = inst_start + 4; + a11 = inst_next; call off24abs; }