diff options
Diffstat (limited to 'kernel/features/load.c')
-rw-r--r-- | kernel/features/load.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/kernel/features/load.c b/kernel/features/load.c index 8a4aae3..9e6db79 100644 --- a/kernel/features/load.c +++ b/kernel/features/load.c @@ -3,28 +3,36 @@ #include <fs.h> #include <load.h> #include <mem.h> +#include <mm.h> #include <str.h> -void proc_load(struct proc *proc, void *data) -{ - u32 stack = (u32)malloc(0x2000) + 0x1000; - - proc->regs.ebp = (u32)stack; - proc->regs.useresp = (u32)stack; - proc->regs.eip = (u32)data; - proc->entry = (u32)data; -} +#define PROC_STACK_SIZE 0x4000 int bin_load(const char *path, struct proc *proc) { struct stat s = { 0 }; vfs_stat(path, &s); - char *data = malloc(s.size); - if (!vfs_read(path, data, 0, s.size)) - return 1; strcpy(proc->name, path); - proc_load(proc, data); + struct page_dir *prev; + memory_backup_dir(&prev); + memory_switch_dir(proc->page_dir); + + u32 size = PAGE_ALIGN_UP(s.size); + u32 data = (u32)memory_alloc(proc->page_dir, size, MEMORY_USER | MEMORY_CLEAR); + + if (!vfs_read(proc->name, (void *)data, 0, s.size)) { + memory_switch_dir(prev); + return 1; + } + + u32 stack = (u32)memory_alloc(proc->page_dir, PROC_STACK_SIZE, MEMORY_USER | MEMORY_CLEAR); + proc->regs.ebp = stack; + proc->regs.useresp = stack; + proc->regs.eip = data; + proc->entry = data; + + memory_switch_dir(prev); return 0; } |