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;