Patch "riscv: provide riscv-specific is_trap_insn()" has been added to the 6.5-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    riscv: provide riscv-specific is_trap_insn()

to the 6.5-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     riscv-provide-riscv-specific-is_trap_insn.patch
and it can be found in the queue-6.5 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit f054f8d1117644e194054c321f5443402506ea0f
Author: Nam Cao <namcaov@xxxxxxxxx>
Date:   Tue Aug 29 10:36:15 2023 +0200

    riscv: provide riscv-specific is_trap_insn()
    
    [ Upstream commit b701f9e726f0a30a94ea6af596b74c1f07b95b6b ]
    
    uprobes expects is_trap_insn() to return true for any trap instructions,
    not just the one used for installing uprobe. The current default
    implementation only returns true for 16-bit c.ebreak if C extension is
    enabled. This can confuse uprobes if a 32-bit ebreak generates a trap
    exception from userspace: uprobes asks is_trap_insn() who says there is no
    trap, so uprobes assume a probe was there before but has been removed, and
    return to the trap instruction. This causes an infinite loop of entering
    and exiting trap handler.
    
    Instead of using the default implementation, implement this function
    speficially for riscv with checks for both ebreak and c.ebreak.
    
    Fixes: 74784081aac8 ("riscv: Add uprobes supported")
    Signed-off-by: Nam Cao <namcaov@xxxxxxxxx>
    Tested-by: Björn Töpel <bjorn@xxxxxxxxxxxx>
    Reviewed-by: Guo Ren <guoren@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230829083614.117748-1-namcaov@xxxxxxxxx
    Signed-off-by: Palmer Dabbelt <palmer@xxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/riscv/kernel/probes/uprobes.c b/arch/riscv/kernel/probes/uprobes.c
index 194f166b2cc40..4b3dc8beaf77d 100644
--- a/arch/riscv/kernel/probes/uprobes.c
+++ b/arch/riscv/kernel/probes/uprobes.c
@@ -3,6 +3,7 @@
 #include <linux/highmem.h>
 #include <linux/ptrace.h>
 #include <linux/uprobes.h>
+#include <asm/insn.h>
 
 #include "decode-insn.h"
 
@@ -17,6 +18,11 @@ bool is_swbp_insn(uprobe_opcode_t *insn)
 #endif
 }
 
+bool is_trap_insn(uprobe_opcode_t *insn)
+{
+	return riscv_insn_is_ebreak(*insn) || riscv_insn_is_c_ebreak(*insn);
+}
+
 unsigned long uprobe_get_swbp_addr(struct pt_regs *regs)
 {
 	return instruction_pointer(regs);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux