summaryrefslogtreecommitdiffstats
path: root/libexec
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>2004-08-04 19:12:14 +0000
committerdfr <dfr@FreeBSD.org>2004-08-04 19:12:14 +0000
commitc42f6bfee03d5eb96ee02123546ad3da06e4ad0f (patch)
tree1800afe500fdade8ce865bcc7debe2b3d788862b /libexec
parent44a25b6e89dc206d6c2c254bc588eb03277a561e (diff)
downloadFreeBSD-src-c42f6bfee03d5eb96ee02123546ad3da06e4ad0f.zip
FreeBSD-src-c42f6bfee03d5eb96ee02123546ad3da06e4ad0f.tar.gz
Add stubs for powerpc TLS.
Submitted by: ssouhlal
Diffstat (limited to 'libexec')
-rw-r--r--libexec/rtld-elf/powerpc/reloc.c26
-rw-r--r--libexec/rtld-elf/powerpc/rtld_machdep.h15
-rw-r--r--libexec/rtld-elf/rtld.c7
3 files changed, 43 insertions, 5 deletions
diff --git a/libexec/rtld-elf/powerpc/reloc.c b/libexec/rtld-elf/powerpc/reloc.c
index 9894033..1f9f05a 100644
--- a/libexec/rtld-elf/powerpc/reloc.c
+++ b/libexec/rtld-elf/powerpc/reloc.c
@@ -489,3 +489,29 @@ init_pltgot(Obj_Entry *obj)
*/
__syncicache(pltcall, 72 + N * 8);
}
+
+void
+allocate_initial_tls(Obj_Entry *list)
+{
+ register Elf_Addr **tp __asm__("r2");
+
+ /*
+ * 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;
+
+ tp = (Elf_Addr **) ((char *) allocate_tls(list, 0, 8, 8) + 0x7008);
+}
+
+void*
+__tls_get_addr(tls_index* ti)
+{
+ register Elf_Addr **tp __asm__("r2");
+ char *p;
+
+ p = tls_get_addr_common(tp, ti->ti_module, ti->ti_offset);
+ return p + 0x8000;
+}
diff --git a/libexec/rtld-elf/powerpc/rtld_machdep.h b/libexec/rtld-elf/powerpc/rtld_machdep.h
index 77495d7..534882b 100644
--- a/libexec/rtld-elf/powerpc/rtld_machdep.h
+++ b/libexec/rtld-elf/powerpc/rtld_machdep.h
@@ -62,4 +62,19 @@ void _rtld_bind_start(void);
void _rtld_powerpc_pltresolve(void);
void _rtld_powerpc_pltcall(void);
+#define round(size, align) \
+ (((size) + (align) - 1) & ~((align) - 1))
+#define calculate_first_tls_offset(size, align) \
+ round(8, align)
+#define calculate_tls_offset(prev_offset, prev_size, size, align) \
+ round(prev_offset + prev_size, align)
+#define calculate_tls_end(off, size) ((off) + (size))
+
+typedef struct {
+ unsigned long ti_module;
+ unsigned long ti_offset;
+} tls_index;
+
+extern void *__tls_get_addr(tls_index* ti);
+
#endif
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index 97ddf57..3891f17 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -2508,9 +2508,9 @@ tls_get_addr_common(Elf_Addr** dtvp, int index, size_t offset)
return (void*) (dtv[index + 1] + offset);
}
-/* XXX not sure what variants to use for arm and powerpc. */
+/* XXX not sure what variants to use for arm. */
-#if defined(__ia64__) || defined(__alpha__)
+#if defined(__ia64__) || defined(__alpha__) || defined(__powerpc__)
/*
* Allocate Static TLS using the Variant I method.
@@ -2525,9 +2525,6 @@ allocate_tls(Obj_Entry *objs, void *oldtls, size_t tcbsize, size_t tcbalign)
Elf_Addr addr;
int i;
- assert(tcbsize == 16);
- assert(tcbalign == 16);
-
size = tls_static_space;
tls = malloc(size);
OpenPOWER on IntegriCloud