diff --git a/src/arch/x86_64/syscall.asm b/src/arch/x86_64/syscall.asm index 60a59375..3e6ae5f8 100644 --- a/src/arch/x86_64/syscall.asm +++ b/src/arch/x86_64/syscall.asm @@ -27,7 +27,8 @@ extern syscall_chdir extern syscall_fstatat extern syscall_pipe2 extern syscall_mkdir -func_count equ 26 +extern syscall_munmap +func_count equ 27 func_table: @@ -57,6 +58,7 @@ func_table: dq syscall_fstatat dq syscall_pipe2 dq syscall_mkdir + dq syscall_munmap section .text global asm_syscall_entry diff --git a/src/sys/mm/vmm.c b/src/sys/mm/vmm.c index 3eecae0e..26c527e0 100644 --- a/src/sys/mm/vmm.c +++ b/src/sys/mm/vmm.c @@ -513,10 +513,12 @@ bool vmm_unmap(void* addr, size_t pagec){ spinlock_acquire(lock); - unmap(start, addr, pagec); + bool ret = unmap(start, addr, pagec); spinlock_release(lock); + return ret; + } bool vmm_setused(void* addr, size_t pagec, size_t mmuflags){ diff --git a/src/sys/syscalls/munmap.c b/src/sys/syscalls/munmap.c new file mode 100644 index 00000000..ab25ed07 --- /dev/null +++ b/src/sys/syscalls/munmap.c @@ -0,0 +1,32 @@ +#include +#include +#include + +syscallret syscall_munmap(void* addr, size_t length){ + + syscallret retv; + retv.ret = -1; + + if(length == 0 || length % PAGE_SIZE > 0){ + retv.errno = EINVAL; + return retv; + } + + if(addr > USER_SPACE_END){ + retv.errno = EFAULT; + return retv; + } + + bool res = vmm_unmap(addr, length / PAGE_SIZE); + + retv.ret = 0; + retv.errno = 0; + + if(!res){ + retv.errno = ENOMEM; + retv.ret = -1; + } + + return retv; + +}