Commit 48acba98 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'riscv/for-v5.4-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux

Pull RISC-V fixes from Paul Walmsley:

 - Fix several bugs in the breakpoint trap handler

 - Drop an unnecessary loop around calls to preempt_schedule_irq()

* tag 'riscv/for-v5.4-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux:
  RISC-V: entry: Remove unneeded need_resched() loop
  riscv: Correct the handling of unexpected ebreak in do_trap_break()
  riscv: avoid sending a SIGTRAP to a user thread trapped in WARN()
  riscv: avoid kernel hangs when trapped in BUG()
parents 63f9bff5 cd9e72b8
...@@ -273,12 +273,11 @@ restore_all: ...@@ -273,12 +273,11 @@ restore_all:
resume_kernel: resume_kernel:
REG_L s0, TASK_TI_PREEMPT_COUNT(tp) REG_L s0, TASK_TI_PREEMPT_COUNT(tp)
bnez s0, restore_all bnez s0, restore_all
need_resched:
REG_L s0, TASK_TI_FLAGS(tp) REG_L s0, TASK_TI_FLAGS(tp)
andi s0, s0, _TIF_NEED_RESCHED andi s0, s0, _TIF_NEED_RESCHED
beqz s0, restore_all beqz s0, restore_all
call preempt_schedule_irq call preempt_schedule_irq
j need_resched j restore_all
#endif #endif
work_pending: work_pending:
......
...@@ -124,24 +124,24 @@ static inline unsigned long get_break_insn_length(unsigned long pc) ...@@ -124,24 +124,24 @@ static inline unsigned long get_break_insn_length(unsigned long pc)
asmlinkage void do_trap_break(struct pt_regs *regs) asmlinkage void do_trap_break(struct pt_regs *regs)
{ {
#ifdef CONFIG_GENERIC_BUG
if (!user_mode(regs)) { if (!user_mode(regs)) {
enum bug_trap_type type; enum bug_trap_type type;
type = report_bug(regs->sepc, regs); type = report_bug(regs->sepc, regs);
switch (type) { switch (type) {
case BUG_TRAP_TYPE_NONE: #ifdef CONFIG_GENERIC_BUG
break;
case BUG_TRAP_TYPE_WARN: case BUG_TRAP_TYPE_WARN:
regs->sepc += get_break_insn_length(regs->sepc); regs->sepc += get_break_insn_length(regs->sepc);
break; return;
case BUG_TRAP_TYPE_BUG: case BUG_TRAP_TYPE_BUG:
#endif /* CONFIG_GENERIC_BUG */
default:
die(regs, "Kernel BUG"); die(regs, "Kernel BUG");
} }
} else {
force_sig_fault(SIGTRAP, TRAP_BRKPT,
(void __user *)(regs->sepc));
} }
#endif /* CONFIG_GENERIC_BUG */
force_sig_fault(SIGTRAP, TRAP_BRKPT, (void __user *)(regs->sepc));
} }
#ifdef CONFIG_GENERIC_BUG #ifdef CONFIG_GENERIC_BUG
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment