{set,long}jmp [s390x]: save/restore the correct registers
authormirabilos <tg@debian.org>
Sat, 5 Jun 2021 18:20:42 +0000 (19:20 +0100)
committerBen Hutchings <benh@debian.org>
Sat, 5 Jun 2021 18:20:42 +0000 (19:20 +0100)
Forwarded: https://lists.zytor.com/archives/klibc/2021-May/004620.html

The s390x ABI actually has FPU registers f8‥f15, not f1/f3/f5/f7,
to be saved. (Closes: Debian #943425)

Gbp-Pq: Name 0041-klibc-set-long-jmp-s390x-save-restore-the-correct-re.patch

usr/include/arch/s390/klibc/archsetjmp.h
usr/klibc/arch/s390/setjmp.S

index 728780add2df5d2be9243e75cdcb21710f21898e..1167c8b67338324a3e605991ca0a5c8c81a06566 100644 (file)
@@ -16,7 +16,7 @@ struct __jmp_buf {
 
 struct __jmp_buf {
        uint64_t __gregs[10]; /* general registers r6-r15 */
-       uint64_t __fpregs[4]; /* fp registers f1, f3, f5, f7 */
+       uint64_t __fpregs[8]; /* fp registers f8-f15 */
 };
 
 #endif /* __s390x__ */
index c36a0517ccf2116d7cf68abe4ea97aa21c847919..1386419a26ae3c736f17188515f5b4790f452249 100644 (file)
@@ -38,10 +38,14 @@ longjmp:
 
 setjmp:
        stmg    %r6,%r15,0(%r2)         # save all general registers
-       std     %f1,80(%r2)             # save fp registers f4 and f6
-       std     %f3,88(%r2)
-       std     %f5,96(%r2)
-       std     %f7,104(%r2)
+       std     %f8,80(%r2)             # save fp registers f8 to f15
+       std     %f9,88(%r2)
+       std     %f10,96(%r2)
+       std     %f11,104(%r2)
+       std     %f12,112(%r2)
+       std     %f13,120(%r2)
+       std     %f14,128(%r2)
+       std     %f15,136(%r2)
        lghi    %r2,0                   # return 0
        br      %r14
 
@@ -54,10 +58,14 @@ setjmp:
 longjmp:
        lgr     %r1,%r2                 # jmp_buf
        lgr     %r2,%r3                 # return value
-       ld      %f7,104(%r1)            # restore all saved registers
-       ld      %f5,96(%r1)
-       ld      %f3,88(%r1)
-       ld      %f1,80(%r1)
+       ld      %f15,136(%r1)           # restore all saved registers
+       ld      %f14,128(%r1)
+       ld      %f13,120(%r1)
+       ld      %f12,112(%r1)
+       ld      %f11,104(%r1)
+       ld      %f10,96(%r1)
+       ld      %f9,88(%r1)
+       ld      %f8,80(%r1)
        lmg     %r6,%r15,0(%r1)
        br      %r14                    # return to restored address