Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6823fc85 authored by Jon Medhurst's avatar Jon Medhurst Committed by Nicolas Pitre
Browse files

ARM: kprobes: Fix emulation of LDRH, STRH, LDRSB and LDRSH instructions



The decoding of these instructions got the register indexed and
immediate indexed forms the wrong way around, causing incorrect
emulation.

Signed-off-by: default avatarJon Medhurst <tixy@yxit.co.uk>
Signed-off-by: default avatarNicolas Pitre <nicolas.pitre@linaro.org>
parent ec58d7f2
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -883,11 +883,12 @@ emulate_alu_tests(struct kprobe *p, struct pt_regs *regs)
static enum kprobe_insn __kprobes
static enum kprobe_insn __kprobes
prep_emulate_ldr_str(kprobe_opcode_t insn, struct arch_specific_insn *asi)
prep_emulate_ldr_str(kprobe_opcode_t insn, struct arch_specific_insn *asi)
{
{
	int ibit = (insn & (1 << 26)) ? 25 : 22;
	int not_imm = (insn & (1 << 26)) ? (insn & (1 << 25))
					 : (~insn & (1 << 22));


	insn &= 0xfff00fff;
	insn &= 0xfff00fff;
	insn |= 0x00001000;	/* Rn = r0, Rd = r1 */
	insn |= 0x00001000;	/* Rn = r0, Rd = r1 */
	if (insn & (1 << ibit)) {
	if (not_imm) {
		insn &= ~0xf;
		insn &= ~0xf;
		insn |= 2;	/* Rm = r2 */
		insn |= 2;	/* Rm = r2 */
	}
	}