[PATCH v4 0/2] riscv: kprobes: reject probes inside LR/SC sequences
Xiaofeng Yuan <[email protected]>
| Newsgroups | org.infradead.lists.linux-riscv |
|---|---|
| Message-ID | <[email protected]> |
A breakpoint trap taken in the middle of an LR/SC sequence clears the
load reservation, so an SC following the probed instruction always fails
and the enclosing retry loop re-enters the breakpoint, livelocking the
CPU.
This series makes the RISC-V kprobes implementation reject probes placed
inside an LR/SC sequence:
- patch 1 detects the sequences (insn.h decoding helpers, reject list
in decode-insn.c, and a forward scan from the function start in
kprobes.c).
- patch 2 adds a KUnit test that registers a probe inside and right
after a hand-written LR/SC loop and checks rejection/acceptance.
Changes in v4:
- v3 walked backwards from the probe to find an open LR. That was
wrong twice: the LR/SC state was toggled in the reverse order, and
worse, a backward walk is fundamentally ambiguous in RISC-V (the
halfword at addr-2 may be a compressed instruction or the upper
half of a 32-bit instruction, and the length bits cannot be
trusted). v4 walks forward from the function start instead, a
known instruction boundary.
- document the kallsyms_lookup_size_offset() offset-0 caveat in the
commit message, and test it with local (.L) labels so probe
addresses never coincide with kallsyms symbols inside the sequence.
- the KUnit test (patch 2) is new in v4. No earlier version had a
dedicated LR/SC test, which is why the backward-scan bugs went
unnoticed.
Link: https://lore.kernel.org/linux-riscv/REPLACE-WITH-V3-MSGID/
Xiaofeng Yuan (2):
riscv: probes: reject kprobes inside LR/SC sequences
riscv: kprobes: add KUnit test for LR/SC sequence rejection
arch/riscv/include/asm/insn.h | 18 +++++++
arch/riscv/kernel/probes/decode-insn.c | 2 +
arch/riscv/kernel/probes/kprobes.c | 54 +++++++++++++++++++
.../kernel/tests/kprobes/test-kprobes-asm.S | 19 +++++++
.../riscv/kernel/tests/kprobes/test-kprobes.c | 19 +++++++
.../riscv/kernel/tests/kprobes/test-kprobes.h | 6 +++
6 files changed, 118 insertions(+)
--
2.43.0
_______________________________________________
linux-riscv mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-riscv