Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 24 May 2010 17:24:14 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r208514 - in head/sys/ia64: ia32 ia64 include
Message-ID:  <201005241724.o4OHOEuE065147@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Mon May 24 17:24:14 2010
New Revision: 208514
URL: http://svn.freebsd.org/changeset/base/208514

Log:
  Change ia64' struct syscall_args definition so that args is a pointer to
  the arguments array instead of array itself. ia64 syscall arguments are
  readily available in the frame, point args to it, do not do unnecessary
  bcopy. Still reserve the array in syscall_args for ia32 emulation.
  
  Suggested and reviewed by:	marcel
  MFC after:	1 month

Modified:
  head/sys/ia64/ia32/ia32_trap.c
  head/sys/ia64/ia64/trap.c
  head/sys/ia64/include/proc.h

Modified: head/sys/ia64/ia32/ia32_trap.c
==============================================================================
--- head/sys/ia64/ia32/ia32_trap.c	Mon May 24 17:23:14 2010	(r208513)
+++ head/sys/ia64/ia32/ia32_trap.c	Mon May 24 17:24:14 2010	(r208514)
@@ -132,10 +132,11 @@ ia32_fetch_syscall_args(struct thread *t
 		error = copyin(params, (caddr_t)args, sa->narg * sizeof(int));
 	else
 		error = 0;
+	sa->args = &sa->args32[0];
 
 	if (error == 0) {
 		for (i = 0; i < sa->narg; i++)
-			sa->args[i] = args[i];
+			sa->args32[i] = args[i];
 		td->td_retval[0] = 0;
 		td->td_retval[1] = tf->tf_scratch.gr10;	/* edx */
 	}

Modified: head/sys/ia64/ia64/trap.c
==============================================================================
--- head/sys/ia64/ia64/trap.c	Mon May 24 17:23:14 2010	(r208513)
+++ head/sys/ia64/ia64/trap.c	Mon May 24 17:24:14 2010	(r208514)
@@ -902,13 +902,12 @@ cpu_fetch_syscall_args(struct thread *td
 {
 	struct proc *p;
 	struct trapframe *tf;
-	register_t *args;
 
 	p = td->td_proc;
 	tf = td->td_frame;
 
 	sa->code = tf->tf_scratch.gr15;
-	args = &tf->tf_scratch.gr16;
+	sa->args = &tf->tf_scratch.gr16;
 
 	/*
 	 * syscall() and __syscall() are handled the same on
@@ -918,8 +917,8 @@ cpu_fetch_syscall_args(struct thread *td
 		/*
 		 * Code is first argument, followed by actual args.
 		 */
-		sa->code = args[0];
-		args++;
+		sa->code = sa->args[0];
+		sa->args++;
 	}
 
  	if (p->p_sysent->sv_mask)
@@ -929,7 +928,6 @@ cpu_fetch_syscall_args(struct thread *td
  	else
 		sa->callp = &p->p_sysent->sv_table[sa->code];
 	sa->narg = sa->callp->sy_narg;
-	bcopy(args, sa->args, sa->narg * sizeof(sa->args[0]));
 
 	td->td_retval[0] = 0;
 	td->td_retval[1] = 0;

Modified: head/sys/ia64/include/proc.h
==============================================================================
--- head/sys/ia64/include/proc.h	Mon May 24 17:23:14 2010	(r208513)
+++ head/sys/ia64/include/proc.h	Mon May 24 17:24:14 2010	(r208514)
@@ -45,7 +45,8 @@ struct mdproc {
 struct syscall_args {
 	u_int code;
 	struct sysent *callp;
-	register_t args[8];
+	register_t *args;
+	register_t args32[8];
 	int narg;
 };
 #define	HAVE_SYSCALL_ARGS_DEF 1



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