diff --git a/xen/arch/x86/hvm/ioreq.c b/xen/arch/x86/hvm/ioreq.c index fecabb96a9..44d029499d 100644 --- a/xen/arch/x86/hvm/ioreq.c +++ b/xen/arch/x86/hvm/ioreq.c @@ -757,6 +757,10 @@ int hvm_destroy_ioreq_server(struct domain *d, ioservid_t id) if ( s->id != id ) continue; + rc = -EPERM; + if ( s->emulator != current->domain ) + break; + domain_pause(d); p2m_set_ioreq_server(d, 0, s); @@ -801,6 +805,10 @@ int hvm_get_ioreq_server_info(struct domain *d, ioservid_t id, if ( s->id != id ) continue; + rc = -EPERM; + if ( s->emulator != current->domain ) + break; + *ioreq_gfn = s->ioreq.gfn; if ( s->bufioreq.va != NULL ) @@ -843,6 +851,10 @@ int hvm_map_io_range_to_ioreq_server(struct domain *d, ioservid_t id, if ( s->id != id ) continue; + rc = -EPERM; + if ( s->emulator != current->domain ) + break; + switch ( type ) { case XEN_DMOP_IO_RANGE_PORT: @@ -898,6 +910,10 @@ int hvm_unmap_io_range_from_ioreq_server(struct domain *d, ioservid_t id, if ( s->id != id ) continue; + rc = -EPERM; + if ( s->emulator != current->domain ) + break; + switch ( type ) { case XEN_DMOP_IO_RANGE_PORT: @@ -961,6 +977,10 @@ int hvm_map_mem_type_to_ioreq_server(struct domain *d, ioservid_t id, if ( s->id != id ) continue; + rc = -EPERM; + if ( s->emulator != current->domain ) + break; + rc = p2m_set_ioreq_server(d, flags, s); break; } @@ -1000,6 +1020,10 @@ int hvm_set_ioreq_server_state(struct domain *d, ioservid_t id, if ( s->id != id ) continue; + rc = -EPERM; + if ( s->emulator != current->domain ) + break; + domain_pause(d); if ( enabled )