diff options
-rw-r--r-- | arch/x32/src/syscall_cp_fixup.c | 7 | ||||
-rw-r--r-- | src/thread/aarch64/syscall_cp.s | 10 | ||||
-rw-r--r-- | src/thread/arm/syscall_cp.s | 11 | ||||
-rw-r--r-- | src/thread/i386/syscall_cp.s | 11 | ||||
-rw-r--r-- | src/thread/microblaze/syscall_cp.s | 12 | ||||
-rw-r--r-- | src/thread/mips/syscall_cp.s | 11 | ||||
-rw-r--r-- | src/thread/or1k/syscall_cp.s | 12 | ||||
-rw-r--r-- | src/thread/powerpc/syscall_cp.s | 13 | ||||
-rw-r--r-- | src/thread/pthread_cancel.c | 14 | ||||
-rw-r--r-- | src/thread/sh/syscall_cp.s | 12 | ||||
-rw-r--r-- | src/thread/x32/syscall_cp.s | 10 | ||||
-rw-r--r-- | src/thread/x86_64/syscall_cp.s | 10 |
12 files changed, 103 insertions, 30 deletions
diff --git a/arch/x32/src/syscall_cp_fixup.c b/arch/x32/src/syscall_cp_fixup.c index 470597d1..07d39b52 100644 --- a/arch/x32/src/syscall_cp_fixup.c +++ b/arch/x32/src/syscall_cp_fixup.c @@ -1,4 +1,8 @@ #include <sys/syscall.h> + +#ifdef SHARED +__attribute__((__visibility__("hidden"))) +#endif long __syscall_cp_internal(volatile void*, long long, long long, long long, long long, long long, long long, long long); @@ -8,6 +12,9 @@ struct __timespec_kernel { long long tv_sec; long long tv_nsec; }; #define __fixup(X) do { if(X) X = (unsigned long) (&(struct __timespec_kernel) \ { .tv_sec = __tsc(X)->tv_sec, .tv_nsec = __tsc(X)->tv_nsec}); } while(0) +#ifdef SHARED +__attribute__((__visibility__("hidden"))) +#endif long __syscall_cp_asm (volatile void * foo, long long n, long long a1, long long a2, long long a3, long long a4, long long a5, long long a6) { switch (n) { diff --git a/src/thread/aarch64/syscall_cp.s b/src/thread/aarch64/syscall_cp.s index 6302a0bd..30e677ce 100644 --- a/src/thread/aarch64/syscall_cp.s +++ b/src/thread/aarch64/syscall_cp.s @@ -4,10 +4,17 @@ // syscall(nr, u, v, w, x, y, z) // x8 x0 x1 x2 x3 x4 x5 +.global __cp_begin +.hidden __cp_begin +.global __cp_end +.hidden __cp_end +.global __cp_cancel +.hidden __cp_cancel +.hidden __cancel .global __syscall_cp_asm +.hidden __syscall_cp_asm .type __syscall_cp_asm,%function __syscall_cp_asm: -.global __cp_begin __cp_begin: ldr w0,[x0] cbnz w0,1f @@ -19,7 +26,6 @@ __cp_begin: mov x4,x6 mov x5,x7 svc 0 -.global __cp_end __cp_end: ret diff --git a/src/thread/arm/syscall_cp.s b/src/thread/arm/syscall_cp.s index 66c5ecbd..96ce6135 100644 --- a/src/thread/arm/syscall_cp.s +++ b/src/thread/arm/syscall_cp.s @@ -1,9 +1,16 @@ +.global __cp_begin +.hidden __cp_begin +.global __cp_end +.hidden __cp_end +.global __cp_cancel +.hidden __cp_cancel +.hidden __cancel .global __syscall_cp_asm +.hidden __syscall_cp_asm .type __syscall_cp_asm,%function __syscall_cp_asm: mov ip,sp stmfd sp!,{r4,r5,r6,r7,lr} -.global __cp_begin __cp_begin: ldr r0,[r0] cmp r0,#0 @@ -13,13 +20,11 @@ __cp_begin: mov r1,r3 ldmfd ip,{r2,r3,r4,r5,r6} svc 0 -.global __cp_end __cp_end: ldmfd sp!,{r4,r5,r6,r7,lr} tst lr,#1 moveq pc,lr bx lr -.global __cp_cancel __cp_cancel: ldmfd sp!,{r4,r5,r6,r7,lr} b __cancel diff --git a/src/thread/i386/syscall_cp.s b/src/thread/i386/syscall_cp.s index 71ce63f7..7dce1eb3 100644 --- a/src/thread/i386/syscall_cp.s +++ b/src/thread/i386/syscall_cp.s @@ -1,5 +1,13 @@ .text +.global __cp_begin +.hidden __cp_begin +.global __cp_end +.hidden __cp_end +.global __cp_cancel +.hidden __cp_cancel +.hidden __cancel .global __syscall_cp_asm +.hidden __syscall_cp_asm .type __syscall_cp_asm,@function __syscall_cp_asm: mov 4(%esp),%ecx @@ -7,7 +15,6 @@ __syscall_cp_asm: pushl %esi pushl %edi pushl %ebp -.global __cp_begin __cp_begin: movl (%ecx),%eax testl %eax,%eax @@ -20,14 +27,12 @@ __cp_begin: movl 44(%esp),%edi movl 48(%esp),%ebp int $128 -.global __cp_end __cp_end: popl %ebp popl %edi popl %esi popl %ebx ret -.global __cp_cancel __cp_cancel: popl %ebp popl %edi diff --git a/src/thread/microblaze/syscall_cp.s b/src/thread/microblaze/syscall_cp.s index ce38b56c..51599c91 100644 --- a/src/thread/microblaze/syscall_cp.s +++ b/src/thread/microblaze/syscall_cp.s @@ -1,10 +1,17 @@ +.global __cp_begin +.hidden __cp_begin +.global __cp_end +.hidden __cp_end +.global __cp_cancel +.hidden __cp_cancel +.hidden __cancel .global __syscall_cp_asm +.hidden __syscall_cp_asm .type __syscall_cp_asm,@function __syscall_cp_asm: -.global __cp_begin __cp_begin: lwi r5, r5, 0 - bnei r5, __cancel@PLT + bnei r5, __cancel addi r12, r6, 0 add r5, r7, r0 add r6, r8, r0 @@ -13,7 +20,6 @@ __cp_begin: lwi r9, r1, 28 lwi r10, r1, 32 brki r14, 0x8 -.global __cp_end __cp_end: rtsd r15, 8 nop diff --git a/src/thread/mips/syscall_cp.s b/src/thread/mips/syscall_cp.s index d903794d..399289e3 100644 --- a/src/thread/mips/syscall_cp.s +++ b/src/thread/mips/syscall_cp.s @@ -1,10 +1,17 @@ .set noreorder +.global __cp_begin +.hidden __cp_begin +.global __cp_end +.hidden __cp_end +.global __cp_cancel +.hidden __cp_cancel +.hidden __cancel .global __syscall_cp_asm +.hidden __syscall_cp_asm .type __syscall_cp_asm,@function __syscall_cp_asm: subu $sp, $sp, 32 -.global __cp_begin __cp_begin: lw $4, 0($4) bne $4, $0, __cp_cancel @@ -22,7 +29,6 @@ __cp_begin: sw $2, 28($sp) lw $2, 28($sp) syscall -.global __cp_end __cp_end: beq $7, $0, 1f addu $sp, $sp, 32 @@ -30,7 +36,6 @@ __cp_end: 1: jr $ra nop -.global __cp_cancel __cp_cancel: addu $sp, $sp, 32 lw $25, %call16(__cancel)($gp) diff --git a/src/thread/or1k/syscall_cp.s b/src/thread/or1k/syscall_cp.s index 02d4cd79..2c0bf0e8 100644 --- a/src/thread/or1k/syscall_cp.s +++ b/src/thread/or1k/syscall_cp.s @@ -1,11 +1,18 @@ +.global __cp_begin +.hidden __cp_begin +.global __cp_end +.hidden __cp_end +.global __cp_cancel +.hidden __cp_cancel +.hidden __cancel .global __syscall_cp_asm +.hidden __syscall_cp_asm .type __syscall_cp_asm,@function __syscall_cp_asm: -.global __cp_begin __cp_begin: l.lwz r3, 0(r3) l.sfeqi r3, 0 - l.bnf plt(__cancel) + l.bnf __cancel l.ori r11, r4, 0 l.ori r3, r5, 0 l.ori r4, r6, 0 @@ -14,7 +21,6 @@ __cp_begin: l.lwz r7, 0(r1) l.lwz r8, 4(r1) l.sys 1 -.global __cp_end __cp_end: l.jr r9 l.nop diff --git a/src/thread/powerpc/syscall_cp.s b/src/thread/powerpc/syscall_cp.s index 0c7869cc..20b5e0ac 100644 --- a/src/thread/powerpc/syscall_cp.s +++ b/src/thread/powerpc/syscall_cp.s @@ -1,3 +1,13 @@ +.global __cp_begin +.hidden __cp_begin +.global __cp_end +.hidden __cp_end +.global __cp_cancel +.hidden __cp_cancel +.hidden __cancel +.global __syscall_cp_asm +.hidden __syscall_cp_asm + #r0: volatile. may be modified during linkage. #r1: stack frame: 16 byte alignment. #r2: tls/thread pointer on pp32 @@ -16,11 +26,9 @@ #the fields CR2,CR2,CR4 of the cond reg must be preserved #LR (link reg) shall contain the funcs return address .text - .global __syscall_cp_asm .type __syscall_cp_asm,%function __syscall_cp_asm: # at enter: r3 = pointer to self->cancel, r4: syscall no, r5: first arg, r6: 2nd, r7: 3rd, r8: 4th, r9: 5th, r10: 6th - .global __cp_begin __cp_begin: # r3 holds first argument, its a pointer to self->cancel. # we must compare the dereferenced value with 0 and jump to __cancel if its not @@ -42,7 +50,6 @@ __cp_begin: mr 7, 9 # arg5 mr 8, 10 # arg6 sc - .global __cp_end __cp_end: bnslr+ # return if no summary overflow. #else negate result. diff --git a/src/thread/pthread_cancel.c b/src/thread/pthread_cancel.c index 7c5dda31..fde09080 100644 --- a/src/thread/pthread_cancel.c +++ b/src/thread/pthread_cancel.c @@ -3,7 +3,13 @@ #include "syscall.h" #include "libc.h" -long __cancel() +#ifdef SHARED +#define hidden __attribute__((__visibility__("hidden"))) +#else +#define hidden +#endif + +hidden long __cancel() { pthread_t self = __pthread_self(); if (self->canceldisable == PTHREAD_CANCEL_ENABLE || self->cancelasync) @@ -16,12 +22,14 @@ long __cancel() * definition of __cp_cancel to undo those adjustments and call __cancel. * Otherwise, __cancel provides a definition for __cp_cancel. */ -weak_alias(__cancel, __cp_cancel); +hidden weak_alias(__cancel, __cp_cancel); +hidden 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); +hidden long __syscall_cp_c(syscall_arg_t nr, syscall_arg_t u, syscall_arg_t v, syscall_arg_t w, syscall_arg_t x, syscall_arg_t y, syscall_arg_t z) @@ -52,7 +60,7 @@ static void cancel_handler(int sig, siginfo_t *si, void *ctx) pthread_t self = __pthread_self(); ucontext_t *uc = ctx; const char *ip = ((char **)&uc->uc_mcontext)[CANCEL_REG_IP]; - extern const char __cp_begin[1], __cp_end[1]; + hidden extern const char __cp_begin[1], __cp_end[1]; a_barrier(); if (!self->cancel || self->canceldisable == PTHREAD_CANCEL_DISABLE) return; diff --git a/src/thread/sh/syscall_cp.s b/src/thread/sh/syscall_cp.s index 5677b9c0..c783ca05 100644 --- a/src/thread/sh/syscall_cp.s +++ b/src/thread/sh/syscall_cp.s @@ -1,9 +1,16 @@ .text +.global __cp_begin +.hidden __cp_begin +.global __cp_end +.hidden __cp_end +.global __cp_cancel +.hidden __cp_cancel +.hidden __cancel .global __syscall_cp_asm +.hidden __syscall_cp_asm .type __syscall_cp_asm, @function __syscall_cp_asm: -.global __cp_begin __cp_begin: mov.l @r4, r4 tst r4, r4 @@ -15,7 +22,7 @@ __cp_begin: 1: .align 2 -L1: .long __cancel@PLT-(1b-.) +L1: .long __cancel-(1b-.) 2: mov r5, r3 mov r6, r4 @@ -26,7 +33,6 @@ L1: .long __cancel@PLT-(1b-.) mov.l @(12,r15), r1 trapa #22 -.global __cp_end __cp_end: ! work around hardware bug or r0, r0 diff --git a/src/thread/x32/syscall_cp.s b/src/thread/x32/syscall_cp.s index 70605c19..79709a55 100644 --- a/src/thread/x32/syscall_cp.s +++ b/src/thread/x32/syscall_cp.s @@ -1,9 +1,16 @@ .text +.global __cp_begin +.hidden __cp_begin +.global __cp_end +.hidden __cp_end +.global __cp_cancel +.hidden __cp_cancel +.hidden __cancel .global __syscall_cp_internal +.hidden __syscall_cp_internal .type __syscall_cp_internal,@function __syscall_cp_internal: -.global __cp_begin __cp_begin: mov (%rdi),%eax test %eax,%eax @@ -18,6 +25,5 @@ __cp_begin: mov 16(%rsp),%r9 mov %r11,8(%rsp) syscall -.global __cp_end __cp_end: ret diff --git a/src/thread/x86_64/syscall_cp.s b/src/thread/x86_64/syscall_cp.s index 788c53cc..1a0fd5d2 100644 --- a/src/thread/x86_64/syscall_cp.s +++ b/src/thread/x86_64/syscall_cp.s @@ -1,9 +1,16 @@ .text +.global __cp_begin +.hidden __cp_begin +.global __cp_end +.hidden __cp_end +.global __cp_cancel +.hidden __cp_cancel +.hidden __cancel .global __syscall_cp_asm +.hidden __syscall_cp_asm .type __syscall_cp_asm,@function __syscall_cp_asm: -.global __cp_begin __cp_begin: mov (%rdi),%eax test %eax,%eax @@ -18,6 +25,5 @@ __cp_begin: mov 16(%rsp),%r9 mov %r11,8(%rsp) syscall -.global __cp_end __cp_end: ret |