diff --git a/kernel-src/arch/x86-64/syscalllog.c b/kernel-src/arch/x86-64/syscalllog.c index 4573aa2c..54c90d66 100644 --- a/kernel-src/arch/x86-64/syscalllog.c +++ b/kernel-src/arch/x86-64/syscalllog.c @@ -200,7 +200,9 @@ static char *args[] = { #endif +#ifdef SYSCALL_LOGGING static spinlock_t lock; +#endif extern size_t freepagecount; __attribute__((no_caller_saved_registers)) void arch_syscall_log(int syscall, uint64_t a1, uint64_t a2, uint64_t a3, uint64_t a4, uint64_t a5, uint64_t a6) { #ifdef SYSCALL_LOGGING diff --git a/kernel-src/include/kernel/vmm.h b/kernel-src/include/kernel/vmm.h index 5c8a2182..f1b39bf3 100644 --- a/kernel-src/include/kernel/vmm.h +++ b/kernel-src/include/kernel/vmm.h @@ -101,7 +101,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_getphysical(void *addr, bool hold); void vmm_apinit(); void vmm_init(); diff --git a/kernel-src/io/block/nvme.c b/kernel-src/io/block/nvme.c index 63ea5947..704e0348 100644 --- a/kernel-src/io/block/nvme.c +++ b/kernel-src/io/block/nvme.c @@ -517,11 +517,13 @@ static int rwblocks(nvmenamespace_t *namespace, void *buffer, uintmax_t lba, siz size_t docount = (done == 0) ? (PAGE_SIZE - pageoffset) / namespace->blocksize : PAGE_SIZE / namespace->blocksize; docount = min(docount, count - done); - prp[0] = (uint64_t)vmm_getphysical((void *)((uintptr_t)buffer + done * namespace->blocksize)); + prp[0] = (uint64_t)vmm_getphysical((void *)((uintptr_t)buffer + done * namespace->blocksize), true); __assert(prp[0]); err = write ? iowrite(namespace, prp, lba + done, docount) : ioread(namespace, prp, lba + done, docount); + pmm_release((void *)prp[0]); + if (err) break; diff --git a/kernel-src/io/block/vioblk.c b/kernel-src/io/block/vioblk.c index f7398008..ba8dbf84 100644 --- a/kernel-src/io/block/vioblk.c +++ b/kernel-src/io/block/vioblk.c @@ -121,11 +121,13 @@ static int vioblk_rw(vioblkdev_t *blkdev, void *buffer, uintmax_t lba, size_t co size_t docount = (done == 0) ? (PAGE_SIZE - pageoffset) / 512 : PAGE_SIZE / 512; docount = min(docount, count - done); - void *bufferphys = vmm_getphysical((void *)((uintptr_t)buffer + done * 512)); + void *bufferphys = vmm_getphysical((void *)((uintptr_t)buffer + done * 512), true); __assert(bufferphys); vioblk_enqueue(blkdev, header, bufferphys, docount * 512, status, write); + pmm_release(bufferphys); + if (*statushhdm) { err = EIO; break; diff --git a/kernel-src/mm/vmm.c b/kernel-src/mm/vmm.c index 0d92ceb6..92d95cd5 100644 --- a/kernel-src/mm/vmm.c +++ b/kernel-src/mm/vmm.c @@ -655,7 +655,7 @@ bool vmm_pagefault(void *addr, bool user, int actions) { return status; } -void *vmm_getphysical(void *addr) { +void *vmm_getphysical(void *addr, bool hold) { addr = (void *)ROUND_DOWN((uintptr_t)addr, PAGE_SIZE); vmmspace_t *space = getspace(addr); @@ -666,6 +666,9 @@ void *vmm_getphysical(void *addr) { void *physical = arch_mmu_getphysical(current_vmm_context()->pagetable, addr); + if (hold) + pmm_hold(physical); + MUTEX_RELEASE(&space->lock); return physical + ((uintptr_t)addr - ROUND_DOWN((uintptr_t)addr, PAGE_SIZE)); } diff --git a/kernel-src/sys/syscalls/futex.c b/kernel-src/sys/syscalls/futex.c index dafe5865..f898a533 100644 --- a/kernel-src/sys/syscalls/futex.c +++ b/kernel-src/sys/syscalls/futex.c @@ -80,7 +80,7 @@ syscallret_t syscall_futex(context_t *, uint32_t *futexp, int op, uint32_t value if (ret.errno) goto cleanup; - uint32_t *physical = vmm_getphysical(futexp); + uint32_t *physical = vmm_getphysical(futexp, false); futex_t *futex = getfutex(physical); switch (op) {