diff options
-rw-r--r-- | xen/arch/x86/hvm/hvm.c | 13 | ||||
-rw-r--r-- | xen/arch/x86/hvm/io.c | 2 | ||||
-rw-r--r-- | xen/include/public/hvm/params.h | 3 |
3 files changed, 17 insertions, 1 deletions
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index b118195c94..29452a2daf 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -985,6 +985,16 @@ int hvm_vcpu_initialise(struct vcpu *v) /* Register ioreq event channel. */ v->arch.hvm_vcpu.xen_port = rc; + + if ( v->vcpu_id == 0 ) + { + /* Create bufioreq event channel. */ + rc = alloc_unbound_xen_event_channel(v, 0); + if ( rc < 0 ) + goto fail2; + v->domain->arch.hvm_domain.params[HVM_PARAM_BUFIOREQ_EVTCHN] = rc; + } + spin_lock(&v->domain->arch.hvm_domain.ioreq.lock); if ( v->domain->arch.hvm_domain.ioreq.va != NULL ) get_ioreq(v)->vp_eport = v->arch.hvm_vcpu.xen_port; @@ -3597,6 +3607,9 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg) if ( rc == 0 ) rc = nestedhvm_vcpu_initialise(v); break; + case HVM_PARAM_BUFIOREQ_EVTCHN: + rc = -EINVAL; + break; } if ( rc == 0 ) diff --git a/xen/arch/x86/hvm/io.c b/xen/arch/x86/hvm/io.c index 7ebefc7460..41a2edea50 100644 --- a/xen/arch/x86/hvm/io.c +++ b/xen/arch/x86/hvm/io.c @@ -118,6 +118,8 @@ int hvm_buffered_io_send(ioreq_t *p) wmb(); pg->write_pointer += qw ? 2 : 1; + notify_via_xen_event_channel(v->domain, + v->domain->arch.hvm_domain.params[HVM_PARAM_BUFIOREQ_EVTCHN]); spin_unlock(&iorp->lock); return 1; diff --git a/xen/include/public/hvm/params.h b/xen/include/public/hvm/params.h index 1c5a1a9964..6699788eae 100644 --- a/xen/include/public/hvm/params.h +++ b/xen/include/public/hvm/params.h @@ -52,6 +52,7 @@ #define HVM_PARAM_IOREQ_PFN 5 #define HVM_PARAM_BUFIOREQ_PFN 6 +#define HVM_PARAM_BUFIOREQ_EVTCHN 26 #ifdef __ia64__ @@ -141,6 +142,6 @@ /* Boolean: Enable nestedhvm (hvm only) */ #define HVM_PARAM_NESTEDHVM 24 -#define HVM_NR_PARAMS 26 +#define HVM_NR_PARAMS 27 #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */ |