vmx: support EFER and PAT access
This commit is contained in:
parent
49261dcb40
commit
4dad8ffb6e
1 changed files with 17 additions and 8 deletions
|
@ -240,6 +240,7 @@ cpuid(ExitInfo *ei)
|
||||||
case 5: goto zero; /* monitor/mwait */
|
case 5: goto zero; /* monitor/mwait */
|
||||||
case 6: goto zero; /* thermal management */
|
case 6: goto zero; /* thermal management */
|
||||||
case 7: goto zero; /* more features */
|
case 7: goto zero; /* more features */
|
||||||
|
case 10: goto zero; /* performance counters */
|
||||||
case 0x80000000: /* highest register */
|
case 0x80000000: /* highest register */
|
||||||
ax = 0x80000008;
|
ax = 0x80000008;
|
||||||
bx = cx = dx = 0;
|
bx = cx = dx = 0;
|
||||||
|
@ -290,16 +291,25 @@ rdwrmsr(ExitInfo *ei)
|
||||||
cx = rget(RCX);
|
cx = rget(RCX);
|
||||||
val = (uvlong)rget(RDX) << 32 | rget(RAX);
|
val = (uvlong)rget(RDX) << 32 | rget(RAX);
|
||||||
switch(cx){
|
switch(cx){
|
||||||
|
case 0x277:
|
||||||
|
if(rd) val = rget("pat");
|
||||||
|
else rset("pat", val);
|
||||||
|
break;
|
||||||
|
case 0xC0000080:
|
||||||
|
if(rd) val = rget("efer");
|
||||||
|
else rset("efer", val);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if(rd)
|
if(rd){
|
||||||
vmerror("read from unknown MSR %#x ignored", cx);
|
vmerror("read from unknown MSR %#ux ignored", cx);
|
||||||
else
|
val = 0;
|
||||||
vmerror("write to unknown MSR %#x ignored (val=%#ullx)", cx, val);
|
}else
|
||||||
|
vmerror("write to unknown MSR %#ux ignored (val=%#ullx)", cx, val);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(rd){
|
if(rd){
|
||||||
rset(RAX, val);
|
rset(RAX, (u32int)val);
|
||||||
rset(RDX, val >> 32);
|
rset(RDX, (u32int)(val >> 32));
|
||||||
}
|
}
|
||||||
skipinstr(ei);
|
skipinstr(ei);
|
||||||
}
|
}
|
||||||
|
@ -350,7 +360,6 @@ processexit(char *msg)
|
||||||
memset(&ei, 0, sizeof(ei));
|
memset(&ei, 0, sizeof(ei));
|
||||||
ei.raw = msg;
|
ei.raw = msg;
|
||||||
ei.name = f[0];
|
ei.name = f[0];
|
||||||
if(strcmp(ei.name, "io") != 0 && strcmp(ei.name, "eptfault") != 0 && strcmp(ei.name, "*ack") != 0 && strcmp(ei.name, ".hlt") != 0) vmdebug("exit: %s", msg);
|
|
||||||
ei.qual = strtoull(f[1], nil, 0);
|
ei.qual = strtoull(f[1], nil, 0);
|
||||||
for(i = 2; i < nf; i += 2){
|
for(i = 2; i < nf; i += 2){
|
||||||
if(strcmp(f[i], "pc") == 0)
|
if(strcmp(f[i], "pc") == 0)
|
||||||
|
@ -383,5 +392,5 @@ processexit(char *msg)
|
||||||
vmerror("vmx: unknown notification %s", f[0]+1);
|
vmerror("vmx: unknown notification %s", f[0]+1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sysfatal("vmx: unknown exit: %s", msg);
|
sysfatal("unknown exit: %s", msg);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue