summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorwangxiaoyao <[email protected]>2023-02-20 13:48:00 +0800
committerguo <[email protected]>2023-02-21 08:48:49 +0800
commit484a0d602e8b571a9d8186d38c8b136abc4ccfc9 (patch)
tree399ef1a1718bffed545a7354bbf2a8f8133e9c23 /components
parentf84d89b0ca9c8982d436aa12be75554722462090 (diff)
[fixup] add cache maintenance ops;
fix bugs on cache maintenance when starting user app
Diffstat (limited to 'components')
-rw-r--r--components/lwp/lwp.c2
-rw-r--r--components/lwp/lwp_pid.c4
-rw-r--r--components/mm/mm_kmem.c48
-rw-r--r--components/mm/mm_page.c9
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);