fix sh jmp_buf size to match ABI
authorRich Felker <dalias@aerifal.cx>
Tue, 28 Apr 2015 00:03:28 +0000 (20:03 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 28 Apr 2015 00:03:28 +0000 (20:03 -0400)
while the sh port is still experimental and subject to ABI
instability, this is not actually an application/libc boundary ABI
change. it only affects third-party APIs where jmp_buf is used in a
shared structure at the ABI boundary, because nothing anywhere near
the end of the jmp_buf object (which includes the oversized sigset_t)
is accessed by libc.

both glibc and uclibc have 15-slot jmp_buf for sh. presumably the
smaller version was used in musl because the slots for fpu status
register and thread pointer register (gbr) were incorrect and must not
be restored by longjmp, but the size should have been preserved, as
it's generally treated as a libc-agnostic ABI property for the arch,
and having extra slots free in case we ever need them for something is
useful anyway.

arch/sh/bits/setjmp.h
src/signal/sh/sigsetjmp.s

index bef7fe2a47e3c94c1f970871db35f70e5ff24cc2..05dbdc71e8a3ddc14b4aa5661e01f142c618f68b 100644 (file)
@@ -1 +1 @@
-typedef unsigned long __jmp_buf[13];
+typedef unsigned long __jmp_buf[15];
index 16256e5f098671fc357529459f01d3366a02ebb1..1e2270beeccb208875ae1a91342b1c2c0c01f096 100644 (file)
@@ -8,7 +8,7 @@ __sigsetjmp:
        bt 9f
 
        mov r4, r6
-       add #52, r6
+       add #60, r6
        sts pr, r0
        mov.l r0, @r6
        mov.l r8, @(4+8,r6)
@@ -20,7 +20,7 @@ __sigsetjmp:
        mov r0, r5
        mov r8, r4
        mov r4, r6
-       add #52, r6
+       add #60, r6
 
        mov.l @r6, r0
        lds r0, pr