git: 9front

Download patch

ref: 8842755bdeb7c27747f6852499bf37f3b5481b48
parent: f2af10a4546ac6a621900575f0c742993e6b408e
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Fri May 22 19:58:24 EDT 2020

pc, pc64: do page attribute table (PAT) init early in cpuidentify()

the page attribute table was initialized in mmuinit(), which is
too late for bootscreen(). So now we check for PAT support and
insert the write-combine entry early in cpuidentify().

this might have been the cause of some slow EFI framebuffers on
machines with overlapping or insufficient MTRR entries.

--- a/sys/src/9/pc/devarch.c
+++ b/sys/src/9/pc/devarch.c
@@ -749,7 +749,7 @@
 	X86type *t, *tab;
 	uintptr cr4;
 	ulong regs[4];
-	vlong mca, mct;
+	vlong mca, mct, pat;
 
 	cpuid(Highstdfunc, regs);
 	memmove(m->cpuidid,   &regs[1], BY2WD);	/* bx */
@@ -880,6 +880,13 @@
 
 		if((m->cpuiddx & (Mca|Mce)) == Mce)
 			rdmsr(0x01, &mct);
+	}
+
+	/* IA32_PAT write combining */
+	if((m->cpuiddx & Pat) != 0 && rdmsr(0x277, &pat) != -1){
+		pat &= ~(255LL<<(PATWC*8));
+		pat |= 1LL<<(PATWC*8);	/* WC */
+		wrmsr(0x277, pat);
 	}
 
 	if(m->cpuiddx & Mtrr)
--- a/sys/src/9/pc/mem.h
+++ b/sys/src/9/pc/mem.h
@@ -173,3 +173,5 @@
 
 #define	getpgcolor(a)	0
 
+/* PAT entry used for write combining */
+#define PATWC	7
--- a/sys/src/9/pc/mmu.c
+++ b/sys/src/9/pc/mmu.c
@@ -66,11 +66,6 @@
 #define	VPTX(va)		(((ulong)(va))>>12)
 #define	vpd (vpt+VPTX(VPT))
 
-enum {
-	/* PAT entry used for write combining */
-	PATWC	= 7,
-};
-
 void
 mmuinit(void)
 {
@@ -125,14 +120,6 @@
 
 	taskswitch(PADDR(m->pdb),  (ulong)m + BY2PG);
 	ltr(TSSSEL);
-
-	/* IA32_PAT write combining */
-	if((MACHP(0)->cpuiddx & Pat) != 0
-	&& rdmsr(0x277, &v) != -1){
-		v &= ~(255LL<<(PATWC*8));
-		v |= 1LL<<(PATWC*8);	/* WC */
-		wrmsr(0x277, v);
-	}
 }
 
 /* 
--- a/sys/src/9/pc64/mem.h
+++ b/sys/src/9/pc64/mem.h
@@ -176,5 +176,8 @@
 
 #define	getpgcolor(a)	0
 
+/* PAT entry used for write combining */
+#define PATWC	7
+
 #define RMACH		R15			/* m-> */
 #define RUSER		R14			/* up-> */
--- a/sys/src/9/pc64/mmu.c
+++ b/sys/src/9/pc64/mmu.c
@@ -38,9 +38,6 @@
 	PDE	= 0,
 
 	MAPBITS	= 8*sizeof(m->mmumap[0]),
-
-	/* PAT entry used for write combining */
-	PATWC	= 7,
 };
 
 static void
@@ -133,14 +130,6 @@
 	wrmsr(Star, ((uvlong)UE32SEL << 48) | ((uvlong)KESEL << 32));
 	wrmsr(Lstar, (uvlong)syscallentry);
 	wrmsr(Sfmask, 0x200);
-
-	/* IA32_PAT write combining */
-	if((MACHP(0)->cpuiddx & Pat) != 0
-	&& rdmsr(0x277, &v) != -1){
-		v &= ~(255LL<<(PATWC*8));
-		v |= 1LL<<(PATWC*8);	/* WC */
-		wrmsr(0x277, v);
-	}
 }
 
 /*
--