diff --git a/Ghidra/Processors/ARM/data/languages/ARM.sinc b/Ghidra/Processors/ARM/data/languages/ARM.sinc index dd547417fd..a6bef11194 100644 --- a/Ghidra/Processors/ARM/data/languages/ARM.sinc +++ b/Ghidra/Processors/ARM/data/languages/ARM.sinc @@ -75,6 +75,10 @@ define register offset=0x0200 size=4 [ cr0 cr1 cr2 cr3 cr4 cr5 cr6 cr7 cr8 cr9 c @endif # SIMD +@if defined(CORTEX) + define register offset=0x400 size=4 [ msplim psplim ]; +@endif + # Define context bits # WARNING: when adjusting context keep compiler packing in mind # and make sure fields do not span a 32-bit boundary before or diff --git a/Ghidra/Processors/ARM/data/languages/ARMTHUMBinstructions.sinc b/Ghidra/Processors/ARM/data/languages/ARMTHUMBinstructions.sinc index 8f801357db..0f46b8f4ed 100644 --- a/Ghidra/Processors/ARM/data/languages/ARMTHUMBinstructions.sinc +++ b/Ghidra/Processors/ARM/data/languages/ARMTHUMBinstructions.sinc @@ -2860,6 +2860,42 @@ control: "control" is epsilon {} @endif +@if defined(CORTEX) + +define pcodeop setMainStackPointerLimit; + +:msr^ItCond msplim,Rn0003 is TMode=1 & ItCond & op4=0xf38 & Rn0003; op12=0x8 & th_psrmask=8 & sysm=10 & msplim +{ + build ItCond; + setMainStackPointerLimit(Rn0003); +} + +define pcodeop setProcStackPointerLimit; + +:msr^ItCond psplim,Rn0003 is TMode=1 & ItCond & op4=0xf38 & Rn0003; op12=0x8 & th_psrmask=8 & sysm=11 & psplim +{ + build ItCond; + setProcStackPointerLimit(Rn0003); +} + +define pcodeop getMainStackPointerLimit; + +:mrs^ItCond Rd0811,msplim is TMode=1 & ItCond & op0=0xf3ef; op12=0x8 & Rd0811 & sysm=10 & msplim +{ + build ItCond; + Rd0811 = getMainStackPointerLimit(); +} + +define pcodeop getProcessStackPointerLimit; + +:mrs^ItCond Rd0811,psplim is TMode=1 & ItCond & op0=0xf3ef; op12=0x8 & Rd0811 & sysm=11 & psplim +{ + build ItCond; + Rd0811 = getProcessStackPointerLimit(); +} + +@endif #CORTEX + :mrs^ItCond Rd0811,cpsr is TMode=1 & ItCond & op0=0xf3ef; op12=0x8 & Rd0811 & sysm=0 & cpsr { build ItCond;