]> xenbits.xensource.com Git - people/larsk/xen.git/commitdiff
xen/arm32: setup: Give a xenheap page to the boot allocator
authorJulien Grall <julien.grall@arm.com>
Fri, 20 Sep 2019 09:31:30 +0000 (10:31 +0100)
committerStefano Stabellini <sstabellini@kernel.org>
Fri, 20 Sep 2019 15:20:14 +0000 (08:20 -0700)
After commit 6e3e771203 "xen/arm: setup: Relocate the Device-Tree later on
in the boot", the boot allocator will not receive any xenheap page (i.e.
mapped page) on Arm32.

However, the boot allocator implicitly relies on having the first page
already mapped and therefore result to break boot on Arm32.

The easiest way for now is to give a xenheap page to the boot allocator.
We may want to rethink the interface in the future.

[stefano: fix grammar in commit message]

Fixes: 6e3e771203 ('xen/arm: setup: Relocate the Device-Tree later on in the boot')
Signed-off-by: Julien Grall <julien.grall@arm.com>
Signed-off-by: Stefano Stabellini <stefano.stabellini@xilinx.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
xen/arch/arm/setup.c

index 581b262655840ed2f94e6b887f934b7ad3df19ea..fca7e68cbabea6cd2fb686547709fbbedb9cc1ab 100644 (file)
@@ -593,6 +593,7 @@ static void __init setup_mm(void)
     unsigned long heap_pages, xenheap_pages, domheap_pages;
     int i;
     const uint32_t ctr = READ_CP32(CTR);
+    mfn_t boot_mfn_start, boot_mfn_end;
 
     if ( !bootinfo.mem.nr_banks )
         panic("No memory bank\n");
@@ -665,6 +666,11 @@ static void __init setup_mm(void)
 
     setup_xenheap_mappings((e >> PAGE_SHIFT) - xenheap_pages, xenheap_pages);
 
+    /* We need a single mapped page for populating bootmem_region_list. */
+    boot_mfn_start = mfn_add(xenheap_mfn_end, -1);
+    boot_mfn_end = xenheap_mfn_end;
+    init_boot_pages(mfn_to_maddr(boot_mfn_start), mfn_to_maddr(boot_mfn_end));
+
     /* Add non-xenheap memory */
     for ( i = 0; i < bootinfo.mem.nr_banks; i++ )
     {
@@ -710,7 +716,7 @@ static void __init setup_mm(void)
 
     /* Add xenheap memory that was not already added to the boot allocator. */
     init_xenheap_pages(mfn_to_maddr(xenheap_mfn_start),
-                       mfn_to_maddr(xenheap_mfn_end));
+                       mfn_to_maddr(boot_mfn_start));
 }
 #else /* CONFIG_ARM_64 */
 static void __init setup_mm(void)