Index: fusl/src/ldso/x86_64/tlsdesc.s |
diff --git a/fusl/src/ldso/x86_64/tlsdesc.s b/fusl/src/ldso/x86_64/tlsdesc.s |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8238c3ebf4d6ecb44b92573133e36cfa882ea383 |
--- /dev/null |
+++ b/fusl/src/ldso/x86_64/tlsdesc.s |
@@ -0,0 +1,44 @@ |
+.text |
+.global __tlsdesc_static |
+.hidden __tlsdesc_static |
+.type __tlsdesc_static,@function |
+__tlsdesc_static: |
+ mov 8(%rax),%rax |
+ ret |
+ |
+.hidden __tls_get_new |
+ |
+.global __tlsdesc_dynamic |
+.hidden __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_new |
+ pop %r11 |
+ pop %r10 |
+ pop %r9 |
+ pop %r8 |
+ pop %rsi |
+ pop %rdi |
+ pop %rdi |
+ jmp 2b |