From 28ca53cb343e655aa4515ee041dbd93004833d44 Mon Sep 17 00:00:00 2001 From: ghintern Date: Wed, 7 May 2025 17:41:41 +0000 Subject: [PATCH] GP-4923: cspec, ldefs, opinion file support for ARM apcs abi --- Ghidra/Processors/ARM/certification.manifest | 1 + .../Processors/ARM/data/languages/ARM.ldefs | 22 ++ .../ARM/data/languages/ARM_apcs.cspec | 299 ++++++++++++++++++ 3 files changed, 322 insertions(+) create mode 100644 Ghidra/Processors/ARM/data/languages/ARM_apcs.cspec diff --git a/Ghidra/Processors/ARM/certification.manifest b/Ghidra/Processors/ARM/certification.manifest index 777e1f93dd..fc28f71729 100644 --- a/Ghidra/Processors/ARM/certification.manifest +++ b/Ghidra/Processors/ARM/certification.manifest @@ -26,6 +26,7 @@ data/languages/ARM8m_le.slaspec||GHIDRA||||END| data/languages/ARMCortex.pspec||GHIDRA||||END| data/languages/ARMTHUMBinstructions.sinc||GHIDRA||||END| data/languages/ARM_CDE.sinc||GHIDRA||||END| +data/languages/ARM_apcs.cspec||GHIDRA||||END| data/languages/ARM_v45.cspec||GHIDRA||||END| data/languages/ARM_v45.pspec||GHIDRA||||END| data/languages/ARM_win.cspec||GHIDRA||||END| diff --git a/Ghidra/Processors/ARM/data/languages/ARM.ldefs b/Ghidra/Processors/ARM/data/languages/ARM.ldefs index 695e6bd3e7..e914419a8d 100644 --- a/Ghidra/Processors/ARM/data/languages/ARM.ldefs +++ b/Ghidra/Processors/ARM/data/languages/ARM.ldefs @@ -13,6 +13,7 @@ Generic ARM/Thumb v8 little endian + @@ -36,6 +37,7 @@ Generic ARM/Thumb v8 little endian (Thumb is default) + @@ -58,6 +60,7 @@ Generic ARM/Thumb v8 little endian instructions and big endian data + @@ -72,6 +75,7 @@ id="ARM:BE:32:v8"> Generic ARM/Thumb v8 big endian + @@ -94,6 +98,7 @@ id="ARM:BE:32:v8T"> Generic ARM/Thumb v8 big endian (Thumb is default) + @@ -114,6 +119,7 @@ Generic ARM/Thumb v7 little endian + @@ -136,6 +142,7 @@ Generic ARM/Thumb v7 little endian instructions and big endian data + @@ -150,6 +157,7 @@ id="ARM:BE:32:v7"> Generic ARM/Thumb v7 big endian + @@ -170,6 +178,7 @@ id="ARM:LE:32:Cortex"> ARM Cortex / Thumb little endian + @@ -193,6 +202,7 @@ id="ARM:BE:32:Cortex"> ARM Cortex / Thumb big endian + @@ -215,6 +225,7 @@ id="ARM:LE:32:v8-m"> ARM Cortex v8-m little endian + @@ -232,6 +243,7 @@ id="ARM:BE:32:v8-m"> ARM Cortex v8-m big endian + @@ -250,6 +262,7 @@ id="ARM:LE:32:v6"> Generic ARM/Thumb v6 little endian + @@ -272,6 +285,7 @@ id="ARM:BE:32:v6"> Generic ARM/Thumb v6 big endian + @@ -294,6 +308,7 @@ id="ARM:LE:32:v5t"> Generic ARM/Thumb v5 little endian (T-variant) + @@ -314,6 +329,7 @@ id="ARM:BE:32:v5t"> Generic ARM/Thumb v5 big endian (T-variant) + @@ -334,6 +350,7 @@ id="ARM:LE:32:v5"> Generic ARM v5 little endian + @@ -352,6 +369,7 @@ id="ARM:BE:32:v5"> Generic ARM v5 big endian + @@ -370,6 +388,7 @@ id="ARM:LE:32:v4t"> Generic ARM/Thumb v4 little endian (T-variant) + @@ -389,6 +408,7 @@ id="ARM:BE:32:v4t"> Generic ARM/Thumb v4 big endian (T-variant) + @@ -408,6 +428,7 @@ id="ARM:LE:32:v4"> Generic ARM v4 little endian + @@ -430,6 +451,7 @@ id="ARM:BE:32:v4"> Generic ARM v4 big endian + diff --git a/Ghidra/Processors/ARM/data/languages/ARM_apcs.cspec b/Ghidra/Processors/ARM/data/languages/ARM_apcs.cspec new file mode 100644 index 0000000000..406734fa88 --- /dev/null +++ b/Ghidra/Processors/ARM/data/languages/ARM_apcs.cspec @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ; + offset = *:1 (lr + r3); + r3 = zext(offset); + + + if (inbounds) goto ; + offset = *:1 (lr + r12); + r3 = zext(offset); + + + r3 = r3 * 2; + + r12 = lr + r3; + + ISAModeSwitch = (r12 & 1) != 1; + TB = ISAModeSwitch; + pc = r12 & 0xfffffffe; + goto [pc]; + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +