swissChili | e20b79b | 2021-03-17 21:20:13 -0700 | [diff] [blame] | 1 | #include "task.h" |
| 2 | #include "alloc.h" |
| 3 | #include "io.h" |
| 4 | #include "paging.h" |
| 5 | |
swissChili | e9289ee | 2021-03-20 21:54:28 -0700 | [diff] [blame^] | 6 | struct process processes[1024] = {0}; |
| 7 | struct ll_task_i *first_task = NULL, *last_task = NULL, *current_task = NULL; |
| 8 | |
| 9 | void init_tasks(uint kernel_esp, uint kernel_ebp, uint kernel_eip) |
swissChili | e20b79b | 2021-03-17 21:20:13 -0700 | [diff] [blame] | 10 | { |
swissChili | e9289ee | 2021-03-20 21:54:28 -0700 | [diff] [blame^] | 11 | asm volatile("cli"); |
swissChili | e20b79b | 2021-03-17 21:20:13 -0700 | [diff] [blame] | 12 | |
swissChili | e9289ee | 2021-03-20 21:54:28 -0700 | [diff] [blame^] | 13 | processes[0] = (struct process){ |
| 14 | .exists = true, |
| 15 | .id = 0, |
| 16 | .ring = 0, |
| 17 | .uid = 0, |
| 18 | }; |
| 19 | strcpy(processes[0].name, "kernel"); |
swissChili | e20b79b | 2021-03-17 21:20:13 -0700 | [diff] [blame] | 20 | |
swissChili | e9289ee | 2021-03-20 21:54:28 -0700 | [diff] [blame^] | 21 | first_task = last_task = current_task = malloc(sizeof(struct ll_task_i)); |
swissChili | e20b79b | 2021-03-17 21:20:13 -0700 | [diff] [blame] | 22 | |
swissChili | e9289ee | 2021-03-20 21:54:28 -0700 | [diff] [blame^] | 23 | first_task->next = NULL; |
| 24 | first_task->task = (struct task){ |
| 25 | .proc = &processes[0], |
| 26 | .esp = kernel_esp, |
| 27 | .ebp = kernel_ebp, |
| 28 | .eip = kernel_eip, |
| 29 | .kernel = true, |
| 30 | .page_directory = kernel_page_directory, |
| 31 | }; |
swissChili | e20b79b | 2021-03-17 21:20:13 -0700 | [diff] [blame] | 32 | |
swissChili | e9289ee | 2021-03-20 21:54:28 -0700 | [diff] [blame^] | 33 | asm volatile("sti"); |
swissChili | e20b79b | 2021-03-17 21:20:13 -0700 | [diff] [blame] | 34 | } |
| 35 | |
swissChili | e9289ee | 2021-03-20 21:54:28 -0700 | [diff] [blame^] | 36 | struct process *get_process(uint pid) |
swissChili | e20b79b | 2021-03-17 21:20:13 -0700 | [diff] [blame] | 37 | { |
swissChili | e9289ee | 2021-03-20 21:54:28 -0700 | [diff] [blame^] | 38 | if (pid < 1024) |
| 39 | return &processes[pid]; |
| 40 | else |
| 41 | return NULL; |
| 42 | } |
swissChili | e20b79b | 2021-03-17 21:20:13 -0700 | [diff] [blame] | 43 | |
swissChili | e9289ee | 2021-03-20 21:54:28 -0700 | [diff] [blame^] | 44 | int get_task_id() |
| 45 | { |
| 46 | return current_task->task.id; |
| 47 | } |
swissChili | e20b79b | 2021-03-17 21:20:13 -0700 | [diff] [blame] | 48 | |
swissChili | e9289ee | 2021-03-20 21:54:28 -0700 | [diff] [blame^] | 49 | int get_process_id() |
| 50 | { |
| 51 | return current_task->task.proc->id; |
| 52 | } |
| 53 | |
| 54 | void spawn_thread(void (* function)(void *data), void *data) |
| 55 | { |
| 56 | |
swissChili | e20b79b | 2021-03-17 21:20:13 -0700 | [diff] [blame] | 57 | } |