[Xen-devel,for-4.13,v2] xen/arm32: setup: Give a xenheap page to the boot allocator

Message ID 20190920093130.11842-1-julien.grall@arm.com
State New
Headers show
Series
  • [Xen-devel,for-4.13,v2] xen/arm32: setup: Give a xenheap page to the boot allocator
Related show

Commit Message

Julien Grall Sept. 20, 2019, 9:31 a.m.
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 implicitely rely 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.

Fixes: 6e3e771203 ('xen/arm: setup: Relocate the Device-Tree later on in the boot')
Signed-off-by: Julien Grall <julien.grall@arm.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>

---
    Changes in v2:
        - Add Jan's reviewed-by
        - Use boot_mfn_start rather than boot_mfn_end when giving
        xenheap pages.
---
 xen/arch/arm/setup.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

Comments

Stefano Stabellini Sept. 20, 2019, 3:22 p.m. | #1
On Fri, 20 Sep 2019, Julien Grall wrote:
> 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 implicitely rely on having the first page

"implicitly relies"

I fixed the commit message and committed.

Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>


> 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.
> 
> Fixes: 6e3e771203 ('xen/arm: setup: Relocate the Device-Tree later on in the boot')
> Signed-off-by: Julien Grall <julien.grall@arm.com>
> Reviewed-by: Jan Beulich <jbeulich@suse.com>
> ---
>     Changes in v2:
>         - Add Jan's reviewed-by
>         - Use boot_mfn_start rather than boot_mfn_end when giving
>         xenheap pages.
> ---
>  xen/arch/arm/setup.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
> index 581b262655..fca7e68cba 100644
> --- a/xen/arch/arm/setup.c
> +++ b/xen/arch/arm/setup.c
> @@ -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)
> -- 
> 2.11.0
>

Patch

diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index 581b262655..fca7e68cba 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -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)