fix dlsym of thread-local symbols on archs with DTP_OFFSET!=0
[musl] / src / thread / mips / syscall_cp.s
index d903794..d284626 100644 (file)
@@ -1,10 +1,20 @@
 .set    noreorder
 
+.global __cp_begin
+.hidden __cp_begin
+.type   __cp_begin,@function
+.global __cp_end
+.hidden __cp_end
+.type   __cp_end,@function
+.global __cp_cancel
+.hidden __cp_cancel
+.type   __cp_cancel,@function
+.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 +32,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,9 +39,15 @@ __cp_end:
 1:     jr      $ra
        nop
 
-.global __cp_cancel
 __cp_cancel:
+       move    $2, $ra
+       bal     1f
        addu    $sp, $sp, 32
-       lw      $25, %call16(__cancel)($gp)
+       .gpword .
+       .gpword __cancel
+1:     lw      $3, ($ra)
+       subu    $3, $ra, $3
+       lw      $25, 4($ra)
+       addu    $25, $25, $3
        jr      $25
-       nop
+       move    $ra, $2