mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 12:48:22 +00:00
vmm: VMM_FLAGS_REPLACE
This commit is contained in:
+18
-7
@@ -482,10 +482,22 @@ void *vmm_map(void *addr, volatile size_t size, int flags, mmuflags_t mmuflags,
|
||||
if (range == NULL)
|
||||
goto cleanup;
|
||||
|
||||
range->start = start;
|
||||
range->size = size;
|
||||
range->flags = VMM_PERMANENT_FLAGS_MASK & flags;
|
||||
range->mmuflags = mmuflags;
|
||||
if (flags & VMM_FLAGS_REPLACE) {
|
||||
__assert(addr);
|
||||
retaddr = addr;
|
||||
range->start = addr;
|
||||
range->size = size;
|
||||
range->flags = VMM_PERMANENT_FLAGS_MASK & flags;
|
||||
range->mmuflags = mmuflags;
|
||||
__assert((flags & (VMM_FLAGS_ALLOCATE | VMM_FLAGS_PHYSICAL)) == 0);
|
||||
unmap(space, addr, size);
|
||||
} else {
|
||||
retaddr = start;
|
||||
range->start = start;
|
||||
range->size = size;
|
||||
range->flags = VMM_PERMANENT_FLAGS_MASK & flags;
|
||||
range->mmuflags = mmuflags;
|
||||
}
|
||||
|
||||
if (flags & VMM_FLAGS_FILE) {
|
||||
// XXX make sure that writes can't happen to executable memory mapped files and check file permissions
|
||||
@@ -503,6 +515,7 @@ void *vmm_map(void *addr, volatile size_t size, int flags, mmuflags_t mmuflags,
|
||||
for (uintmax_t j = 0; j < size; j += PAGE_SIZE)
|
||||
arch_mmu_unmap(_cpu()->vmmctx->pagetable, (void *)((uintptr_t)start + j));
|
||||
|
||||
retaddr = NULL;
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
@@ -526,6 +539,7 @@ void *vmm_map(void *addr, volatile size_t size, int flags, mmuflags_t mmuflags,
|
||||
}
|
||||
}
|
||||
|
||||
retaddr = NULL;
|
||||
goto cleanup;
|
||||
}
|
||||
memset(MAKE_HHDM(allocated), 0, PAGE_SIZE);
|
||||
@@ -533,9 +547,6 @@ void *vmm_map(void *addr, volatile size_t size, int flags, mmuflags_t mmuflags,
|
||||
}
|
||||
|
||||
insertrange(space, range);
|
||||
|
||||
retaddr = start;
|
||||
|
||||
cleanup:
|
||||
if (start == NULL && range)
|
||||
freerange(range);
|
||||
|
||||
@@ -44,9 +44,8 @@ syscallret_t syscall_mmap(context_t *context, void *hint, size_t len, int prot,
|
||||
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;
|
||||
vmmflags |= VMM_FLAGS_REPLACE;
|
||||
|
||||
if ((flags & MAP_ANONYMOUS) == 0)
|
||||
vmmflags |= VMM_FLAGS_FILE;
|
||||
|
||||
Reference in New Issue
Block a user