diff --git a/kernel-src/include/kernel/vmm.h b/kernel-src/include/kernel/vmm.h index 9a610ae8..451f6284 100644 --- a/kernel-src/include/kernel/vmm.h +++ b/kernel-src/include/kernel/vmm.h @@ -99,6 +99,7 @@ void vmm_unmap(void *addr, size_t size, int flags); bool vmm_pagefault(void *addr, bool user, int actions); vmmcontext_t *vmm_newcontext(); void vmm_switchcontext(vmmcontext_t *ctx); +void *vmm_getphysical(void *addr); void vmm_apinit(); void vmm_init(); diff --git a/kernel-src/mm/vmm.c b/kernel-src/mm/vmm.c index 2e3f9560..d5e6af8b 100644 --- a/kernel-src/mm/vmm.c +++ b/kernel-src/mm/vmm.c @@ -373,6 +373,22 @@ bool vmm_pagefault(void *addr, bool user, int actions) { return status; } +void *vmm_getphysical(void *addr) { + addr = (void *)ROUND_DOWN((uintptr_t)addr, PAGE_SIZE); + + vmmspace_t *space = getspace(addr); + if (space == NULL) + return NULL; + + MUTEX_ACQUIRE(&space->lock, false); + + void *physical = arch_mmu_getphysical(_cpu()->vmmctx->pagetable, addr); + + MUTEX_RELEASE(&space->lock); + return physical; +} + + void *vmm_map(void *addr, volatile size_t size, int flags, mmuflags_t mmuflags, void *private) { if (addr == NULL) addr = KERNELSPACE_START;