Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions components/mm/Kconfig
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion components/mm/mm_aspace.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
9 changes: 6 additions & 3 deletions components/mm/mm_memblock.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand Down
25 changes: 21 additions & 4 deletions components/mm/mm_page.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand Down
5 changes: 5 additions & 0 deletions components/mm/mm_page.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down