diff --git a/Ghidra/Processors/ARM/data/languages/ARM.ldefs b/Ghidra/Processors/ARM/data/languages/ARM.ldefs index e914419a8d..fca51e9ab2 100644 --- a/Ghidra/Processors/ARM/data/languages/ARM.ldefs +++ b/Ghidra/Processors/ARM/data/languages/ARM.ldefs @@ -5,7 +5,7 @@ endian="little" size="32" variant="v8" - version="1.107" + version="1.108" slafile="ARM8_le.sla" processorspec="ARMt.pspec" manualindexfile="../manuals/ARM.idx" @@ -29,7 +29,7 @@ endian="little" size="32" variant="v8T" - version="1.107" + version="1.108" slafile="ARM8_le.sla" processorspec="ARMtTHUMB.pspec" manualindexfile="../manuals/ARM.idx" @@ -52,7 +52,7 @@ instructionEndian="little" size="32" variant="v8LEInstruction" - version="1.107" + version="1.108" slafile="ARM8_le.sla" processorspec="ARMt.pspec" manualindexfile="../manuals/ARM.idx" @@ -68,7 +68,7 @@ endian="big" size="32" variant="v8" - version="1.107" + version="1.108" slafile="ARM8_be.sla" processorspec="ARMt.pspec" manualindexfile="../manuals/ARM.idx" @@ -91,7 +91,7 @@ endian="big" size="32" variant="v8T" - version="1.107" + version="1.108" slafile="ARM8_be.sla" processorspec="ARMtTHUMB.pspec" manualindexfile="../manuals/ARM.idx" @@ -111,7 +111,7 @@ endian="little" size="32" variant="v7" - version="1.107" + version="1.108" slafile="ARM7_le.sla" processorspec="ARMt.pspec" manualindexfile="../manuals/ARM.idx" @@ -134,7 +134,7 @@ instructionEndian="little" size="32" variant="v7LEInstruction" - version="1.107" + version="1.108" slafile="ARM7_le.sla" processorspec="ARMt.pspec" manualindexfile="../manuals/ARM.idx" @@ -150,7 +150,7 @@ endian="big" size="32" variant="v7" - version="1.107" + version="1.108" slafile="ARM7_be.sla" processorspec="ARMt.pspec" manualindexfile="../manuals/ARM.idx" @@ -171,7 +171,7 @@ endian="little" size="32" variant="Cortex" - version="1.107" + version="1.108" slafile="ARM7_le.sla" processorspec="ARMCortex.pspec" manualindexfile="../manuals/ARM.idx" @@ -195,7 +195,7 @@ endian="big" size="32" variant="Cortex" - version="1.107" + version="1.108" slafile="ARM7_be.sla" processorspec="ARMCortex.pspec" manualindexfile="../manuals/ARM.idx" @@ -218,7 +218,7 @@ endian="little" size="32" variant="v8-m" - version="1.107" + version="1.108" slafile="ARM8m_le.sla" processorspec="ARMCortex.pspec" manualindexfile="../manuals/ARM.idx" @@ -236,7 +236,7 @@ endian="big" size="32" variant="v8-m" - version="1.107" + version="1.108" slafile="ARM8m_be.sla" processorspec="ARMCortex.pspec" manualindexfile="../manuals/ARM.idx" @@ -255,7 +255,7 @@ endian="little" size="32" variant="v6" - version="1.107" + version="1.108" slafile="ARM6_le.sla" processorspec="ARMt_v6.pspec" manualindexfile="../manuals/ARM.idx" @@ -278,7 +278,7 @@ endian="big" size="32" variant="v6" - version="1.107" + version="1.108" slafile="ARM6_be.sla" processorspec="ARMt_v6.pspec" manualindexfile="../manuals/ARM.idx" @@ -301,7 +301,7 @@ endian="little" size="32" variant="v5t" - version="1.107" + version="1.108" slafile="ARM5t_le.sla" processorspec="ARMt_v45.pspec" manualindexfile="../manuals/ARM.idx" @@ -322,7 +322,7 @@ endian="big" size="32" variant="v5t" - version="1.107" + version="1.108" slafile="ARM5t_be.sla" processorspec="ARMt_v45.pspec" manualindexfile="../manuals/ARM.idx" @@ -343,7 +343,7 @@ endian="little" size="32" variant="v5" - version="1.107" + version="1.108" slafile="ARM5_le.sla" processorspec="ARM_v45.pspec" manualindexfile="../manuals/ARM.idx" @@ -362,7 +362,7 @@ endian="big" size="32" variant="v5" - version="1.101" + version="1.108" slafile="ARM5_be.sla" processorspec="ARM_v45.pspec" manualindexfile="../manuals/ARM.idx" @@ -381,7 +381,7 @@ endian="little" size="32" variant="v4t" - version="1.107" + version="1.108" slafile="ARM4t_le.sla" processorspec="ARMt_v45.pspec" manualindexfile="../manuals/ARM.idx" @@ -401,7 +401,7 @@ endian="big" size="32" variant="v4t" - version="1.107" + version="1.108" slafile="ARM4t_be.sla" processorspec="ARMt_v45.pspec" manualindexfile="../manuals/ARM.idx" @@ -421,7 +421,7 @@ endian="little" size="32" variant="v4" - version="1.107" + version="1.108" slafile="ARM4_le.sla" processorspec="ARM_v45.pspec" manualindexfile="../manuals/ARM.idx" @@ -444,7 +444,7 @@ endian="big" size="32" variant="v4" - version="1.107" + version="1.108" slafile="ARM4_be.sla" processorspec="ARM_v45.pspec" manualindexfile="../manuals/ARM.idx" diff --git a/Ghidra/Processors/ARM/data/languages/ARMinstructions.sinc b/Ghidra/Processors/ARM/data/languages/ARMinstructions.sinc index ddd0fa648d..79be5184a6 100644 --- a/Ghidra/Processors/ARM/data/languages/ARMinstructions.sinc +++ b/Ghidra/Processors/ARM/data/languages/ARMinstructions.sinc @@ -2565,7 +2565,7 @@ ArmPCRelImmed12: reloff is U23=0 & immed & rotate @if defined(VERSION_6) # cpy is a pre-UAL synonym for mov -:cpy^COND pc,rm is $(AMODE) & ARMcond=1 & COND & pc & c2027=0x1a & c1619=0 & c0411=0 & Rd=15 & rm +:cpy^COND pc,rm is $(AMODE) & ARMcond=1 & LRset=0 & COND & pc & c2027=0x1a & c1619=0 & c0411=0 & Rd=15 & rm { build COND; build rm; @@ -2573,6 +2573,14 @@ ArmPCRelImmed12: reloff is U23=0 & immed & rotate goto [pc]; } +:cpy^COND pc,rm is $(AMODE) & ARMcond=1 & LRset=1 & COND & pc & c2027=0x1a & c1619=0 & c0411=0 & Rd=15 & rm +{ + build COND; + build rm; + BXWritePC(rm); + call [pc]; +} + :cpy^COND lr,rm is $(AMODE) & ARMcond=1 & COND & c2027=0x1a & c1619=0 & c0411=0 & Rd=14 & lr & rm & Rm2=15 [ LRset=1; globalset(inst_next,LRset); ] { diff --git a/Ghidra/Processors/ARM/data/patterns/ARM_BE_patterns.xml b/Ghidra/Processors/ARM/data/patterns/ARM_BE_patterns.xml index cfd1eca3b3..31a095fffe 100644 --- a/Ghidra/Processors/ARM/data/patterns/ARM_BE_patterns.xml +++ b/Ghidra/Processors/ARM/data/patterns/ARM_BE_patterns.xml @@ -67,7 +67,7 @@ 11100101 00101101 1110.... ........ 0xe24dd... 11100101 00101101 1110.... ........ 0x........ 0xe24dd... 0xe5 0x2d 0xe0 0x08 - 0xe1a0c00d 0xe92d.... + 0xe1a0c00d 0xe9 0x2. 11...... 0x.0 @@ -140,7 +140,7 @@ - 0xe1a0c00d 0xe92d.... + 0xe1a0c00d 0xe9 0x2. 11...... 0x.0 @@ -157,7 +157,7 @@ 0xe92d 0100.... ........ - + diff --git a/Ghidra/Processors/ARM/data/patterns/ARM_LE_patterns.xml b/Ghidra/Processors/ARM/data/patterns/ARM_LE_patterns.xml index dc113fa049..3f654adb84 100644 --- a/Ghidra/Processors/ARM/data/patterns/ARM_LE_patterns.xml +++ b/Ghidra/Processors/ARM/data/patterns/ARM_LE_patterns.xml @@ -68,7 +68,7 @@ ........ 1110.... 00101101 11100101 0x..d.4de2 ........ 1110.... 00101101 11100101 0x........ 0x..d.4de2 0x08 0xe0 0x2d 0xe5 - 0x0dc0a0e1 0x....2de9 + 0x0dc0a0e1 0x.0 11...... 0x2. 0xe9 ........ 0100.... 00101101 11101001 @@ -156,7 +156,7 @@ - 0x0dc0a0e1 0x....2de9 + 0x0dc0a0e1 0x.0 11...... 0x2. 0xe9 @@ -173,7 +173,7 @@ 0x2de9 ........ 010..... - + diff --git a/Ghidra/Processors/ARM/src/main/java/ghidra/app/plugin/core/analysis/ArmAnalyzer.java b/Ghidra/Processors/ARM/src/main/java/ghidra/app/plugin/core/analysis/ArmAnalyzer.java index bb515bc4d3..e9c513363f 100644 --- a/Ghidra/Processors/ARM/src/main/java/ghidra/app/plugin/core/analysis/ArmAnalyzer.java +++ b/Ghidra/Processors/ARM/src/main/java/ghidra/app/plugin/core/analysis/ArmAnalyzer.java @@ -30,6 +30,7 @@ import ghidra.program.model.data.*; import ghidra.program.model.lang.*; import ghidra.program.model.listing.*; import ghidra.program.model.mem.MemoryBlock; +import ghidra.program.model.pcode.PcodeOp; import ghidra.program.model.pcode.Varnode; import ghidra.program.model.scalar.Scalar; import ghidra.program.model.symbol.*; @@ -200,6 +201,11 @@ public class ArmAnalyzer extends ConstantPropagationAnalyzer { } return true; } + else if (pcodeop == PcodeOp.STORE && instr.getMinAddress().add(8).equals(address)) { + // Most likely a store of the PC to the stack + // ARM PC is curInst+8 + return false; + } } else if (refType.isCall() && refType.isComputed() && !address.isExternalAddress()) { // must disassemble right now, because TB flag could get set back at end of blx