From b9e878daaefbfa53ec930baf5d0f5cb15659baee Mon Sep 17 00:00:00 2001 From: lizhirui Date: Wed, 16 Jun 2021 19:47:39 +0800 Subject: [PATCH] update user mode interface for qemu-virt-rv64 update user mode interface for qemu-virt-rv64 --- bsp/qemu-virt-rv64/rtconfig.py | 2 +- components/lwp/arch/risc-v/virt64/lwp_gcc.S | 29 +++++++++++++-------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/bsp/qemu-virt-rv64/rtconfig.py b/bsp/qemu-virt-rv64/rtconfig.py index 20bb6c6101..3f774080fd 100644 --- a/bsp/qemu-virt-rv64/rtconfig.py +++ b/bsp/qemu-virt-rv64/rtconfig.py @@ -35,7 +35,7 @@ if PLATFORM == 'gcc': OBJDUMP = PREFIX + 'objdump' OBJCPY = PREFIX + 'objcopy' - DEVICE = ' -mcmodel=medany -march=rv64imafdc -mabi=lp64d' + DEVICE = ' -mcmodel=medany -march=rv64imac -mabi=lp64' CFLAGS = DEVICE + ' -fvar-tracking -ffreestanding -fno-common -ffunction-sections -fdata-sections -fstrict-volatile-bitfields' AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp' LFLAGS = DEVICE + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,_start -T link.lds' diff --git a/components/lwp/arch/risc-v/virt64/lwp_gcc.S b/components/lwp/arch/risc-v/virt64/lwp_gcc.S index 2a2bdf1c97..11e1c1f612 100644 --- a/components/lwp/arch/risc-v/virt64/lwp_gcc.S +++ b/components/lwp/arch/risc-v/virt64/lwp_gcc.S @@ -20,30 +20,37 @@ .section .text.lwp /* - * void lwp_user_entry(args, text, data); + * void lwp_user_entry(args, text, ustack, kstack); */ .global lwp_user_entry .type lwp_user_entry, % function lwp_user_entry: + csrci sstatus, 8//set sstatus.spp = 0 + csrw sepc, a1 + mv sp, a2//user_sp + sret//enter user mode + +/* + * void lwp_user_thread_entry(args, text, ustack, kstack); + */ +.global lwp_user_thread_entry +.type lwp_user_thread_entry, % function +lwp_user_thread_entry: csrci sstatus, 8//set sstatus.spp = 0 csrw sepc, a1 mv s0, a0 - mv a0, a3 + mv s1, a1 + mv s2, a2 + mv s3, a3 + mv a0, s2 + call lwp_copy_return_code_to_user_stack + mv a0, s2 call lwp_fix_sp mv sp, a0//user_sp mv ra, a0//return address mv a0, s0//args sret//enter user mode -.global set_user_context -set_user_context: - addi sp, sp, -8 - STORE ra, 0(sp) - call lwp_copy_return_code_to_user_stack - LOAD ra, 0(sp) - addi sp, sp, 8 - ret - /* int lwp_set_thread_context(void *new_thread_stack, void *origin_thread_stack, void *user_stack, void **thread_sp, int tid); */ -- Gitee