Page MenuHomeFreeBSD

D47688.id146760.diff
No OneTemporary

D47688.id146760.diff

diff --git a/sys/riscv/riscv/trap.c b/sys/riscv/riscv/trap.c
--- a/sys/riscv/riscv/trap.c
+++ b/sys/riscv/riscv/trap.c
@@ -227,11 +227,6 @@
pcb = td->td_pcb;
stval = frame->tf_stval;
- if (td->td_critnest != 0 || td->td_intr_nesting_level != 0 ||
- WITNESS_CHECK(WARN_SLEEPOK | WARN_GIANTOK, NULL,
- "Kernel page fault") != 0)
- goto fatal;
-
if (usermode) {
if (!VIRT_IS_VALID(stval)) {
call_trapsignal(td, SIGSEGV, SEGV_MAPERR, (void *)stval,
@@ -244,7 +239,8 @@
* Enable interrupts for the duration of the page fault. For
* user faults this was done already in do_trap_user().
*/
- intr_enable();
+ if ((frame->tf_sstatus & SSTATUS_SIE) != 0)
+ intr_enable();
if (stval >= VM_MIN_KERNEL_ADDRESS) {
map = kernel_map;
@@ -283,6 +279,11 @@
}
}
+ if (td->td_critnest != 0 || td->td_intr_nesting_level != 0 ||
+ WITNESS_CHECK(WARN_SLEEPOK | WARN_GIANTOK, NULL,
+ "Kernel page fault") != 0)
+ goto fatal;
+
done:
if (usermode)
userret(td, frame);

File Metadata

Mime Type
text/plain
Expires
Mon, Feb 9, 9:24 AM (13 h, 23 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28562944
Default Alt Text
D47688.id146760.diff (1016 B)

Event Timeline