Przeglądaj źródła

[MM] Update MM System (#10989)

* [MM] Fixup MM

1. Fixup some LOG_D args.
2. Stop installing page when `rt_aspace_map_phy` fail.

* [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>
GUI 1 miesiąc temu
rodzic
commit
7836d26d39

+ 7 - 0
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

+ 1 - 1
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)

+ 6 - 3
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;
     }

+ 21 - 4
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;
 
@@ -1168,7 +1185,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;
 

+ 5 - 0
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);