From 42c1c066326cc965738e5f0e8653a90fdcc7ffd1 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Fri, 24 Jul 2015 11:45:25 +0200 Subject: [PATCH] guarantee that the stack is aligned to 16 byte --- hermit/arch/x86/kernel/tasks.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/hermit/arch/x86/kernel/tasks.c b/hermit/arch/x86/kernel/tasks.c index daac98d77..49c8e89af 100644 --- a/hermit/arch/x86/kernel/tasks.c +++ b/hermit/arch/x86/kernel/tasks.c @@ -44,9 +44,10 @@ size_t* get_current_stack(void) { uint32_t core_id = CORE_ID; task_t* curr_task = per_core(current_task); + size_t stptr = ((size_t) curr_task->stack + KERNEL_STACK_SIZE - 0x10) & ~0xF; - set_per_core(kernel_stack, curr_task->stack + KERNEL_STACK_SIZE - 0x10); - task_state_segments[core_id].rsp0 = (size_t) curr_task->stack + KERNEL_STACK_SIZE - 0x10; + set_per_core(kernel_stack, stptr); + task_state_segments[core_id].rsp0 = stptr; // use new page table write_cr3(curr_task->page_map); @@ -72,7 +73,7 @@ int create_default_frame(task_t* task, entry_point_t ep, void* arg) * and not for HW-task-switching is setting up a stack and not a TSS. * This is the stack which will be activated and popped off for iret later. */ - stack = (size_t*) (task->stack + KERNEL_STACK_SIZE - 16); // => stack is 16byte aligned + stack = (size_t*) (((size_t) task->stack + KERNEL_STACK_SIZE - 0x10) & ~0xF); // => stack is 16byte aligned /* Only marker for debugging purposes, ... */ *stack-- = 0xDEADBEEF;