56 lines
1.4 KiB
C
56 lines
1.4 KiB
C
#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)
|
|
{
|
|
map_page(page_stack, (void*)0xFF7FF000, reserve_page(page_stack), PAGE_RW);
|
|
map_page(page_stack, (void*)0xFF7FD000, reserve_page(page_stack), PAGE_RW | PAGE_USERMODE);
|
|
unmap_page((void*)0xFF7FE000);
|
|
unmap_page((void*)0xFF7FC000);
|
|
uint32_t flags;
|
|
struct process_state_t *stack = (struct process_state_t*)((void*)0xFF800000 - 20 - 8*4);
|
|
asm("pushf; "
|
|
"mov (%%esp), %0; "
|
|
"popf; "
|
|
: "=r"(flags));
|
|
memset(stack, 0, sizeof(*stack));
|
|
stack->eip = (uint32_t)task_entry;
|
|
stack->cs = 27;
|
|
stack->flags = flags | 0x200;
|
|
stack->esp = 0xFF7FE000;
|
|
stack->ss = 35;
|
|
stack->esp_temp = &stack->eax;
|
|
return (void*)stack;
|
|
}
|
|
|
|
void load_context(struct process_state_t *context)
|
|
{
|
|
asm("mov $0x10, %%ax; "
|
|
"mov %%ax, %%ds; "
|
|
"mov %%ax, %%es; "
|
|
"mov %%ax, %%fs; "
|
|
"mov %%ax, %%gs; "
|
|
::: "ax");
|
|
asm("mov 4(%esp), %esp; "
|
|
"popal; "
|
|
"iret; ");
|
|
} |