summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/thread/aarch64/syscall_cp.s7
-rw-r--r--src/thread/microblaze/syscall_cp.s4
-rw-r--r--src/thread/or1k/syscall_cp.s5
-rw-r--r--src/thread/powerpc/syscall_cp.s4
-rw-r--r--src/thread/pthread_cancel.c10
-rw-r--r--src/thread/sh/syscall_cp.s22
-rw-r--r--src/thread/x32/syscall_cp.s4
-rw-r--r--src/thread/x86_64/syscall_cp.s4
8 files changed, 32 insertions, 28 deletions
diff --git a/src/thread/aarch64/syscall_cp.s b/src/thread/aarch64/syscall_cp.s
index 30e677ce..41db68af 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 51599c91..b0df61c5 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 2c0bf0e8..7951166e 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 20b5e0ac..77f8938d 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 6eaf72c4..c4631f08 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 c3caface..bb848ef3 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 79709a55..9805af0a 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 1a0fd5d2..4f101716 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