Date: Wed, 27 Aug 2014 09:26:29 +0000 (UTC) From: Andrew Turner <andrew@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r270700 - projects/arm64/sys/arm64/arm64 Message-ID: <201408270926.s7R9QTDd058300@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: andrew Date: Wed Aug 27 09:26:29 2014 New Revision: 270700 URL: http://svnweb.freebsd.org/changeset/base/270700 Log: Start to support system calls by adding the kernel side. The system call id is stored in x8 while arguments are passed in registers x0 to x7. Modified: projects/arm64/sys/arm64/arm64/trap.c projects/arm64/sys/arm64/arm64/vm_machdep.c Modified: projects/arm64/sys/arm64/arm64/trap.c ============================================================================== --- projects/arm64/sys/arm64/arm64/trap.c Wed Aug 27 09:26:21 2014 (r270699) +++ projects/arm64/sys/arm64/arm64/trap.c Wed Aug 27 09:26:29 2014 (r270700) @@ -32,7 +32,11 @@ __FBSDID("$FreeBSD$"); #include <sys/systm.h> #include <sys/lock.h> #include <sys/mutex.h> +#include <sys/pioctl.h> #include <sys/proc.h> +#include <sys/ptrace.h> +#include <sys/syscall.h> +#include <sys/sysent.h> #include <vm/vm.h> #include <vm/pmap.h> @@ -50,8 +54,52 @@ void do_el0_error(struct trapframe *); int cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa) { + struct proc *p; + register_t *ap; + int nap; + + nap = 8; + p = td->td_proc; + ap = td->td_frame->tf_x; + + sa->code = td->td_frame->tf_x[8]; + + if (sa->code == SYS_syscall || sa->code == SYS___syscall) { + panic("TODO: syscall/__syscall"); + } + + if (p->p_sysent->sv_mask) + sa->code &= p->p_sysent->sv_mask; + if (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]; + + sa->narg = sa->callp->sy_narg; + memcpy(sa->args, ap, nap * sizeof(register_t)); + if (sa->narg > nap) + panic("TODO: Could we have more then 8 args?"); + + td->td_retval[0] = 0; + td->td_retval[1] = 0; + + return (0); +} + +#include "../../kern/subr_syscall.c" + +static void +svc_handler(struct trapframe *frame) +{ + struct syscall_args sa; + struct thread *td; + int error; - panic("cpu_fetch_syscall_args"); + td = curthread; + td->td_frame = frame; + + error = syscallenter(td, &sa); + syscallret(td, error, &sa); } static void @@ -167,6 +215,9 @@ do_el0_sync(struct trapframe *frame) printf("spsr: %llx\n", frame->tf_spsr); switch(exception) { + case 0x15: + svc_handler(frame); + break; case 0x20: case 0x24: data_abort(frame, esr, 1); Modified: projects/arm64/sys/arm64/arm64/vm_machdep.c ============================================================================== --- projects/arm64/sys/arm64/arm64/vm_machdep.c Wed Aug 27 09:26:21 2014 (r270699) +++ projects/arm64/sys/arm64/arm64/vm_machdep.c Wed Aug 27 09:26:29 2014 (r270700) @@ -98,8 +98,25 @@ cpu_thread_swapout(struct thread *td) void cpu_set_syscall_retval(struct thread *td, int error) { + struct trapframe *frame; - panic("cpu_set_syscall_retval"); + frame = td->td_frame; + + printf("cpu_set_syscall_retval %d\n", error); + switch (error) { + case 0: + frame->tf_x[0] = td->td_retval[0]; + frame->tf_x[1] = td->td_retval[1]; + break; + case ERESTART: + frame->tf_elr -= 4; + break; + case EJUSTRETURN: + break; + default: + frame->tf_x[0] = error; + break; + } } /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201408270926.s7R9QTDd058300>