]> xenbits.xensource.com Git - people/liuw/rumprun.git/commitdiff
Store the TLS block location (variant II)
authorAntti Kantee <pooka@iki.fi>
Tue, 5 May 2015 13:59:11 +0000 (13:59 +0000)
committerAntti Kantee <pooka@iki.fi>
Tue, 5 May 2015 13:59:11 +0000 (13:59 +0000)
Now anything taking the address of a __thread variable also works.

lib/libbmk_core/sched.c

index 95634c46dfa6e759453cc7673ca1e602b6094464..51215d6ff21d8a5305baebdff63ea5650a4ac855 100644 (file)
@@ -262,14 +262,19 @@ allocothertls(struct bmk_thread *thread)
        const unsigned long tdatasize = _tdata_end - _tdata_start;
        const unsigned long tbsssize = _tbss_end - _tbss_start;
        struct bmk_tcb *tcb = &thread->bt_tcb;
+       unsigned long *tcbptr;
        char *tlsmem;
 
-       tlsmem = bmk_memalloc(tdatasize + tbsssize, 0);
+       tlsmem = bmk_memalloc(tdatasize + tbsssize + sizeof(unsigned long), 0);
 
        bmk_memcpy(tlsmem, _tdata_start, tdatasize);
        bmk_memset(tlsmem + tdatasize, 0, tbsssize);
 
-       tcb->btcb_tp = (unsigned long)(tlsmem + tdatasize + tbsssize);
+       /* assumes TLS variant 2 for now */
+       tcbptr = (unsigned long *)(tlsmem + tdatasize + tbsssize);
+       *tcbptr = (unsigned long)tcbptr;
+
+       tcb->btcb_tp = (unsigned long)tcbptr;
        tcb->btcb_tpsize = tdatasize + tbsssize;
 
        return 0;