diff --git a/hermit/kernel/tasks.c b/hermit/kernel/tasks.c index 357bd320e..f657a57a9 100644 --- a/hermit/kernel/tasks.c +++ b/hermit/kernel/tasks.c @@ -44,6 +44,8 @@ extern const void tls_start; extern const void tls_end; +#define TLS_OFFSET 8 + /* * HermitCore is a single address space OS * => we need only a lock to protect the page tables & VMA @@ -196,17 +198,17 @@ int init_tls(void) curr_task->tls_addr = (size_t) &tls_start; curr_task->tls_size = (size_t) &tls_end - (size_t) &tls_start; - tls_addr = kmalloc(curr_task->tls_size); + tls_addr = kmalloc(curr_task->tls_size + TLS_OFFSET); if (BUILTIN_EXPECT(!tls_addr, 0)) { kprintf("load_task: heap is missing!\n"); return -ENOMEM; } - memcpy((void*) tls_addr, (void*) curr_task->tls_addr, curr_task->tls_size); + memcpy((void*) (tls_addr+TLS_OFFSET), (void*) curr_task->tls_addr, curr_task->tls_size); // set fs register to the TLS segment - set_tls((size_t) tls_addr + curr_task->tls_size); - kprintf("TLS of task %d starts at 0x%zx (TLS)\n", curr_task->id, tls_addr); + set_tls((size_t) tls_addr + curr_task->tls_size + TLS_OFFSET); + kprintf("TLS of task %d starts at 0x%zx (TLS)\n", curr_task->id, tls_addr + TLS_OFFSET); } else set_tls(0); // no TLS => clear fs register return 0; @@ -285,8 +287,8 @@ void NORETURN do_exit(int arg) // do we need to release the TLS? tls_addr = (void*)get_tls(); if (tls_addr) { - kprintf("Release TLS %p\n", tls_addr - curr_task->tls_size); - kfree(tls_addr - curr_task->tls_size); + kprintf("Release TLS at %p\n", tls_addr - curr_task->tls_size); + kfree(tls_addr - curr_task->tls_size - TLS_OFFSET); } curr_task->status = TASK_FINISHED; diff --git a/hermit/usr/libomp b/hermit/usr/libomp index a67cdd442..25e1103b0 160000 --- a/hermit/usr/libomp +++ b/hermit/usr/libomp @@ -1 +1 @@ -Subproject commit a67cdd4420737374590a403ce3d5882ae6311524 +Subproject commit 25e1103b0486ea90150d17ced824eb51e4bf36fe