diff --git a/bsp/qemu-virt-rv64/rtconfig.py b/bsp/qemu-virt-rv64/rtconfig.py index 20bb6c61019df40f7a0035b475be6cef800e2b69..3f774080fd1fadbcab4eb82502cf655ac18f1a2f 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 2a2bdf1c9739a5d587e9872680b1b3d083aceb61..11e1c1f612a2b010668ae12205855d01a39b8774 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); */