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:
parent
f5d1fce9b5
commit
658c994cff
2 changed files with 9 additions and 13 deletions
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue