ref: e47b16b1ef5822a5a678a56d210f172592936775
parent: 77e9964f83cbf76a7ecb3dbbacce4bd04f8aec45
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Wed Jan 17 14:48:39 EST 2024
pc64: set accessed and dirty bits in PTE to avoid write-back We do not use the accessed and dirty bits in page table entries so we can just always set them. this avoids that the cpu needs to atomically write back to the page table when setting these bits.
--- a/sys/src/9/pc64/l.s
+++ b/sys/src/9/pc64/l.s
@@ -124,7 +124,7 @@
MOVL SI, AX /* PML4 */
MOVL AX, DX
- ADDL $(PTSZ|PTEWRITE|PTEVALID), DX /* PDP at PML4 + PTSZ */
+ ADDL $(PTEACCESSED|PTEDIRTY|PTSZ|PTEWRITE|PTEVALID), DX /* PDP at PML4 + PTSZ */
MOVL DX, PML4O(0)(AX) /* PML4E for double-map */
MOVL DX, PML4O(KZERO)(AX) /* PML4E for KZERO */
--- a/sys/src/9/pc64/mem.h
+++ b/sys/src/9/pc64/mem.h
@@ -156,6 +156,8 @@
#define PTERONLY (0ull<<1)
#define PTEKERNEL (0ull<<2)
#define PTEUSER (1ull<<2)
+#define PTEACCESSED (1ull<<5)
+#define PTEDIRTY (1ull<<6)
#define PTESIZE (1ull<<7)
#define PTEGLOBAL (1ull<<8)
#define PTENOEXEC ((uvlong)m->havenx<<63)
--- a/sys/src/9/pc64/mmu.c
+++ b/sys/src/9/pc64/mmu.c
@@ -341,6 +341,7 @@
flags = pa;
pa = PPN(pa);
flags -= pa;
+ flags |= PTEACCESSED|PTEDIRTY;
if(va >= KZERO)
flags |= PTEGLOBAL;
while(size > 0){
@@ -504,7 +505,7 @@
if(pte == 0)
panic("putmmu: bug: va=%#p pa=%#p", va, pa);
old = *pte;
- *pte = pa | PTEUSER;
+ *pte = pa | PTEACCESSED|PTEDIRTY|PTEUSER;
splx(x);
if(old & PTEVALID)
invlpg(va);
@@ -553,7 +554,7 @@
pte = mmuwalk(m->pml4, va, 0, 1);
if(pte == 0 || (*pte & PTEVALID) != 0)
panic("kmap: pa=%#p va=%#p", pa, va);
- *pte = pa | PTEWRITE|PTENOEXEC|PTEVALID;
+ *pte = pa | PTEACCESSED|PTEDIRTY|PTEWRITE|PTENOEXEC|PTEVALID;
splx(x);
invlpg(va);
return (KMap*)va;
--
⑨