From ab260209355fc986f5371618f900d3ebb8a79399 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sat, 8 Feb 2025 20:25:16 -0300 Subject: [PATCH] mmap: support MAP_FIXED_NOREPLACE --- kernel-src/include/x86-64/arch/mmu.h | 2 ++ kernel-src/sys/syscalls/mmap.c | 11 +++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/kernel-src/include/x86-64/arch/mmu.h b/kernel-src/include/x86-64/arch/mmu.h index 72599471..ff266a27 100644 --- a/kernel-src/include/x86-64/arch/mmu.h +++ b/kernel-src/include/x86-64/arch/mmu.h @@ -22,6 +22,8 @@ #define ARCH_MMU_FLAGS_WT (1 << 3) #define ARCH_MMU_FLAGS_UC (1 << 4) +#define ARCH_MMU_REQUIRED_FLAGS ARCH_MMU_FLAGS_READ + typedef uint64_t mmuflags_t; typedef uint64_t * pagetableptr_t; // physical address diff --git a/kernel-src/sys/syscalls/mmap.c b/kernel-src/sys/syscalls/mmap.c index 223554eb..7fe1259e 100644 --- a/kernel-src/sys/syscalls/mmap.c +++ b/kernel-src/sys/syscalls/mmap.c @@ -12,11 +12,12 @@ #define MAP_PRIVATE 0x02 #define MAP_FIXED 0x10 #define MAP_ANON 0x20 +#define MAP_FIXED_NOREPLACE 0x100000 #define MAP_ANONYMOUS MAP_ANON #define MAP_NORESERVE 0x4000 #define KNOWN_PROT (PROT_READ | PROT_WRITE | PROT_EXEC) -#define KNOWN_FLAGS (MAP_SHARED | MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS | MAP_NORESERVE) +#define KNOWN_FLAGS (MAP_SHARED | MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS | MAP_NORESERVE | MAP_FIXED_NOREPLACE) syscallret_t syscall_mmap(context_t *context, void *hint, size_t len, int prot, int flags, int fd, off_t offset) { syscallret_t ret = { @@ -24,6 +25,9 @@ syscallret_t syscall_mmap(context_t *context, void *hint, size_t len, int prot, .ret = -1 }; + if ((~KNOWN_FLAGS & flags)) + printf("%x\n", flags); + __assert((~KNOWN_FLAGS & flags) == 0); __assert((~KNOWN_PROT & prot) == 0); __assert(!((flags & MAP_PRIVATE) && (flags & MAP_SHARED))); @@ -34,7 +38,7 @@ syscallret_t syscall_mmap(context_t *context, void *hint, size_t len, int prot, return ret; } - mmuflags_t mmuflags = ARCH_MMU_FLAGS_USER; + mmuflags_t mmuflags = ARCH_MMU_FLAGS_USER | ARCH_MMU_REQUIRED_FLAGS; if (prot & PROT_READ) mmuflags |= ARCH_MMU_FLAGS_READ; if (prot & PROT_WRITE) @@ -48,6 +52,9 @@ syscallret_t syscall_mmap(context_t *context, void *hint, size_t len, int prot, if (flags & MAP_FIXED) vmmflags |= VMM_FLAGS_REPLACE; + if (flags & MAP_FIXED_NOREPLACE) + vmmflags |= VMM_FLAGS_EXACT; + if ((flags & MAP_ANONYMOUS) == 0) vmmflags |= VMM_FLAGS_FILE;