Fixed initialize_context()
Function did not take 'popal' instruction into account when initializing stack
This commit is contained in:
@@ -1,6 +1,24 @@
|
|||||||
#include "context.h"
|
#include "context.h"
|
||||||
#include "pageallocator.h"
|
#include "pageallocator.h"
|
||||||
#include "mmgr.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)
|
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*)0xFF7FE000);
|
||||||
unmap_page((void*)0xFF7FC000);
|
unmap_page((void*)0xFF7FC000);
|
||||||
uint32_t flags;
|
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; "
|
asm("pushf; "
|
||||||
"mov (%%esp), %0; "
|
"mov (%%esp), %0; "
|
||||||
"popf; "
|
"popf; "
|
||||||
: "=r"(flags));
|
: "=r"(flags));
|
||||||
stack[0] = (uint32_t)task_entry;
|
memset(stack, 0, sizeof(*stack));
|
||||||
stack[1] = 27;
|
stack->eip = (uint32_t)task_entry;
|
||||||
stack[2] = flags;
|
stack->cs = 27;
|
||||||
stack[3] = 0xFF7FE000;
|
stack->flags = flags;
|
||||||
stack[4] = 35;
|
stack->esp = 0xFF7FE000;
|
||||||
|
stack->ss = 35;
|
||||||
|
stack->esp_temp = &stack->eax;
|
||||||
return (void*)stack;
|
return (void*)stack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user