3#include "../../lib/base/generic.h"
4#include "../../lib/base/heap.h"
5#include "../../lib/base/memory.h"
6#include "../../lib/base/stdio.h"
11extern page_folder* kernel_directory, * current_directory;
14extern u_dword get_instruction_pointer();
18volatile task* current_task, * ready_queue;
24void initialise_tasking() {
29 current_task->id = next_pid++;
30 current_task->esp = current_task->ebp = 0;
31 current_task->eip = 0;
32 current_task->page_directory = current_directory;
33 current_task->next = 0;
45 task *parent_task = (
task*) current_task;
48 page_folder* directory = clone_directory(current_directory);
52 new_task->id = next_pid++;
53 new_task->esp = new_task->ebp = 0;
55 new_task->page_directory = directory;
60 task* tmp_task = (
task*) ready_queue;
61 while (tmp_task->next) tmp_task = tmp_task->next;
63 tmp_task->next = new_task;
66 u_dword eip = get_instruction_pointer();
69 if (current_task == parent_task) {
71 asm volatile(
"mov %%esp, %0" :
"=r"(new_task->esp));
72 asm volatile(
"mov %%ebp, %0" :
"=r"(new_task->ebp));
84 if (!current_task)
return;
88 asm volatile(
"mov %%esp, %0" :
"=r"(esp));
89 asm volatile(
"mov %%ebp, %0" :
"=r"(ebp));
100 u_dword eip = get_instruction_pointer();
103 if (eip == 0xDEADBABA)
return;
106 current_task->eip = eip;
107 current_task->esp = esp;
108 current_task->ebp = ebp;
111 current_task = current_task->next;
113 if (current_task ==
nullptr) current_task = ready_queue;
114 eip = current_task->eip;
115 esp = current_task->esp;
116 ebp = current_task->ebp;
119 current_directory = current_task->page_directory;
136 "mov $0xDEADBABA, %%eax;\n"
139 ::
"c"(eip),
"rm"(esp),
"rm"(ebp),
"r"(¤t_directory->contents)
145 return current_task->id;
void * ralloc(u_dword size)