static memory regions overlap with memory nodes. The
overlapping memory is reserved-memory and should be
handled accordingly:
dt_unreserved_regions should skip these regions the
same way they are already skipping mem-reserved regions.
Signed-off-by: Penny Zheng <penny.zheng@arm.com>
---
v3 changes:
- extract common codes for dealing with reserved memory stored in
bootinfo
---
xen/arch/arm/setup.c | 47 ++++++++++++++++++++++++++++----------------
1 file changed, 30 insertions(+), 17 deletions(-)
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index 63a908e325..f569134317 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -200,6 +200,13 @@ static void __init dt_unreserved_regions(paddr_t s, paddr_t e,
int first)
{
int i, nr = fdt_num_mem_rsv(device_tree_flattened);
+ /*
+ * There are two types of reserved memory stored in bootinfo, one defines
+ * in /reserved-memory node, the other refers to domain on static allocation
+ * through "xen,static-mem" property.
+ */
+ int nr_rsv_type = 2, t = 0, prev_nr;
+ struct meminfo *rsv_type[2] = {&bootinfo.reserved_mem, &bootinfo.static_mem};
for ( i = first; i < nr ; i++ )
{
@@ -219,26 +226,32 @@ static void __init dt_unreserved_regions(paddr_t s, paddr_t e,
}
}
- /*
- * i is the current bootmodule we are evaluating across all possible
- * kinds.
- *
- * When retrieving the corresponding reserved-memory addresses
- * below, we need to index the bootinfo.reserved_mem bank starting
- * from 0, and only counting the reserved-memory modules. Hence,
- * we need to use i - nr.
- */
- for ( ; i - nr < bootinfo.reserved_mem.nr_banks; i++ )
+ prev_nr = nr;
+ while ( t < nr_rsv_type )
{
- paddr_t r_s = bootinfo.reserved_mem.bank[i - nr].start;
- paddr_t r_e = r_s + bootinfo.reserved_mem.bank[i - nr].size;
-
- if ( s < r_e && r_s < e )
+ /*
+ * i is the current bootmodule we are evaluating across all possible
+ * kinds.
+ *
+ * When retrieving the corresponding reserved-memory addresses
+ * below, we need to index the reserved mem bank starting
+ * from 0, and only counting the reserved-memory modules. Hence,
+ * we need to use i - prev_nr.
+ */
+ i = i - prev_nr;
+ for ( ; i < rsv_type[t]->nr_banks; i++ )
{
- dt_unreserved_regions(r_e, e, cb, i + 1);
- dt_unreserved_regions(s, r_s, cb, i + 1);
- return;
+ paddr_t r_s = rsv_type[t]->bank[i].start;
+ paddr_t r_e = r_s + rsv_type[t]->bank[i].size;
+
+ if ( s < r_e && r_s < e )
+ {
+ dt_unreserved_regions(r_e, e, cb, i + 1);
+ dt_unreserved_regions(s, r_s, cb, i + 1);
+ return;
+ }
}
+ prev_nr = rsv_type[t++]->nr_banks;
}
cb(s, e);
--
2.25.1