ref: acf3be5128568a2f04f16f7a87728665f4b472c2
parent: 3400b3e6d241ec004695ba308b34d7910d83fa19
author: aiju <devnull@localhost>
date: Wed Jun 14 13:42:25 EDT 2017
vmx: support EFER and PAT access
--- a/sys/src/cmd/vmx/exith.c
+++ b/sys/src/cmd/vmx/exith.c
@@ -240,6 +240,7 @@
case 5: goto zero; /* monitor/mwait */
case 6: goto zero; /* thermal management */
case 7: goto zero; /* more features */
+ case 10: goto zero; /* performance counters */
case 0x80000000: /* highest register */
ax = 0x80000008;
bx = cx = dx = 0;
@@ -290,16 +291,25 @@
cx = rget(RCX);
val = (uvlong)rget(RDX) << 32 | rget(RAX);
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:
- if(rd)
- vmerror("read from unknown MSR %#x ignored", cx);- else
- vmerror("write to unknown MSR %#x ignored (val=%#ullx)", cx, val);+ if(rd){+ vmerror("read from unknown MSR %#ux ignored", cx);+ val = 0;
+ }else
+ vmerror("write to unknown MSR %#ux ignored (val=%#ullx)", cx, val);break;
}
if(rd){- rset(RAX, val);
- rset(RDX, val >> 32);
+ rset(RAX, (u32int)val);
+ rset(RDX, (u32int)(val >> 32));
}
skipinstr(ei);
}
@@ -350,7 +360,6 @@
memset(&ei, 0, sizeof(ei));
ei.raw = msg;
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);
for(i = 2; i < nf; i += 2){if(strcmp(f[i], "pc") == 0)
@@ -383,5 +392,5 @@
vmerror("vmx: unknown notification %s", f[0]+1);return;
}
- sysfatal("vmx: unknown exit: %s", msg);+ sysfatal("unknown exit: %s", msg);}
--
⑨