Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Aug 2010 06:42:47 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r211795 - in projects/arm_eabi/sys/arm: arm include
Message-ID:  <201008250642.o7P6glCu001983@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Wed Aug 25 06:42:47 2010
New Revision: 211795
URL: http://svn.freebsd.org/changeset/base/211795

Log:
  Update how syscalls are handled to use syscallenter and syscallret

Modified:
  projects/arm_eabi/sys/arm/arm/elf_machdep.c
  projects/arm_eabi/sys/arm/arm/trap.c
  projects/arm_eabi/sys/arm/include/proc.h

Modified: projects/arm_eabi/sys/arm/arm/elf_machdep.c
==============================================================================
--- projects/arm_eabi/sys/arm/arm/elf_machdep.c	Wed Aug 25 03:14:32 2010	(r211794)
+++ projects/arm_eabi/sys/arm/arm/elf_machdep.c	Wed Aug 25 06:42:47 2010	(r211795)
@@ -76,7 +76,7 @@ struct sysentvec elf32_freebsd_sysvec = 
 	.sv_maxssiz	= NULL,
 	.sv_flags	= SV_ABI_FREEBSD | SV_ILP32,
 	.sv_set_syscall_retval = cpu_set_syscall_retval,
-	.sv_fetch_syscall_args = NULL, /* XXXKIB */
+	.sv_fetch_syscall_args = cpu_fetch_syscall_args,
 	.sv_syscallnames = syscallnames,
 };
 

Modified: projects/arm_eabi/sys/arm/arm/trap.c
==============================================================================
--- projects/arm_eabi/sys/arm/arm/trap.c	Wed Aug 25 03:14:32 2010	(r211794)
+++ projects/arm_eabi/sys/arm/arm/trap.c	Wed Aug 25 06:42:47 2010	(r211795)
@@ -861,98 +861,76 @@ badaddr_read(void *addr, size_t size, vo
 	return (rv);
 }
 
