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