diff options
author | Timo Teräs <timo.teras@iki.fi> | 2016-01-08 09:18:11 +0200 |
---|---|---|
committer | Timo Teräs <timo.teras@iki.fi> | 2016-01-08 09:21:58 +0200 |
commit | 8a4ccf53a605414546a73d39dda24fe95c1bc1b2 (patch) | |
tree | 9dfd741e819a102716237fab07aa65b07a6ce4ba /main/musl/0005-use-explicit-__cp_cancel-label-in-cancellable-syscal.patch | |
parent | 7d84a0410e406fd7edd9f82c0c83a39ad222201e (diff) | |
download | aports-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.patch | 220 |
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 + |