x86/vmx: introduce VMX_INSN_SUCCEED
authorSergey Dyasli <sergey.dyasli@citrix.com>
Mon, 13 Feb 2017 14:21:08 +0000 (14:21 +0000)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Tue, 14 Feb 2017 10:25:05 +0000 (10:25 +0000)
The new value corresponds to VMsucceed status of VMX instructions.
This will replace usage of literal zeroes in related functions.

Update vmfail(), vmread_safe() and vmwrite_safe().

Signed-off-by: Sergey Dyasli <sergey.dyasli@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Kevin Tian <kevin.tian@intel.com>
xen/arch/x86/hvm/vmx/vvmx.c
xen/include/asm-x86/hvm/vmx/vmcs.h
xen/include/asm-x86/hvm/vmx/vmx.h

index 9c61b5bbac55e17dd6d531fd75806bf27c5a7594..7172621a415d7c1cce2c7dd12405baee29766433 100644 (file)
@@ -483,6 +483,9 @@ static void vmfail_invalid(struct cpu_user_regs *regs)
 
 static void vmfail(struct cpu_user_regs *regs, enum vmx_insn_errno errno)
 {
+    if ( errno == VMX_INSN_SUCCEED )
+        return;
+
     if ( vcpu_nestedhvm(current).nv_vvmcxaddr != INVALID_PADDR &&
          errno != VMX_INSN_FAIL_INVALID )
         vmfail_valid(regs, errno);
index b6b665b77fec1ec913c026e9eb0a7af0e9516896..35b0430942026345c80e5d246fbd72ddb18c80da 100644 (file)
@@ -513,6 +513,7 @@ enum vmcs_field {
 /* VM Instruction error numbers */
 enum vmx_insn_errno
 {
+    VMX_INSN_SUCCEED                       = 0,
     VMX_INSN_VMCLEAR_INVALID_PHYADDR       = 2,
     VMX_INSN_VMLAUNCH_NONCLEAR_VMCS        = 4,
     VMX_INSN_VMRESUME_NONLAUNCHED_VMCS     = 5,
index f4183d96150ed8023f4c2496e273755217128144..17e6342402ce57fb7ba249a32a188dc62e012589 100644 (file)
@@ -404,7 +404,7 @@ static always_inline void __vmwrite(unsigned long field, unsigned long value)
 static inline enum vmx_insn_errno vmread_safe(unsigned long field,
                                               unsigned long *value)
 {
-    unsigned long ret = 0;
+    unsigned long ret = VMX_INSN_SUCCEED;
     bool fail_invalid, fail_valid;
 
     asm volatile ( GAS_VMX_OP("vmread %[field], %[value]\n\t",
@@ -427,7 +427,7 @@ static inline enum vmx_insn_errno vmread_safe(unsigned long field,
 static inline enum vmx_insn_errno vmwrite_safe(unsigned long field,
                                                unsigned long value)
 {
-    unsigned long ret = 0;
+    unsigned long ret = VMX_INSN_SUCCEED;
     bool fail_invalid, fail_valid;
 
     asm volatile ( GAS_VMX_OP("vmwrite %[value], %[field]\n\t",