From f0dadcb3c390e60463afa5892d2d65e6033d82c8 Mon Sep 17 00:00:00 2001 From: Shell Date: Mon, 16 Jan 2023 08:24:03 +0800 Subject: [rt-smart] porting c906 and D1s to mm (#6848) * [rv64/bsp] porting to mm * [mm] report more info for debugging * [fix] code format * [libcpu/c906] porting to RTOS * [fix] using rtdbg api * [fix] add return * [fix] report more information for debugging * [fix] use assert 0 for unrecoverable error --- components/mm/mm_aspace.c | 27 +++++++++++++++++-------- components/mm/mm_fault.c | 8 ++++---- components/mm/mm_page.c | 51 +++++++++++++++++++++++++++++++---------------- 3 files changed, 57 insertions(+), 29 deletions(-) (limited to 'components') diff --git a/components/mm/mm_aspace.c b/components/mm/mm_aspace.c index 9bb91239e6..df296b1782 100644 --- a/components/mm/mm_aspace.c +++ b/components/mm/mm_aspace.c @@ -17,6 +17,10 @@ #include #include +#define DBG_TAG "mm.aspace" +#define DBG_LVL DBG_INFO +#include + #include "avl_adpt.h" #include "mm_aspace.h" #include "mm_fault.h" @@ -31,10 +35,6 @@ #define PV_OFFSET 0 #endif -#define DBG_TAG "mm.aspace" -#define DBG_LVL DBG_INFO -#include - static void _aspace_unmap(rt_aspace_t aspace, void *addr, rt_size_t length); static void *_find_free(rt_aspace_t aspace, void *prefer, rt_size_t req_size, void *limit_start, rt_size_t limit_size, @@ -138,6 +138,7 @@ void rt_aspace_delete(rt_aspace_t aspace) static int _do_named_map(rt_aspace_t aspace, void *vaddr, rt_size_t length, rt_size_t offset, rt_size_t attr) { + LOG_D("%s: va %p length %p", __func__, vaddr, length); int err = RT_EOK; /* it's ensured by caller that (void*)end will not overflow */ @@ -288,6 +289,7 @@ static int _mm_aspace_map(rt_aspace_t aspace, rt_varea_t varea, rt_size_t attr, static inline int _not_in_range(void *start, rt_size_t length, void *limit_start, rt_size_t limit_size) { + LOG_D("%s: [%p : %p] [%p : %p]", __func__, start, length, limit_start, limit_size); /* assuming (base + length) will not overflow except (0) */ return start != ARCH_MAP_FAILED ? ((length > (0ul - (uintptr_t)start)) || start < limit_start || @@ -336,6 +338,7 @@ int rt_aspace_map(rt_aspace_t aspace, void **addr, rt_size_t length, } else { + LOG_W("%s: mm aspace map failed", __func__); err = -RT_ENOMEM; } } @@ -393,14 +396,22 @@ int _mm_aspace_map_phy(rt_aspace_t aspace, rt_varea_t varea, int err; void *vaddr; - if (!aspace || !hint || !hint->limit_range_size || !hint->map_size || - _not_align(hint->prefer, hint->map_size, ARCH_PAGE_MASK) || - _not_in_range(hint->limit_start, hint->limit_range_size, aspace->start, + if (!aspace || !hint || !hint->limit_range_size || !hint->map_size) + { + LOG_W("%s: Invalid input", __func__); + err = -RT_EINVAL; + } + else if (_not_align(hint->prefer, hint->map_size, ARCH_PAGE_MASK)) + { + LOG_W("%s: not aligned", __func__); + err = -RT_EINVAL; + } + else if (_not_in_range(hint->limit_start, hint->limit_range_size, aspace->start, aspace->size) || _not_in_range(hint->prefer, hint->map_size, aspace->start, aspace->size)) { - LOG_I("%s: Invalid input", __func__); + LOG_W("%s: not in range", __func__); err = -RT_EINVAL; } else diff --git a/components/mm/mm_fault.c b/components/mm/mm_fault.c index 08d7c84196..79274e7f8a 100644 --- a/components/mm/mm_fault.c +++ b/components/mm/mm_fault.c @@ -10,6 +10,10 @@ #include #ifdef RT_USING_SMART +#define DBG_TAG "mm.fault" +#define DBG_LVL DBG_INFO +#include + #include #include #include "mm_aspace.h" @@ -19,10 +23,6 @@ #include #include -#define DBG_TAG "mm.fault" -#define DBG_LVL DBG_INFO -#include - #define UNRECOVERABLE 0 #define RECOVERABLE 1 diff --git a/components/mm/mm_page.c b/components/mm/mm_page.c index 7d897789da..2da22457a8 100644 --- a/components/mm/mm_page.c +++ b/components/mm/mm_page.c @@ -490,6 +490,11 @@ void rt_page_init(rt_region_t reg) reg.start += ARCH_PAGE_MASK; reg.start &= ~ARCH_PAGE_MASK; reg.end &= ~ARCH_PAGE_MASK; + if (reg.end <= reg.start) + { + LOG_E("region end(%p) must greater than start(%p)", reg.start, reg.end); + RT_ASSERT(0); + } page_nr = ((reg.end - reg.start) >> ARCH_PAGE_SHIFT); shadow.start = reg.start & ~shadow_mask; shadow.end = FLOOR(reg.end, shadow_mask + 1); @@ -512,8 +517,7 @@ void rt_page_init(rt_region_t reg) if (err != RT_EOK) { LOG_E("MPR map failed with size %lx at %p", rt_mpr_size, rt_mpr_start); - while (1) - ; + RT_ASSERT(0); } /* calculate footprint */ @@ -583,14 +587,19 @@ void rt_page_init(rt_region_t reg) pages_alloc_handler = _early_pages_alloc; /* doing the page table bushiness */ - rt_aspace_load_page(&rt_kernel_space, (void *)init_mpr_align_start, - init_mpr_npage); + if (rt_aspace_load_page(&rt_kernel_space, (void *)init_mpr_align_start, init_mpr_npage)) + { + LOG_E("%s: failed to load pages", __func__); + RT_ASSERT(0); + } + if (rt_hw_mmu_tbl_get() == rt_kernel_space.page_table) rt_page_cleanup(); } -static void _load_mpr_area(void *head, void *tail) +static int _load_mpr_area(void *head, void *tail) { + int err = 0; void *iter = (void *)((uintptr_t)head & ~ARCH_PAGE_MASK); tail = (void *)FLOOR(tail, ARCH_PAGE_SIZE); @@ -599,10 +608,16 @@ static void _load_mpr_area(void *head, void *tail) void *paddr = rt_kmem_v2p(iter); if (paddr == ARCH_MAP_FAILED) { - rt_aspace_load_page(&rt_kernel_space, iter, 1); + err = rt_aspace_load_page(&rt_kernel_space, iter, 1); + if (err != RT_EOK) + { + LOG_E("%s: failed to load page", __func__); + break; + } } iter += ARCH_PAGE_SIZE; } + return err; } int rt_page_install(rt_region_t region) @@ -617,22 +632,24 @@ int rt_page_install(rt_region_t region) page_nr += ((region.end - region.start) >> ARCH_PAGE_SHIFT); - _load_mpr_area(head, tail); + err = _load_mpr_area(head, tail); - while (region.start != region.end) + if (err == RT_EOK) { - struct rt_page *p; - int size_bits; + while (region.start != region.end) + { + struct rt_page *p; + int size_bits; - size_bits = RT_PAGE_MAX_ORDER - 1; - p = addr_to_page(page_start, (void *)region.start); - p->size_bits = ARCH_ADDRESS_WIDTH_BITS; - p->ref_cnt = 1; + size_bits = RT_PAGE_MAX_ORDER - 1; + p = addr_to_page(page_start, (void *)region.start); + p->size_bits = ARCH_ADDRESS_WIDTH_BITS; + p->ref_cnt = 1; - _pages_free(p, size_bits); - region.start += (1UL << (size_bits + ARCH_PAGE_SHIFT)); + _pages_free(p, size_bits); + region.start += (1UL << (size_bits + ARCH_PAGE_SHIFT)); + } } - err = 0; } return err; } -- cgit v1.3.1