MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / GetSpecialRegister

Function GetSpecialRegister

arch/armv7/thumb2_disasm/il_thumb2.cpp:45–89  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

43}
44
45static int GetSpecialRegister(LowLevelILFunction& il, decomp_result* instr, size_t operand)
46{
47 uint32_t mask = instr->fields[FIELD_mask] & 0xF;
48
49 if (IS_FIELD_PRESENT(instr, FIELD_write_spsr))
50 {
51 if (instr->fields[FIELD_write_spsr])
52 return REGS_SPSR + mask;
53 else
54 return REGS_CPSR + mask;
55 }
56
57 uint32_t tmp = (instr->fields[FIELD_write_nzcvq] << 1) | instr->fields[FIELD_write_g];
58 uint8_t sysm = instr->fields[FIELD_SYSm];
59 switch (sysm >> 3)
60 {
61 case 0:
62 switch(tmp)
63 {
64 case 1: return REGS_APSR_G;
65 case 2: return REGS_APSR_NZCVQ;
66 case 3: return REGS_APSR_NZCVQG;
67 }
68 break;
69 case 1:
70 switch (sysm & 7)
71 {
72 case 0: return REGS_MSP;
73 case 1: return REGS_PSP;
74 }
75 break;
76 case 2:
77 switch (sysm & 7)
78 {
79 case 0: return REGS_PRIMASK;
80 case 1:
81 case 2: return REGS_BASEPRI;
82 case 3: return REGS_FAULTMASK;
83 case 4: return REGS_CONTROL;
84 }
85 break;
86 }
87
88 return REG_INVALID;
89}
90
91static ExprId ReadILOperand(LowLevelILFunction& il, decomp_result* instr, size_t operand, size_t size = 4)
92{

Callers 1

Calls

no outgoing calls

Tested by

no test coverage detected