소스 검색

!225 update user mode interface for qemu-virt-rv64
Merge pull request !225 from lizhirui/rt-smart

bernard 4 년 전
부모
커밋
8744ef90a0
2개의 변경된 파일19개의 추가작업 그리고 12개의 파일을 삭제
  1. 1 1
      bsp/qemu-virt-rv64/rtconfig.py
  2. 18 11
      components/lwp/arch/risc-v/virt64/lwp_gcc.S

+ 1 - 1
bsp/qemu-virt-rv64/rtconfig.py

@@ -35,7 +35,7 @@ if PLATFORM == 'gcc':
     OBJDUMP = PREFIX + 'objdump'
     OBJDUMP = PREFIX + 'objdump'
     OBJCPY  = PREFIX + 'objcopy'
     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'
     CFLAGS  = DEVICE + ' -fvar-tracking -ffreestanding -fno-common -ffunction-sections -fdata-sections -fstrict-volatile-bitfields'
     AFLAGS  = ' -c' + DEVICE + ' -x assembler-with-cpp'
     AFLAGS  = ' -c' + DEVICE + ' -x assembler-with-cpp'
     LFLAGS  = DEVICE + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,_start -T link.lds'
     LFLAGS  = DEVICE + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,_start -T link.lds'

+ 18 - 11
components/lwp/arch/risc-v/virt64/lwp_gcc.S

@@ -20,30 +20,37 @@
 .section      .text.lwp
 .section      .text.lwp
 
 
 /*
 /*
- * void lwp_user_entry(args, text, data);
+ * void lwp_user_entry(args, text, ustack, kstack);
  */
  */
 .global lwp_user_entry
 .global lwp_user_entry
 .type lwp_user_entry, % function
 .type lwp_user_entry, % function
 lwp_user_entry:
 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
     csrci sstatus, 8//set sstatus.spp = 0
     csrw sepc, a1
     csrw sepc, a1
     mv s0, a0
     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
     call lwp_fix_sp
     mv sp, a0//user_sp
     mv sp, a0//user_sp
     mv ra, a0//return address
     mv ra, a0//return address
     mv a0, s0//args
     mv a0, s0//args
     sret//enter user mode
     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);
 int lwp_set_thread_context(void *new_thread_stack, void *origin_thread_stack, void *user_stack, void **thread_sp, int tid);
 */
 */