summaryrefslogtreecommitdiff
path: root/sys/src/9/pc/devvmx.c
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2017-06-18 22:13:20 +0000
committeraiju <devnull@localhost>2017-06-18 22:13:20 +0000
commited040d676ad95858211ec8b5f43e8713692fdeb2 (patch)
treef18ae4f10a6dd9aa219f02eb7c8e14e3b3445320 /sys/src/9/pc/devvmx.c
parenteaffaab79030463fff1587ea595ea104204737ed (diff)
devvmx: fix CR0/CR4 readout; also don't exit on PAUSE instruction
Diffstat (limited to 'sys/src/9/pc/devvmx.c')
-rw-r--r--sys/src/9/pc/devvmx.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/sys/src/9/pc/devvmx.c b/sys/src/9/pc/devvmx.c
index 91c92e0ff..77074a5a8 100644
--- a/sys/src/9/pc/devvmx.c
+++ b/sys/src/9/pc/devvmx.c
@@ -349,7 +349,7 @@ cr0fakeread(char *p, char *e)
guest = vmcsread(GUEST_CR0);
mask = vmcsread(GUEST_CR0MASK);
shadow = vmcsread(GUEST_CR0SHADOW);
- return seprint(p, e, "%#.*ullx", sizeof(uintptr) * 2, guest & mask | shadow & ~mask);
+ return seprint(p, e, "%#.*ullx", sizeof(uintptr) * 2, guest & ~mask | shadow & mask);
}
static char *
@@ -360,7 +360,7 @@ cr4fakeread(char *p, char *e)
guest = vmcsread(GUEST_CR4);
mask = vmcsread(GUEST_CR4MASK);
shadow = vmcsread(GUEST_CR4SHADOW);
- return seprint(p, e, "%#.*ullx", sizeof(uintptr) * 2, guest & mask | shadow & ~mask);
+ return seprint(p, e, "%#.*ullx", sizeof(uintptr) * 2, guest & ~mask | shadow & mask);
}
static int
@@ -757,7 +757,7 @@ vmcsinit(void)
if(rdmsr(VMX_PROCB_CTLS_MSR, &msr) < 0) error("rdmsr(VMX_PROCB_CTLS_MSR failed");
x = (u32int)procb_ctls | 1<<1 | 7<<4 | 1<<8 | 1<<13 | 1<<14 | 1<<26; /* currently reserved default1 bits */
x |= PROCB_EXITHLT | PROCB_EXITMWAIT;
- x |= PROCB_EXITMOVDR | PROCB_EXITIO | PROCB_EXITMONITOR | PROCB_EXITPAUSE;
+ x |= PROCB_EXITMOVDR | PROCB_EXITIO | PROCB_EXITMONITOR;
x |= PROCB_USECTLS2;
x &= msr >> 32;
vmcswrite(PROCB_CTLS, x);
@@ -993,15 +993,20 @@ cmdgetregs(VmCmd *, va_list va)
p0 = va_arg(va, char *);
e = va_arg(va, char *);
p = p0;
- for(r = guestregs; r < guestregs + nelem(guestregs); r++){
- if(r->offset >= 0)
- val = vmcsread(r->offset);
- else
- val = *(uintptr*)((uchar*)&vmx + ~r->offset);
- s = r->size;
- if(s == 0) s = sizeof(uintptr);
- p = seprint(p, e, "%s %#.*llux\n", r->name, s * 2, val);
- }
+ for(r = guestregs; r < guestregs + nelem(guestregs); r++)
+ if(r->read != nil){
+ p = seprint(p, e, "%s ", r->name);
+ p = r->read(p, e);
+ p = strecpy(p, e, "\n");
+ }else{
+ if(r->offset >= 0)
+ val = vmcsread(r->offset);
+ else
+ val = *(uintptr*)((uchar*)&vmx + ~r->offset);
+ s = r->size;
+ if(s == 0) s = sizeof(uintptr);
+ p = seprint(p, e, "%s %#.*llux\n", r->name, s * 2, val);
+ }
return p - p0;
}