return kvm_skip_emulated_instruction(vcpu);
 }
 
-int __kvm_emulate_hypercall(struct kvm_vcpu *vcpu, unsigned long nr,
-                           unsigned long a0, unsigned long a1,
-                           unsigned long a2, unsigned long a3,
-                           int op_64_bit, int cpl,
-                           int (*complete_hypercall)(struct kvm_vcpu *))
+int ____kvm_emulate_hypercall(struct kvm_vcpu *vcpu, unsigned long nr,
+                             unsigned long a0, unsigned long a1,
+                             unsigned long a2, unsigned long a3,
+                             int op_64_bit, int cpl,
+                             int (*complete_hypercall)(struct kvm_vcpu *))
 {
        unsigned long ret;
 
 
 out:
        vcpu->run->hypercall.ret = ret;
-       return complete_hypercall(vcpu);
+       return 1;
 }
-EXPORT_SYMBOL_GPL(__kvm_emulate_hypercall);
+EXPORT_SYMBOL_GPL(____kvm_emulate_hypercall);
 
 int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)
 {
-       unsigned long nr, a0, a1, a2, a3;
-       int op_64_bit;
-       int cpl;
-
        if (kvm_xen_hypercall_enabled(vcpu->kvm))
                return kvm_xen_hypercall(vcpu);
 
        if (kvm_hv_hypercall_enabled(vcpu))
                return kvm_hv_hypercall(vcpu);
 
-       nr = kvm_rax_read(vcpu);
-       a0 = kvm_rbx_read(vcpu);
-       a1 = kvm_rcx_read(vcpu);
-       a2 = kvm_rdx_read(vcpu);
-       a3 = kvm_rsi_read(vcpu);
-       op_64_bit = is_64_bit_hypercall(vcpu);
-       cpl = kvm_x86_call(get_cpl)(vcpu);
-
-       return __kvm_emulate_hypercall(vcpu, nr, a0, a1, a2, a3, op_64_bit, cpl,
+       return __kvm_emulate_hypercall(vcpu, rax, rbx, rcx, rdx, rsi,
+                                      is_64_bit_hypercall(vcpu),
+                                      kvm_x86_call(get_cpl)(vcpu),
                                       complete_hypercall_exit);
 }
 EXPORT_SYMBOL_GPL(kvm_emulate_hypercall);
 
        return kvm->arch.hypercall_exit_enabled & BIT(hc_nr);
 }
 
-int __kvm_emulate_hypercall(struct kvm_vcpu *vcpu, unsigned long nr,
-                           unsigned long a0, unsigned long a1,
-                           unsigned long a2, unsigned long a3,
-                           int op_64_bit, int cpl,
-                           int (*complete_hypercall)(struct kvm_vcpu *));
+int ____kvm_emulate_hypercall(struct kvm_vcpu *vcpu, unsigned long nr,
+                             unsigned long a0, unsigned long a1,
+                             unsigned long a2, unsigned long a3,
+                             int op_64_bit, int cpl,
+                             int (*complete_hypercall)(struct kvm_vcpu *));
+
+#define __kvm_emulate_hypercall(_vcpu, nr, a0, a1, a2, a3, op_64_bit, cpl, complete_hypercall) \
+({                                                                                             \
+       int __ret;                                                                              \
+                                                                                               \
+       __ret = ____kvm_emulate_hypercall(_vcpu,                                                \
+                                         kvm_##nr##_read(_vcpu), kvm_##a0##_read(_vcpu),       \
+                                         kvm_##a1##_read(_vcpu), kvm_##a2##_read(_vcpu),       \
+                                         kvm_##a3##_read(_vcpu), op_64_bit, cpl,               \
+                                         complete_hypercall);                                  \
+                                                                                               \
+       if (__ret > 0)                                                                          \
+               __ret = complete_hypercall(_vcpu);                                              \
+       __ret;                                                                                  \
+})
 
 int kvm_emulate_hypercall(struct kvm_vcpu *vcpu);