From 8d9f4e0d6e18cae5174bb26f16655a7eb50f4f01 Mon Sep 17 00:00:00 2001 From: mirabilos Date: Sun, 26 Dec 2021 23:17:05 +0000 Subject: [PATCH] {set,long}jmp [s390x]: save/restore the correct registers MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 | 2 +- usr/klibc/arch/s390/setjmp.S | 24 ++++++++++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/usr/include/arch/s390/klibc/archsetjmp.h b/usr/include/arch/s390/klibc/archsetjmp.h index 728780a..1167c8b 100644 --- a/usr/include/arch/s390/klibc/archsetjmp.h +++ b/usr/include/arch/s390/klibc/archsetjmp.h @@ -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__ */ diff --git a/usr/klibc/arch/s390/setjmp.S b/usr/klibc/arch/s390/setjmp.S index c36a051..1386419 100644 --- a/usr/klibc/arch/s390/setjmp.S +++ b/usr/klibc/arch/s390/setjmp.S @@ -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 -- 2.30.2