diff options
Diffstat (limited to 'sys/amd64/vmm/intel/vmcs.c')
-rw-r--r-- | sys/amd64/vmm/intel/vmcs.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/sys/amd64/vmm/intel/vmcs.c b/sys/amd64/vmm/intel/vmcs.c index a5784dd..97a7ef2 100644 --- a/sys/amd64/vmm/intel/vmcs.c +++ b/sys/amd64/vmm/intel/vmcs.c @@ -174,7 +174,7 @@ vmcs_seg_desc_encoding(int seg, uint32_t *base, uint32_t *lim, uint32_t *acc) } int -vmcs_getreg(struct vmcs *vmcs, int ident, uint64_t *retval) +vmcs_getreg(struct vmcs *vmcs, int running, int ident, uint64_t *retval) { int error; uint32_t encoding; @@ -194,14 +194,19 @@ vmcs_getreg(struct vmcs *vmcs, int ident, uint64_t *retval) if (encoding == (uint32_t)-1) return (EINVAL); - VMPTRLD(vmcs); + if (!running) + VMPTRLD(vmcs); + error = vmread(encoding, retval); - VMCLEAR(vmcs); + + if (!running) + VMCLEAR(vmcs); + return (error); } int -vmcs_setreg(struct vmcs *vmcs, int ident, uint64_t val) +vmcs_setreg(struct vmcs *vmcs, int running, int ident, uint64_t val) { int error; uint32_t encoding; @@ -216,9 +221,14 @@ vmcs_setreg(struct vmcs *vmcs, int ident, uint64_t val) val = vmcs_fix_regval(encoding, val); - VMPTRLD(vmcs); + if (!running) + VMPTRLD(vmcs); + error = vmwrite(encoding, val); - VMCLEAR(vmcs); + + if (!running) + VMCLEAR(vmcs); + return (error); } |