mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-02 07:28:21 +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)
|
if (range == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
range->start = start;
|
if (flags & VMM_FLAGS_REPLACE) {
|
||||||
range->size = size;
|
__assert(addr);
|
||||||
range->flags = VMM_PERMANENT_FLAGS_MASK & flags;
|
retaddr = addr;
|
||||||
range->mmuflags = mmuflags;
|
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) {
|
if (flags & VMM_FLAGS_FILE) {
|
||||||
// XXX make sure that writes can't happen to executable memory mapped files and check file permissions
|
// 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)
|
for (uintmax_t j = 0; j < size; j += PAGE_SIZE)
|
||||||
arch_mmu_unmap(_cpu()->vmmctx->pagetable, (void *)((uintptr_t)start + j));
|
arch_mmu_unmap(_cpu()->vmmctx->pagetable, (void *)((uintptr_t)start + j));
|
||||||
|
|
||||||
|
retaddr = NULL;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -526,6 +539,7 @@ void *vmm_map(void *addr, volatile size_t size, int flags, mmuflags_t mmuflags,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
retaddr = NULL;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
memset(MAKE_HHDM(allocated), 0, PAGE_SIZE);
|
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);
|
insertrange(space, range);
|
||||||
|
|
||||||
retaddr = start;
|
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
if (start == NULL && range)
|
if (start == NULL && range)
|
||||||
freerange(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;
|
bool isfile = (flags & MAP_ANONYMOUS) == 0;
|
||||||
int vmmflags = 0;
|
int vmmflags = 0;
|
||||||
|
|
||||||
// XXX this isn't the correct behaviour for MAP_FIXED
|
|
||||||
if (flags & MAP_FIXED)
|
if (flags & MAP_FIXED)
|
||||||
vmmflags |= VMM_FLAGS_EXACT;
|
vmmflags |= VMM_FLAGS_REPLACE;
|
||||||
|
|
||||||
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