Commit 40e77dad83

Andrew Kelley <andrew@ziglang.org>
2019-09-25 21:15:52
musl [PATCH] arm: fix setjmp and longjmp asm for armv8-a
From: Szabolcs Nagy <szabolcs.nagy@arm.com> armv8 removed the coprocessor instructions other than cp14, so on an armv8 system the related hwcaps should never be set. new llvm complains about the use of coprocessor instructions in armv8-a mode (even though they are never executed at runtime), so ifdef them out when musl is built for armv8. <dalias> i think the patch looks ok
1 parent dc3c419
Changed files (3)
lib
libc
musl
src
src
lib/libc/musl/src/setjmp/arm/longjmp.s → lib/libc/musl/src/setjmp/arm/longjmp.S
@@ -16,11 +16,14 @@ longjmp:
 	ldr r2,1f
 	ldr r1,[r1,r2]
 
+#if __ARM_ARCH < 8
 	tst r1,#0x260
 	beq 3f
+	// HWCAP_ARM_FPA
 	tst r1,#0x20
 	beq 2f
 	ldc p2, cr4, [ip], #48
+#endif
 2:	tst r1,#0x40
 	beq 2f
 	.fpu vfp
@@ -28,6 +31,8 @@ longjmp:
 	.fpu softvfp
 	.eabi_attribute 10, 0
 	.eabi_attribute 27, 0
+#if __ARM_ARCH < 8
+	// HWCAP_ARM_IWMMXT
 2:	tst r1,#0x200
 	beq 3f
 	ldcl p1, cr10, [ip], #8
@@ -36,6 +41,8 @@ longjmp:
 	ldcl p1, cr13, [ip], #8
 	ldcl p1, cr14, [ip], #8
 	ldcl p1, cr15, [ip], #8
+#endif
+2:
 3:	bx lr
 
 .hidden __hwcap
lib/libc/musl/src/setjmp/arm/setjmp.s → lib/libc/musl/src/setjmp/arm/setjmp.S
@@ -18,11 +18,14 @@ setjmp:
 	ldr r2,1f
 	ldr r1,[r1,r2]
 
+#if __ARM_ARCH < 8
 	tst r1,#0x260
 	beq 3f
+	// HWCAP_ARM_FPA
 	tst r1,#0x20
 	beq 2f
 	stc p2, cr4, [ip], #48
+#endif
 2:	tst r1,#0x40
 	beq 2f
 	.fpu vfp
@@ -30,6 +33,8 @@ setjmp:
 	.fpu softvfp
 	.eabi_attribute 10, 0
 	.eabi_attribute 27, 0
+#if __ARM_ARCH < 8
+	// HWCAP_ARM_IWMMXT
 2:	tst r1,#0x200
 	beq 3f
 	stcl p1, cr10, [ip], #8
@@ -38,6 +43,8 @@ setjmp:
 	stcl p1, cr13, [ip], #8
 	stcl p1, cr14, [ip], #8
 	stcl p1, cr15, [ip], #8
+#endif
+2:
 3:	bx lr
 
 .hidden __hwcap
src/install_files.h
@@ -1155,8 +1155,8 @@ static const char *ZIG_MUSL_SRC_FILES[] = {
 "musl/src/select/select.c",
 "musl/src/setjmp/aarch64/longjmp.s",
 "musl/src/setjmp/aarch64/setjmp.s",
-"musl/src/setjmp/arm/longjmp.s",
-"musl/src/setjmp/arm/setjmp.s",
+"musl/src/setjmp/arm/longjmp.S",
+"musl/src/setjmp/arm/setjmp.S",
 "musl/src/setjmp/i386/longjmp.s",
 "musl/src/setjmp/i386/setjmp.s",
 "musl/src/setjmp/longjmp.c",