#include "kvm_cache_regs.h"
 #include "x86.h"
 
+#include <asm/asm.h>
 #include <asm/cpu.h>
 #include <asm/io.h>
 #include <asm/desc.h>
        u64 rsvd : 48;
        u64 gva;
     } operand = { vpid, 0, gva };
+    bool error;
 
-    asm volatile (__ex(ASM_VMX_INVVPID)
-                 /* CF==1 or ZF==1 --> rc = -1 */
-                 "; ja 1f ; ud2 ; 1:"
-                 : : "a"(&operand), "c"(ext) : "cc", "memory");
+    asm volatile (__ex(ASM_VMX_INVVPID) CC_SET(na)
+                 : CC_OUT(na) (error) : "a"(&operand), "c"(ext)
+                 : "memory");
+    BUG_ON(error);
 }
 
 static inline void __invept(int ext, u64 eptp, gpa_t gpa)
        struct {
                u64 eptp, gpa;
        } operand = {eptp, gpa};
+       bool error;
 
-       asm volatile (__ex(ASM_VMX_INVEPT)
-                       /* CF==1 or ZF==1 --> rc = -1 */
-                       "; ja 1f ; ud2 ; 1:\n"
-                       : : "a" (&operand), "c" (ext) : "cc", "memory");
+       asm volatile (__ex(ASM_VMX_INVEPT) CC_SET(na)
+                     : CC_OUT(na) (error) : "a" (&operand), "c" (ext)
+                     : "memory");
+       BUG_ON(error);
 }
 
 static struct shared_msr_entry *find_msr_entry(struct vcpu_vmx *vmx, u32 msr)
 static void vmcs_clear(struct vmcs *vmcs)
 {
        u64 phys_addr = __pa(vmcs);
-       u8 error;
+       bool error;
 
-       asm volatile (__ex(ASM_VMX_VMCLEAR_RAX) "; setna %0"
-                     : "=qm"(error) : "a"(&phys_addr), "m"(phys_addr)
-                     : "cc", "memory");
-       if (error)
+       asm volatile (__ex(ASM_VMX_VMCLEAR_RAX) CC_SET(na)
+                     : CC_OUT(na) (error) : "a"(&phys_addr), "m"(phys_addr)
+                     : "memory");
+       if (unlikely(error))
                printk(KERN_ERR "kvm: vmclear fail: %p/%llx\n",
                       vmcs, phys_addr);
 }
 static void vmcs_load(struct vmcs *vmcs)
 {
        u64 phys_addr = __pa(vmcs);
-       u8 error;
+       bool error;
 
        if (static_branch_unlikely(&enable_evmcs))
                return evmcs_load(phys_addr);
 
-       asm volatile (__ex(ASM_VMX_VMPTRLD_RAX) "; setna %0"
-                       : "=qm"(error) : "a"(&phys_addr), "m"(phys_addr)
-                       : "cc", "memory");
-       if (error)
+       asm volatile (__ex(ASM_VMX_VMPTRLD_RAX) CC_SET(na)
+                     : CC_OUT(na) (error) : "a"(&phys_addr), "m"(phys_addr)
+                     : "memory");
+       if (unlikely(error))
                printk(KERN_ERR "kvm: vmptrld %p/%llx failed\n",
                       vmcs, phys_addr);
 }
 
 static __always_inline void __vmcs_writel(unsigned long field, unsigned long value)
 {
-       u8 error;
+       bool error;
 
-       asm volatile (__ex(ASM_VMX_VMWRITE_RAX_RDX) "; setna %0"
-                      : "=q"(error) : "a"(value), "d"(field) : "cc");
+       asm volatile (__ex(ASM_VMX_VMWRITE_RAX_RDX) CC_SET(na)
+                     : CC_OUT(na) (error) : "a"(value), "d"(field));
        if (unlikely(error))
                vmwrite_error(field, value);
 }