@@ -1396,85 +1396,92 @@ static int __init make_hypervisor_node(struct domain *d,
if ( res )
return res;
- if ( !opt_ext_regions )
- {
- printk(XENLOG_INFO "%pd: extended regions support is disabled\n", d);
- nr_ext_regions = 0;
- }
- else if ( is_32bit_domain(d) )
- {
- printk(XENLOG_WARNING
- "%pd: extended regions not supported for 32-bit guests\n", d);
- nr_ext_regions = 0;
- }
- else
+ if ( kinfo->dom0less_enhanced )
{
- ext_regions = xzalloc(struct meminfo);
- if ( !ext_regions )
- return -ENOMEM;
-
- if ( is_domain_direct_mapped(d) )
+ if ( !opt_ext_regions )
{
- if ( !is_iommu_enabled(d) )
- res = find_unallocated_memory(kinfo, ext_regions);
- else
- res = find_memory_holes(kinfo, ext_regions);
+ printk(XENLOG_INFO
+ "%pd: extended regions support is disabled\n", d);
+ nr_ext_regions = 0;
}
- else
+ else if ( is_32bit_domain(d) )
{
- res = find_domU_holes(kinfo, ext_regions);
+ printk(XENLOG_WARNING
+ "%pd: extended regions not supported for 32-bit guests\n", d);
+ nr_ext_regions = 0;
}
+ else
+ {
+ ext_regions = xzalloc(struct meminfo);
+ if ( !ext_regions )
+ return -ENOMEM;
- if ( res )
- printk(XENLOG_WARNING "%pd: failed to allocate extended regions\n",
- d);
- nr_ext_regions = ext_regions->nr_banks;
- }
+ if ( is_domain_direct_mapped(d) )
+ {
+ if ( !is_iommu_enabled(d) )
+ res = find_unallocated_memory(kinfo, ext_regions);
+ else
+ res = find_memory_holes(kinfo, ext_regions);
+ }
+ else
+ {
+ res = find_domU_holes(kinfo, ext_regions);
+ }
- reg = xzalloc_array(__be32, (nr_ext_regions + 1) * (addrcells + sizecells));
- if ( !reg )
- {
- xfree(ext_regions);
- return -ENOMEM;
- }
+ if ( res )
+ printk(XENLOG_WARNING
+ "%pd: failed to allocate extended regions\n", d);
+ nr_ext_regions = ext_regions->nr_banks;
+ }
- /* reg 0 is grant table space */
- cells = ®[0];
- dt_child_set_range(&cells, addrcells, sizecells,
- kinfo->gnttab_start, kinfo->gnttab_size);
- /* reg 1...N are extended regions */
- for ( i = 0; i < nr_ext_regions; i++ )
- {
- u64 start = ext_regions->bank[i].start;
- u64 size = ext_regions->bank[i].size;
+ reg = xzalloc_array(__be32, (nr_ext_regions + 1) * (addrcells + sizecells));
+ if ( !reg )
+ {
+ xfree(ext_regions);
+ return -ENOMEM;
+ }
- printk("%pd: extended region %d: %#"PRIx64"->%#"PRIx64"\n",
- d, i, start, start + size);
+ /* reg 0 is grant table space */
+ cells = ®[0];
+ dt_child_set_range(&cells, addrcells, sizecells,
+ kinfo->gnttab_start, kinfo->gnttab_size);
+ /* reg 1...N are extended regions */
+ for ( i = 0; i < nr_ext_regions; i++ )
+ {
+ u64 start = ext_regions->bank[i].start;
+ u64 size = ext_regions->bank[i].size;
- dt_child_set_range(&cells, addrcells, sizecells, start, size);
- }
+ printk("%pd: extended region %d: %#"PRIx64"->%#"PRIx64"\n",
+ d, i, start, start + size);
- res = fdt_property(fdt, "reg", reg,
- dt_cells_to_size(addrcells + sizecells) *
- (nr_ext_regions + 1));
- xfree(ext_regions);
- xfree(reg);
+ dt_child_set_range(&cells, addrcells, sizecells, start, size);
+ }
- if ( res )
- return res;
+ res = fdt_property(fdt, "reg", reg,
+ dt_cells_to_size(addrcells + sizecells) *
+ (nr_ext_regions + 1));
+ xfree(ext_regions);
+ xfree(reg);
- BUG_ON(d->arch.evtchn_irq == 0);
+ if ( res )
+ return res;
+ }
- /*
- * Interrupt event channel upcall:
- * - Active-low level-sensitive
- * - All CPUs
- * TODO: Handle properly the cpumask;
- */
- set_interrupt(intr, d->arch.evtchn_irq, 0xf, DT_IRQ_TYPE_LEVEL_LOW);
- res = fdt_property_interrupts(kinfo, &intr, 1);
- if ( res )
- return res;
+ if ( kinfo->dom0less_evtchn )
+ {
+ BUG_ON(d->arch.evtchn_irq == 0);
+
+ /*
+ * Interrupt event channel upcall:
+ * - Active-low level-sensitive
+ * - All CPUs
+ * TODO: Handle properly the cpumask;
+ */
+ set_interrupt(intr, d->arch.evtchn_irq, 0xf, DT_IRQ_TYPE_LEVEL_LOW);
+ res = fdt_property_interrupts(kinfo, &intr, 1);
+ if ( res )
+ return res;
+ }
res = fdt_end_node(fdt);
@@ -2891,7 +2898,7 @@ static int __init prepare_dtb_domU(struct domain *d, struct kernel_info *kinfo)
goto err;
}
- if ( kinfo->dom0less_enhanced )
+ if ( kinfo->dom0less_enhanced || kinfo->dom0less_evtchn )
{
ret = make_hypervisor_node(d, kinfo, addrcells, sizecells);
if ( ret )
@@ -3346,11 +3353,11 @@ static int __init construct_domU(struct domain *d,
rc == -ENODATA ||
(rc == 0 && !strcmp(dom0less_enhanced, "enabled")) )
{
- if ( hardware_domain )
- kinfo.dom0less_enhanced = true;
- else
- panic("Tried to use xen,enhanced without dom0\n");
+ kinfo.dom0less_enhanced = true;
+ kinfo.dom0less_evtchn = true;
}
+ else if ( rc == 0 && !strcmp(dom0less_enhanced, "evtchn") )
+ kinfo.dom0less_evtchn = true;
if ( vcpu_create(d, 0) == NULL )
return -ENOMEM;
@@ -3529,6 +3536,8 @@ static int __init construct_dom0(struct domain *d)
kinfo.unassigned_mem = dom0_mem;
kinfo.d = d;
+ kinfo.dom0less_enhanced = true;
+ kinfo.dom0less_evtchn = true;
rc = kernel_probe(&kinfo, NULL);
if ( rc < 0 )
@@ -39,6 +39,9 @@ struct kernel_info {
/* Enable PV drivers */
bool dom0less_enhanced;
+ /* Enable event-channel interface */
+ bool dom0less_evtchn;
+
/* GIC phandle */
uint32_t phandle_gic;
Introduce a new "xen,enhanced" dom0less property value "evtchn" to enable/disable event-channel interfaces for dom0less guests. The configurable option is for domUs only. For dom0 we always set the corresponding property in the Xen code to true. Signed-off-by: Rahul Singh <rahul.singh@arm.com> --- xen/arch/arm/domain_build.c | 149 ++++++++++++++++-------------- xen/arch/arm/include/asm/kernel.h | 3 + 2 files changed, 82 insertions(+), 70 deletions(-)