]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
riscv: misaligned: enable IRQs while handling misaligned accesses
authorClément Léger <cleger@rivosinc.com>
Tue, 22 Apr 2025 16:23:09 +0000 (18:23 +0200)
committerAlexandre Ghiti <alexghiti@rivosinc.com>
Thu, 8 May 2025 12:00:36 +0000 (12:00 +0000)
We can safely reenable IRQs if coming from userspace. This allows to
access user memory that could potentially trigger a page fault.

Fixes: b686ecdeacf6 ("riscv: misaligned: Restrict user access to kernel memory")
Signed-off-by: Clément Léger <cleger@rivosinc.com>
Reviewed-by: Alexandre Ghiti <alexghiti@rivosinc.com>
Link: https://lore.kernel.org/r/20250422162324.956065-3-cleger@rivosinc.com
Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com>
arch/riscv/kernel/traps.c

index b1d991c78a23379e5dfc00df6a4d0f1a9a5261ed..9c83848797a78b05e7f05a435dc4236f0a126948 100644 (file)
@@ -220,19 +220,23 @@ static void do_trap_misaligned(struct pt_regs *regs, enum misaligned_access_type
 {
        irqentry_state_t state;
 
-       if (user_mode(regs))
+       if (user_mode(regs)) {
                irqentry_enter_from_user_mode(regs);
-       else
+               local_irq_enable();
+       } else {
                state = irqentry_nmi_enter(regs);
+       }
 
        if (misaligned_handler[type].handler(regs))
                do_trap_error(regs, SIGBUS, BUS_ADRALN, regs->epc,
                              misaligned_handler[type].type_str);
 
-       if (user_mode(regs))
+       if (user_mode(regs)) {
+               local_irq_disable();
                irqentry_exit_to_user_mode(regs);
-       else
+       } else {
                irqentry_nmi_exit(regs, state);
+       }
 }
 
 asmlinkage __visible __trap_section void do_trap_load_misaligned(struct pt_regs *regs)