Initialize static TLS for the benchmarks
authorAndrew Waterman <waterman@cs.berkeley.edu>
Sat, 13 Dec 2014 11:53:49 +0000 (03:53 -0800)
committerAndrew Waterman <waterman@cs.berkeley.edu>
Sat, 13 Dec 2014 11:54:07 +0000 (03:54 -0800)
benchmarks/common/crt.S
benchmarks/common/syscalls.c
benchmarks/common/test.ld

index 2c004d1308e152a459650bb9465f1a17305914c6..cce3140ab8c966978b5ba8e674fe23d48ec91389 100644 (file)
@@ -114,13 +114,6 @@ _start:
   sll sp, sp, STKSHIFT
   add sp, sp, tp
 
-  # offset thread pointer by thread pointer bias
-  lui t0, %tprel_hi(tls_start)
-  add t0, t0, tp, %tprel_add(tls_start)
-  add t0, t0, %tprel_lo(tls_start)
-  sub t0, t0, tp
-  sub tp, tp, t0
-
   la t0, _init
   csrw epc, t0
   sret
@@ -211,5 +204,14 @@ trap_entry:
   addi sp, sp, 272
   sret
 
-.section .tbss
-tls_start:
+.section ".tdata.begin"
+.globl _tdata_begin
+_tdata_begin:
+
+.section ".tdata.end"
+.globl _tdata_end
+_tdata_end:
+
+.section ".tbss.end"
+.globl _tbss_end
+_tbss_end:
index ddbb795dde579b7110323e2a622c035ad683a02d..1e4efab1e3f28ff6cf70b4463f5d7e1e48aaa8cd 100644 (file)
@@ -125,8 +125,20 @@ int __attribute__((weak)) main(int argc, char** argv)
   return -1;
 }
 
+static void init_tls()
+{
+  register void* thread_pointer asm("tp");
+  extern char _tls_data;
+  extern __thread char _tdata_begin, _tdata_end, _tbss_end;
+  size_t tdata_size = &_tdata_end - &_tdata_begin;
+  memcpy(thread_pointer, &_tls_data, tdata_size);
+  size_t tbss_size = &_tbss_end - &_tdata_end;
+  memset(thread_pointer + tdata_size, 0, tbss_size);
+}
+
 void _init(int cid, int nc)
 {
+  init_tls();
   thread_entry(cid, nc);
 
   // only single-threaded programs should ever get here.
index dda2a7f528ccd6e8b8ce964c03fefbf9995e4435..438581cb6b04d9b754b09840d7b4e60dd61d60c1 100644 (file)
@@ -38,11 +38,18 @@ SECTIONS
   .bss : { *(.bss) }
 
   /* thread-local data segment */
-  .tbss : { 
-    crt.o(.tbss) /* Make sure tls_start is the first TLS symbol */
+  .tdata :
+  {
+    _tls_data = .;
+    crt.o(.tdata.begin)
+    *(.tdata)
+    crt.o(.tdata.end)
+  }
+  .tbss :
+  {
     *(.tbss)
+    crt.o(.tbss.end)
   }
-  .tdata : { *(.tdata) }
 
   /* End of uninitalized data segement */
   _end = .;