From 185b3616874c53a712872d16ca243df9a04944e2 Mon Sep 17 00:00:00 2001 From: BernardXiong Date: Thu, 17 Jun 2021 10:36:39 +0800 Subject: [PATCH] [bsp] Update riscv-virt64 bsp for lwp --- bsp/qemu-virt-rv64/qemu-nographic.sh | 2 +- components/lwp/SConscript | 2 +- components/lwp/arch/risc-v/virt64/arch.h | 22 ----- .../arch/risc-v/virt64/arch_user_space_init.c | 55 ----------- .../virt64/{arch_user_stack.c => lwp_arch.c} | 96 +++++++++++++------ libcpu/risc-v/virt64/page.h | 1 + 6 files changed, 68 insertions(+), 110 deletions(-) mode change 100644 => 100755 bsp/qemu-virt-rv64/qemu-nographic.sh delete mode 100644 components/lwp/arch/risc-v/virt64/arch.h delete mode 100644 components/lwp/arch/risc-v/virt64/arch_user_space_init.c rename components/lwp/arch/risc-v/virt64/{arch_user_stack.c => lwp_arch.c} (44%) diff --git a/bsp/qemu-virt-rv64/qemu-nographic.sh b/bsp/qemu-virt-rv64/qemu-nographic.sh old mode 100644 new mode 100755 index 934c4f935b..5394923bec --- a/bsp/qemu-virt-rv64/qemu-nographic.sh +++ b/bsp/qemu-virt-rv64/qemu-nographic.sh @@ -1 +1 @@ -qemu-system-riscv64 -nographic -machine virt -m 256M -kernel rtthread.bin +qemu-system-riscv64 -nographic -machine virt -m 256M -kernel rtthread.bin -bios default diff --git a/components/lwp/SConscript b/components/lwp/SConscript index ddf585aa5f..fed70e8d1b 100644 --- a/components/lwp/SConscript +++ b/components/lwp/SConscript @@ -5,7 +5,7 @@ cwd = GetCurrentDir() src = [] CPPPATH = [cwd] -support_arch = {"arm": ["cortex-m3", "cortex-m4", "cortex-m7", "arm926", "cortex-a"],"aarch64":["cortex-a"],"risc-v": ["virt64"]} +support_arch = {"arm": ["cortex-m3", "cortex-m4", "cortex-m7", "arm926", "cortex-a"],"aarch64":["cortex-a"],"risc-v": ["virt64", "c906"]} platform_file = {'armcc': 'rvds.S', 'gcc': 'gcc.S', 'iar': 'iar.S'} if GetDepend('LWP_UNIX98_PTY'): diff --git a/components/lwp/arch/risc-v/virt64/arch.h b/components/lwp/arch/risc-v/virt64/arch.h deleted file mode 100644 index 21a51115a4..0000000000 --- a/components/lwp/arch/risc-v/virt64/arch.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2006-2020, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-02-03 lizhirui first version - */ - -#ifndef __ARCH_H__ -#define __ARCH_H__ - -#include "riscv_mmu.h" - -#define ARCH_PAGE_SIZE PAGE_SIZE -#define ARCH_PAGE_MASK PAGE_OFFSET_MASK -#define ARCH_PAGE_SHIFT PAGE_OFFSET_BIT - -#define dsb() - -#endif \ No newline at end of file diff --git a/components/lwp/arch/risc-v/virt64/arch_user_space_init.c b/components/lwp/arch/risc-v/virt64/arch_user_space_init.c deleted file mode 100644 index fa74180756..0000000000 --- a/components/lwp/arch/risc-v/virt64/arch_user_space_init.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2019-10-28 Jesven first version - * 2021-02-03 lizhirui port to riscv64 - */ - -#include -#include - -#ifdef RT_USING_USERSPACE - -#include -#include -#include -#include -#include - -extern size_t MMUTable[]; - -int arch_user_space_init(struct rt_lwp *lwp) -{ - size_t *mmu_table; - - mmu_table = (size_t*)rt_pages_alloc(0); - if (!mmu_table) - { - return -1; - } - - lwp->end_heap = USER_HEAP_VADDR; - memcpy(mmu_table, MMUTable, PAGE_SIZE); - rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, mmu_table, 4 * PAGE_SIZE); - rt_hw_mmu_map_init(&lwp->mmu_info,(void *)0x100000000UL,0xFFFFFFFEFFFFFFFFUL,(rt_size_t *)mmu_table,0); - - return 0; -} - -void *arch_kernel_mmu_table_get(void) -{ - return (void*)((char*)MMUTable); -} - -void arch_user_space_vtable_free(struct rt_lwp *lwp) -{ - if (lwp && lwp->mmu_info.vtable) - { - rt_pages_free(lwp->mmu_info.vtable, 0); - } -} -#endif diff --git a/components/lwp/arch/risc-v/virt64/arch_user_stack.c b/components/lwp/arch/risc-v/virt64/lwp_arch.c similarity index 44% rename from components/lwp/arch/risc-v/virt64/arch_user_stack.c rename to components/lwp/arch/risc-v/virt64/lwp_arch.c index baabc45026..fb995e7402 100644 --- a/components/lwp/arch/risc-v/virt64/arch_user_stack.c +++ b/components/lwp/arch/risc-v/virt64/lwp_arch.c @@ -14,7 +14,6 @@ * 2021-03-04 lizhirui modify for new version of rt-smart */ -#include #include #include @@ -26,6 +25,9 @@ #include #include +extern size_t MMUTable[]; + +//该函数用于支持用户栈扩展功能 int arch_expand_user_stack(void *addr) { int ret = 0; @@ -34,7 +36,7 @@ int arch_expand_user_stack(void *addr) stack_addr &= ~PAGE_OFFSET_MASK; if ((stack_addr >= (size_t)USER_STACK_VSTART) && (stack_addr < (size_t)USER_STACK_VEND)) { - void *map = lwp_map_user(lwp_self(), (void*)stack_addr, PAGE_SIZE, RT_FALSE); + void *map = lwp_map_user(lwp_self(), (void *)stack_addr, PAGE_SIZE, RT_FALSE); if (map || lwp_user_accessable(addr, 1)) { @@ -43,52 +45,84 @@ int arch_expand_user_stack(void *addr) } return ret; } -#endif - -#ifdef RT_USING_USERSPACE - void *lwp_copy_return_code_to_user_stack() - { - void lwp_thread_return(); - void lwp_thread_return_end(); - rt_thread_t tid = rt_thread_self(); - if(tid -> user_stack != RT_NULL) - { - size_t size = (size_t)lwp_thread_return_end - (size_t)lwp_thread_return; - size_t userstack = (size_t)tid -> user_stack + tid -> user_stack_size - size; - memcpy((void *)userstack,lwp_thread_return,size); - return (void *)userstack; - } +void *lwp_copy_return_code_to_user_stack() +{ + void lwp_thread_return(); + void lwp_thread_return_end(); + rt_thread_t tid = rt_thread_self(); - return RT_NULL; + if (tid->user_stack != RT_NULL) + { + size_t size = (size_t)lwp_thread_return_end - (size_t)lwp_thread_return; + size_t userstack = (size_t)tid->user_stack + tid->user_stack_size - size; + memcpy((void *)userstack, lwp_thread_return, size); + return (void *)userstack; } - uint32_t lwp_fix_sp(uint32_t cursp) - { - void lwp_thread_return(); - void lwp_thread_return_end(); + return RT_NULL; +} - if(cursp == 0) - { - return 0; - } +uint32_t lwp_fix_sp(uint32_t cursp) +{ + void lwp_thread_return(); + void lwp_thread_return_end(); - return cursp - ((size_t)lwp_thread_return_end - (size_t)lwp_thread_return); + if (cursp == 0) + { + return 0; } -#endif + + return cursp - ((size_t)lwp_thread_return_end - (size_t)lwp_thread_return); +} rt_thread_t rt_thread_sp_to_thread(void *spmember_addr) { - return (rt_thread_t)(((rt_ubase_t)spmember_addr) - (offsetof(struct rt_thread,sp))); + return (rt_thread_t)(((rt_ubase_t)spmember_addr) - (offsetof(struct rt_thread, sp))); } void *get_thread_kernel_stack_top(rt_thread_t thread) { - return (void *)(((rt_size_t)thread -> stack_addr) + ((rt_size_t)thread -> stack_size)); + return (void *)(((rt_size_t)thread->stack_addr) + ((rt_size_t)thread->stack_size)); } //don't support this temporarily in riscv void *lwp_get_user_sp() { return RT_NULL; -} \ No newline at end of file +} + +//该函数负责初始化lwp的页表和堆 +int arch_user_space_init(struct rt_lwp *lwp) +{ + size_t *mmu_table; + + mmu_table = (size_t *)rt_pages_alloc(0); + if (!mmu_table) + { + return -1; + } + + lwp->end_heap = USER_HEAP_VADDR; + memcpy(mmu_table, MMUTable, PAGE_SIZE); + rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, mmu_table, 4 * PAGE_SIZE); + rt_hw_mmu_map_init(&lwp->mmu_info, (void *)0x100000000UL, 0xFFFFFFFEFFFFFFFFUL, (rt_size_t *)mmu_table, 0); + + return 0; +} + +//该函数负责返回内核页表指针 +void *arch_kernel_mmu_table_get(void) +{ + return (void *)((char *)MMUTable); +} + +void arch_user_space_vtable_free(struct rt_lwp *lwp) +{ + if (lwp && lwp->mmu_info.vtable) + { + rt_pages_free(lwp->mmu_info.vtable, 0); + } +} + +#endif diff --git a/libcpu/risc-v/virt64/page.h b/libcpu/risc-v/virt64/page.h index 8b63c356b5..a1bf949d2e 100644 --- a/libcpu/risc-v/virt64/page.h +++ b/libcpu/risc-v/virt64/page.h @@ -19,6 +19,7 @@ typedef struct tag_region rt_size_t rt_page_bits(rt_size_t size); void *rt_pages_alloc(rt_size_t size_bits); +void rt_page_ref_inc(void *addr, uint32_t size_bits); void rt_pages_free(void *addr,rt_size_t size_bits); void rt_pageinfo_dump(); void rt_page_get_info(size_t *total_nr, size_t *free_nr); -- Gitee