summaryrefslogtreecommitdiff
path: root/libexec/rtld-elf/mips
diff options
context:
space:
mode:
authorOleksandr Tymoshenko <gonzo@FreeBSD.org>2012-02-10 06:42:50 +0000
committerOleksandr Tymoshenko <gonzo@FreeBSD.org>2012-02-10 06:42:50 +0000
commit20c390af6349ee2953d10b59954fc8befd8306fb (patch)
tree3e73bcf3ae3fc9f0c80eebc52d8c5bc78e8f1d7c /libexec/rtld-elf/mips
parentde02885a7b0682177a98c2595c0a0f2546401dcb (diff)
downloadsrc-test2-20c390af6349ee2953d10b59954fc8befd8306fb.tar.gz
src-test2-20c390af6349ee2953d10b59954fc8befd8306fb.zip
Notes
Diffstat (limited to 'libexec/rtld-elf/mips')
-rw-r--r--libexec/rtld-elf/mips/reloc.c26
-rw-r--r--libexec/rtld-elf/mips/rtld_machdep.h23
2 files changed, 42 insertions, 7 deletions
diff --git a/libexec/rtld-elf/mips/reloc.c b/libexec/rtld-elf/mips/reloc.c
index c160841a1fd2..b954fa3afe1f 100644
--- a/libexec/rtld-elf/mips/reloc.c
+++ b/libexec/rtld-elf/mips/reloc.c
@@ -39,8 +39,11 @@ __FBSDID("$FreeBSD$");
#include <string.h>
#include <inttypes.h>
+#include <machine/sysarch.h>
+
#include "debug.h"
#include "rtld.h"
+#include "rtld_printf.h"
#ifdef __mips_n64
#define GOT1_MASK 0x8000000000000000UL
@@ -528,11 +531,32 @@ reloc_jmpslot(Elf_Addr *where, Elf_Addr target, const Obj_Entry *defobj,
void
allocate_initial_tls(Obj_Entry *objs)
{
+ char *tls;
+ /*
+ * Fix the size of the static TLS block by using the maximum
+ * offset allocated so far and adding a bit for dynamic modules to
+ * use.
+ */
+ tls_static_space = tls_last_offset + tls_last_size + RTLD_STATIC_TLS_EXTRA;
+
+ tls = ((char *) allocate_tls(objs, NULL, TLS_TCB_SIZE, 8)
+ + TLS_TP_OFFSET + TLS_TCB_SIZE);
+
+ sysarch(MIPS_SET_TLS, tls);
+ rtld_printf("allocate_initial_tls -> %p(%p)\n", tls, tls - TLS_TP_OFFSET - TLS_TCB_SIZE);
}
void *
__tls_get_addr(tls_index* ti)
{
- return (NULL);
+ Elf_Addr** tls;
+ char *p;
+
+ sysarch(MIPS_GET_TLS, &tls);
+
+ p = tls_get_addr_common((Elf_Addr**)((Elf_Addr)tls - TLS_TP_OFFSET
+ - TLS_TCB_SIZE), ti->ti_module, ti->ti_offset);
+
+ return (p + TLS_DTV_OFFSET);
}
diff --git a/libexec/rtld-elf/mips/rtld_machdep.h b/libexec/rtld-elf/mips/rtld_machdep.h
index 8a1b7869e3f0..14fdf4472945 100644
--- a/libexec/rtld-elf/mips/rtld_machdep.h
+++ b/libexec/rtld-elf/mips/rtld_machdep.h
@@ -47,21 +47,32 @@ Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target,
#define call_initfini_pointer(obj, target) \
(((InitFunc)(target))())
-
+
+/*
+ * TLS
+ */
+
+#define TLS_TP_OFFSET 0x7000
+#define TLS_DTV_OFFSET 0x8000
+#ifdef __mips_n64
+#define TLS_TCB_SIZE 16
+#else
+#define TLS_TCB_SIZE 8
+#endif
+
typedef struct {
unsigned long ti_module;
unsigned long ti_offset;
} tls_index;
#define round(size, align) \
- (((size) + (align) - 1) & ~((align) - 1))
+ (((size) + (align) - 1) & ~((align) - 1))
#define calculate_first_tls_offset(size, align) \
- round(size, align)
+ round(TLS_TCB_SIZE, align)
#define calculate_tls_offset(prev_offset, prev_size, size, align) \
- round(prev_offset + prev_size, align)
+ round(prev_offset + prev_size, align)
#define calculate_tls_end(off, size) ((off) + (size))
-
-
+
/*
* Lazy binding entry point, called via PLT.
*/