aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/0005-use-explicit-__cp_cancel-label-in-cancellable-syscal.patch
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2016-01-08 09:18:11 +0200
committerTimo Teräs <timo.teras@iki.fi>2016-01-08 09:21:58 +0200
commit8a4ccf53a605414546a73d39dda24fe95c1bc1b2 (patch)
tree9dfd741e819a102716237fab07aa65b07a6ce4ba /main/musl/0005-use-explicit-__cp_cancel-label-in-cancellable-syscal.patch
parent7d84a0410e406fd7edd9f82c0c83a39ad222201e (diff)
downloadaports-8a4ccf53a605414546a73d39dda24fe95c1bc1b2.tar.bz2
aports-8a4ccf53a605414546a73d39dda24fe95c1bc1b2.tar.xz
main/musl: cherry-pick upstream fixes and improvements
fixes #4621
Diffstat (limited to 'main/musl/0005-use-explicit-__cp_cancel-label-in-cancellable-syscal.patch')
-rw-r--r--main/musl/0005-use-explicit-__cp_cancel-label-in-cancellable-syscal.patch220
1 files changed, 220 insertions, 0 deletions
diff --git a/main/musl/0005-use-explicit-__cp_cancel-label-in-cancellable-syscal.patch b/main/musl/0005-use-explicit-__cp_cancel-label-in-cancellable-syscal.patch
new file mode 100644
index 0000000000..f4d7637d00
--- /dev/null
+++ b/main/musl/0005-use-explicit-__cp_cancel-label-in-cancellable-syscal.patch
@@ -0,0 +1,220 @@
+From 36e8b6a28be5d4ffad966386b1e1c0d0dc6ca11a Mon Sep 17 00:00:00 2001
+From: Rich Felker <dalias@aerifal.cx>
+Date: Mon, 2 Nov 2015 16:16:00 -0500
+Subject: [PATCH] use explicit __cp_cancel label in cancellable syscall asm for
+ all archs
+
+previously, only archs that needed to do stack cleanup defined a
+__cp_cancel label for acting on cancellation in their syscall asm, and
+a default definition was provided by a weak alias to __cancel, the C
+function. this resulted in wrong codegen for arm on gcc versions
+affected by pr 68178 and possibly similar issues (like pr 66609) on
+other archs, and also created an inconsistency where the __cp_begin
+and __cp_end labels were treated as const data but __cp_cancel was
+treated as a function. this in turn caused incorrect code generation
+on archs where function pointers point to function descriptors rather
+than code (for now, only sh/fdpic).
+---
+ src/thread/aarch64/syscall_cp.s | 7 +++----
+ src/thread/microblaze/syscall_cp.s | 4 +++-
+ src/thread/or1k/syscall_cp.s | 5 ++++-
+ src/thread/powerpc/syscall_cp.s | 4 +++-
+ src/thread/pthread_cancel.c | 10 ++--------
+ src/thread/sh/syscall_cp.s | 22 +++++++++++-----------
+ src/thread/x32/syscall_cp.s | 4 +++-
+ src/thread/x86_64/syscall_cp.s | 4 +++-
+ 8 files changed, 32 insertions(+), 28 deletions(-)
+
+diff --git a/src/thread/aarch64/syscall_cp.s b/src/thread/aarch64/syscall_cp.s
+index 30e677c..41db68a 100644
+--- a/src/thread/aarch64/syscall_cp.s
++++ b/src/thread/aarch64/syscall_cp.s
+@@ -17,7 +17,7 @@
+ __syscall_cp_asm:
+ __cp_begin:
+ ldr w0,[x0]
+- cbnz w0,1f
++ cbnz w0,__cp_cancel
+ mov x8,x1
+ mov x0,x2
+ mov x1,x3
+@@ -28,6 +28,5 @@ __cp_begin:
+ svc 0
+ __cp_end:
+ ret
+-
+- // cbnz might not be able to jump far enough
+-1: b __cancel
++__cp_cancel:
++ b __cancel
+diff --git a/src/thread/microblaze/syscall_cp.s b/src/thread/microblaze/syscall_cp.s
+index 51599c9..b0df61c 100644
+--- a/src/thread/microblaze/syscall_cp.s
++++ b/src/thread/microblaze/syscall_cp.s
+@@ -11,7 +11,7 @@
+ __syscall_cp_asm:
+ __cp_begin:
+ lwi r5, r5, 0
+- bnei r5, __cancel
++ bnei r5, __cp_cancel
+ addi r12, r6, 0
+ add r5, r7, r0
+ add r6, r8, r0
+@@ -23,3 +23,5 @@ __cp_begin:
+ __cp_end:
+ rtsd r15, 8
+ nop
++__cp_cancel:
++ bri __cancel
+diff --git a/src/thread/or1k/syscall_cp.s b/src/thread/or1k/syscall_cp.s
+index 2c0bf0e..7951166 100644
+--- a/src/thread/or1k/syscall_cp.s
++++ b/src/thread/or1k/syscall_cp.s
+@@ -12,7 +12,7 @@ __syscall_cp_asm:
+ __cp_begin:
+ l.lwz r3, 0(r3)
+ l.sfeqi r3, 0
+- l.bnf __cancel
++ l.bnf __cp_cancel
+ l.ori r11, r4, 0
+ l.ori r3, r5, 0
+ l.ori r4, r6, 0
+@@ -24,3 +24,6 @@ __cp_begin:
+ __cp_end:
+ l.jr r9
+ l.nop
++__cp_cancel:
++ l.j __cancel
++ l.nop
+diff --git a/src/thread/powerpc/syscall_cp.s b/src/thread/powerpc/syscall_cp.s
+index 20b5e0a..77f8938 100644
+--- a/src/thread/powerpc/syscall_cp.s
++++ b/src/thread/powerpc/syscall_cp.s
+@@ -38,7 +38,7 @@ __cp_begin:
+ cmpwi cr7, 0, 0 #compare r0 with 0, store result in cr7.
+ beq+ cr7, 1f #jump to label 1 if r0 was 0
+
+- b __cancel #else call cancel
++ b __cp_cancel #else call cancel
+ 1:
+ #ok, the cancel flag was not set
+ # syscall: number goes to r0, the rest 3-8
+@@ -55,3 +55,5 @@ __cp_end:
+ #else negate result.
+ neg 3, 3
+ blr
++__cp_cancel:
++ b __cancel
+diff --git a/src/thread/pthread_cancel.c b/src/thread/pthread_cancel.c
+index 6eaf72c..c4631f0 100644
+--- a/src/thread/pthread_cancel.c
++++ b/src/thread/pthread_cancel.c
+@@ -7,7 +7,7 @@
+ #ifdef SHARED
+ __attribute__((__visibility__("hidden")))
+ #endif
+-long __cancel(), __cp_cancel(), __syscall_cp_asm(), __syscall_cp_c();
++long __cancel(), __syscall_cp_asm(), __syscall_cp_c();
+
+ long __cancel()
+ {
+@@ -18,12 +18,6 @@ long __cancel()
+ return -ECANCELED;
+ }
+
+-/* If __syscall_cp_asm has adjusted the stack pointer, it must provide a
+- * definition of __cp_cancel to undo those adjustments and call __cancel.
+- * Otherwise, __cancel provides a definition for __cp_cancel. */
+-
+-weak_alias(__cancel, __cp_cancel);
+-
+ long __syscall_cp_asm(volatile void *, syscall_arg_t,
+ syscall_arg_t, syscall_arg_t, syscall_arg_t,
+ syscall_arg_t, syscall_arg_t, syscall_arg_t);
+@@ -56,7 +50,7 @@ static void _sigaddset(sigset_t *set, int sig)
+ #ifdef SHARED
+ __attribute__((__visibility__("hidden")))
+ #endif
+-extern const char __cp_begin[1], __cp_end[1];
++extern const char __cp_begin[1], __cp_end[1], __cp_cancel[1];
+
+ static void cancel_handler(int sig, siginfo_t *si, void *ctx)
+ {
+diff --git a/src/thread/sh/syscall_cp.s b/src/thread/sh/syscall_cp.s
+index c3cafac..bb848ef 100644
+--- a/src/thread/sh/syscall_cp.s
++++ b/src/thread/sh/syscall_cp.s
+@@ -14,17 +14,8 @@ __syscall_cp_asm:
+ __cp_begin:
+ mov.l @r4, r4
+ tst r4, r4
+- bt 2f
+-
+- mov.l L1, r0
+- braf r0
+- nop
+-1:
+-
+-.align 2
+-L1: .long __cancel@PLT-(1b-.)
+-
+-2: mov r5, r3
++ bf __cp_cancel
++ mov r5, r3
+ mov r6, r4
+ mov r7, r5
+ mov.l @r15, r6
+@@ -43,3 +34,12 @@ __cp_end:
+
+ rts
+ nop
++
++__cp_cancel:
++ mov.l 2f, r0
++ braf r0
++ nop
++1:
++
++.align 2
++2: .long __cancel@PCREL-(1b-.)
+diff --git a/src/thread/x32/syscall_cp.s b/src/thread/x32/syscall_cp.s
+index 79709a5..9805af0 100644
+--- a/src/thread/x32/syscall_cp.s
++++ b/src/thread/x32/syscall_cp.s
+@@ -14,7 +14,7 @@ __syscall_cp_internal:
+ __cp_begin:
+ mov (%rdi),%eax
+ test %eax,%eax
+- jnz __cancel
++ jnz __cp_cancel
+ mov %rdi,%r11
+ mov %rsi,%rax
+ mov %rdx,%rdi
+@@ -27,3 +27,5 @@ __cp_begin:
+ syscall
+ __cp_end:
+ ret
++__cp_cancel:
++ jmp __cancel
+diff --git a/src/thread/x86_64/syscall_cp.s b/src/thread/x86_64/syscall_cp.s
+index 1a0fd5d..4f10171 100644
+--- a/src/thread/x86_64/syscall_cp.s
++++ b/src/thread/x86_64/syscall_cp.s
+@@ -14,7 +14,7 @@ __syscall_cp_asm:
+ __cp_begin:
+ mov (%rdi),%eax
+ test %eax,%eax
+- jnz __cancel
++ jnz __cp_cancel
+ mov %rdi,%r11
+ mov %rsi,%rax
+ mov %rdx,%rdi
+@@ -27,3 +27,5 @@ __cp_begin:
+ syscall
+ __cp_end:
+ ret
++__cp_cancel:
++ jmp __cancel
+--
+2.7.0
+