diff options
| author | Shell <[email protected]> | 2023-04-22 23:59:11 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-04-22 23:59:11 +0800 |
| commit | 470454d201ebb89aa72525f8c3fb562e372f4f56 (patch) | |
| tree | e0a3ba80fb727a02b1981053934a9d50469e328a /components/lwp | |
| parent | 90c69a0588090e181e4ce12767738b1853510d3f (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.c | 2 | ||||
| -rw-r--r-- | components/lwp/arch/risc-v/rv64/lwp_arch.c | 2 | ||||
| -rw-r--r-- | components/lwp/arch/x86/i386/lwp_arch.c | 2 | ||||
| -rw-r--r-- | components/lwp/lwp.c | 15 | ||||
| -rw-r--r-- | components/lwp/lwp_shm.c | 7 | ||||
| -rw-r--r-- | components/lwp/lwp_syscall.c | 10 | ||||
| -rw-r--r-- | components/lwp/lwp_user_mm.c | 15 |
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; |
