mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
xen/arm: exclude xen,reg from domU extended regions
When a device is passed through to a dom0less domU, the xen,reg ranges may overlap with the extended regions. Remove xen,reg from extended regions. Signed-off-by: Stewart Hildebrand <stewart.hildebrand@amd.com> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
This commit is contained in:
1 parent
31703c5d7a
commit
fba1b0974d
3 files changed
+26
-1
No files matched your search
@@ -973,6 +973,13 @@ static int __init find_domU_holes(const struct kernel_info *kinfo,
|
||||
if ( res )
|
||||
goto out;
|
||||
|
||||
if ( kinfo->xen_reg_assigned )
|
||||
{
|
||||
res = rangeset_subtract(mem_holes, kinfo->xen_reg_assigned);
|
||||
if ( res )
|
||||
goto out;
|
||||
}
|
||||
|
||||
res = rangeset_report_ranges(mem_holes, 0,
|
||||
PFN_DOWN((1ULL << p2m_ipa_bits) - 1),
|
||||
add_ext_regions, ext_regions);
|
||||
|
||||
@@ -146,6 +146,14 @@ static int __init handle_passthrough_prop(struct kernel_info *kinfo,
|
||||
int res;
|
||||
paddr_t mstart, size, gstart;
|
||||
|
||||
if ( !kinfo->xen_reg_assigned )
|
||||
{
|
||||
kinfo->xen_reg_assigned = rangeset_new(NULL, NULL, 0);
|
||||
|
||||
if ( !kinfo->xen_reg_assigned )
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* xen,reg specifies where to map the MMIO region */
|
||||
cell = (const __be32 *)xen_reg->data;
|
||||
len = fdt32_to_cpu(xen_reg->len) / ((address_cells * 2 + size_cells) *
|
||||
@@ -187,6 +195,11 @@ static int __init handle_passthrough_prop(struct kernel_info *kinfo,
|
||||
mstart, gstart);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
res = rangeset_add_range(kinfo->xen_reg_assigned, PFN_DOWN(gstart),
|
||||
PFN_DOWN(gstart + size - 1));
|
||||
if ( res )
|
||||
return res;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -814,7 +827,11 @@ static int __init construct_domU(struct domain *d,
|
||||
|
||||
domain_vcpu_affinity(d, node);
|
||||
|
||||
return alloc_xenstore_params(&kinfo);
|
||||
rc = alloc_xenstore_params(&kinfo);
|
||||
|
||||
rangeset_destroy(kinfo.xen_reg_assigned);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
void __init create_domUs(void)
|
||||
|
||||
@@ -24,6 +24,7 @@ struct kernel_info {
|
||||
#ifdef CONFIG_STATIC_SHM
|
||||
struct shared_meminfo shm_mem;
|
||||
#endif
|
||||
struct rangeset *xen_reg_assigned;
|
||||
|
||||
/* kernel entry point */
|
||||
paddr_t entry;
|
||||
|
||||