diff options
Diffstat (limited to 'components')
| -rw-r--r-- | components/lwp/lwp.c | 2 | ||||
| -rw-r--r-- | components/lwp/lwp_pid.c | 4 | ||||
| -rw-r--r-- | components/mm/mm_kmem.c | 48 | ||||
| -rw-r--r-- | components/mm/mm_page.c | 9 |
4 files changed, 61 insertions, 2 deletions
diff --git a/components/lwp/lwp.c b/components/lwp/lwp.c index c6f87a60bf..90f7b35e43 100644 --- a/components/lwp/lwp.c +++ b/components/lwp/lwp.c @@ -1097,6 +1097,8 @@ static void _lwp_thread_entry(void *parameter) icache_invalid_all(); } + rt_hw_icache_invalidate_all(); + #ifdef ARCH_MM_MMU arch_start_umode(lwp->args, lwp->text_entry, (void *)USER_STACK_VEND, tid->stack_addr + tid->stack_size); #else diff --git a/components/lwp/lwp_pid.c b/components/lwp/lwp_pid.c index 1979a6a8fd..caff790f5e 100644 --- a/components/lwp/lwp_pid.c +++ b/components/lwp/lwp_pid.c @@ -467,6 +467,10 @@ void lwp_free(struct rt_lwp* lwp) } } } + else + { + level = rt_hw_interrupt_disable(); + } /* for parent */ { diff --git a/components/mm/mm_kmem.c b/components/mm/mm_kmem.c index 4d7854f04a..3559aa6ab4 100644 --- a/components/mm/mm_kmem.c +++ b/components/mm/mm_kmem.c @@ -8,8 +8,14 @@ * 2022-11-14 WangXiaoyao the first version */ +#include <rtthread.h> +#define DBG_TAG "mm.kmem" +#define DBG_LVL DBG_INFO +#include <rtdbg.h> + #include "mm_aspace.h" #include "mm_private.h" +#include <mmu.h> static void list_kernel_space(void) { @@ -30,3 +36,45 @@ void rt_kmem_pvoff_set(rt_ubase_t pvoff) { rt_pv_offset = pvoff; } + +#define _KMEM_LO_OFF(addr) ((rt_ubase_t)(addr) & ARCH_PAGE_MASK) + +int rt_kmem_map_phy(void *va, void *pa, rt_size_t length, rt_size_t attr) +{ + int err; + size_t lo_off; + lo_off = _KMEM_LO_OFF(pa); + + if (va == RT_NULL) + { + LOG_E("%s: va NULL is not a valid input", __func__); + err = -RT_EINVAL; + } + else if (_KMEM_LO_OFF(pa) != _KMEM_LO_OFF(va)) + { + LOG_E("%s: misaligned PA(%p) to VA(%p)", __func__, pa, va); + err = -RT_EINVAL; + } + else + { + struct rt_mm_va_hint hint = {.flags = MMF_MAP_FIXED, + .limit_range_size = rt_kernel_space.size, + .limit_start = rt_kernel_space.start, + .prefer = va, + .map_size = RT_ALIGN(length + lo_off, ARCH_PAGE_SIZE)}; + + err = rt_aspace_map_phy(&rt_kernel_space, &hint, attr, MM_PA_TO_OFF(pa), &va); + + if (err) + { + LOG_W("%s: map %p to %p (%p bytes) failed(err %d)", __func__, pa, va, length, err); + } + } + + return err; +} + +void *rt_kmem_v2p(void *vaddr) +{ + return rt_hw_mmu_v2p(&rt_kernel_space, vaddr); +} diff --git a/components/mm/mm_page.c b/components/mm/mm_page.c index bacade4f5e..a53b62aba7 100644 --- a/components/mm/mm_page.c +++ b/components/mm/mm_page.c @@ -402,13 +402,18 @@ static rt_page_t (*pages_alloc_handler)(rt_uint32_t size_bits); void *rt_pages_alloc(rt_uint32_t size_bits) { + void *alloc_buf = RT_NULL; struct rt_page *p; rt_base_t level; level = rt_hw_interrupt_disable(); p = pages_alloc_handler(size_bits); rt_hw_interrupt_enable(level); - return page_to_addr(p); + if (p) + { + alloc_buf = page_to_addr(p); + } + return alloc_buf; } int rt_pages_free(void *addr, rt_uint32_t size_bits) @@ -452,7 +457,7 @@ void list_page(void) rt_kprintf("\n"); } rt_hw_interrupt_enable(level); - rt_kprintf("free pages is 0x%08x\n", total); + rt_kprintf("free pages is 0x%08lx (%ld KB)\n", total, total * ARCH_PAGE_SIZE / 1024); rt_kprintf("-------------------------------\n"); } MSH_CMD_EXPORT(list_page, show page info); |
