shithub: riscv

Download patch

ref: b86bb35c7d82f097e6572d400527046245b877fd
parent: 0002fd0cf786d16c9b3e1ab62f0cb92b2461f185
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);
-	}
 }
 
 /*