Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 25 Jun 2018 22:36:26 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r335649 - in head/sys/arm64: arm64 linux
Message-ID:  <201806252236.w5PMaQNP069610@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Mon Jun 25 22:36:25 2018
New Revision: 335649
URL: https://svnweb.freebsd.org/changeset/base/335649

Log:
  Make cpu_set_syscall_retval common between the existing FreeBSD ABI and
  the Linuxulator. We need to translate error values onto Linux errno values
  and return them to userspace when a syscall fails. We also need to preserve
  x1 as all registers are preserved other than the return value.
  
  Reviewed by:	emaste
  Sponsored by:	DARPA, AFRL
  Differential Revision:	https://reviews.freebsd.org/D16008

Modified:
  head/sys/arm64/arm64/vm_machdep.c
  head/sys/arm64/linux/linux_sysvec.c

Modified: head/sys/arm64/arm64/vm_machdep.c
==============================================================================
--- head/sys/arm64/arm64/vm_machdep.c	Mon Jun 25 22:05:33 2018	(r335648)
+++ head/sys/arm64/arm64/vm_machdep.c	Mon Jun 25 22:36:25 2018	(r335649)
@@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/proc.h>
 #include <sys/sf_buf.h>
 #include <sys/signal.h>
+#include <sys/sysent.h>
 #include <sys/unistd.h>
 
 #include <vm/vm.h>
@@ -154,7 +155,7 @@ cpu_set_syscall_retval(struct thread *td, int error)
 		break;
 	default:
 		frame->tf_spsr |= PSR_C;	/* carry bit */
-		frame->tf_x[0] = error;
+		frame->tf_x[0] = SV_ABI_ERRNO(td->td_proc, error);
 		break;
 	}
 }

Modified: head/sys/arm64/linux/linux_sysvec.c
==============================================================================
--- head/sys/arm64/linux/linux_sysvec.c	Mon Jun 25 22:05:33 2018	(r335648)
+++ head/sys/arm64/linux/linux_sysvec.c	Mon Jun 25 22:36:25 2018	(r335649)
@@ -143,25 +143,9 @@ linux_fetch_syscall_args(struct thread *td)
 static void
 linux_set_syscall_retval(struct thread *td, int error)
 {
-	struct trapframe *frame;
 
-	frame = td->td_frame;
-
-	switch (error) {
-	case 0:
-		frame->tf_x[0] = td->td_retval[0];
-		frame->tf_x[1] = td->td_retval[1];
-		break;
-	case ERESTART:
-		/* LINUXTODO: verify */
-		frame->tf_elr -= 4;
-		break;
-	case EJUSTRETURN:
-		break;
-	default:
-		frame->tf_x[0] = error;
-		break;
-	}
+	td->td_retval[1] = td->td_frame->tf_x[1];
+	cpu_set_syscall_retval(td, error);
 }
 
 static int



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201806252236.w5PMaQNP069610>