diff options
author | dzwdz | 2022-05-21 18:26:54 +0200 |
---|---|---|
committer | dzwdz | 2022-05-21 18:26:54 +0200 |
commit | 0fd9c19c5d66a380ad4b2b881881ce7fba9a6d27 (patch) | |
tree | 369757199f469b390f89d20abd293d6a96fd8719 /src/kernel/syscalls.c | |
parent | 6ed683618151359159e10dff872eee50005eb015 (diff) |
syscall/memflag: implement freeing memory
Diffstat (limited to 'src/kernel/syscalls.c')
-rw-r--r-- | src/kernel/syscalls.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/src/kernel/syscalls.c b/src/kernel/syscalls.c index 35b243f..560cd37 100644 --- a/src/kernel/syscalls.c +++ b/src/kernel/syscalls.c @@ -253,17 +253,21 @@ int _syscall_fs_respond(char __user *buf, int ret) { int _syscall_memflag(void __user *addr, size_t len, int flags) { userptr_t goal = addr + len; struct pagedir *pages = process_current->pages; - if (flags != MEMFLAG_PRESENT) panic_unimplemented(); // TODO addr = (userptr_t)((int __force)addr & ~PAGE_MASK); // align to page boundary for (; addr < goal; addr += PAGE_SIZE) { - if (pagedir_virt2phys(pages, addr, false, false)) { - // allocated page, currently a no-op - // if you'll be changing this - remember to check if the pages are owned by the kernel! - } else { - // allocate the new pages - pagedir_map(pages, addr, page_alloc(1), true, true); + if (pagedir_iskern(pages, addr)) { + // TODO reflect failure in return value + continue; + } + + if (!(flags & MEMFLAG_PRESENT)) { + page_free(pagedir_unmap(pages, addr), 1); + continue; } + + if (!pagedir_virt2phys(pages, addr, false, false)) + pagedir_map(pages, addr, page_alloc(1), true, true); } SYSCALL_RETURN(-1); |