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;
}