#include "../../tasking.h" #include "../paging.h" #include "../tasking_helpers.h" #include "../../pmem.h" static uint32_t* kstacks=(uint32_t*)0xC8000000; static uint32_t kstack_bmap[(218*1024)/8]={0}; static char get_bmap_bit(uint32_t index) { uint32_t byte=index/8; uint32_t bit=index%8; char entry=kstack_bmap[byte]; return (entry&(1<0; } static void set_bmap_bit(uint32_t index) { uint32_t byte=index/8; uint32_t bit=index%8; kstack_bmap[byte]=kstack_bmap[byte]|(1<cr3); if (kmode) { uint32_t top_idx=(1024*(kstack_num+1)); thread->kernel_esp=((uint32_t)(&kstacks[top_idx-5])); thread->kernel_esp_top=thread->kernel_esp; kstacks[top_idx-1]=(uint32_t)eip; } else { uint32_t top_idx=(1024*(kstack_num+1)); thread->kernel_esp=((uint32_t)(&kstacks[top_idx-7])); thread->kernel_esp_top=thread->kernel_esp; uint32_t* user_stack=(uint32_t*)(((uint32_t)alloc_pages(2))+0x2000); user_stack-=2; user_stack[0]=param1; user_stack[1]=param2; kstacks[top_idx-3]=(uint32_t)task_init; kstacks[top_idx-2]=(uint32_t)user_stack; kstacks[top_idx-1]=(uint32_t)eip; } load_address_space(old_cr3); }