Index: sys/riscv/riscv/trap.c =================================================================== --- sys/riscv/riscv/trap.c +++ sys/riscv/riscv/trap.c @@ -158,15 +158,12 @@ } static void -svc_handler(struct trapframe *frame) +svc_handler(void) { struct thread *td; td = curthread; - KASSERT(td->td_frame == frame, - ("%s: td_frame %p != frame %p", __func__, td->td_frame, frame)); - syscallenter(td); syscallret(td); } @@ -331,6 +328,15 @@ KASSERT((csr_read(sstatus) & (SSTATUS_SPP | SSTATUS_SIE)) == 0, ("Came from U mode with interrupts enabled")); + if (__predict_true(frame->tf_scause == EXCP_USER_ECALL)) { + KASSERT(td->td_frame == frame, + ("%s: td_frame %p != frame %p", __func__, td->td_frame, frame)); + intr_enable(); + frame->tf_sepc += 4; + svc_handler(); + return; + } + exception = frame->tf_scause & EXCP_MASK; if (frame->tf_scause & EXCP_INTR) { /* Interrupt */ @@ -354,10 +360,6 @@ case EXCP_LOAD_PAGE_FAULT: case EXCP_INST_PAGE_FAULT: data_abort(frame, 1); - break; - case EXCP_USER_ECALL: - frame->tf_sepc += 4; /* Next instruction */ - svc_handler(frame); break; case EXCP_ILLEGAL_INSTRUCTION: #ifdef FPE