On Tue, Mar 07, 2017 at 08:40:22AM +0100, Patrick Wildt wrote:
> On Tue, Mar 07, 2017 at 01:44:19AM -0500, Dale Rahn wrote:
> > Setjmp, longjmp was converted from calling sigprocmask to invoking
> > sigprocmask directly. The ABI for the function call and the syscall
> > are not the same and the register manipulation code was not updated 
> > in the change.
> > 
> > This diff moves the jmpbuf to x2 for the duration of the sigprocmask syscall
> > and loads x0/x1 with the appropriate values and saves the returned x0
> > as the signal mask.
> > 
> > Other than storing x0 and x30 (lr) on the stack, this should be equivalent
> > to calling sigprocmask 'bl sigprocmaskB instead of 'SYSTRAP(sigprocmask)'
> > 
> > diff --git a/lib/libc/arch/aarch64/gen/setjmp.S 
> > b/lib/libc/arch/aarch64/gen/setjmp.S
> > index ba4010be7ff..76c1be5b9b5 100644
> > --- a/lib/libc/arch/aarch64/gen/setjmp.S
> > +++ b/lib/libc/arch/aarch64/gen/setjmp.S
> > @@ -34,16 +34,15 @@
> >  #include <machine/setjmp.h>
> >  
> >  ENTRY(setjmp)
> > -   stp     x0, x30, [sp, #-16]!
> >  
> > +   mov     x2, x0                          /* save jmpbuf in x2 */
> >     /* Store the signal mask */
> > -   add     x2, x0, #(_JB_SIGMASK * 8)      /* oset */
> > -   mov     x1, #0                          /* set */
> > +   mov     w1, #0                          /* set */
> >     mov     x0, #1                          /* SIG_BLOCK */
> >     SYSTRAP(sigprocmask)
> > +   str     w0, [x2, #(_JB_SIGMASK * 8)]    /* oset */
> >  
> > -   ldp     x0, x30, [sp], #16
> > -
> > +   mov     x0, x2
> >     /* Store the magic value and stack pointer */
> >     ldr     x8, .Lmagic
> >     mov     x9, sp
> > @@ -73,18 +72,15 @@ ENTRY(setjmp)
> >  END_STRONG(setjmp)
> >  
> >  ENTRY(longjmp)
> > -   stp     x0, x1, [sp, #-32]!
> > -   str     x30, [sp, #24]
> > +   mov     x2, x0                          /* move jmpbuf */
> > +   mov     x3, x1                          /* final return value */
> >  
> >     /* Restore the signal mask */
> > -   mov     x2, #0                          /* oset */
> > -   add     x1, x0, #(_JB_SIGMASK * 8)      /* set */
> > +   ldr     x1, [x2, #(_JB_SIGMASK * 8)]    /* set */
> 
> Shouldn't this be w1 instead of x1, since you are storing it using w0?

With that fixed, ok patrick@

> 
> >     mov     x0, #3                          /* SIG_SETMASK */
> >     SYSTRAP(sigprocmask)
> >  
> > -   ldr     x30, [sp, #24]
> > -   ldp     x0, x1, [sp], #32
> > -
> > +   mov     x0, x2
> >     /* Check the magic value */
> >     ldr     x8, [x0], #8
> >     ldr     x9, .Lmagic
> > @@ -110,7 +106,7 @@ ENTRY(longjmp)
> >     ldp     d14, d15, [x0]
> >  
> >     /* Load the return value */
> > -   mov     x0, x1
> > +   mov     x0, x3
> >     ret
> >  
> >  botch:
> > Dale Rahn                           dr...@dalerahn.com
> > 
> 

Reply via email to