#include "task.h" #include "alloc.h" #include "debug.h" #include "kpanic.h" #include "kprintf.h" #include "memory.h" #include uint32_t esp_backup; static struct task *create_task(uint8_t owner_id) { static uint32_t pid = 1; struct task *new_task = vmalloc(sizeof(struct task)); if (!new_task) return NULL; new_task->next = current_task->next; new_task->prev = current_task; current_task->next = new_task; new_task->owner_id = owner_id; new_task->esp0 = alloc_pages(STACK_SIZE, NULL); if (!new_task->esp0) { vfree(new_task); return NULL; } new_task->esp = new_task->esp0 + STACK_SIZE; new_task->pid = pid++; new_task->heap = alloc_pages(4096, (void **)&new_task->cr3); if (!new_task->heap) { free_pages(new_task->esp0, STACK_SIZE); vfree(new_task); return NULL; } return new_task; } int create_kernel_task(void) { struct task *new_task = vmalloc(sizeof(struct task)); if (!new_task) return -1; new_task->status = RUN; new_task->owner_id = 0; new_task->pid = 0; new_task->heap = page_directory; new_task->cr3 = page_directory - KERNEL_START; new_task->prev = new_task; new_task->next = new_task; current_task = new_task; return 0; } void exec_fn(void (*fn)(void)) { struct task *new_task = create_task(OWNER_KERNEL); if (!new_task) kpanic("failed to create new task"); new_task->status = RUN; new_task->eip = (uint32_t *)fn; } /* * Create task * Allocate new pd => kmalloc(4096) * Add pd address to the struct task * */