add tlsdesc support for x86_64
authorRich Felker <dalias@aerifal.cx>
Thu, 19 Jun 2014 19:26:04 +0000 (15:26 -0400)
committerRich Felker <dalias@aerifal.cx>
Thu, 19 Jun 2014 19:26:04 +0000 (15:26 -0400)
arch/x86_64/reloc.h
src/ldso/x86_64/tlsdesc.s [new file with mode: 0644]

index ffab5566b68a77fa3709342709e9357bfd98ec54..9bc58496cea46e6c028c6fba967dd2cb00962df4 100644 (file)
@@ -25,6 +25,8 @@ static int remap_rel(int type)
                return REL_DTPOFF;
        case R_X86_64_TPOFF64:
                return REL_TPOFF;
+       case R_X86_64_TLSDESC:
+               return REL_TLSDESC;
        }
        return 0;
 }
diff --git a/src/ldso/x86_64/tlsdesc.s b/src/ldso/x86_64/tlsdesc.s
new file mode 100644 (file)
index 0000000..57b78e0
--- /dev/null
@@ -0,0 +1,40 @@
+.text
+.global __tlsdesc_static
+.type __tlsdesc_static,@function
+__tlsdesc_static:
+       mov 8(%rax),%rax
+       ret
+
+.global __tlsdesc_dynamic
+.type __tlsdesc_dynamic,@function
+__tlsdesc_dynamic:
+       mov 8(%rax),%rax
+       push %rdx
+       mov %fs:8,%rdx
+       push %rcx
+       mov (%rax),%rcx
+       cmp %rcx,(%rdx)
+       jc 1f
+       mov 8(%rax),%rax
+       add (%rdx,%rcx,8),%rax
+2:     pop %rcx
+       sub %fs:0,%rax
+       pop %rdx
+       ret
+1:     push %rdi
+       push %rdi
+       push %rsi
+       push %r8
+       push %r9
+       push %r10
+       push %r11
+       mov %rax,%rdi
+       call __tls_get_addr
+       pop %r11
+       pop %r10
+       pop %r9
+       pop %r8
+       pop %rsi
+       pop %rdi
+       pop %rdi
+       jmp 2b