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.t...@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);
 }
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to