svn commit: r366392 - head/sys/riscv/riscv

Edward Tomasz Napierala trasz at FreeBSD.org
Sat Oct 3 13:01:08 UTC 2020


Author: trasz
Date: Sat Oct  3 13:01:07 2020
New Revision: 366392
URL: https://svnweb.freebsd.org/changeset/base/366392

Log:
  Optimize riscv's cpu_fetch_syscall_args(), making it possible
  for the compiler to inline the memcpy.
  
  Reviewed by:	arichardson, mhorne
  MFC after:	2 weeks
  Sponsored by:	DARPA
  Differential Revision:	https://reviews.freebsd.org/D26528

Modified:
  head/sys/riscv/riscv/trap.c

Modified: head/sys/riscv/riscv/trap.c
==============================================================================
--- head/sys/riscv/riscv/trap.c	Sat Oct  3 12:03:08 2020	(r366391)
+++ head/sys/riscv/riscv/trap.c	Sat Oct  3 13:01:07 2020	(r366392)
@@ -96,30 +96,31 @@ int
 cpu_fetch_syscall_args(struct thread *td)
 {
 	struct proc *p;
-	register_t *ap;
+	register_t *ap, *dst_ap;
 	struct syscall_args *sa;
-	int nap;
 
-	nap = NARGREG;
 	p = td->td_proc;
 	sa = &td->td_sa;
 	ap = &td->td_frame->tf_a[0];
+	dst_ap = &sa->args[0];
 
 	sa->code = td->td_frame->tf_t[0];
 
-	if (sa->code == SYS_syscall || sa->code == SYS___syscall) {
+	if (__predict_false(sa->code == SYS_syscall || sa->code == SYS___syscall)) {
 		sa->code = *ap++;
-		nap--;
+	} else {
+		*dst_ap++ = *ap++;
 	}
 
-	if (sa->code >= p->p_sysent->sv_size)
+	if (__predict_false(sa->code >= p->p_sysent->sv_size))
 		sa->callp = &p->p_sysent->sv_table[0];
 	else
 		sa->callp = &p->p_sysent->sv_table[sa->code];
 
-	memcpy(sa->args, ap, nap * sizeof(register_t));
-	if (sa->callp->sy_narg > nap)
-		panic("TODO: Could we have more then %d args?", NARGREG);
+	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));
 
 	td->td_retval[0] = 0;
 	td->td_retval[1] = 0;


More information about the svn-src-all mailing list