vmx: support EFER and PAT access

This commit is contained in:
aiju 2017-06-14 17:42:25 +00:00
parent 49261dcb40
commit 4dad8ffb6e

View file

@ -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);
} }