diff options
| author | Shell <[email protected]> | 2023-01-16 08:24:03 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-01-16 08:24:03 +0800 |
| commit | f0dadcb3c390e60463afa5892d2d65e6033d82c8 (patch) | |
| tree | d82a527a7956eef53989680082cfd8180ef7b46a /components/mm | |
| parent | fec7404506c677748887067952861a28b2e4a068 (diff) | |
[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
Diffstat (limited to 'components/mm')
| -rw-r--r-- | components/mm/mm_aspace.c | 27 | ||||
| -rw-r--r-- | components/mm/mm_fault.c | 8 | ||||
| -rw-r--r-- | components/mm/mm_page.c | 51 |
3 files changed, 57 insertions, 29 deletions
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 <stddef.h> #include <stdint.h> +#define DBG_TAG "mm.aspace" +#define DBG_LVL DBG_INFO +#include <rtdbg.h> + #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 <rtdbg.h> - 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 <rtthread.h> #ifdef RT_USING_SMART +#define DBG_TAG "mm.fault" +#define DBG_LVL DBG_INFO +#include <rtdbg.h> + #include <lwp.h> #include <lwp_syscall.h> #include "mm_aspace.h" @@ -19,10 +23,6 @@ #include <mmu.h> #include <tlb.h> -#define DBG_TAG "mm.fault" -#define DBG_LVL DBG_INFO -#include <rtdbg.h> - #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; } |
