From ba4ad175bb35dec86f474419c00d0ddca957cfce Mon Sep 17 00:00:00 2001 From: Antti Kantee Date: Tue, 5 May 2015 13:59:11 +0000 Subject: [PATCH] Store the TLS block location (variant II) Now anything taking the address of a __thread variable also works. --- lib/libbmk_core/sched.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/libbmk_core/sched.c b/lib/libbmk_core/sched.c index 95634c4..51215d6 100644 --- a/lib/libbmk_core/sched.c +++ b/lib/libbmk_core/sched.c @@ -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; -- 2.39.5