diff --git a/cpu/i386/isr.c b/cpu/i386/isr.c index 5cbc1a5..346c48c 100644 --- a/cpu/i386/isr.c +++ b/cpu/i386/isr.c @@ -185,6 +185,8 @@ void isr_handler(registers_t r) { tasking_send_msg(r.ebx,(void*)r.ecx,r.edx); } else if (r.eax==8) { r.ebx=(uint32_t)paging_new_address_space(); + } else if (r.eax==9) { + tasking_createTaskCr3((void*)r.ebx,(void*)r.ecx); } break; } diff --git a/cpu/tasking.h b/cpu/tasking.h index a0c9f80..d917d46 100644 --- a/cpu/tasking.h +++ b/cpu/tasking.h @@ -6,6 +6,7 @@ void tasking_init(); void tasking_yield(); Task* tasking_createTask(void* eip); +Task* tasking_createTaskCr3(void* eip,void* cr3); char isPrivleged(uint32_t pid); void tasking_send_msg(uint32_t pid,void* msg,uint32_t size); void* tasking_get_msg(uint32_t* sender); diff --git a/initrd/init b/initrd/init index 49ef7a7..5c0354b 100755 Binary files a/initrd/init and b/initrd/init differ diff --git a/libc/tasking.c b/libc/tasking.c index 14ec66c..6e36d59 100644 --- a/libc/tasking.c +++ b/libc/tasking.c @@ -29,3 +29,10 @@ void send_msg(uint32_t pid,void* msg,uint32_t size) { int $80; \ "::"b"(pid),"c"(msg),"d"(size)); } + +void createTaskCr3(void* task,void* cr3) { + asm volatile(" \ + mov $9, %%eax; \ + int $80; \ + "::"b"(task),"c"(cr3)); +} diff --git a/libc/tasking.h b/libc/tasking.h index 5946ed3..32f05f0 100644 --- a/libc/tasking.h +++ b/libc/tasking.h @@ -5,6 +5,7 @@ void yield(); void createTask(void* task); +void createTaskCr3(void* task,void* cr3); char isPrivleged(uint32_t pid); void send_msg(uint32_t pid,void* msg,uint32_t size); void* get_msg(uint32_t* sender);