mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-02 07:28:21 +00:00
cpu: change all _cpu()->vmmctx to current_vmm_context
This commit is contained in:
@@ -400,7 +400,6 @@ void pipefs_init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int pipefs_newpipe(vnode_t **nodep) {
|
int pipefs_newpipe(vnode_t **nodep) {
|
||||||
__assert(_cpu()->intstatus);
|
|
||||||
vnode_t *vnode = slab_allocate(nodecache);
|
vnode_t *vnode = slab_allocate(nodecache);
|
||||||
pipenode_t *node = (pipenode_t *)vnode;
|
pipenode_t *node = (pipenode_t *)vnode;
|
||||||
if (node == NULL)
|
if (node == NULL)
|
||||||
|
|||||||
@@ -266,7 +266,6 @@ void sockfs_init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sockfs_newsocket(vnode_t **nodep, socket_t *socket) {
|
int sockfs_newsocket(vnode_t **nodep, socket_t *socket) {
|
||||||
__assert(_cpu()->intstatus);
|
|
||||||
vnode_t *vnode = slab_allocate(nodecache);
|
vnode_t *vnode = slab_allocate(nodecache);
|
||||||
socketnode_t *node = (socketnode_t *)vnode;
|
socketnode_t *node = (socketnode_t *)vnode;
|
||||||
if (node == NULL)
|
if (node == NULL)
|
||||||
|
|||||||
@@ -18,11 +18,11 @@
|
|||||||
typedef struct cpu_t {
|
typedef struct cpu_t {
|
||||||
thread_t *thread;
|
thread_t *thread;
|
||||||
struct cpu_t *self;
|
struct cpu_t *self;
|
||||||
|
vmmcontext_t *vmmctx;
|
||||||
uint64_t gdt[7];
|
uint64_t gdt[7];
|
||||||
ist_t ist;
|
ist_t ist;
|
||||||
long id;
|
long id;
|
||||||
isr_t isr[MAX_ISR_COUNT];
|
isr_t isr[MAX_ISR_COUNT];
|
||||||
vmmcontext_t *vmmctx;
|
|
||||||
int acpiid;
|
int acpiid;
|
||||||
timer_t *timer;
|
timer_t *timer;
|
||||||
bool intstatus;
|
bool intstatus;
|
||||||
@@ -56,16 +56,26 @@ static inline uint16_t be_to_cpu_w(uint16_t w) {
|
|||||||
|
|
||||||
cpu_t *_bsp(void);
|
cpu_t *_bsp(void);
|
||||||
|
|
||||||
|
static inline thread_t *current_thread(void) {
|
||||||
|
thread_t *thread;
|
||||||
|
asm volatile ("mov %%gs:0, %%rax" : "=a"(thread) : : "memory");
|
||||||
|
return thread;
|
||||||
|
}
|
||||||
|
|
||||||
static inline cpu_t *_cpu(void) {
|
static inline cpu_t *_cpu(void) {
|
||||||
cpu_t *cpu;
|
cpu_t *cpu;
|
||||||
asm volatile ("mov %%gs:8, %%rax" : "=a"(cpu) : : "memory");
|
asm volatile ("mov %%gs:8, %%rax" : "=a"(cpu) : : "memory");
|
||||||
return cpu;
|
return cpu;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline thread_t *current_thread(void) {
|
static inline vmmcontext_t *current_vmm_context(void) {
|
||||||
thread_t *thread;
|
vmmcontext_t *context;
|
||||||
asm volatile ("mov %%gs:0, %%rax" : "=a"(thread) : : "memory");
|
asm volatile ("mov %%gs:16, %%rax" : "=a"(context) : : "memory");
|
||||||
return thread;
|
return context;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void set_current_vmm_context(vmmcontext_t *context) {
|
||||||
|
asm volatile ("mov %%rax, %%gs:16" : : "a"(context) : "memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void cpu_set(cpu_t *ptr) {
|
static inline void cpu_set(cpu_t *ptr) {
|
||||||
|
|||||||
+4
-4
@@ -136,7 +136,7 @@ static int mmap(int minor, void *addr, uintmax_t offset, int flags) {
|
|||||||
if (flags & V_FFLAGS_SHARED) {
|
if (flags & V_FFLAGS_SHARED) {
|
||||||
// make sure offset is ALWAYS page aligned when doing a shared mapping
|
// make sure offset is ALWAYS page aligned when doing a shared mapping
|
||||||
__assert((offset % PAGE_SIZE) == 0);
|
__assert((offset % PAGE_SIZE) == 0);
|
||||||
return arch_mmu_map(_cpu()->vmmctx->pagetable, FROM_HHDM((void *)((uintptr_t)fbs[minor]->address + offset)), addr, vnodeflagstommuflags(flags)) ? 0 : ENOMEM;
|
return arch_mmu_map(current_vmm_context()->pagetable, FROM_HHDM((void *)((uintptr_t)fbs[minor]->address + offset)), addr, vnodeflagstommuflags(flags)) ? 0 : ENOMEM;
|
||||||
} else {
|
} else {
|
||||||
size_t size = offset + PAGE_SIZE < end ? PAGE_SIZE : end - offset;
|
size_t size = offset + PAGE_SIZE < end ? PAGE_SIZE : end - offset;
|
||||||
paddr = pmm_allocpage(PMM_SECTION_DEFAULT);
|
paddr = pmm_allocpage(PMM_SECTION_DEFAULT);
|
||||||
@@ -145,7 +145,7 @@ static int mmap(int minor, void *addr, uintmax_t offset, int flags) {
|
|||||||
|
|
||||||
memcpy(MAKE_HHDM(paddr), (void *)((uintptr_t)fbs[minor]->address + offset), size);
|
memcpy(MAKE_HHDM(paddr), (void *)((uintptr_t)fbs[minor]->address + offset), size);
|
||||||
|
|
||||||
if (arch_mmu_map(_cpu()->vmmctx->pagetable, paddr, addr, vnodeflagstommuflags(flags)) == false) {
|
if (arch_mmu_map(current_vmm_context()->pagetable, paddr, addr, vnodeflagstommuflags(flags)) == false) {
|
||||||
pmm_release(paddr);
|
pmm_release(paddr);
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
@@ -155,8 +155,8 @@ static int mmap(int minor, void *addr, uintmax_t offset, int flags) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int munmap(int minor, void *addr, uintmax_t offset, int flags) {
|
static int munmap(int minor, void *addr, uintmax_t offset, int flags) {
|
||||||
void *phys = arch_mmu_getphysical(_cpu()->vmmctx->pagetable, addr);
|
void *phys = arch_mmu_getphysical(current_vmm_context()->pagetable, addr);
|
||||||
arch_mmu_unmap(_cpu()->vmmctx->pagetable, addr);
|
arch_mmu_unmap(current_vmm_context()->pagetable, addr);
|
||||||
if ((flags & V_FFLAGS_SHARED) == 0) {
|
if ((flags & V_FFLAGS_SHARED) == 0) {
|
||||||
pmm_release(phys);
|
pmm_release(phys);
|
||||||
}
|
}
|
||||||
|
|||||||
+23
-23
@@ -87,7 +87,7 @@ static vmmspace_t kernelspace = {
|
|||||||
// returns a pointer to the space of vaddr
|
// returns a pointer to the space of vaddr
|
||||||
static vmmspace_t *getspace(void *vaddr) {
|
static vmmspace_t *getspace(void *vaddr) {
|
||||||
if (USERSPACE_START <= vaddr && vaddr < USERSPACE_END)
|
if (USERSPACE_START <= vaddr && vaddr < USERSPACE_END)
|
||||||
return &_cpu()->vmmctx->space;
|
return ¤t_vmm_context()->space;
|
||||||
else if (KERNELSPACE_START <= vaddr && vaddr < KERNELSPACE_END)
|
else if (KERNELSPACE_START <= vaddr && vaddr < KERNELSPACE_END)
|
||||||
return &kernelspace;
|
return &kernelspace;
|
||||||
else
|
else
|
||||||
@@ -219,7 +219,7 @@ static void destroyrange(vmmrange_t *range, uintmax_t _offset, size_t size, int
|
|||||||
|
|
||||||
for (uintmax_t offset = _offset; offset < top; offset += PAGE_SIZE) {
|
for (uintmax_t offset = _offset; offset < top; offset += PAGE_SIZE) {
|
||||||
void *vaddr = (void *)((uintptr_t)range->start + offset);
|
void *vaddr = (void *)((uintptr_t)range->start + offset);
|
||||||
void *physical = arch_mmu_getphysical(_cpu()->vmmctx->pagetable, vaddr);
|
void *physical = arch_mmu_getphysical(current_vmm_context()->pagetable, vaddr);
|
||||||
if (physical == NULL)
|
if (physical == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -234,21 +234,21 @@ static void destroyrange(vmmrange_t *range, uintmax_t _offset, size_t size, int
|
|||||||
VOP_LOCK(range->vnode);
|
VOP_LOCK(range->vnode);
|
||||||
__assert(VOP_MUNMAP(range->vnode, vaddr, range->offset + offset, mmuflagstovnodeflags(range->mmuflags) | (range->flags & VMM_FLAGS_SHARED ? V_FFLAGS_SHARED : 0), cred) == 0);
|
__assert(VOP_MUNMAP(range->vnode, vaddr, range->offset + offset, mmuflagstovnodeflags(range->mmuflags) | (range->flags & VMM_FLAGS_SHARED ? V_FFLAGS_SHARED : 0), cred) == 0);
|
||||||
VOP_UNLOCK(range->vnode);
|
VOP_UNLOCK(range->vnode);
|
||||||
} else if (arch_mmu_iswritable(_cpu()->vmmctx->pagetable, vaddr)) {
|
} else if (arch_mmu_iswritable(current_vmm_context()->pagetable, vaddr)) {
|
||||||
// dirty page cache mapping
|
// dirty page cache mapping
|
||||||
arch_mmu_unmap(_cpu()->vmmctx->pagetable, vaddr);
|
arch_mmu_unmap(current_vmm_context()->pagetable, vaddr);
|
||||||
VOP_LOCK(range->vnode);
|
VOP_LOCK(range->vnode);
|
||||||
vmmcache_makedirty(pmm_getpage(physical));
|
vmmcache_makedirty(pmm_getpage(physical));
|
||||||
VOP_UNLOCK(range->vnode);
|
VOP_UNLOCK(range->vnode);
|
||||||
pmm_release(physical);
|
pmm_release(physical);
|
||||||
} else {
|
} else {
|
||||||
// non dirty page mapping
|
// non dirty page mapping
|
||||||
arch_mmu_unmap(_cpu()->vmmctx->pagetable, vaddr);
|
arch_mmu_unmap(current_vmm_context()->pagetable, vaddr);
|
||||||
pmm_release(physical);
|
pmm_release(physical);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// anonymous, physical or private non character device mapping
|
// anonymous, physical or private non character device mapping
|
||||||
arch_mmu_unmap(_cpu()->vmmctx->pagetable, vaddr);
|
arch_mmu_unmap(current_vmm_context()->pagetable, vaddr);
|
||||||
if ((range->flags & VMM_FLAGS_PHYSICAL) == 0)
|
if ((range->flags & VMM_FLAGS_PHYSICAL) == 0)
|
||||||
pmm_release(physical);
|
pmm_release(physical);
|
||||||
}
|
}
|
||||||
@@ -268,10 +268,10 @@ static void changemmurange(vmmrange_t *range, void *base, size_t size, mmuflags_
|
|||||||
|
|
||||||
mmuflags_t currentflags;
|
mmuflags_t currentflags;
|
||||||
// if page is not mapped, do nothing
|
// if page is not mapped, do nothing
|
||||||
if (arch_mmu_getflags(_cpu()->vmmctx->pagetable, address, ¤tflags) == false)
|
if (arch_mmu_getflags(current_vmm_context()->pagetable, address, ¤tflags) == false)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
void *physical = arch_mmu_getphysical(_cpu()->vmmctx->pagetable, address);
|
void *physical = arch_mmu_getphysical(current_vmm_context()->pagetable, address);
|
||||||
|
|
||||||
uintmax_t mask = 0;
|
uintmax_t mask = 0;
|
||||||
// check which flags are currently set and will be unset
|
// check which flags are currently set and will be unset
|
||||||
@@ -291,7 +291,7 @@ static void changemmurange(vmmrange_t *range, void *base, size_t size, mmuflags_
|
|||||||
|
|
||||||
// we will only change the mapping if the permissions decreased
|
// we will only change the mapping if the permissions decreased
|
||||||
if (mask) {
|
if (mask) {
|
||||||
arch_mmu_remap(_cpu()->vmmctx->pagetable, physical, address, currentflags & ~mask);
|
arch_mmu_remap(current_vmm_context()->pagetable, physical, address, currentflags & ~mask);
|
||||||
arch_mmu_invalidate(address);
|
arch_mmu_invalidate(address);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -564,7 +564,7 @@ bool vmm_pagefault(void *addr, bool user, int actions) {
|
|||||||
proc_t *proc = thread ? thread->proc : NULL;
|
proc_t *proc = thread ? thread->proc : NULL;
|
||||||
cred_t *cred = proc ? &proc->cred : NULL;
|
cred_t *cred = proc ? &proc->cred : NULL;
|
||||||
|
|
||||||
if (arch_mmu_ispresent(_cpu()->vmmctx->pagetable, addr) == false) {
|
if (arch_mmu_ispresent(current_vmm_context()->pagetable, addr) == false) {
|
||||||
// page not present in the page tables
|
// page not present in the page tables
|
||||||
if (range->flags & VMM_FLAGS_FILE) {
|
if (range->flags & VMM_FLAGS_FILE) {
|
||||||
uintmax_t mapoffset = (uintptr_t)addr - (uintptr_t)range->start;
|
uintmax_t mapoffset = (uintptr_t)addr - (uintptr_t)range->start;
|
||||||
@@ -590,7 +590,7 @@ bool vmm_pagefault(void *addr, bool user, int actions) {
|
|||||||
printf("vmm: error on vmmcache_getpage(): %d\n", error);
|
printf("vmm: error on vmmcache_getpage(): %d\n", error);
|
||||||
status = false;
|
status = false;
|
||||||
} else {
|
} else {
|
||||||
status = arch_mmu_map(_cpu()->vmmctx->pagetable, pmm_getpageaddress(res), addr, range->mmuflags & ~ARCH_MMU_FLAGS_WRITE);
|
status = arch_mmu_map(current_vmm_context()->pagetable, pmm_getpageaddress(res), addr, range->mmuflags & ~ARCH_MMU_FLAGS_WRITE);
|
||||||
if (!status) {
|
if (!status) {
|
||||||
printf("vmm: out of memory to map file into address space (sending SIGBUS)\n");
|
printf("vmm: out of memory to map file into address space (sending SIGBUS)\n");
|
||||||
pmm_release(pmm_getpageaddress(res));
|
pmm_release(pmm_getpageaddress(res));
|
||||||
@@ -601,7 +601,7 @@ bool vmm_pagefault(void *addr, bool user, int actions) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// anonymous memory. map the zero'd page
|
// anonymous memory. map the zero'd page
|
||||||
status = arch_mmu_map(_cpu()->vmmctx->pagetable, zeropage, addr, range->mmuflags & ~ARCH_MMU_FLAGS_WRITE);
|
status = arch_mmu_map(current_vmm_context()->pagetable, zeropage, addr, range->mmuflags & ~ARCH_MMU_FLAGS_WRITE);
|
||||||
if (!status) {
|
if (!status) {
|
||||||
printf("vmm: out of memory to map zero page into address space (sending SIGBUS)\n");
|
printf("vmm: out of memory to map zero page into address space (sending SIGBUS)\n");
|
||||||
signal_signalthread(current_thread(), SIGBUS, true);
|
signal_signalthread(current_thread(), SIGBUS, true);
|
||||||
@@ -610,13 +610,13 @@ bool vmm_pagefault(void *addr, bool user, int actions) {
|
|||||||
pmm_hold(zeropage);
|
pmm_hold(zeropage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (arch_mmu_iswritable(_cpu()->vmmctx->pagetable, addr) == false) {
|
} else if (arch_mmu_iswritable(current_vmm_context()->pagetable, addr) == false) {
|
||||||
// page present but not writeable in the page tables
|
// page present but not writeable in the page tables
|
||||||
|
|
||||||
void *oldphys = arch_mmu_getphysical(_cpu()->vmmctx->pagetable, addr);
|
void *oldphys = arch_mmu_getphysical(current_vmm_context()->pagetable, addr);
|
||||||
if ((range->flags & VMM_FLAGS_FILE) && (range->flags & VMM_FLAGS_SHARED)) {
|
if ((range->flags & VMM_FLAGS_FILE) && (range->flags & VMM_FLAGS_SHARED)) {
|
||||||
// shared file, remap it as writable
|
// shared file, remap it as writable
|
||||||
arch_mmu_remap(_cpu()->vmmctx->pagetable, oldphys, addr, range->mmuflags);
|
arch_mmu_remap(current_vmm_context()->pagetable, oldphys, addr, range->mmuflags);
|
||||||
if (vfs_iscacheable(range->vnode)) {
|
if (vfs_iscacheable(range->vnode)) {
|
||||||
// and if its a cache page, mark it as dirty
|
// and if its a cache page, mark it as dirty
|
||||||
VOP_LOCK(range->vnode);
|
VOP_LOCK(range->vnode);
|
||||||
@@ -634,7 +634,7 @@ bool vmm_pagefault(void *addr, bool user, int actions) {
|
|||||||
status = true;
|
status = true;
|
||||||
} else {
|
} else {
|
||||||
memcpy(MAKE_HHDM(newphys), MAKE_HHDM(oldphys), PAGE_SIZE);
|
memcpy(MAKE_HHDM(newphys), MAKE_HHDM(oldphys), PAGE_SIZE);
|
||||||
arch_mmu_remap(_cpu()->vmmctx->pagetable, newphys, addr, range->mmuflags);
|
arch_mmu_remap(current_vmm_context()->pagetable, newphys, addr, range->mmuflags);
|
||||||
if ((range->flags & VMM_FLAGS_FILE) == 0 || vfs_iscacheable(range->vnode))
|
if ((range->flags & VMM_FLAGS_FILE) == 0 || vfs_iscacheable(range->vnode))
|
||||||
pmm_release(oldphys);
|
pmm_release(oldphys);
|
||||||
|
|
||||||
@@ -660,7 +660,7 @@ void *vmm_getphysical(void *addr) {
|
|||||||
|
|
||||||
MUTEX_ACQUIRE(&space->lock, false);
|
MUTEX_ACQUIRE(&space->lock, false);
|
||||||
|
|
||||||
void *physical = arch_mmu_getphysical(_cpu()->vmmctx->pagetable, addr);
|
void *physical = arch_mmu_getphysical(current_vmm_context()->pagetable, addr);
|
||||||
|
|
||||||
MUTEX_RELEASE(&space->lock);
|
MUTEX_RELEASE(&space->lock);
|
||||||
return physical + ((uintptr_t)addr - ROUND_DOWN((uintptr_t)addr, PAGE_SIZE));
|
return physical + ((uintptr_t)addr - ROUND_DOWN((uintptr_t)addr, PAGE_SIZE));
|
||||||
@@ -726,9 +726,9 @@ void *vmm_map(void *addr, volatile size_t size, int flags, mmuflags_t mmuflags,
|
|||||||
if (flags & VMM_FLAGS_PHYSICAL) {
|
if (flags & VMM_FLAGS_PHYSICAL) {
|
||||||
// map to allocated virtual memory
|
// map to allocated virtual memory
|
||||||
for (uintmax_t i = 0; i < size; i += PAGE_SIZE) {
|
for (uintmax_t i = 0; i < size; i += PAGE_SIZE) {
|
||||||
if (arch_mmu_map(_cpu()->vmmctx->pagetable, (void *)((uintptr_t)private + i), (void *)((uintptr_t)start + i), mmuflags) == false) {
|
if (arch_mmu_map(current_vmm_context()->pagetable, (void *)((uintptr_t)private + i), (void *)((uintptr_t)start + i), mmuflags) == false) {
|
||||||
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(current_vmm_context()->pagetable, (void *)((uintptr_t)start + j));
|
||||||
|
|
||||||
retaddr = NULL;
|
retaddr = NULL;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@@ -743,14 +743,14 @@ void *vmm_map(void *addr, volatile size_t size, int flags, mmuflags_t mmuflags,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arch_mmu_map(_cpu()->vmmctx->pagetable, allocated, (void *)((uintptr_t)start + i), mmuflags) == false) {
|
if (arch_mmu_map(current_vmm_context()->pagetable, allocated, (void *)((uintptr_t)start + i), mmuflags) == false) {
|
||||||
for (uintmax_t j = 0; j < size; j += PAGE_SIZE) {
|
for (uintmax_t j = 0; j < size; j += PAGE_SIZE) {
|
||||||
void *virt = (void *)((uintptr_t)start + i);
|
void *virt = (void *)((uintptr_t)start + i);
|
||||||
void *physical = arch_mmu_getphysical(_cpu()->vmmctx->pagetable, virt);
|
void *physical = arch_mmu_getphysical(current_vmm_context()->pagetable, virt);
|
||||||
|
|
||||||
if (physical) {
|
if (physical) {
|
||||||
pmm_release(physical);
|
pmm_release(physical);
|
||||||
arch_mmu_unmap(_cpu()->vmmctx->pagetable, virt);
|
arch_mmu_unmap(current_vmm_context()->pagetable, virt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -877,7 +877,7 @@ vmmcontext_t *vmm_fork(vmmcontext_t *oldcontext) {
|
|||||||
void vmm_switchcontext(vmmcontext_t *ctx) {
|
void vmm_switchcontext(vmmcontext_t *ctx) {
|
||||||
if (current_thread())
|
if (current_thread())
|
||||||
current_thread()->vmmctx = ctx;
|
current_thread()->vmmctx = ctx;
|
||||||
_cpu()->vmmctx = ctx;
|
set_current_vmm_context(ctx);
|
||||||
arch_mmu_switch(ctx->pagetable);
|
arch_mmu_switch(ctx->pagetable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ static syscallret_t execve(context_t *context, char *upath, char *uargv[], char
|
|||||||
char **argv = NULL;
|
char **argv = NULL;
|
||||||
char **envp = NULL;
|
char **envp = NULL;
|
||||||
vmmcontext_t *vmmctx = NULL;
|
vmmcontext_t *vmmctx = NULL;
|
||||||
vmmcontext_t *oldctx = _cpu()->vmmctx;
|
vmmcontext_t *oldctx = current_vmm_context();
|
||||||
vnode_t *node = NULL;
|
vnode_t *node = NULL;
|
||||||
vnode_t *refnode = NULL;
|
vnode_t *refnode = NULL;
|
||||||
char *interp = NULL;
|
char *interp = NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user