[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 4/6] xen: Allow hardare domain != dom0
This adds a hypervisor command line option "hardware_dom=" which takes a domain ID. When the domain with this ID is created, it will be used as the hardware domain. This is intended to be used when dom0 is a dedicated stub domain for domain building, allowing the hardware domain to be de-privileged and act only as a driver domain. Signed-off-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx> Cc: Keir Fraser <keir@xxxxxxx> Cc: Jan Beulich <jbeulich@xxxxxxxx> --- xen/arch/x86/domain_build.c | 4 +++- xen/arch/x86/setup.c | 3 +++ xen/common/domctl.c | 8 ++++++++ xen/common/rangeset.c | 26 ++++++++++++++++++++++++++ xen/include/xen/rangeset.h | 3 +++ xen/include/xen/sched.h | 3 ++- 6 files changed, 45 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c index 84ce392..e9de496 100644 --- a/xen/arch/x86/domain_build.c +++ b/xen/arch/x86/domain_build.c @@ -1149,7 +1149,9 @@ int __init construct_dom0( printk(" Xen warning: dom0 kernel broken ELF: %s\n", elf_check_broken(&elf)); - iommu_dom0_init(dom0); + if( is_hardware_domain(dom0) ) + iommu_dom0_init(dom0); + return 0; out: diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index 3a4f69c..3480854 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -88,6 +88,9 @@ unsigned long __initdata highmem_start; size_param("highmem-start", highmem_start); #endif +unsigned int __read_mostly hardware_dom; +integer_param("hardware_dom", hardware_dom); + cpumask_t __read_mostly cpu_present_map; unsigned long __read_mostly xen_phys_start; diff --git a/xen/common/domctl.c b/xen/common/domctl.c index eebeee7..11e6b94 100644 --- a/xen/common/domctl.c +++ b/xen/common/domctl.c @@ -472,6 +472,14 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) break; } + if (d->domain_id == hardware_dom) { + printk("Initialising hardware domain %d\n", hardware_dom); + rangeset_swap(d->irq_caps, dom0->irq_caps); + + dom0 = d; + iommu_dom0_init(dom0); + } + ret = 0; memcpy(d->handle, op->u.createdomain.handle, diff --git a/xen/common/rangeset.c b/xen/common/rangeset.c index f09c0c4..cd44634 100644 --- a/xen/common/rangeset.c +++ b/xen/common/rangeset.c @@ -438,3 +438,29 @@ void rangeset_domain_printk( spin_unlock(&d->rangesets_lock); } + +void rangeset_swap(struct rangeset *a, struct rangeset *b) +{ + struct list_head tmp; + spin_lock(&a->lock); + spin_lock(&b->lock); + memcpy(&tmp, &a->range_list, sizeof(tmp)); + memcpy(&a->range_list, &b->range_list, sizeof(tmp)); + memcpy(&b->range_list, &tmp, sizeof(tmp)); + if (a->range_list.next == &b->range_list) { + a->range_list.next = &a->range_list; + a->range_list.prev = &a->range_list; + } else { + a->range_list.next->prev = &a->range_list; + a->range_list.prev->next = &a->range_list; + } + if (b->range_list.next == &a->range_list) { + b->range_list.next = &b->range_list; + b->range_list.prev = &b->range_list; + } else { + b->range_list.next->prev = &b->range_list; + b->range_list.prev->next = &b->range_list; + } + spin_unlock(&a->lock); + spin_unlock(&b->lock); +} diff --git a/xen/include/xen/rangeset.h b/xen/include/xen/rangeset.h index 1e16a6b..805ebde 100644 --- a/xen/include/xen/rangeset.h +++ b/xen/include/xen/rangeset.h @@ -73,4 +73,7 @@ void rangeset_printk( void rangeset_domain_printk( struct domain *d); +/* swap contents */ +void rangeset_swap(struct rangeset *a, struct rangeset *b); + #endif /* __XEN_RANGESET_H__ */ diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index 3be26ec..6c4237b 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -778,7 +778,8 @@ void watchdog_domain_destroy(struct domain *d); * (that is, this would not be suitable for a driver domain) * - There is never a reason to deny dom0 access to this */ -#define is_hardware_domain(_d) ((_d)->domain_id == 0) +extern unsigned int hardware_dom; +#define is_hardware_domain(d) ((d)->domain_id == hardware_dom) /* This check is for functionality specific to a control domain */ #define is_control_domain(_d) ((_d)->is_privileged) -- 1.8.5.3 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |