Refactor kvm_emulate_hypercall() to no skip instruction, it can be used in next patch for emulating hypercall in instruction emulation. Signed-off-by: Hou Wenlong <houwenlong93@xxxxxxxxxxxxxxxxx> --- arch/x86/kvm/x86.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 4e2836b94a01..b8d799e1c57c 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -8636,17 +8636,11 @@ static int complete_hypercall_exit(struct kvm_vcpu *vcpu) return kvm_skip_emulated_instruction(vcpu); } -int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) +static int kvm_emulate_hypercall_noskip(struct kvm_vcpu *vcpu) { unsigned long nr, a0, a1, a2, a3, ret; int op_64_bit; - 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); @@ -8664,11 +8658,6 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) a3 &= 0xFFFFFFFF; } - if (static_call(kvm_x86_get_cpl)(vcpu) != 0) { - static_call(kvm_x86_handle_hypercall_fail)(vcpu); - return 1; - } - ret = -KVM_ENOSYS; switch (nr) { @@ -8733,7 +8722,28 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) kvm_rax_write(vcpu, ret); ++vcpu->stat.hypercalls; - return kvm_skip_emulated_instruction(vcpu); + return 1; +} + +int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) +{ + int ret; + + if (kvm_xen_hypercall_enabled(vcpu->kvm)) + return kvm_xen_hypercall(vcpu); + + if (kvm_hv_hypercall_enabled(vcpu)) + return kvm_hv_hypercall(vcpu); + + if (static_call(kvm_x86_get_cpl)(vcpu) != 0) { + static_call(kvm_x86_handle_hypercall_fail)(vcpu); + return 1; + } + + ret = kvm_emulate_hypercall_noskip(vcpu); + if (ret) + return kvm_skip_emulated_instruction(vcpu); + return ret; } EXPORT_SYMBOL_GPL(kvm_emulate_hypercall); -- 2.31.1