projects
/
linux.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
5b89c6f
)
riscv/kprobe: Fix instruction simulation of JALR
author
Liao Chang
<liaochang1@huawei.com>
Mon, 16 Jan 2023 06:43:42 +0000
(14:43 +0800)
committer
Palmer Dabbelt
<palmer@rivosinc.com>
Wed, 25 Jan 2023 05:38:19 +0000
(21:38 -0800)
Set kprobe at 'jalr 1140(ra)' of vfs_write results in the following
crash:
[ 32.092235] Unable to handle kernel access to user memory without uaccess routines at virtual address
00aaaaaad77b1170
[ 32.093115] Oops [#1]
[ 32.093251] Modules linked in:
[ 32.093626] CPU: 0 PID: 135 Comm: ftracetest Not tainted
6.2.0-rc2-00013-gb0aa5e5df0cb
-dirty #16
[ 32.093985] Hardware name: riscv-virtio,qemu (DT)
[ 32.094280] epc : ksys_read+0x88/0xd6
[ 32.094855] ra : ksys_read+0xc0/0xd6
[ 32.095016] epc :
ffffffff801cda80
ra :
ffffffff801cdab8
sp :
ff20000000d7bdc0
[ 32.095227] gp :
ffffffff80f14000
tp :
ff60000080f9cb40
t0 :
ffffffff80f13e80
[ 32.095500] t1 :
ffffffff8000c29c
t2 :
ffffffff800dbc54
s0 :
ff20000000d7be60
[ 32.095716] s1 :
0000000000000000
a0 :
ffffffff805a64ae
a1 :
ffffffff80a83708
[ 32.095921] a2 :
ffffffff80f160a0
a3 :
0000000000000000
a4 :
f229b0afdb165300
[ 32.096171] a5 :
f229b0afdb165300
a6 :
ffffffff80eeebd0
a7 :
00000000000003ff
[ 32.096411] s2 :
ff6000007ff76800
s3 :
fffffffffffffff7
s4 :
00aaaaaad77b1170
[ 32.096638] s5 :
ffffffff80f160a0
s6 :
ff6000007ff76800
s7 :
0000000000000030
[ 32.096865] s8 :
00ffffffc3d97be0
s9 :
0000000000000007
s10:
00aaaaaad77c9410
[ 32.097092] s11:
0000000000000000
t3 :
ffffffff80f13e48
t4 :
ffffffff8000c29c
[ 32.097317] t5 :
ffffffff8000c29c
t6 :
ffffffff800dbc54
[ 32.097505] status:
0000000200000120
badaddr:
00aaaaaad77b1170
cause:
000000000000000d
[ 32.098011] [<
ffffffff801cdb72
>] ksys_write+0x6c/0xd6
[ 32.098222] [<
ffffffff801cdc06
>] sys_write+0x2a/0x38
[ 32.098405] [<
ffffffff80003c76
>] ret_from_syscall+0x0/0x2
Since the rs1 and rd might be the same one, such as 'jalr 1140(ra)',
hence it requires obtaining the target address from rs1 followed by
updating rd.
Fixes: c22b0bcb1dd0 ("riscv: Add kprobes supported")
Signed-off-by: Liao Chang <liaochang1@huawei.com>
Reviewed-by: Guo Ren <guoren@kernel.org>
Link:
https://lore.kernel.org/r/20230116064342.2092136-1-liaochang1@huawei.com
[Palmer: Pick Guo's cleanup]
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/kernel/probes/simulate-insn.c
patch
|
blob
|
history
diff --git
a/arch/riscv/kernel/probes/simulate-insn.c
b/arch/riscv/kernel/probes/simulate-insn.c
index d73e96f6ed7c59dafdaebb916598c69df9f15c1b..a20568bd1f1a885909009b4e14460ab73ada2b90 100644
(file)
--- a/
arch/riscv/kernel/probes/simulate-insn.c
+++ b/
arch/riscv/kernel/probes/simulate-insn.c
@@
-71,11
+71,11
@@
bool __kprobes simulate_jalr(u32 opcode, unsigned long addr, struct pt_regs *reg
u32 rd_index = (opcode >> 7) & 0x1f;
u32 rs1_index = (opcode >> 15) & 0x1f;
- ret = rv_insn_reg_
set_val(regs, rd_index, addr + 4
);
+ ret = rv_insn_reg_
get_val(regs, rs1_index, &base_addr
);
if (!ret)
return ret;
- ret = rv_insn_reg_
get_val(regs, rs1_index, &base_addr
);
+ ret = rv_insn_reg_
set_val(regs, rd_index, addr + 4
);
if (!ret)
return ret;