diff --git a/arch/arm64/kernel/probes/simulate-insn.c b/arch/arm64/kernel/probes/simulate-insn.c index 7d63423ea..25f67ec59 100755 --- a/arch/arm64/kernel/probes/simulate-insn.c +++ b/arch/arm64/kernel/probes/simulate-insn.c @@ -170,15 +170,17 @@ simulate_tbz_tbnz(u32 opcode, long addr, struct pt_regs *regs) void __kprobes simulate_ldr_literal(u32 opcode, long addr, struct pt_regs *regs) { - unsigned long load_addr; + u64 *load_addr; int xn = opcode & 0x1f; + int disp; - load_addr = addr + ldr_displacement(opcode); + disp = ldr_displacement(opcode); + load_addr = (u64 *) (addr + disp); if (opcode & (1 << 30)) /* x0-x30 */ - set_x_reg(regs, xn, READ_ONCE(*(u64 *)load_addr)); + set_x_reg(regs, xn, *load_addr); else /* w0-w30 */ - set_w_reg(regs, xn, READ_ONCE(*(u32 *)load_addr)); + set_w_reg(regs, xn, *load_addr); instruction_pointer_set(regs, instruction_pointer(regs) + 4); } @@ -186,12 +188,14 @@ simulate_ldr_literal(u32 opcode, long addr, struct pt_regs *regs) void __kprobes simulate_ldrsw_literal(u32 opcode, long addr, struct pt_regs *regs) { - unsigned long load_addr; + s32 *load_addr; int xn = opcode & 0x1f; + int disp; - load_addr = addr + ldr_displacement(opcode); + disp = ldr_displacement(opcode); + load_addr = (s32 *) (addr + disp); - set_x_reg(regs, xn, READ_ONCE(*(s32 *)load_addr)); + set_x_reg(regs, xn, *load_addr); instruction_pointer_set(regs, instruction_pointer(regs) + 4); }