diff --git a/arch/x86/kernel/tasks.c b/arch/x86/kernel/tasks.c index 13bebbee5..41ef3cb8b 100644 --- a/arch/x86/kernel/tasks.c +++ b/arch/x86/kernel/tasks.c @@ -39,7 +39,10 @@ #include #include -#define TLS_OFFSET 0 +#define TLS_ALIGNBITS 5 +#define TLS_ALIGNSIZE (1L << TLS_ALIGNBITS) +#define TSL_ALIGNMASK ((~0L) << TLS_ALIGNBITS) +#define TLS_FLOOR(addr) ((((size_t)addr) + TLS_ALIGNSIZE - 1) & TSL_ALIGNMASK) /* * Note that linker symbols are not variables, they have no memory allocated for @@ -64,20 +67,20 @@ static 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_OFFSET + sizeof(size_t)); + tls_addr = kmalloc(curr_task->tls_size + TLS_ALIGNSIZE + sizeof(size_t)); if (BUILTIN_EXPECT(!tls_addr, 0)) { LOG_ERROR("load_task: heap is missing!\n"); return -ENOMEM; } - memset(tls_addr, 0x00, TLS_OFFSET); - memcpy((void*) (tls_addr+TLS_OFFSET), (void*) curr_task->tls_addr, curr_task->tls_size); - fs = (size_t) tls_addr + curr_task->tls_size + TLS_OFFSET; + memset(tls_addr, 0x00, TLS_ALIGNSIZE); + memcpy((void*) TLS_FLOOR(tls_addr), (void*) curr_task->tls_addr, curr_task->tls_size); + fs = (size_t) TLS_FLOOR(tls_addr) + curr_task->tls_size; *((size_t*)fs) = fs; // set fs register to the TLS segment set_tls(fs); - LOG_INFO("TLS of task %d on core %d starts at 0x%zx (size 0x%zx)\n", curr_task->id, CORE_ID, tls_addr + TLS_OFFSET, curr_task->tls_size); + LOG_INFO("TLS of task %d on core %d starts at 0x%zx (size 0x%zx)\n", curr_task->id, CORE_ID, TLS_FLOOR(tls_addr), curr_task->tls_size); } else set_tls(0); // no TLS => clear fs register return 0; diff --git a/include/hermit/malloc.h b/include/hermit/malloc.h index bcdc948be..1186be556 100644 --- a/include/hermit/malloc.h +++ b/include/hermit/malloc.h @@ -71,8 +71,6 @@ typedef union buddy { uint8_t exponent; /// Must be equal to BUDDY_MAGIC for a valid memory block uint16_t magic; - /// padding to gurantee a sizeof 32Byte - //uint8_t padding[28]; } prefix; } buddy_t; @@ -84,4 +82,3 @@ void buddy_dump(void); #endif #endif - diff --git a/tests.sh b/tests.sh index d5ef4da65..f6c53678e 100755 --- a/tests.sh +++ b/tests.sh @@ -4,7 +4,7 @@ # it is written only for internal tests via Travis CI TDIR=build/local_prefix/opt/hermit/x86_64-hermit/extra -FILES="$TDIR/tests/hello $TDIR/tests/hellof $TDIR/tests/hello++ $TDIR/tests/thr_hello $TDIR/tests/pi $TDIR/benchmarks/stream $TDIR/benchmarks/basic $TDIR/tests/signals $TDIR/tests/test-malloc $TDIR/tests/test-malloc-mt" +FILES="$TDIR/tests/hello $TDIR/tests/hellof $TDIR/tests/hello++ $TDIR/tests/thr_hello $TDIR/tests/pi $TDIR/benchmarks/stream $TDIR/benchmarks/basic $TDIR/tests/signals $TDIR/tests/test-malloc" PROXY=build/local_prefix/opt/hermit/bin/proxy for f in $FILES; do echo "check $f..."; HERMIT_ISLE=qemu HERMIT_CPUS=1 HERMIT_KVM=0 HERMIT_VERBOSE=1 timeout --kill-after=5m 5m $PROXY $f || exit 1; done