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>