|
[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 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?
~Michal
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |