mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 23:18:21 +00:00
mmap: support MAP_FIXED_NOREPLACE
This commit is contained in:
@@ -22,6 +22,8 @@
|
|||||||
#define ARCH_MMU_FLAGS_WT (1 << 3)
|
#define ARCH_MMU_FLAGS_WT (1 << 3)
|
||||||
#define ARCH_MMU_FLAGS_UC (1 << 4)
|
#define ARCH_MMU_FLAGS_UC (1 << 4)
|
||||||
|
|
||||||
|
#define ARCH_MMU_REQUIRED_FLAGS ARCH_MMU_FLAGS_READ
|
||||||
|
|
||||||
typedef uint64_t mmuflags_t;
|
typedef uint64_t mmuflags_t;
|
||||||
typedef uint64_t * pagetableptr_t; // physical address
|
typedef uint64_t * pagetableptr_t; // physical address
|
||||||
|
|
||||||
|
|||||||
@@ -12,11 +12,12 @@
|
|||||||
#define MAP_PRIVATE 0x02
|
#define MAP_PRIVATE 0x02
|
||||||
#define MAP_FIXED 0x10
|
#define MAP_FIXED 0x10
|
||||||
#define MAP_ANON 0x20
|
#define MAP_ANON 0x20
|
||||||
|
#define MAP_FIXED_NOREPLACE 0x100000
|
||||||
#define MAP_ANONYMOUS MAP_ANON
|
#define MAP_ANONYMOUS MAP_ANON
|
||||||
#define MAP_NORESERVE 0x4000
|
#define MAP_NORESERVE 0x4000
|
||||||
|
|
||||||
#define KNOWN_PROT (PROT_READ | PROT_WRITE | PROT_EXEC)
|
#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 syscall_mmap(context_t *context, void *hint, size_t len, int prot, int flags, int fd, off_t offset) {
|
||||||
syscallret_t ret = {
|
syscallret_t ret = {
|
||||||
@@ -24,6 +25,9 @@ syscallret_t syscall_mmap(context_t *context, void *hint, size_t len, int prot,
|
|||||||
.ret = -1
|
.ret = -1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if ((~KNOWN_FLAGS & flags))
|
||||||
|
printf("%x\n", flags);
|
||||||
|
|
||||||
__assert((~KNOWN_FLAGS & flags) == 0);
|
__assert((~KNOWN_FLAGS & flags) == 0);
|
||||||
__assert((~KNOWN_PROT & prot) == 0);
|
__assert((~KNOWN_PROT & prot) == 0);
|
||||||
__assert(!((flags & MAP_PRIVATE) && (flags & MAP_SHARED)));
|
__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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
mmuflags_t mmuflags = ARCH_MMU_FLAGS_USER;
|
mmuflags_t mmuflags = ARCH_MMU_FLAGS_USER | ARCH_MMU_REQUIRED_FLAGS;
|
||||||
if (prot & PROT_READ)
|
if (prot & PROT_READ)
|
||||||
mmuflags |= ARCH_MMU_FLAGS_READ;
|
mmuflags |= ARCH_MMU_FLAGS_READ;
|
||||||
if (prot & PROT_WRITE)
|
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)
|
if (flags & MAP_FIXED)
|
||||||
vmmflags |= VMM_FLAGS_REPLACE;
|
vmmflags |= VMM_FLAGS_REPLACE;
|
||||||
|
|
||||||
|
if (flags & MAP_FIXED_NOREPLACE)
|
||||||
|
vmmflags |= VMM_FLAGS_EXACT;
|
||||||
|
|
||||||
if ((flags & MAP_ANONYMOUS) == 0)
|
if ((flags & MAP_ANONYMOUS) == 0)
|
||||||
vmmflags |= VMM_FLAGS_FILE;
|
vmmflags |= VMM_FLAGS_FILE;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user