Index: sys/riscv/riscv/trap.c =================================================================== --- sys/riscv/riscv/trap.c +++ sys/riscv/riscv/trap.c @@ -46,6 +46,7 @@ #include #include #include +#include #ifdef KDB #include #endif @@ -106,12 +107,6 @@ sa->code = td->td_frame->tf_t[0]; - if (__predict_false(sa->code == SYS_syscall || sa->code == SYS___syscall)) { - sa->code = *ap++; - } else { - *dst_ap++ = *ap++; - } - if (__predict_false(sa->code >= p->p_sysent->sv_size)) sa->callp = &p->p_sysent->sv_table[0]; else @@ -120,7 +115,13 @@ KASSERT(sa->callp->sy_narg <= nitems(sa->args), ("Syscall %d takes too many arguments", sa->code)); - memcpy(dst_ap, ap, (NARGREG - 1) * sizeof(register_t)); + if (__predict_false(sa->callp->sy_call == (sy_call_t *)nosys) && + (sa->code == SYS_syscall || sa->code == SYS___syscall)) { + sa->code = *ap++; + memcpy(dst_ap, ap, (NARGREG - 1) * sizeof(register_t)); + } else { + memcpy(dst_ap, ap, NARGREG * sizeof(register_t)); + } td->td_retval[0] = 0; td->td_retval[1] = 0;