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

index 12224b7927146fb7288e49f3b83403577fdd9134..eaf5aae03527db64176a7788d5115a67c41086a5 100644 (file)
@@ -26,6 +26,8 @@ static int remap_rel(int type)
                return REL_TPOFF;
        case R_386_TLS_TPOFF32:
                return REL_TPOFF_NEG;
+       case R_386_TLS_DESC:
+               return REL_TLSDESC;
        }
        return 0;
 }
diff --git a/src/ldso/i386/tlsdesc.s b/src/ldso/i386/tlsdesc.s
new file mode 100644 (file)
index 0000000..3ac6129
--- /dev/null
@@ -0,0 +1,27 @@
+.text
+.global __tlsdesc_static
+.type __tlsdesc_static,@function
+__tlsdesc_static:
+       mov 4(%eax),%eax
+       ret
+
+.global __tlsdesc_dynamic
+.type __tlsdesc_dynamic,@function
+__tlsdesc_dynamic:
+       mov 4(%eax),%eax
+       push %edx
+       mov %gs:4,%edx
+       push %ecx
+       mov (%eax),%ecx
+       cmp %ecx,(%edx)
+       jc 1f
+       mov 4(%eax),%eax
+       add (%edx,%ecx,4),%eax
+2:     pop %ecx
+       sub %gs:0,%eax
+       pop %edx
+       ret
+1:     push %eax
+       call __tls_get_addr
+       pop %ecx
+       jmp 2b