]> Git Repo - J-linux.git/commitdiff
riscv, kprobes: Stricter c.jr/c.jalr decoding
authorBjörn Töpel <[email protected]>
Mon, 2 Jan 2023 16:07:48 +0000 (17:07 +0100)
committerPalmer Dabbelt <[email protected]>
Thu, 5 Jan 2023 20:30:41 +0000 (12:30 -0800)
In the compressed instruction extension, c.jr, c.jalr, c.mv, and c.add
is encoded the following way (each instruction is 16b):

---+-+-----------+-----------+--
100 0 rs1[4:0]!=0       00000 10 : c.jr
100 1 rs1[4:0]!=0       00000 10 : c.jalr
100 0  rd[4:0]!=0 rs2[4:0]!=0 10 : c.mv
100 1  rd[4:0]!=0 rs2[4:0]!=0 10 : c.add

The following logic is used to decode c.jr and c.jalr:

  insn & 0xf007 == 0x8002 => instruction is an c.jr
  insn & 0xf007 == 0x9002 => instruction is an c.jalr

When 0xf007 is used to mask the instruction, c.mv can be incorrectly
decoded as c.jr, and c.add as c.jalr.

Correct the decoding by changing the mask from 0xf007 to 0xf07f.

Fixes: c22b0bcb1dd0 ("riscv: Add kprobes supported")
Signed-off-by: Björn Töpel <[email protected]>
Reviewed-by: Conor Dooley <[email protected]>
Reviewed-by: Guo Ren <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Cc: [email protected]
Signed-off-by: Palmer Dabbelt <[email protected]>
arch/riscv/kernel/probes/simulate-insn.h

index cb6ff7dccb92e18bde5f9b517e42ec851a98b986..de8474146a9b6e71e025fcb79daef39e1cd8d2e7 100644 (file)
@@ -31,9 +31,9 @@ __RISCV_INSN_FUNCS(fence,     0x7f, 0x0f);
        } while (0)
 
 __RISCV_INSN_FUNCS(c_j,                0xe003, 0xa001);
-__RISCV_INSN_FUNCS(c_jr,       0xf007, 0x8002);
+__RISCV_INSN_FUNCS(c_jr,       0xf07f, 0x8002);
 __RISCV_INSN_FUNCS(c_jal,      0xe003, 0x2001);
-__RISCV_INSN_FUNCS(c_jalr,     0xf007, 0x9002);
+__RISCV_INSN_FUNCS(c_jalr,     0xf07f, 0x9002);
 __RISCV_INSN_FUNCS(c_beqz,     0xe003, 0xc001);
 __RISCV_INSN_FUNCS(c_bnez,     0xe003, 0xe001);
 __RISCV_INSN_FUNCS(c_ebreak,   0xffff, 0x9002);
This page took 0.052033 seconds and 4 git commands to generate.