mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-02 07:28:21 +00:00
vmm: rename DESTROY_FLAGS_NOSYNC and force hhdm mappings to use VMM_FLAGS_EXACT
This commit is contained in:
@@ -19,6 +19,8 @@
|
|||||||
#define VMM_ACTION_WRITE 2
|
#define VMM_ACTION_WRITE 2
|
||||||
#define VMM_ACTION_EXEC 4
|
#define VMM_ACTION_EXEC 4
|
||||||
|
|
||||||
|
#define VMM_DESTROY_FLAGS_NOSYNC 1
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
vnode_t *node;
|
vnode_t *node;
|
||||||
uintmax_t offset;
|
uintmax_t offset;
|
||||||
@@ -92,6 +94,7 @@ static inline int mmuflagstovnodeflags(mmuflags_t mmuflags) {
|
|||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vmm_destroycontext(vmmcontext_t *context, int destroyrangeflags);
|
||||||
vmmcontext_t *vmm_fork(vmmcontext_t *oldcontext);
|
vmmcontext_t *vmm_fork(vmmcontext_t *oldcontext);
|
||||||
void *vmm_map(void *addr, size_t size, int flags, mmuflags_t mmuflags, void *private);
|
void *vmm_map(void *addr, size_t size, int flags, mmuflags_t mmuflags, void *private);
|
||||||
void vmm_unmap(void *addr, size_t size, int flags);
|
void vmm_unmap(void *addr, size_t size, int flags);
|
||||||
|
|||||||
+7
-8
@@ -195,8 +195,6 @@ static void insertrange(vmmspace_t *space, vmmrange_t *newrange) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DESTROY_FLAGS_NOSYNC 1
|
|
||||||
|
|
||||||
static void destroyrange(vmmcontext_t *context, vmmrange_t *range, uintmax_t _offset, size_t size, int flags) {
|
static void destroyrange(vmmcontext_t *context, vmmrange_t *range, uintmax_t _offset, size_t size, int flags) {
|
||||||
uintmax_t top = _offset + size;
|
uintmax_t top = _offset + size;
|
||||||
__assert(!(range->flags & VMM_FLAGS_COPY)); // TODO unimplemented
|
__assert(!(range->flags & VMM_FLAGS_COPY)); // TODO unimplemented
|
||||||
@@ -207,7 +205,7 @@ static void destroyrange(vmmcontext_t *context, vmmrange_t *range, uintmax_t _of
|
|||||||
if (physical == NULL)
|
if (physical == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ((range->flags & VMM_FLAGS_FILE) && (range->flags & VMM_FLAGS_SHARED) && (flags & DESTROY_FLAGS_NOSYNC) == 0) {
|
if ((range->flags & VMM_FLAGS_FILE) && (range->flags & VMM_FLAGS_SHARED) && (flags & VMM_DESTROY_FLAGS_NOSYNC) == 0) {
|
||||||
VOP_LOCK(range->vnode);
|
VOP_LOCK(range->vnode);
|
||||||
__assert(VOP_MUNMAP(range->vnode, vaddr, range->offset + offset, mmuflagstovnodeflags(range->mmuflags), NULL) == 0); // XXX pass cred struct
|
__assert(VOP_MUNMAP(range->vnode, vaddr, range->offset + offset, mmuflagstovnodeflags(range->mmuflags), NULL) == 0); // XXX pass cred struct
|
||||||
VOP_UNLOCK(range->vnode);
|
VOP_UNLOCK(range->vnode);
|
||||||
@@ -532,7 +530,7 @@ vmmcontext_t *vmm_fork(vmmcontext_t *oldcontext) {
|
|||||||
return newcontext;
|
return newcontext;
|
||||||
error:
|
error:
|
||||||
spinlock_release(&oldcontext->space.lock);
|
spinlock_release(&oldcontext->space.lock);
|
||||||
vmm_destroycontext(newcontext, DESTROY_FLAGS_NOSYNC);
|
vmm_destroycontext(newcontext, VMM_DESTROY_FLAGS_NOSYNC);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -575,12 +573,13 @@ void vmm_init() {
|
|||||||
|
|
||||||
for (uint64_t i = 0; i < pmm_liminemap.response->entry_count; ++i) {
|
for (uint64_t i = 0; i < pmm_liminemap.response->entry_count; ++i) {
|
||||||
struct limine_memmap_entry *e = pmm_liminemap.response->entries[i];
|
struct limine_memmap_entry *e = pmm_liminemap.response->entries[i];
|
||||||
__assert(vmm_map(MAKE_HHDM(e->base), e->length, 0, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC, NULL));
|
mmuflags_t mmuflags = ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC;
|
||||||
|
__assert(vmm_map(MAKE_HHDM(e->base), e->length, VMM_FLAGS_EXACT, mmuflags, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
__assert(vmm_map(&_text_start, (uintptr_t)&_text_end - (uintptr_t)&_text_start, 0, ARCH_MMU_FLAGS_READ, NULL));
|
__assert(vmm_map(&_text_start, (uintptr_t)&_text_end - (uintptr_t)&_text_start, VMM_FLAGS_EXACT, ARCH_MMU_FLAGS_READ, NULL));
|
||||||
__assert(vmm_map(&_rodata_start, (uintptr_t)&_rodata_end - (uintptr_t)&_rodata_start, 0, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_NOEXEC, NULL));
|
__assert(vmm_map(&_rodata_start, (uintptr_t)&_rodata_end - (uintptr_t)&_rodata_start, VMM_FLAGS_EXACT, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_NOEXEC, NULL));
|
||||||
__assert(vmm_map(&_data_start, (uintptr_t)&_data_end - (uintptr_t)&_data_start, 0, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC, NULL));
|
__assert(vmm_map(&_data_start, (uintptr_t)&_data_end - (uintptr_t)&_data_start, VMM_FLAGS_EXACT, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC, NULL));
|
||||||
|
|
||||||
// null page
|
// null page
|
||||||
vmm_map(MAKE_HHDM(NULL), PAGE_SIZE, VMM_FLAGS_EXACT, ARCH_MMU_FLAGS_NOEXEC, NULL);
|
vmm_map(MAKE_HHDM(NULL), PAGE_SIZE, VMM_FLAGS_EXACT, ARCH_MMU_FLAGS_NOEXEC, NULL);
|
||||||
|
|||||||
Reference in New Issue
Block a user