summaryrefslogtreecommitdiff
path: root/components/lwp
diff options
context:
space:
mode:
authorShell <[email protected]>2023-04-22 23:59:11 +0800
committerGitHub <[email protected]>2023-04-22 23:59:11 +0800
commit470454d201ebb89aa72525f8c3fb562e372f4f56 (patch)
treee0a3ba80fb727a02b1981053934a9d50469e328a /components/lwp
parent90c69a0588090e181e4ce12767738b1853510d3f (diff)
[components/mm] support for scalable memory management (#7277)
* [mm/page] multi-list page manager [mm/page] page debugger [libcpu/aarch64] hugepage support * [quality] remove void-arith * [format] remove kasan codes
Diffstat (limited to 'components/lwp')
-rw-r--r--components/lwp/arch/aarch64/cortex-a/lwp_arch.c2
-rw-r--r--components/lwp/arch/risc-v/rv64/lwp_arch.c2
-rw-r--r--components/lwp/arch/x86/i386/lwp_arch.c2
-rw-r--r--components/lwp/lwp.c15
-rw-r--r--components/lwp/lwp_shm.c7
-rw-r--r--components/lwp/lwp_syscall.c10
-rw-r--r--components/lwp/lwp_user_mm.c15
7 files changed, 33 insertions, 20 deletions
diff --git a/components/lwp/arch/aarch64/cortex-a/lwp_arch.c b/components/lwp/arch/aarch64/cortex-a/lwp_arch.c
index eb6d4dd4f2..da9e5f94bd 100644
--- a/components/lwp/arch/aarch64/cortex-a/lwp_arch.c
+++ b/components/lwp/arch/aarch64/cortex-a/lwp_arch.c
@@ -26,7 +26,7 @@ int arch_user_space_init(struct rt_lwp *lwp)
{
size_t *mmu_table;
- mmu_table = (size_t *)rt_pages_alloc(0);
+ mmu_table = (size_t *)rt_pages_alloc_ext(0, PAGE_ANY_AVAILABLE);
if (!mmu_table)
{
return -RT_ENOMEM;
diff --git a/components/lwp/arch/risc-v/rv64/lwp_arch.c b/components/lwp/arch/risc-v/rv64/lwp_arch.c
index 7d58294c61..b2315a614f 100644
--- a/components/lwp/arch/risc-v/rv64/lwp_arch.c
+++ b/components/lwp/arch/risc-v/rv64/lwp_arch.c
@@ -91,7 +91,7 @@ int arch_user_space_init(struct rt_lwp *lwp)
{
rt_ubase_t *mmu_table;
- mmu_table = (rt_ubase_t *)rt_pages_alloc(0);
+ mmu_table = (rt_ubase_t *)rt_pages_alloc_ext(0, PAGE_ANY_AVAILABLE);
if (!mmu_table)
{
return -RT_ENOMEM;
diff --git a/components/lwp/arch/x86/i386/lwp_arch.c b/components/lwp/arch/x86/i386/lwp_arch.c
index 9f9e846582..4b054f969b 100644
--- a/components/lwp/arch/x86/i386/lwp_arch.c
+++ b/components/lwp/arch/x86/i386/lwp_arch.c
@@ -82,7 +82,7 @@ int arch_user_space_init(struct rt_lwp *lwp)
{
rt_size_t *mmu_table;
- mmu_table = (rt_size_t *)rt_pages_alloc(0);
+ mmu_table = (rt_size_t *)rt_pages_alloc_ext(0, PAGE_ANY_AVAILABLE);
if (!mmu_table)
{
return -1;
diff --git a/components/lwp/lwp.c b/components/lwp/lwp.c
index 375ac9b317..a341c1b977 100644
--- a/components/lwp/lwp.c
+++ b/components/lwp/lwp.c
@@ -9,6 +9,7 @@
* 2018-11-02 heyuanjie fix complie error in iar
* 2021-02-03 lizhirui add 64-bit arch support and riscv64 arch support
* 2021-08-26 linzhenxing add lwp_setcwd\lwp_getcwd
+ * 2023-02-20 wangxiaoyao inv icache before new app startup
*/
#include <rthw.h>
@@ -1097,10 +1098,22 @@ static void _lwp_thread_entry(void *parameter)
icache_invalid_all();
}
+ /**
+ * without ASID support, it will be a special case when trying to run application
+ * and exit multiple times and a same page frame allocated to it bound to
+ * different text segment. Then we are in a situation where icache contains
+ * out-of-dated data and must be handle by the running core itself.
+ * with ASID support, this should be a rare case that ASID & page frame both
+ * identical to previous running application.
+ *
+ * For a new application loaded into memory, icache are seen as empty. And there
+ * should be nothing in the icache entry to match. So this icache invalidation
+ * operation should have barely influence.
+ */
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);
+ arch_start_umode(lwp->args, lwp->text_entry, (void *)USER_STACK_VEND, (char *)tid->stack_addr + tid->stack_size);
#else
arch_start_umode(lwp->args, lwp->text_entry, lwp->data_entry, (void *)((uint32_t)lwp->data_entry + lwp->data_size));
#endif /* ARCH_MM_MMU */
diff --git a/components/lwp/lwp_shm.c b/components/lwp/lwp_shm.c
index f2bacf1b13..7ee7e29d8c 100644
--- a/components/lwp/lwp_shm.c
+++ b/components/lwp/lwp_shm.c
@@ -6,6 +6,7 @@
* Change Logs:
* Date Author Notes
* 2019-10-12 Jesven first version
+ * 2023-02-20 wangxiaoyao adapt to mm
*/
#include <rthw.h>
#include <rtthread.h>
@@ -17,8 +18,6 @@
#include <lwp_user_mm.h>
#include <mmu.h>
-#include <mm_aspace.h>
-#include <mm_flag.h>
/* the kernel structure to represent a share-memory */
struct lwp_shm_struct
@@ -64,7 +63,7 @@ static void on_shm_page_fault(struct rt_varea *varea, struct rt_aspace_fault_msg
/* map all share page frames to user space in a time */
void *page = (void *)shm->addr;
- void *pg_paddr = page + PV_OFFSET;
+ void *pg_paddr = (char *)page + PV_OFFSET;
err = rt_varea_map_range(varea, varea->start, pg_paddr, shm->size);
if (err == RT_EOK)
@@ -140,7 +139,7 @@ static int _lwp_shmget(size_t key, size_t size, int create)
/* allocate pages up to 2's exponent to cover the required size */
bit = rt_page_bits(size);
- page_addr = rt_pages_alloc(bit); /* virtual address */
+ page_addr = rt_pages_alloc_ext(bit, PAGE_ANY_AVAILABLE); /* virtual address */
if (!page_addr)
{
goto err;
diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c
index 8d07a9388d..6f8479e26a 100644
--- a/components/lwp/lwp_syscall.c
+++ b/components/lwp/lwp_syscall.c
@@ -306,7 +306,7 @@ static void _crt_thread_entry(void *parameter)
user_stack &= ~7; //align 8
#ifdef ARCH_MM_MMU
- arch_crt_start_umode(parameter, tid->user_entry, (void *)user_stack, tid->stack_addr + tid->stack_size);
+ arch_crt_start_umode(parameter, tid->user_entry, (void *)user_stack, (char *)tid->stack_addr + tid->stack_size);
#else
set_user_context((void*)user_stack);
arch_start_umode(parameter, tid->user_entry, ((struct rt_lwp *)tid->lwp)->data_entry, (void*)user_stack);
@@ -1861,7 +1861,7 @@ static char *_insert_args(int new_argc, char *new_argv[], struct lwp_args_info *
{
goto quit;
}
- page = rt_pages_alloc(0); /* 1 page */
+ page = rt_pages_alloc_ext(0, PAGE_ANY_AVAILABLE); /* 1 page */
if (!page)
{
goto quit;
@@ -2065,7 +2065,7 @@ int load_ldso(struct rt_lwp *lwp, char *exec_name, char *const argv[], char *con
}
}
- page = rt_pages_alloc(0); /* 1 page */
+ page = rt_pages_alloc_ext(0, PAGE_ANY_AVAILABLE); /* 1 page */
if (!page)
{
SET_ERRNO(ENOMEM);
@@ -2252,7 +2252,7 @@ sysret_t sys_execve(const char *path, char *const argv[], char *const envp[])
SET_ERRNO(EINVAL);
goto quit;
}
- page = rt_pages_alloc(0); /* 1 page */
+ page = rt_pages_alloc_ext(0, PAGE_ANY_AVAILABLE); /* 1 page */
if (!page)
{
SET_ERRNO(ENOMEM);
@@ -2396,7 +2396,7 @@ sysret_t sys_execve(const char *path, char *const argv[], char *const envp[])
arch_start_umode(lwp->args,
lwp->text_entry,
(void*)USER_STACK_VEND,
- thread->stack_addr + thread->stack_size);
+ (char *)thread->stack_addr + thread->stack_size);
/* never reach here */
}
return -EINVAL;
diff --git a/components/lwp/lwp_user_mm.c b/components/lwp/lwp_user_mm.c
index 068073ec0b..dfb87aca9e 100644
--- a/components/lwp/lwp_user_mm.c
+++ b/components/lwp/lwp_user_mm.c
@@ -10,6 +10,7 @@
* 2021-02-12 lizhirui add 64-bit support for lwp_brk
* 2021-02-19 lizhirui add riscv64 support for lwp_user_accessable and lwp_get_from_user
* 2021-06-07 lizhirui modify user space bound check
+ * 2022-12-25 wangxiaoyao adapt to new mm
*/
#include <rtthread.h>
@@ -122,7 +123,7 @@ static void _user_do_page_fault(struct rt_varea *varea,
if (lwp_objs->source)
{
- void *paddr = rt_hw_mmu_v2p(lwp_objs->source, msg->fault_vaddr);
+ char *paddr = rt_hw_mmu_v2p(lwp_objs->source, msg->fault_vaddr);
if (paddr != ARCH_MAP_FAILED)
{
void *vaddr;
@@ -130,7 +131,7 @@ static void _user_do_page_fault(struct rt_varea *varea,
if (!(varea->flag & MMF_TEXT))
{
- void *cp = rt_pages_alloc(0);
+ void *cp = rt_pages_alloc_ext(0, PAGE_ANY_AVAILABLE);
if (cp)
{
memcpy(cp, vaddr, ARCH_PAGE_SIZE);
@@ -220,9 +221,9 @@ int lwp_unmap_user(struct rt_lwp *lwp, void *va)
static void _dup_varea(rt_varea_t varea, struct rt_lwp *src_lwp,
rt_aspace_t dst)
{
- void *vaddr = varea->start;
- void *vend = vaddr + varea->size;
- if (vaddr < (void *)USER_STACK_VSTART || vaddr >= (void *)USER_STACK_VEND)
+ char *vaddr = varea->start;
+ char *vend = vaddr + varea->size;
+ if (vaddr < (char *)USER_STACK_VSTART || vaddr >= (char *)USER_STACK_VEND)
{
while (vaddr != vend)
{
@@ -430,7 +431,7 @@ void *lwp_map_user_phy(struct rt_lwp *lwp, void *map_va, void *map_pa,
size_t map_size, int cached)
{
int err;
- void *va;
+ char *va;
size_t offset = 0;
if (!map_size)
@@ -458,7 +459,7 @@ void *lwp_map_user_phy(struct rt_lwp *lwp, void *map_va, void *map_pa,
rt_size_t attr = cached ? MMU_MAP_U_RWCB : MMU_MAP_U_RW;
err =
- rt_aspace_map_phy(lwp->aspace, &hint, attr, MM_PA_TO_OFF(map_pa), &va);
+ rt_aspace_map_phy(lwp->aspace, &hint, attr, MM_PA_TO_OFF(map_pa), (void **)&va);
if (err != RT_EOK)
{
va = RT_NULL;