case EVTCHNOP_alloc_unbound:
err = kvm_xen_evtchn_alloc_unbound(cpu, eop);
break;
+ case EVTCHNOP_bind_vcpu:
+ err = kvm_xen_evtchn_bind_vcpu(cpu, eop);
+ break;
case EVTCHNOP_close:
err = kvm_xen_evtchn_close(cpu, eop);
break;
return 0;
}
+int kvm_xen_evtchn_bind_vcpu(X86CPU *cpu, void *arg)
+{
+ struct evtchn_bind_vcpu bind_vcpu;
+ struct XenEvtChn *evtchn;
+ CPUState *dest;
+
+ memcpy(&bind_vcpu, arg, sizeof(bind_vcpu));
+
+ dest = qemu_get_cpu(bind_vcpu.vcpu);
+ if (!dest) {
+ return -EINVAL;
+ }
+
+ evtchn = evtchn_from_port(bind_vcpu.port);
+ if (!evtchn) {
+ return -ENOENT;
+ }
+
+ evtchn->notify_vcpu_id = bind_vcpu.vcpu;
+
+ return 0;
+}
+
int kvm_xen_evtchn_close(X86CPU *cpu, void *arg)
{
struct evtchn_close close;
int kvm_xen_evtchn_bind_ipi(X86CPU *cpu, void *arg);
int kvm_xen_evtchn_bind_virq(X86CPU *cpu, void *arg);
int kvm_xen_evtchn_bind_interdomain(X86CPU *cpu, void *arg);
+int kvm_xen_evtchn_bind_vcpu(X86CPU *cpu, void *arg);
int kvm_xen_evtchn_alloc_unbound(X86CPU *cpu, void *arg);
int kvm_xen_evtchn_close(X86CPU *cpu, void *arg);
int kvm_xen_evtchn_unmask(X86CPU *cpu, void *arg);