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?

>       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