mmap: support MAP_FIXED_NOREPLACE

This commit is contained in:
Matheus
2025-02-08 20:25:16 -03:00
parent ec30337ce0
commit ab26020935
2 changed files with 11 additions and 2 deletions
+2
View File
@@ -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
+9 -2
View File
@@ -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;