pc, pc64: ignore MTRR's when MTRRCap.vcnt and MTRRCap.fix are zero

Bhyve returns 0 in MTRRCap register, so we
can use that instead on relying on cpuid only
to see if MTRR's are supported.

That way we can get rid of the sanity check
in memory.c.
This commit is contained in:
cinap_lenrek 2020-12-11 15:21:44 +01:00
parent f5d1fce9b5
commit 658c994cff
2 changed files with 9 additions and 13 deletions

View file

@ -383,16 +383,8 @@ e820scan(void)
}
}
/*
* 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);

View file

@ -305,12 +305,14 @@ getstate(State *s)
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 @@ getstate(State *s)
return -1;
}
s->mask = physmask();
if(strcmp(m->cpuidid, "AuthenticAMD") != 0
|| m->cpuidfamily < 15
|| rdmsr(AMDK8SysCfg, &v) < 0