From 2c62b1a7d85cf94e797bdfc81f0a10e5824ed8f0 Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 10 Jul 2023 21:16:40 -0300 Subject: [PATCH] mmap: properly support files --- kernel-src/sys/syscalls/mmap.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/kernel-src/sys/syscalls/mmap.c b/kernel-src/sys/syscalls/mmap.c index 5ac10da8..3ccf3a44 100644 --- a/kernel-src/sys/syscalls/mmap.c +++ b/kernel-src/sys/syscalls/mmap.c @@ -40,16 +40,30 @@ syscallret_t syscall_mmap(context_t *context, void *hint, size_t len, int prot, if ((prot & PROT_EXEC) == 0) mmuflags |= ARCH_MMU_FLAGS_NOEXEC; - bool file = (flags & MAP_ANONYMOUS) == 0; + bool isfile = (flags & MAP_ANONYMOUS) == 0; int vmmflags = 0; // XXX this isn't the correct behaviour for MAP_FIXED if (flags & MAP_FIXED) vmmflags |= VMM_FLAGS_EXACT; + if ((flags & MAP_PRIVATE) == 0) + vmmflags |= VMM_FLAGS_FILE; + + if (flags & MAP_SHARED) + vmmflags |= VMM_FLAGS_SHARED; + vmmfiledesc_t vfd; - // TODO file mappings - __assert(file == false); + file_t *file = NULL; + if (isfile) { + file = fd_get(fd); + if (file == NULL) { + ret.errno = EBADF; + return ret; + } + vfd.node = file->vnode; + vfd.offset = offset; + } if (hint < USERSPACE_START) hint = USERSPACE_START; @@ -57,5 +71,9 @@ syscallret_t syscall_mmap(context_t *context, void *hint, size_t len, int prot, ret.ret = (uint64_t)vmm_map(hint, len, vmmflags, mmuflags, &vfd); if (ret.ret == 0) ret.errno = ENOMEM; + + if (isfile) + fd_release(file); + return ret; }