Skip to content

Commit 7836d26

Browse files
authored
[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>
1 parent e5e0ad2 commit 7836d26

File tree

5 files changed

+40
-8
lines changed

5 files changed

+40
-8
lines changed

components/mm/Kconfig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
menu "Memory management"
22

3+
config RT_PAGE_MPR_SIZE_DYNAMIC
4+
bool "Page MPR size is dynamic"
5+
default n
6+
help
7+
Some platforms' virtual address width is not a compile-time constant
8+
and must be determined dynamically at runtime.
9+
310
config RT_PAGE_AFFINITY_BLOCK_SIZE
411
hex "Affinity block size in bytes for page management"
512
default 0x1000

components/mm/mm_aspace.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,7 @@ static rt_varea_t _varea_create(void *start, rt_size_t size)
641641
}
642642

643643
#define _IS_OVERFLOW(start, length) ((length) > (0ul - (uintptr_t)(start)))
644-
#define _IS_OVERSIZE(start, length, limit_s, limit_sz) (((length) + (rt_size_t)((char *)(start) - (char *)(limit_start))) > (limit_size))
644+
#define _IS_OVERSIZE(start, length, limit_s, limit_sz) (((length) + (rt_size_t)((char *)(start) - (char *)(limit_s))) > (limit_sz))
645645

646646
static inline int _not_in_range(rt_size_t flags, void *start, rt_size_t length,
647647
void *limit_start, rt_size_t limit_size)

components/mm/mm_memblock.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,14 +162,14 @@ static rt_err_t _memblock_add_range(struct rt_memblock *memblock,
162162
rt_err_t rt_memblock_add_memory(const char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags)
163163
{
164164
LOG_D("add physical address range [0x%.*lx-0x%.*lx) with flag 0x%x" \
165-
" to overall memory regions\n", MIN_BIT, base, MIN_BIT, base + size, flag);
165+
" to overall memory regions", MIN_BIT, start, MIN_BIT, end, flags);
166166

167167
return _memblock_add_range(&mmblk_memory, name, start, end, flags);
168168
}
169169

170170
rt_err_t rt_memblock_reserve_memory(const char *name, rt_size_t start, rt_size_t end, mmblk_flag_t flags)
171171
{
172-
LOG_D("add physical address range %s [0x%.*lx-0x%.*lx) to reserved memory regions\n",
172+
LOG_D("add physical address range %s [0x%.*lx-0x%.*lx) to reserved memory regions",
173173
name, MIN_BIT, start, MIN_BIT, end);
174174

175175
return _memblock_add_range(&mmblk_reserved, name, start, end, flags);
@@ -389,7 +389,10 @@ void rt_memblock_setup_memory_environment(void)
389389
.map_size = reg.end - reg.start,
390390
.prefer = (void *)reg.start};
391391

392-
rt_aspace_map_phy(&rt_kernel_space, &hint, MMU_MAP_K_RWCB, (reg.start + PV_OFFSET) >> MM_PAGE_SHIFT, &err);
392+
if (rt_aspace_map_phy(&rt_kernel_space, &hint, MMU_MAP_K_RWCB,
393+
(reg.start + PV_OFFSET) >> MM_PAGE_SHIFT, &err))
394+
continue;
395+
393396
rt_page_install(reg);
394397
mem += reg.end - reg.start;
395398
}

components/mm/mm_page.c

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -417,9 +417,26 @@ static inline rt_page_t addr_to_page(rt_page_t pg_start, void *addr)
417417
const rt_size_t shadow_mask =
418418
((1ul << (RT_PAGE_MAX_ORDER + ARCH_PAGE_SHIFT - 1)) - 1);
419419

420-
const rt_size_t rt_mpr_size = CEIL(
421-
((1ul << (ARCH_VADDR_WIDTH - ARCH_PAGE_SHIFT))) * sizeof(struct rt_page),
422-
ARCH_PAGE_SIZE);
420+
#define MPR_SIZE CEIL( \
421+
((1ul << (ARCH_VADDR_WIDTH - ARCH_PAGE_SHIFT))) * sizeof(struct rt_page), \
422+
ARCH_PAGE_SIZE)
423+
424+
#ifdef RT_PAGE_MPR_SIZE_DYNAMIC
425+
/**
426+
* @brief Get the size of Memory Page Region (MPR)
427+
*
428+
* When RT_PAGE_MPR_SIZE_DYNAMIC is enabled, MPR size is calculated at runtime
429+
* for platforms where virtual address width is not a compile-time constant.
430+
*
431+
* @return MPR size in bytes
432+
*/
433+
const rt_size_t rt_mpr_size_dynamic(void)
434+
{
435+
return MPR_SIZE;
436+
}
437+
#else
438+
const rt_size_t rt_mpr_size = MPR_SIZE;
439+
#endif
423440

424441
void *rt_mpr_start;
425442

@@ -1168,7 +1185,7 @@ void rt_page_init(rt_region_t reg)
11681185
shadow.start = reg.start & ~shadow_mask;
11691186
shadow.end = CEIL(reg.end, shadow_mask + 1);
11701187
LOG_D("[Init page] start: 0x%lx, end: 0x%lx, total: 0x%lx", reg.start,
1171-
reg.end, page_nr);
1188+
reg.end, ((reg.end - reg.start) >> ARCH_PAGE_SHIFT));
11721189

11731190
int err;
11741191

components/mm/mm_page.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,12 @@ typedef struct tag_region
7070
const char *name;
7171
} rt_region_t;
7272

73+
#ifdef RT_PAGE_MPR_SIZE_DYNAMIC
74+
const rt_size_t rt_mpr_size_dynamic(void);
75+
#define rt_mpr_size rt_mpr_size_dynamic()
76+
#else
7377
extern const rt_size_t rt_mpr_size;
78+
#endif
7479
extern void *rt_mpr_start;
7580

7681
void rt_page_init(rt_region_t reg);

0 commit comments

Comments
 (0)