Messages in this thread | | | Date | Thu, 9 May 2024 11:26:13 +0800 | Subject | Re: [PATCH v19 097/130] KVM: x86: Split core of hypercall emulation to helper function | From | Binbin Wu <> |
| |
On 4/4/2024 2:34 AM, Isaku Yamahata wrote: > On Fri, Mar 29, 2024 at 11:24:55AM +0800, > Chao Gao <chao.gao@intel.com> wrote: > >> On Mon, Feb 26, 2024 at 12:26:39AM -0800, isaku.yamahata@intel.com wrote: >>> + >>> +int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) >>> +{ >>> + unsigned long nr, a0, a1, a2, a3, ret; >>> + 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 = static_call(kvm_x86_get_cpl)(vcpu); >>> + >>> + ret = __kvm_emulate_hypercall(vcpu, nr, a0, a1, a2, a3, op_64_bit, cpl); >>> + if (nr == KVM_HC_MAP_GPA_RANGE && !ret) >>> + /* MAP_GPA tosses the request to the user space. */ >> no need to check what the request is. Just checking the return value will suffice. > This is needed to avoid updating rax etc. KVM_HC_MAP_GPA_RANGE is only an > exception to go to the user space. This check is a bit weird, but I couldn't > find a good way.
To be generic, I think we can use "vcpu->kvm->arch.hypercall_exit_enabled & (1 << nr)" to check if it needs to exit to userspace.
i.e.,
+ ... + ret = __kvm_emulate_hypercall(vcpu, nr, a0, a1, a2, a3, op_64_bit, cpl); + if (!ret && (vcpu->kvm->arch.hypercall_exit_enabled & (1 << nr))) + /* The hypercall is requested to exit to userspace. */ + return 0;
> >>> + return 0; >>> + >>> if (!op_64_bit) >>> ret = (u32)ret; >>> kvm_rax_write(vcpu, ret); >>> >>> - ++vcpu->stat.hypercalls; >>> return kvm_skip_emulated_instruction(vcpu); >>> } >>> EXPORT_SYMBOL_GPL(kvm_emulate_hypercall); >>> -- >>> 2.25.1 >>> >>>
| |