From owner-svn-src-all@FreeBSD.ORG  Fri Mar  7 20:32:47 2014
Return-Path: <owner-svn-src-all@FreeBSD.ORG>
Delivered-To: svn-src-all@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 1F0658F2;
 Fri,  7 Mar 2014 20:32:47 +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))
 (No client certificate requested)
 by mx1.freebsd.org (Postfix) with ESMTPS id E6291BCB;
 Fri,  7 Mar 2014 20:32:46 +0000 (UTC)
Received: from svn.freebsd.org ([127.0.1.70])
 by svn.freebsd.org (8.14.8/8.14.8) with ESMTP id s27KWkQh035234;
 Fri, 7 Mar 2014 20:32:46 GMT (envelope-from ian@svn.freebsd.org)
Received: (from ian@localhost)
 by svn.freebsd.org (8.14.8/8.14.8/Submit) id s27KWkr1035231;
 Fri, 7 Mar 2014 20:32:46 GMT (envelope-from ian@svn.freebsd.org)
Message-Id: <201403072032.s27KWkr1035231@svn.freebsd.org>
From: Ian Lepore <ian@FreeBSD.org>
Date: Fri, 7 Mar 2014 20:32:46 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-all@freebsd.org,
 svn-src-head@freebsd.org
Subject: svn commit: r262903 - head/sys/arm/arm
X-SVN-Group: head
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-all@freebsd.org
X-Mailman-Version: 2.1.17
Precedence: list
List-Id: "SVN commit messages for the entire src tree \(except for &quot;
 user&quot; and &quot; projects&quot; \)" <svn-src-all.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-all>,
 <mailto:svn-src-all-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-all/>
List-Post: <mailto:svn-src-all@freebsd.org>
List-Help: <mailto:svn-src-all-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-all>,
 <mailto:svn-src-all-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 07 Mar 2014 20:32:47 -0000

Author: ian
Date: Fri Mar  7 20:32:45 2014
New Revision: 262903
URL: http://svnweb.freebsd.org/changeset/base/262903

Log:
  Fix the arm sys_sigreturn(): its argument is a struct ucontext, not a
  struct sigframe containing the struct ucontext.
  
  The signal trampoline return code on the other hand DOES have just a
  struct sigframe on the stack to work with, so have it get a pointer to
  the ucontext out of there to pass along to sys_sigreturn.
  
  In other words, make everything work right whether sys_sigreturn is
  invoked from the trampoline or from userland code calling sigreturn(2).
  
  Submitted by:	Takashi Komatsu <komatsu.taka@jp.panasonic.com>
  Reviewed by:	cognet

Modified:
  head/sys/arm/arm/genassym.c
  head/sys/arm/arm/locore.S
  head/sys/arm/arm/machdep.c

Modified: head/sys/arm/arm/genassym.c
==============================================================================
--- head/sys/arm/arm/genassym.c	Fri Mar  7 20:32:26 2014	(r262902)
+++ head/sys/arm/arm/genassym.c	Fri Mar  7 20:32:45 2014	(r262903)
@@ -109,6 +109,8 @@ ASSYM(TF_PC, offsetof(struct trapframe, 
 ASSYM(P_PID, offsetof(struct proc, p_pid));
 ASSYM(P_FLAG, offsetof(struct proc, p_flag));
 
+ASSYM(SIGF_UC, offsetof(struct sigframe, sf_uc));
+
 #ifdef ARM_TP_ADDRESS
 ASSYM(ARM_TP_ADDRESS, ARM_TP_ADDRESS);
 ASSYM(ARM_RAS_START, ARM_RAS_START);

Modified: head/sys/arm/arm/locore.S
==============================================================================
--- head/sys/arm/arm/locore.S	Fri Mar  7 20:32:26 2014	(r262902)
+++ head/sys/arm/arm/locore.S	Fri Mar  7 20:32:45 2014	(r262903)
@@ -557,6 +557,7 @@ END(abort)
 
 ENTRY_NP(sigcode)
 	mov	r0, sp
+	add	r0, r0, #SIGF_UC
 
 	/*
 	 * Call the sigreturn system call.

Modified: head/sys/arm/arm/machdep.c
==============================================================================
--- head/sys/arm/arm/machdep.c	Fri Mar  7 20:32:26 2014	(r262902)
+++ head/sys/arm/arm/machdep.c	Fri Mar  7 20:32:45 2014	(r262903)
@@ -742,28 +742,26 @@ sys_sigreturn(td, uap)
 		const struct __ucontext *sigcntxp;
 	} */ *uap;
 {
-	struct sigframe sf;
-	struct trapframe *tf;
+	ucontext_t uc;
 	int spsr;
 	
 	if (uap == NULL)
 		return (EFAULT);
-	if (copyin(uap->sigcntxp, &sf, sizeof(sf)))
+	if (copyin(uap->sigcntxp, &uc, sizeof(uc)))
 		return (EFAULT);
 	/*
 	 * Make sure the processor mode has not been tampered with and
 	 * interrupts have not been disabled.
 	 */
-	spsr = sf.sf_uc.uc_mcontext.__gregs[_REG_CPSR];
+	spsr = uc.uc_mcontext.__gregs[_REG_CPSR];
 	if ((spsr & PSR_MODE) != PSR_USR32_MODE ||
 	    (spsr & (I32_bit | F32_bit)) != 0)
 		return (EINVAL);
 		/* Restore register context. */
-	tf = td->td_frame;
-	set_mcontext(td, &sf.sf_uc.uc_mcontext);
+	set_mcontext(td, &uc.uc_mcontext);
 
 	/* Restore signal mask. */
-	kern_sigprocmask(td, SIG_SETMASK, &sf.sf_uc.uc_sigmask, NULL, 0);
+	kern_sigprocmask(td, SIG_SETMASK, &uc.uc_sigmask, NULL, 0);
 
 	return (EJUSTRETURN);
 }