gorka should get the credit for this. he did this years ago, but it was so ugly i was trying to avoid it. vbox seems not to emulate hardware very well. Reference: /n/atom/patch/applied/vboxmmu Date: Tue Apr 22 15:37:37 CES 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/nix/k10/mmu.c Tue Apr 22 15:37:04 2014 +++ /sys/src/nix/k10/mmu.c Tue Apr 22 15:37:05 2014 @@ -87,7 +87,7 @@ } void -mmuflushtlb(uintmem) +xmmuflushtlb(uintmem) { m->tlbpurge++; @@ -98,6 +98,24 @@ putcr3(m->pml4->pa); } +/* hack for vbox */ +void +mmuflushtlb(uintmem) +{ + int i; + PTE *pte; + + m->tlbpurge++; + if(m->pml4->daddr){ + pte = UINT2PTR(m->pml4->va); + for(i = 0; i < m->pml4->daddr; i++) + if(pte[i] & PteP) + pte[i] = 0; + m->pml4->daddr = 0; + } + putcr3(m->pml4->pa); +} + void mmuflush(void) { @@ -259,6 +277,7 @@ void mmuswitch(Proc* proc) { + int i; PTE *pte; Page *page; Mpl pl; @@ -270,7 +289,12 @@ } if(m->pml4->daddr){ - memset(UINT2PTR(m->pml4->va), 0, m->pml4->daddr*sizeof(PTE)); + /* hack for vbox */ +// memset(UINT2PTR(m->pml4->va), 0, m->pml4->daddr*sizeof(PTE)); + pte = UINT2PTR(m->pml4->va); + for(i = 0; i < m->pml4->daddr; i++) + if(pte[i] & PteP) + pte[i] = 0; m->pml4->daddr = 0; }