From e7e6f4fc9061190720b7a67adfff49f2546843aa Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Thu, 16 Jul 2020 03:11:27 +0200 Subject: pc64: disable interrupts in mmuwalk() for checkmmu() we have to disable interrupts during mmuwalk() of user pages as we can get preempted during mmu walk and the original m->pml4 might become one of a different process. --- sys/src/9/pc64/mmu.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/sys/src/9/pc64/mmu.c b/sys/src/9/pc64/mmu.c index 58663a9f1..936955d4b 100644 --- a/sys/src/9/pc64/mmu.c +++ b/sys/src/9/pc64/mmu.c @@ -517,12 +517,17 @@ putmmu(uintptr va, uintptr pa, Page *) void checkmmu(uintptr va, uintptr pa) { - uintptr *pte; + uintptr *pte, old; + int x; + x = splhi(); pte = mmuwalk(m->pml4, va, 0, 0); - if(pte != 0 && (*pte & PTEVALID) != 0 && PPN(*pte) != pa) - print("%ld %s: va=%#p pa=%#p pte=%#p\n", - up->pid, up->text, va, pa, *pte); + if(pte == 0 || ((old = *pte) & PTEVALID) == 0 || PPN(old) == pa){ + splx(x); + return; + } + splx(x); + print("%ld %s: va=%#p pa=%#p pte=%#p\n", up->pid, up->text, va, pa, old); } uintptr -- cgit v1.2.3