git: 9front

Download patch

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;
--