blob: a64d5eec72dfad496aea46f904aca966e884cbd8 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#include <kernel/arch/generic.h>
#include <kernel/mem.h>
#include <kernel/proc.h>
#include <stdint.h>
struct process *process_current;
struct process *process_new() {
struct process *proc = page_alloc(1); // TODO kmalloc
proc->pages = pagedir_new();
// map the stack to the last page in memory
pagedir_map(proc->pages, (void*)~PAGE_MASK, page_alloc(1), true, true);
proc->stack_top = proc->regs.esp = (void*) ~0xF;
// map the kernel
// yup, .text is writeable too. the plan is to not map the kernel
// into user memory at all, but i'll implement that later. TODO
for (size_t p = 0x100000; p < &_bss_end; p += PAGE_SIZE)
pagedir_map(proc->pages, (void*)p, (void*)p, false, true);
// the kernel still has to load the executable code and set EIP
return proc;
}
void process_switch(struct process *proc) {
process_current = proc;
pagedir_switch(proc->pages);
sysexit(proc->regs.eip, proc->regs.esp);
}
|