Signed-off-by: Stijn Tintel <st...@linux-ipv6.be>
---
 ...-check-for-AltiVec-in-setjmp-longjmp.patch | 82 +++++++++++++++++++
 1 file changed, 82 insertions(+)
 create mode 100644 
toolchain/musl/patches/100-ppc64-check-for-AltiVec-in-setjmp-longjmp.patch

diff --git 
a/toolchain/musl/patches/100-ppc64-check-for-AltiVec-in-setjmp-longjmp.patch 
b/toolchain/musl/patches/100-ppc64-check-for-AltiVec-in-setjmp-longjmp.patch
new file mode 100644
index 0000000000..8b27819022
--- /dev/null
+++ b/toolchain/musl/patches/100-ppc64-check-for-AltiVec-in-setjmp-longjmp.patch
@@ -0,0 +1,82 @@
+From 0b6f90a930fcda6df287065d39e6b865428e3c69 Mon Sep 17 00:00:00 2001
+From: Stijn Tintel <st...@linux-ipv6.be>
+Date: Sat, 27 Nov 2021 04:58:50 +0200
+Subject: [PATCH] ppc64: check for AltiVec in setjmp/longjmp
+
+On machines without AltiVec, the lvx and stvx instructions are not
+supported. Use __hwcap to test if AltiVec is supported.
+
+Fixes SIGILL on PowerPC 64 processors without AltiVec support.
+Runtime-tested on e5500 and e6500.
+
+Signed-off-by: Stijn Tintel <st...@linux-ipv6.be>
+---
+ src/setjmp/powerpc64/longjmp.s | 13 ++++++++++++-
+ src/setjmp/powerpc64/setjmp.s  | 13 ++++++++++++-
+ 2 files changed, 24 insertions(+), 2 deletions(-)
+
+diff --git a/src/setjmp/powerpc64/longjmp.s b/src/setjmp/powerpc64/longjmp.s
+index 81d45ff6..da7172af 100644
+--- a/src/setjmp/powerpc64/longjmp.s
++++ b/src/setjmp/powerpc64/longjmp.s
+@@ -56,7 +56,17 @@ longjmp:
+       lfd 30, 38*8(3)
+       lfd 31, 39*8(3)
+ 
+-      # 6) restore vector registers v20-v31
++      # 6) restore vector registers v20-v31 if hardware supports AltiVec
++      mflr 0
++      bl 1f
++      .hidden __hwcap
++      .long __hwcap-.
++1:      mflr 4
++      lwz 5, 0(4)
++      add 4, 4, 5
++      ld 4, 0(4)
++      andis. 4, 4, 0x1000
++      beq 1f
+       addi 3, 3, 40*8
+       lvx 20, 0, 3 ; addi 3, 3, 16
+       lvx 21, 0, 3 ; addi 3, 3, 16
+@@ -70,6 +80,7 @@ longjmp:
+       lvx 29, 0, 3 ; addi 3, 3, 16
+       lvx 30, 0, 3 ; addi 3, 3, 16
+       lvx 31, 0, 3
++1:    mtlr 0
+ 
+       # 7) return r4 ? r4 : 1
+       mr    3,   4
+diff --git a/src/setjmp/powerpc64/setjmp.s b/src/setjmp/powerpc64/setjmp.s
+index 37683fda..32853693 100644
+--- a/src/setjmp/powerpc64/setjmp.s
++++ b/src/setjmp/powerpc64/setjmp.s
+@@ -69,7 +69,17 @@ __setjmp_toc:
+       stfd 30, 38*8(3)
+       stfd 31, 39*8(3)
+ 
+-      # 5) store vector registers v20-v31
++      # 5) store vector registers v20-v31 if hardware supports AltiVec
++      mflr 0
++      bl 1f
++      .hidden __hwcap
++      .long __hwcap-.
++1:    mflr 4
++      lwz 5, 0(4)
++      add 4, 4, 5
++      ld 4, 0(4)
++      andis. 4, 4, 0x1000
++      beq 1f
+       addi  3, 3, 40*8
+       stvx 20, 0, 3 ; addi 3, 3, 16
+       stvx 21, 0, 3 ; addi 3, 3, 16
+@@ -83,6 +93,7 @@ __setjmp_toc:
+       stvx 29, 0, 3 ; addi 3, 3, 16
+       stvx 30, 0, 3 ; addi 3, 3, 16
+       stvx 31, 0, 3
++1:    mtlr 0
+ 
+       # 6) return 0
+       li 3, 0
+-- 
+2.32.0
+
-- 
2.32.0


_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to