mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2025-12-27 17:40:22 +00:00
[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
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user