summaryrefslogtreecommitdiff
path: root/components/mm
diff options
context:
space:
mode:
authorShell <[email protected]>2023-01-16 08:24:03 +0800
committerGitHub <[email protected]>2023-01-16 08:24:03 +0800
commitf0dadcb3c390e60463afa5892d2d65e6033d82c8 (patch)
treed82a527a7956eef53989680082cfd8180ef7b46a /components/mm
parentfec7404506c677748887067952861a28b2e4a068 (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.c27
-rw-r--r--components/mm/mm_fault.c8
-rw-r--r--components/mm/mm_page.c51
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;
}