[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 1/3] arm/mpu: Implement setup_mm for MPU systems




On 12/11/2025 12:40, Orzel, Michal wrote:

On 11/11/2025 11:15, Harry Ramsey wrote:
Implement `setup_mm` for MPU systems. This variant does not require
setting up a direct map.

To reduce code duplication the common initalisation code for both MPU
and MMU Arm64 configurations is refactored into `setup_mm`. Platform-specific
setup steps are now handled by a new helper function `setup_mm_helper`.

Signed-off-by: Harry Ramsey <harry.ramsey@xxxxxxx>
---
Changes in v2:
- Improve clarity with regards to MPU setup in setup_mm
---
  xen/arch/arm/arm64/mmu/mm.c   | 26 +------------------
  xen/arch/arm/include/asm/mm.h |  2 ++
  xen/arch/arm/mm.c             | 48 +++++++++++++++++++++++++++++++++++
  xen/arch/arm/mpu/mm.c         | 30 ++++++++++++++++++++--
  4 files changed, 79 insertions(+), 27 deletions(-)

diff --git a/xen/arch/arm/arm64/mmu/mm.c b/xen/arch/arm/arm64/mmu/mm.c
index 3e64be6ae6..70b53be032 100644
--- a/xen/arch/arm/arm64/mmu/mm.c
+++ b/xen/arch/arm/arm64/mmu/mm.c
@@ -4,8 +4,6 @@
  #include <xen/llc-coloring.h>
  #include <xen/mm.h>
  #include <xen/pfn.h>
-#include <xen/static-memory.h>
-#include <xen/static-shmem.h>

  #include <asm/setup.h>

@@ -240,33 +238,18 @@ static void __init setup_directmap_mappings(unsigned long 
base_mfn,
          panic("Unable to setup the directmap mappings.\n");
  }

-void __init setup_mm(void)
+void __init setup_mm_helper(void)
  {
      const struct membanks *banks = bootinfo_get_mem();
      paddr_t ram_start = INVALID_PADDR;
      paddr_t ram_end = 0;
-    paddr_t ram_size = 0;
      unsigned int i;

-    init_pdx();
-
-    /*
-     * We need some memory to allocate the page-tables used for the directmap
-     * mappings. But some regions may contain memory already allocated
-     * for other uses (e.g. modules, reserved-memory...).
-     *
-     * For simplicity, add all the free regions in the boot allocator.
-     */
-    populate_boot_allocator();
-
-    total_pages = 0;
-
      for ( i = 0; i < banks->nr_banks; i++ )
      {
          const struct membank *bank = &banks->bank[i];
          paddr_t bank_end = bank->start + bank->size;

-        ram_size = ram_size + bank->size;
          ram_start = min(ram_start, bank->start);
          ram_end = max(ram_end, bank_end);

@@ -274,16 +257,9 @@ void __init setup_mm(void)
                                   PFN_DOWN(bank->size));
      }

-    total_pages += ram_size >> PAGE_SHIFT;
-
      directmap_virt_end = XENHEAP_VIRT_START + ram_end - ram_start;
      directmap_mfn_start = maddr_to_mfn(ram_start);
      directmap_mfn_end = maddr_to_mfn(ram_end);
-
-    setup_frametable_mappings(ram_start, ram_end);
-
-    init_staticmem_pages();
-    init_sharedmem_pages();
  }

  /*
diff --git a/xen/arch/arm/include/asm/mm.h b/xen/arch/arm/include/asm/mm.h
index 7a93dad2ed..f702f4a0d6 100644
--- a/xen/arch/arm/include/asm/mm.h
+++ b/xen/arch/arm/include/asm/mm.h
@@ -202,6 +202,8 @@ extern void remove_early_mappings(void);
  extern int prepare_secondary_mm(int cpu);
  /* Map a frame table to cover physical addresses ps through pe */
  extern void setup_frametable_mappings(paddr_t ps, paddr_t pe);
+/* Helper function to setup memory management */
+void setup_mm_helper(void);
  /* map a physical range in virtual memory */
  void __iomem *ioremap_attr(paddr_t start, size_t len, unsigned int 
attributes);

diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
index 3b05b46ee0..c1208de26c 100644
--- a/xen/arch/arm/mm.c
+++ b/xen/arch/arm/mm.c
@@ -12,8 +12,12 @@
  #include <xen/grant_table.h>
  #include <xen/guest_access.h>
  #include <xen/mm.h>
+#include <xen/static-memory.h>
+#include <xen/static-shmem.h>
  #include <xen/vmap.h>

+#include <asm/setup.h>
+
  #include <xsm/xsm.h>

  #include <public/memory.h>
@@ -24,6 +28,50 @@

  unsigned long frametable_base_pdx __read_mostly;

+#if defined(CONFIG_ARM_64) || defined(CONFIG_MPU)
+void __init setup_mm(void)
+{
+    const struct membanks *banks = bootinfo_get_mem();
+    paddr_t ram_start = INVALID_PADDR;
+    paddr_t ram_end = 0;
+    paddr_t ram_size = 0;
+    unsigned int i;
+
+    init_pdx();
+
+    for ( i = 0; i < banks->nr_banks; i++ )
+    {
+        const struct membank *bank = &banks->bank[i];
+        paddr_t bank_end = bank->start + bank->size;
+
+        ram_size = ram_size + bank->size;
+        ram_start = min(ram_start, bank->start);
+        ram_end = max(ram_end, bank_end);
+    }
+
+    total_pages = ram_size >> PAGE_SHIFT;
+
+    /*
+     * On MMU systems we need some memory to allocate the page-tables used for
+     * the directmap mappings.  But some regions may contain memory already
+     * allocated for other uses (e.g. modules, reserved-memory...).
+     *
+     * On MPU systems we need to pre-reserve regions that were allocated for
+     * other uses (e.g. modules, reserved-memory...).
I'm not sure I understand this part of the comment with regards to
populate_boot_allocator(). Could you please explain?
I think I should remove the MPU section and move this comment into patch 3 as it is confusing without the additional context of reference counting.

During Xen initialization, the MPU assigns a refcount of 1 to pre-allocated regions in head.S prepare_xen_region. Unlike an MMU, an MPU has no virtual memory, so we must prevent these regions from being freed or remapped to non-preallocated areas.


~Michal

~Harry



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.