From bd2f06efa9125178a5219ce436637c8ea4e87b1f Mon Sep 17 00:00:00 2001 From: GuEe-GUI <2991707448@qq.com> Date: Mon, 1 Dec 2025 16:09:24 +0800 Subject: [PATCH 1/2] [MM] Fixup MM 1. Fixup some LOG_D args. 2. Stop installing page when `rt_aspace_map_phy` fail. Signed-off-by: GuEe-GUI <2991707448@qq.com> --- components/mm/mm_aspace.c | 2 +- components/mm/mm_memblock.c | 9 ++++++--- components/mm/mm_page.c | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/components/mm/mm_aspace.c b/components/mm/mm_aspace.c index 72cab4b0aab..1b91a33776b 100644 --- a/components/mm/mm_aspace.c +++ b/components/mm/mm_aspace.c @@ -641,7 +641,7 @@ static rt_varea_t _varea_create(void *start, rt_size_t size) } #define _IS_OVERFLOW(start, length) ((length) > (0ul - (uintptr_t)(start))) -#define _IS_OVERSIZE(start, length, limit_s, limit_sz) (((length) + (rt_size_t)((char *)(start) - (char *)(limit_start))) > (limit_size)) +#define _IS_OVERSIZE(start, length, limit_s, limit_sz) (((length) + (rt_size_t)((char *)(start) - (char *)(limit_s))) > (limit_sz)) static inline int _not_in_range(rt_size_t flags, void *start, rt_size_t length, void *limit_start, rt_size_t limit_size) diff --git a/components/mm/mm_memblock.c b/components/mm/mm_memblock.c index 3046c1caa92..57180508b9f 100644 --- a/components/mm/mm_memblock.c +++ b/components/mm/mm_memblock.c @@ -162,14 +162,14 @@ static rt_err_t _memblock_add_range(struct rt_memblock *memblock, rt_err_t rt_memblock_add_memory(const char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags) { LOG_D("add physical address range [0x%.*lx-0x%.*lx) with flag 0x%x" \ - " to overall memory regions\n", MIN_BIT, base, MIN_BIT, base + size, flag); + " to overall memory regions", MIN_BIT, start, MIN_BIT, end, flags); return _memblock_add_range(&mmblk_memory, name, start, end, flags); } rt_err_t rt_memblock_reserve_memory(const char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags) { - LOG_D("add physical address range %s [0x%.*lx-0x%.*lx) to reserved memory regions\n", + LOG_D("add physical address range %s [0x%.*lx-0x%.*lx) to reserved memory regions", name, MIN_BIT, start, MIN_BIT, end); return _memblock_add_range(&mmblk_reserved, name, start, end, flags); @@ -389,7 +389,10 @@ void rt_memblock_setup_memory_environment(void) .map_size = reg.end - reg.start, .prefer = (void *)reg.start}; - rt_aspace_map_phy(&rt_kernel_space, &hint, MMU_MAP_K_RWCB, (reg.start + PV_OFFSET) >> MM_PAGE_SHIFT, &err); + if (rt_aspace_map_phy(&rt_kernel_space, &hint, MMU_MAP_K_RWCB, + (reg.start + PV_OFFSET) >> MM_PAGE_SHIFT, &err)) + continue; + rt_page_install(reg); mem += reg.end - reg.start; } diff --git a/components/mm/mm_page.c b/components/mm/mm_page.c index 7f3b12805da..dcbef36c0d7 100644 --- a/components/mm/mm_page.c +++ b/components/mm/mm_page.c @@ -1168,7 +1168,7 @@ void rt_page_init(rt_region_t reg) shadow.start = reg.start & ~shadow_mask; shadow.end = CEIL(reg.end, shadow_mask + 1); LOG_D("[Init page] start: 0x%lx, end: 0x%lx, total: 0x%lx", reg.start, - reg.end, page_nr); + reg.end, ((reg.end - reg.start) >> ARCH_PAGE_SHIFT)); int err; From c2ecae8d283fd5bdeba06c0ce66da58d3a2f5e16 Mon Sep 17 00:00:00 2001 From: GuEe-GUI <2991707448@qq.com> Date: Mon, 1 Dec 2025 16:12:09 +0800 Subject: [PATCH 2/2] [MM] Support page MPR dynamic size For RISC-V or dynamic address space arch in the future. Signed-off-by: GuEe-GUI <2991707448@qq.com> --- components/mm/Kconfig | 7 +++++++ components/mm/mm_page.c | 23 ++++++++++++++++++++--- components/mm/mm_page.h | 5 +++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/components/mm/Kconfig b/components/mm/Kconfig index 5e189395386..2d47f454345 100644 --- a/components/mm/Kconfig +++ b/components/mm/Kconfig @@ -1,5 +1,12 @@ menu "Memory management" +config RT_PAGE_MPR_SIZE_DYNAMIC + bool "Page MPR size is dynamic" + default n + help + Some platforms' virtual address width is not a compile-time constant + and must be determined dynamically at runtime. + config RT_PAGE_AFFINITY_BLOCK_SIZE hex "Affinity block size in bytes for page management" default 0x1000 diff --git a/components/mm/mm_page.c b/components/mm/mm_page.c index dcbef36c0d7..5425b2b64ed 100644 --- a/components/mm/mm_page.c +++ b/components/mm/mm_page.c @@ -417,9 +417,26 @@ static inline rt_page_t addr_to_page(rt_page_t pg_start, void *addr) const rt_size_t shadow_mask = ((1ul << (RT_PAGE_MAX_ORDER + ARCH_PAGE_SHIFT - 1)) - 1); -const rt_size_t rt_mpr_size = CEIL( - ((1ul << (ARCH_VADDR_WIDTH - ARCH_PAGE_SHIFT))) * sizeof(struct rt_page), - ARCH_PAGE_SIZE); +#define MPR_SIZE CEIL( \ + ((1ul << (ARCH_VADDR_WIDTH - ARCH_PAGE_SHIFT))) * sizeof(struct rt_page), \ + ARCH_PAGE_SIZE) + +#ifdef RT_PAGE_MPR_SIZE_DYNAMIC +/** + * @brief Get the size of Memory Page Region (MPR) + * + * When RT_PAGE_MPR_SIZE_DYNAMIC is enabled, MPR size is calculated at runtime + * for platforms where virtual address width is not a compile-time constant. + * + * @return MPR size in bytes + */ +const rt_size_t rt_mpr_size_dynamic(void) +{ + return MPR_SIZE; +} +#else +const rt_size_t rt_mpr_size = MPR_SIZE; +#endif void *rt_mpr_start; diff --git a/components/mm/mm_page.h b/components/mm/mm_page.h index caa59d36659..9e7f03da1a3 100644 --- a/components/mm/mm_page.h +++ b/components/mm/mm_page.h @@ -70,7 +70,12 @@ typedef struct tag_region const char *name; } rt_region_t; +#ifdef RT_PAGE_MPR_SIZE_DYNAMIC +const rt_size_t rt_mpr_size_dynamic(void); +#define rt_mpr_size rt_mpr_size_dynamic() +#else extern const rt_size_t rt_mpr_size; +#endif extern void *rt_mpr_start; void rt_page_init(rt_region_t reg);