summaryrefslogtreecommitdiff
path: root/arch/armv7
diff options
context:
space:
mode:
authorJosh Ferrell <josh@vector35.com>2025-03-06 16:38:38 -0500
committerJosh Ferrell <josh@vector35.com>2025-03-06 16:38:58 -0500
commitf553aeefa4485bdd15c20a08a6905185d1cf15b9 (patch)
tree148f9a58956f528f12d32d9d75bc0ea11fe530e9 /arch/armv7
parentaaff6a6e366219c52a629729d741fff1711eeb7d (diff)
ARMv7: Fix lifting of instructions that use register-shifted registers
Diffstat (limited to 'arch/armv7')
-rw-r--r--arch/armv7/il.cpp2
-rwxr-xr-xarch/armv7/test_lift.py3
2 files changed, 4 insertions, 1 deletions
diff --git a/arch/armv7/il.cpp b/arch/armv7/il.cpp
index 58eee5c7..7e5d4d90 100644
--- a/arch/armv7/il.cpp
+++ b/arch/armv7/il.cpp
@@ -287,7 +287,7 @@ static ExprId ReadILOperand(LowLevelILFunction& il, InstructionOperand& op, size
case REG:
if (op.shift == SHIFT_NONE)
return ReadRegisterOrPointer(il, op, addr);
- else if (op.flags.offsetRegUsed == 1)
+ else if (op.flags.offsetRegUsed == 1 && op.imm != 0)
{
return GetShiftedOffset(il, op);
}
diff --git a/arch/armv7/test_lift.py b/arch/armv7/test_lift.py
index a3906fc6..983ff092 100755
--- a/arch/armv7/test_lift.py
+++ b/arch/armv7/test_lift.py
@@ -100,6 +100,9 @@ test_cases = \
('A', b'\x02\x0a\x83\xed', 'LLIL_STORE.d(LLIL_ADD.d(LLIL_REG.d(r3),LLIL_CONST.d(0x8)),LLIL_REG.d(s0))'),
# vstr d16, [r3, #0x8]
('A', b'\x02\x0b\xc3\xed', 'LLIL_STORE.q(LLIL_ADD.d(LLIL_REG.d(r3),LLIL_CONST.d(0x8)),LLIL_REG.q(d16))'),
+ # orr r0, r1, r3, lsl r4
+ ('A', b'\x13\x04\x81\xe1', 'LLIL_SET_REG.d(r0,LLIL_OR.d(LLIL_REG.d(r1),LLIL_LSL.d(LLIL_REG.d(r3),LLIL_AND.d(LLIL_REG.d(r4),LLIL_CONST.d(0xFF)))))'),
+
# mov r2, r0
('T', b'\x02\x46', 'LLIL_SET_REG.d(r2,LLIL_REG.d(r0))'),
# cmp r1, r2