Changeset View
Changeset View
Standalone View
Standalone View
sys/riscv/riscv/trap.c
Show First 20 Lines • Show All 192 Lines • ▼ Show 20 Lines | #endif | ||||
pcb = td->td_pcb; | pcb = td->td_pcb; | ||||
stval = frame->tf_stval; | stval = frame->tf_stval; | ||||
if (td->td_critnest != 0 || td->td_intr_nesting_level != 0 || | if (td->td_critnest != 0 || td->td_intr_nesting_level != 0 || | ||||
WITNESS_CHECK(WARN_SLEEPOK | WARN_GIANTOK, NULL, | WITNESS_CHECK(WARN_SLEEPOK | WARN_GIANTOK, NULL, | ||||
"Kernel page fault") != 0) | "Kernel page fault") != 0) | ||||
goto fatal; | goto fatal; | ||||
if (usermode) | if (usermode) { | ||||
map = &td->td_proc->p_vmspace->vm_map; | map = &td->td_proc->p_vmspace->vm_map; | ||||
else if (stval >= VM_MAX_USER_ADDRESS) | } else { | ||||
intr_enable(); | |||||
markj: You might assert, or at least comment, that interrupts are already enabled in the user mode… | |||||
if (stval >= VM_MAX_USER_ADDRESS) { | |||||
map = kernel_map; | map = kernel_map; | ||||
else { | } else { | ||||
if (pcb->pcb_onfault == 0) | if (pcb->pcb_onfault == 0) | ||||
goto fatal; | goto fatal; | ||||
map = &td->td_proc->p_vmspace->vm_map; | map = &td->td_proc->p_vmspace->vm_map; | ||||
} | } | ||||
} | |||||
va = trunc_page(stval); | va = trunc_page(stval); | ||||
if ((frame->tf_scause == EXCP_FAULT_STORE) || | if ((frame->tf_scause == EXCP_FAULT_STORE) || | ||||
(frame->tf_scause == EXCP_STORE_PAGE_FAULT)) { | (frame->tf_scause == EXCP_STORE_PAGE_FAULT)) { | ||||
ftype = VM_PROT_WRITE; | ftype = VM_PROT_WRITE; | ||||
} else if (frame->tf_scause == EXCP_INST_PAGE_FAULT) { | } else if (frame->tf_scause == EXCP_INST_PAGE_FAULT) { | ||||
ftype = VM_PROT_EXECUTE; | ftype = VM_PROT_EXECUTE; | ||||
▲ Show 20 Lines • Show All 101 Lines • ▼ Show 20 Lines | KASSERT((csr_read(sstatus) & (SSTATUS_SPP | SSTATUS_SIE)) == 0, | ||||
("Came from U mode with interrupts enabled")); | ("Came from U mode with interrupts enabled")); | ||||
exception = frame->tf_scause & EXCP_MASK; | exception = frame->tf_scause & EXCP_MASK; | ||||
if (frame->tf_scause & EXCP_INTR) { | if (frame->tf_scause & EXCP_INTR) { | ||||
/* Interrupt */ | /* Interrupt */ | ||||
riscv_cpu_intr(frame); | riscv_cpu_intr(frame); | ||||
return; | return; | ||||
} | } | ||||
intr_enable(); | |||||
CTR3(KTR_TRAP, "do_trap_user: curthread: %p, sepc: %lx, frame: %p", | CTR3(KTR_TRAP, "do_trap_user: curthread: %p, sepc: %lx, frame: %p", | ||||
curthread, frame->tf_sepc, frame); | curthread, frame->tf_sepc, frame); | ||||
switch (exception) { | switch (exception) { | ||||
case EXCP_FAULT_LOAD: | case EXCP_FAULT_LOAD: | ||||
case EXCP_FAULT_STORE: | case EXCP_FAULT_STORE: | ||||
case EXCP_FAULT_FETCH: | case EXCP_FAULT_FETCH: | ||||
Show All 38 Lines |
You might assert, or at least comment, that interrupts are already enabled in the user mode case.