Re: [Xen-devel] [PATCH v3 2/4] x86/vmx: improve vmread_safe()

2017-02-08 Thread Tian, Kevin
> From: Sergey Dyasli [mailto:sergey.dya...@citrix.com]
> Sent: Wednesday, February 08, 2017 6:10 PM
> 
> The original function doesn't distinguish between Valid and Invalid
> VMfails.  Improved function returns error code depending on the outcome:
> 
> VMsucceed: 0
>   VMfailValid: VM Instruction Error Number
> VMfailInvalid: VMX_INSN_FAIL_INVALID (~0)
> 
> Existing users of __vmread_safe() are updated and double underscore
> prefix is removed from the function's name because such prefixes are
> reserved to a compiler.
> 
> Signed-off-by: Sergey Dyasli 

Acked-by: Kevin Tian 

___
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel


Re: [Xen-devel] [PATCH v3 2/4] x86/vmx: improve vmread_safe()

2017-02-08 Thread Jan Beulich
>>> On 08.02.17 at 11:09,  wrote:
> The original function doesn't distinguish between Valid and Invalid
> VMfails.  Improved function returns error code depending on the outcome:
> 
> VMsucceed: 0
>   VMfailValid: VM Instruction Error Number
> VMfailInvalid: VMX_INSN_FAIL_INVALID (~0)
> 
> Existing users of __vmread_safe() are updated and double underscore
> prefix is removed from the function's name because such prefixes are
> reserved to a compiler.
> 
> Signed-off-by: Sergey Dyasli 

Reviewed-by: Jan Beulich 



___
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel


[Xen-devel] [PATCH v3 2/4] x86/vmx: improve vmread_safe()

2017-02-08 Thread Sergey Dyasli
The original function doesn't distinguish between Valid and Invalid
VMfails.  Improved function returns error code depending on the outcome:

VMsucceed: 0
  VMfailValid: VM Instruction Error Number
VMfailInvalid: VMX_INSN_FAIL_INVALID (~0)

Existing users of __vmread_safe() are updated and double underscore
prefix is removed from the function's name because such prefixes are
reserved to a compiler.

Signed-off-by: Sergey Dyasli 
---
v2 --> v3:
* vmread_safe() now returns "enum vmx_insn_errno" (32-bit value)

 xen/arch/x86/hvm/vmx/vmcs.c   |  2 +-
 xen/arch/x86/hvm/vmx/vvmx.c   |  2 +-
 xen/include/asm-x86/hvm/vmx/vmx.h | 41 +--
 3 files changed, 20 insertions(+), 25 deletions(-)

diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c
index 59ef199..24f7570 100644
--- a/xen/arch/x86/hvm/vmx/vmcs.c
+++ b/xen/arch/x86/hvm/vmx/vmcs.c
@@ -1711,7 +1711,7 @@ static inline unsigned long vmr(unsigned long field)
 {
 unsigned long val;
 
-return __vmread_safe(field, &val) ? val : 0;
+return vmread_safe(field, &val) ? 0 : val;
 }
 
 #define vmr16(fld) ({ \
diff --git a/xen/arch/x86/hvm/vmx/vvmx.c b/xen/arch/x86/hvm/vmx/vvmx.c
index 105a3c0..31ac360 100644
--- a/xen/arch/x86/hvm/vmx/vvmx.c
+++ b/xen/arch/x86/hvm/vmx/vvmx.c
@@ -932,7 +932,7 @@ static inline void shadow_to_vvmcs(const struct vcpu *v, 
unsigned int field)
 {
 unsigned long value;
 
-if ( __vmread_safe(field, &value) )
+if ( vmread_safe(field, &value) == 0 )
 set_vvmcs(v, field, value);
 }
 
diff --git a/xen/include/asm-x86/hvm/vmx/vmx.h 
b/xen/include/asm-x86/hvm/vmx/vmx.h
index 9bfe71a..3e809d4 100644
--- a/xen/include/asm-x86/hvm/vmx/vmx.h
+++ b/xen/include/asm-x86/hvm/vmx/vmx.h
@@ -401,32 +401,27 @@ static always_inline void __vmwrite(unsigned long field, 
unsigned long value)
 );
 }
 
-static inline bool_t __vmread_safe(unsigned long field, unsigned long *value)
+static inline enum vmx_insn_errno vmread_safe(unsigned long field,
+  unsigned long *value)
 {
-bool_t okay;
+unsigned long ret = 0;
+bool fail_invalid, fail_valid;
 
-asm volatile (
-#ifdef HAVE_GAS_VMX
-   "vmread %2, %1\n\t"
-#else
-   VMREAD_OPCODE MODRM_EAX_ECX
-#endif
-   /* CF==1 or ZF==1 --> rc = 0 */
-#ifdef __GCC_ASM_FLAG_OUTPUTS__
-   : "=@ccnbe" (okay),
-#else
-   "setnbe %0"
-   : "=qm" (okay),
-#endif
-#ifdef HAVE_GAS_VMX
- "=rm" (*value)
-   : "r" (field));
-#else
- "=c" (*value)
-   : "a" (field));
-#endif
+asm volatile ( GAS_VMX_OP("vmread %[field], %[value]\n\t",
+  VMREAD_OPCODE MODRM_EAX_ECX)
+   ASM_FLAG_OUT(, "setc %[invalid]\n\t")
+   ASM_FLAG_OUT(, "setz %[valid]\n\t")
+   : ASM_FLAG_OUT("=@ccc", [invalid] "=rm") (fail_invalid),
+ ASM_FLAG_OUT("=@ccz", [valid] "=rm") (fail_valid),
+ [value] GAS_VMX_OP("=rm", "=c") (*value)
+   : [field] GAS_VMX_OP("r", "a") (field));
+
+if ( unlikely(fail_invalid) )
+ret = VMX_INSN_FAIL_INVALID;
+else if ( unlikely(fail_valid) )
+__vmread(VM_INSTRUCTION_ERROR, &ret);
 
-return okay;
+return ret;
 }
 
 static inline enum vmx_insn_errno vmwrite_safe(unsigned long field,
-- 
2.9.3


___
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel