Stubdoms need to be able to make all the passthrough related hypercalls
on behalf of the guest.
Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
---
diff -r 65a13cafbbef xen/arch/x86/irq.c
--- a/xen/arch/x86/irq.c Wed Jul 22 15:59:44 2009 +0100
+++ b/xen/arch/x86/irq.c Wed Jul 22 16:15:14 2009 +0100
@@ -917,7 +917,7 @@
ASSERT(spin_is_locked(&pcidevs_lock));
ASSERT(spin_is_locked(&d->event_lock));
- if ( !IS_PRIV(current->domain) )
+ if ( !IS_PRIV_FOR(current->domain, d) )
return -EPERM;
if ( pirq < 0 || pirq >= d->nr_pirqs || vector < 0 || vector >= NR_VECTORS
)
diff -r 65a13cafbbef xen/arch/x86/physdev.c
--- a/xen/arch/x86/physdev.c Wed Jul 22 15:59:44 2009 +0100
+++ b/xen/arch/x86/physdev.c Wed Jul 22 16:15:14 2009 +0100
@@ -34,9 +34,6 @@
struct msi_info _msi;
void *map_data = NULL;
- if ( !IS_PRIV(current->domain) )
- return -EPERM;
-
if ( !map )
return -EINVAL;
@@ -48,6 +45,12 @@
if ( d == NULL )
{
ret = -ESRCH;
+ goto free_domain;
+ }
+
+ if ( !IS_PRIV_FOR(current->domain, d) )
+ {
+ ret = -EPERM;
goto free_domain;
}
@@ -158,10 +161,7 @@
static int physdev_unmap_pirq(struct physdev_unmap_pirq *unmap)
{
struct domain *d;
- int ret;
-
- if ( !IS_PRIV(current->domain) )
- return -EPERM;
+ int ret = -ESRCH;
if ( unmap->domid == DOMID_SELF )
d = rcu_lock_domain(current->domain);
@@ -169,7 +169,13 @@
d = rcu_lock_domain_by_id(unmap->domid);
if ( d == NULL )
- return -ESRCH;
+ goto free_domain;
+
+ if ( !IS_PRIV_FOR(current->domain, d) )
+ {
+ ret = -EPERM;
+ goto free_domain;
+ }
spin_lock(&pcidevs_lock);
spin_lock(&d->event_lock);
@@ -177,6 +183,7 @@
spin_unlock(&d->event_lock);
spin_unlock(&pcidevs_lock);
+free_domain:
rcu_unlock_domain(d);
return ret;
diff -r 65a13cafbbef xen/common/domctl.c
--- a/xen/common/domctl.c Wed Jul 22 15:59:44 2009 +0100
+++ b/xen/common/domctl.c Wed Jul 22 16:15:14 2009 +0100
@@ -220,14 +220,36 @@
long ret = 0;
struct xen_domctl curop, *op = &curop;
- if ( !IS_PRIV(current->domain) )
- return -EPERM;
-
if ( copy_from_guest(op, u_domctl, 1) )
return -EFAULT;
if ( op->interface_version != XEN_DOMCTL_INTERFACE_VERSION )
return -EACCES;
+
+ switch ( op->cmd )
+ {
+ case XEN_DOMCTL_ioport_mapping:
+ case XEN_DOMCTL_memory_mapping:
+ case XEN_DOMCTL_bind_pt_irq:
+ case XEN_DOMCTL_unbind_pt_irq:
+ case XEN_DOMCTL_assign_device:
+ case XEN_DOMCTL_deassign_device:
+ {
+ struct domain *d = get_domain_by_id(op->domain);
+ if ( !IS_PRIV_FOR(current->domain, d) )
+ {
+ put_domain(d);
+ return -EPERM;
+ }
+ put_domain(d);
+ }
+ break;
+ default:
+ if ( !IS_PRIV(current->domain) )
+ return -EPERM;
+ break;
+ }
+
if ( !domctl_lock_acquire() )
return hypercall_create_continuation(
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|