1489 u64 input, params[6], r = -ENOSYS;
1490 bool handled =
false;
1496 if ((input & 0x80000000) &&
1502 params[0] = (u32)kvm_rbx_read(vcpu);
1503 params[1] = (u32)kvm_rcx_read(vcpu);
1504 params[2] = (u32)kvm_rdx_read(vcpu);
1505 params[3] = (u32)kvm_rsi_read(vcpu);
1506 params[4] = (u32)kvm_rdi_read(vcpu);
1507 params[5] = (u32)kvm_rbp_read(vcpu);
1509 #ifdef CONFIG_X86_64
1511 params[0] = (u64)kvm_rdi_read(vcpu);
1512 params[1] = (u64)kvm_rsi_read(vcpu);
1513 params[2] = (u64)kvm_rdx_read(vcpu);
1514 params[3] = (u64)kvm_r10_read(vcpu);
1515 params[4] = (u64)kvm_r8_read(vcpu);
1516 params[5] = (u64)kvm_r9_read(vcpu);
1519 cpl = static_call(kvm_x86_get_cpl)(vcpu);
1520 trace_kvm_xen_hypercall(cpl, input, params[0], params[1], params[2],
1521 params[3], params[4], params[5]);
1527 if (unlikely(cpl > 0))
1528 goto handle_in_userspace;
1531 case __HYPERVISOR_xen_version:
1532 if (params[0] == XENVER_version && vcpu->kvm->arch.xen.xen_version) {
1533 r = vcpu->kvm->arch.xen.xen_version;
1537 case __HYPERVISOR_event_channel_op:
1538 if (params[0] == EVTCHNOP_send)
1541 case __HYPERVISOR_sched_op:
1545 case __HYPERVISOR_vcpu_op:
1549 case __HYPERVISOR_set_timer_op: {
1550 u64 timeout = params[0];
1553 timeout |= params[1] << 32;
1564 handle_in_userspace:
1565 vcpu->run->exit_reason = KVM_EXIT_XEN;
1566 vcpu->run->xen.type = KVM_EXIT_XEN_HCALL;
1567 vcpu->run->xen.u.hcall.longmode = longmode;
1568 vcpu->run->xen.u.hcall.cpl = cpl;
1569 vcpu->run->xen.u.hcall.input = input;
1570 vcpu->run->xen.u.hcall.params[0] = params[0];
1571 vcpu->run->xen.u.hcall.params[1] = params[1];
1572 vcpu->run->xen.u.hcall.params[2] = params[2];
1573 vcpu->run->xen.u.hcall.params[3] = params[3];
1574 vcpu->run->xen.u.hcall.params[4] = params[4];
1575 vcpu->run->xen.u.hcall.params[5] = params[5];
1577 vcpu->arch.complete_userspace_io =
int kvm_hv_hypercall(struct kvm_vcpu *vcpu)
static bool kvm_hv_hypercall_enabled(struct kvm_vcpu *vcpu)
unsigned long kvm_get_linear_rip(struct kvm_vcpu *vcpu)
static unsigned long kvm_register_read(struct kvm_vcpu *vcpu, int reg)
static bool is_64_bit_hypercall(struct kvm_vcpu *vcpu)
static int kvm_xen_hypercall_complete_userspace(struct kvm_vcpu *vcpu)
static bool kvm_xen_hcall_evtchn_send(struct kvm_vcpu *vcpu, u64 param, u64 *r)
static bool kvm_xen_hcall_vcpu_op(struct kvm_vcpu *vcpu, bool longmode, int cmd, int vcpu_id, u64 param, u64 *r)
static bool kvm_xen_hcall_set_timer_op(struct kvm_vcpu *vcpu, uint64_t timeout, u64 *r)
static int kvm_xen_hypercall_set_result(struct kvm_vcpu *vcpu, u64 result)
static bool kvm_xen_hcall_sched_op(struct kvm_vcpu *vcpu, bool longmode, int cmd, u64 param, u64 *r)