shithub: riscv

Download patch

ref: b1d1fa04b952d19064ecc9c4b0a6c07e39e71c3b
parent: 345e93dd4c5879655686edd282b859cf958360c4
parent: fc0f08c65112e50a75d77042d8249b6bd15a3b76
author: cinap_lenrek <[email protected]>
date: Fri Dec 11 10:24:35 EST 2020

merge

--- a/sys/src/9/pc/memory.c
+++ b/sys/src/9/pc/memory.c
@@ -383,16 +383,8 @@
 		}
 	}
 
-	/*
-	 * Make sure RAM is set to writeback,
-	 * but do a sanity check first checking
-	 * that the kernel text is writeback.
-	 * This is needed as some emulators (bhyve)
-	 * set everything to uncached.
-	 */
-	s = mtrrattr(PADDR(KTZERO), nil);
-	if(s != nil && strcmp(s, "wb") == 0)
-		mtrrexclude(MemRAM, "wb");
+	/* RAM needs to be writeback */
+	mtrrexclude(MemRAM, "wb");
 
 	for(base = memmapnext(-1, MemRAM); base != -1; base = memmapnext(base, MemRAM)){
 		size = memmapsize(base, BY2PG) & ~(BY2PG-1);
--- a/sys/src/9/pc/mtrr.c
+++ b/sys/src/9/pc/mtrr.c
@@ -305,12 +305,14 @@
 	vlong v;
 	int i;
 
-	s->mask = physmask();
+	if(rdmsr(MTRRCap, &s->cap) < 0)
+		return -1;
 
+	if((s->cap & (Capfix|Capvcnt)) == 0)
+		return -1;
+
 	if(rdmsr(MTRRDefaultType, &s->def) < 0)
 		return -1;
-	if(rdmsr(MTRRCap, &s->cap) < 0)
-		return -1;
 
 	if(s->cap & Capfix){
 		for(i = 0; i < nelem(fixreg); i++){
@@ -332,6 +334,8 @@
 			return -1;
 	}
 
+	s->mask = physmask();
+
 	if(strcmp(m->cpuidid, "AuthenticAMD") != 0
 	|| m->cpuidfamily < 15
 	|| rdmsr(AMDK8SysCfg, &v) < 0
@@ -673,6 +677,10 @@
 	new.size = size;
 	if((new.type = str2type(tstr)) < 0)
 		return "bad cache type";
+
+	if(new.type == Writecomb
+	&& (cpu0state.cap & Capwc) == 0)
+		return "write combining not supported";
 
 	qlock(&mtrrlk);
 	newstate = cpu0state;