-#define MAXARGS	8
+int
+cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
+{
+	struct proc *p;
+	struct trapframe *frame;
+	u_int nap;
+	register_t *ap;
+	uint32_t insn;
+	int error;
+
+	p = td->td_proc;
+	frame = td->td_frame;
+	insn = *(u_int32_t *)(frame->tf_pc - INSN_SIZE);
+	sa->code = insn & 0x000fffff;
+
+	ap = &frame->tf_r0;
+	nap = 4;
+	if (sa->code == SYS_syscall) {
+		sa->code = *ap++;
+		nap--;
+	} else if (sa->code == SYS___syscall) {
+		sa->code = ap[_QUAD_LOWWORD];
+		nap -= 2;
+		ap += 2;
+	}
+ 	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;
+	KASSERT(sa->narg <= sizeof(sa->args) / sizeof(sa->args[0]),
+	    ("Too many syscall arguments!"));
+	error = 0;
+	memcpy(sa->args, ap, nap * sizeof(register_t));
+	if (sa->narg > nap) {
+		error = copyin((void *)frame->tf_usr_sp, sa->args + nap,
+		    (sa->narg - nap) * sizeof(register_t));
+	}
+	if (error == 0) {
+		td->td_retval[0] = 0;
+		td->td_retval[1] = 0;
+	}
+
+	return (error);
+}
+
 static void
 syscall(struct thread *td, trapframe_t *frame, u_int32_t insn)
 {
-	struct proc *p = td->td_proc;
-	int code, error;
-	u_int nap, nargs;
-	register_t *ap, *args, copyargs[MAXARGS];
-	struct sysent *callp;
+	struct syscall_args sa;
+	int error;
 
-	PCPU_INC(cnt.v_syscall);
-	td->td_pticks = 0;
-	if (td->td_ucred != td->td_proc->p_ucred)
-		cred_update_thread(td);
 	switch (insn & SWI_OS_MASK) {
 	case 0: /* XXX: we need our own one. */
-		nap = 4;
 		break;
 	default:
 		call_trapsignal(td, SIGILL, 0);
 		userret(td, frame);
 		return;
 	}
-	code = insn & 0x000fffff;                
-	td->td_pticks = 0;
-	ap = &frame->tf_r0;
-	if (code == SYS_syscall) {
-		code = *ap++;
-		
-		nap--;
-	} else if (code == SYS___syscall) {
-		code = ap[_QUAD_LOWWORD];
-		nap -= 2;
-		ap += 2;
-	}
-	if (p->p_sysent->sv_mask)
-		code &= p->p_sysent->sv_mask;
-	if (code >= p->p_sysent->sv_size)
-		callp = &p->p_sysent->sv_table[0];
-	else
-		callp = &p->p_sysent->sv_table[code];
-	nargs = callp->sy_narg;
-	memcpy(copyargs, ap, nap * sizeof(register_t));
-	if (nargs > nap) {
-		error = copyin((void *)frame->tf_usr_sp, copyargs + nap,
-		    (nargs - nap) * sizeof(register_t));
-		if (error)
-			goto bad;
-	}
-	args = copyargs;
-	error = 0;
-#ifdef KTRACE
-	if (KTRPOINT(td, KTR_SYSCALL))
-		ktrsyscall(code, nargs, args);
-#endif
-		
-	CTR4(KTR_SYSC, "syscall enter thread %p pid %d proc %s code %d", td,
-	    td->td_proc->p_pid, td->td_name, code);
-	if (error == 0) {
-		td->td_retval[0] = 0;
-		td->td_retval[1] = 0;
-		STOPEVENT(p, S_SCE, callp->sy_narg);
-		PTRACESTOP_SC(p, td, S_PT_SCE);
-		AUDIT_SYSCALL_ENTER(code, td);
-		error = (*callp->sy_call)(td, args);
-		AUDIT_SYSCALL_EXIT(error, td);
-		KASSERT(td->td_ar == NULL, 
-		    ("returning from syscall with td_ar set!"));
-	}
-bad:
-	cpu_set_syscall_retval(td, error);
-
-	WITNESS_WARN(WARN_PANIC, NULL, "System call %s returning",
-	    (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???");
-	KASSERT(td->td_critnest == 0,
-	    ("System call %s returning in a critical section",
-	    (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???"));
-	KASSERT(td->td_locks == 0,
-	    ("System call %s returning with %d locks held",
-	    (code >= 0 && code < SYS_MAXSYSCALL) ? syscallnames[code] : "???",
-	    td->td_locks));
-
-	userret(td, frame);
-	CTR4(KTR_SYSC, "syscall exit thread %p pid %d proc %s code %d", td,
-	    td->td_proc->p_pid, td->td_name, code);
-	
-	STOPEVENT(p, S_SCX, code);
-	PTRACESTOP_SC(p, td, S_PT_SCX);
-#ifdef KTRACE
-      	if (KTRPOINT(td, KTR_SYSRET))
-		ktrsysret(code, error, td->td_retval[0]);
-#endif
+
+	error = syscallenter(td, &sa);
+
+	KASSERT(td->td_ar == NULL, ("returning from syscall with td_ar set!"));
+
+	syscallret(td, error, &sa);
 }
 
 void

Modified: projects/arm_eabi/sys/arm/include/proc.h
==============================================================================
--- projects/arm_eabi/sys/arm/include/proc.h	Wed Aug 25 03:14:32 2010	(r211794)
+++ projects/arm_eabi/sys/arm/include/proc.h	Wed Aug 25 06:42:47 2010	(r211795)
@@ -60,6 +60,21 @@ struct mdproc {
 	void	*md_sigtramp;
 };
 
+#ifdef __ARM_EABI__
+#define	KINFO_PROC_SIZE 816
+#else
 #define	KINFO_PROC_SIZE 792
+#endif
+
+#ifdef _KERNEL
+struct syscall_args {
+	u_int code;
+	struct sysent *callp;
+	register_t args[8];
+	int narg;
+};
+#define	HAVE_SYSCALL_ARGS_DEF 1
+
+#endif
 
 #endif /* !_MACHINE_PROC_H_ */



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