From owner-svn-src-projects@FreeBSD.ORG Wed Aug 27 09:26:30 2014 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id E95609C1; Wed, 27 Aug 2014 09:26:29 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id C9F8238EB; Wed, 27 Aug 2014 09:26:29 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id s7R9QTcZ058302; Wed, 27 Aug 2014 09:26:29 GMT (envelope-from andrew@FreeBSD.org) Received: (from andrew@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id s7R9QTDd058300; Wed, 27 Aug 2014 09:26:29 GMT (envelope-from andrew@FreeBSD.org) Message-Id: <201408270926.s7R9QTDd058300@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: andrew set sender to andrew@FreeBSD.org using -f From: Andrew Turner Date: Wed, 27 Aug 2014 09:26:29 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r270700 - projects/arm64/sys/arm64/arm64 X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 27 Aug 2014 09:26:30 -0000 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 #include #include +#include #include +#include +#include +#include #include #include @@ -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; + } } /*