/* * This file implements kernel threads. Each kernel thread has a stack * allocated in kernel memory and will run a specified function within the * kernel. When that function completes, the thread will terminate. The * thread has no resources allocated and should only access the kernel. */ #include #include #include #include #define PUSH(s,v) ({ \ s -= sizeof(uintptr_t); \ *(uintptr_t *) s = (uintptr_t) v; \ }) /* Create a new kernel thread */ Task * create_kthread(void (*func)(void), enum Priority p) { /* Create new task */ Task *task = new(&taskType); task->priority = p; task->eip = (uintptr_t) func; /* Setup stack to return to terminate() */ task->esp = (uintptr_t) task + KERNEL_STACK_SIZE; PUSH(task->esp, terminate); /* Schedule the task */ enqueue_task(task); return task; }