Преглед на файлове

!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'
     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'

+ 18 - 11
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);
 */