mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-06 03:50:02 +02:00
GP-1221: Using "missing cpsr" heuristic to disassemble Cortex-M as THUMB.
This commit is contained in:
parent
c0739bbede
commit
11b82d7ccf
1 changed files with 32 additions and 23 deletions
|
@ -25,11 +25,13 @@ import ghidra.program.model.address.AddressSetView;
|
|||
import ghidra.program.model.lang.Register;
|
||||
import ghidra.program.model.lang.RegisterValue;
|
||||
import ghidra.trace.model.memory.TraceMemoryRegisterSpace;
|
||||
import ghidra.trace.model.memory.TraceMemoryState;
|
||||
import ghidra.trace.model.program.TraceProgramView;
|
||||
import ghidra.trace.model.thread.TraceThread;
|
||||
import ghidra.util.Msg;
|
||||
|
||||
@DisassemblyInjectInfo(langIDs = {
|
||||
@DisassemblyInjectInfo(
|
||||
langIDs = {
|
||||
"ARM:LE:32:v8",
|
||||
"ARM:LE:32:v8T",
|
||||
"ARM:LEBE:32:v8LEInstruction",
|
||||
|
@ -78,9 +80,16 @@ public class ArmDisassemblyInject implements DisassemblyInject {
|
|||
|
||||
TraceMemoryRegisterSpace regs =
|
||||
view.getTrace().getMemoryManager().getMemoryRegisterSpace(thread, false);
|
||||
if (regs == null) {
|
||||
/**
|
||||
* Some variants (particularly Cortex-M) are missing cpsr This seems to indicate it only
|
||||
* supports THUMB. There is an epsr (xpsr in gdb), but we don't have it in our models, and
|
||||
* its TMode bit must be set, or it will fault.
|
||||
*/
|
||||
if (regs == null || regs.getState(view.getSnap(), cpsrReg) != TraceMemoryState.KNOWN) {
|
||||
command.setInitialContext(new RegisterValue(tModeReg, BigInteger.ONE));
|
||||
return;
|
||||
}
|
||||
|
||||
RegisterValue cpsrVal = regs.getValue(view.getSnap(), cpsrReg);
|
||||
if (isThumbMode(cpsrVal)) {
|
||||
command.setInitialContext(new RegisterValue(tModeReg, BigInteger.ONE));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue