From 461194fdfd7fbbf531d99ec1836985ad5749660a Mon Sep 17 00:00:00 2001 From: ngiddings Date: Sat, 17 Apr 2021 06:26:56 -0500 Subject: [PATCH] Fixed initialize_context() Function did not take 'popal' instruction into account when initializing stack --- src/x86/context.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/x86/context.c b/src/x86/context.c index 9be0f1a..9da0bb2 100644 --- a/src/x86/context.c +++ b/src/x86/context.c @@ -1,6 +1,24 @@ #include "context.h" #include "pageallocator.h" #include "mmgr.h" +#include "string.h" + +struct process_state_t +{ + uint32_t edi; + uint32_t esi; + uint32_t ebp; + uint32_t esp_temp; + uint32_t ebx; + uint32_t edx; + uint32_t ecx; + uint32_t eax; + uint32_t eip; + uint32_t cs; + uint32_t flags; + uint32_t esp; + uint32_t ss; +}; void *initialize_context(void *task_entry, struct page_stack_t *page_stack) { @@ -9,16 +27,18 @@ void *initialize_context(void *task_entry, struct page_stack_t *page_stack) unmap_page((void*)0xFF7FE000); unmap_page((void*)0xFF7FC000); uint32_t flags; - uint32_t *stack = (uint32_t*)((void*)0xFF800000 - 20); + struct process_state_t *stack = (struct process_state_t*)((void*)0xFF800000 - 20 - 8*4); asm("pushf; " "mov (%%esp), %0; " "popf; " : "=r"(flags)); - stack[0] = (uint32_t)task_entry; - stack[1] = 27; - stack[2] = flags; - stack[3] = 0xFF7FE000; - stack[4] = 35; + memset(stack, 0, sizeof(*stack)); + stack->eip = (uint32_t)task_entry; + stack->cs = 27; + stack->flags = flags; + stack->esp = 0xFF7FE000; + stack->ss = 35; + stack->esp_temp = &stack->eax; return (void*)stack; }