Просмотр исходного кода

!223 拆分原lwp_user_entry函数,以增加各平台兼容性
Merge pull request !223 from jesven/change_user_entry

bernard 4 лет назад
Родитель
Сommit
a916f65b95

+ 32 - 19
components/lwp/arch/aarch64/cortex-a/lwp_gcc.S

@@ -98,14 +98,14 @@
 .text
 
 /*
- * void lwp_user_entry(args, text, data, kstack);
+ * void lwp_user_entry(args, text, ustack, kstack);
  */
 .global lwp_user_entry
 .type lwp_user_entry, % function
 lwp_user_entry:
     mov sp, x3
     mov x4, #(SPSR_Mode(0) | SPSR_A64)
-    ldr x3, =0x0000ffff80000000
+    mov x3, x2 ;/* user stack top */
     msr daifset, #3
     dsb sy
     mrs x30, sp_el0
@@ -113,27 +113,40 @@ lwp_user_entry:
     msr elr_el1, x1
     eret
 
-.global set_user_context
-set_user_context:
-    sub x2, x0, #0x10
-    adr x0, lwp_thread_return
-    ldr x1, [x0]
-    str x1, [x2]
-    ldr x1, [x0, #4]
-    str x1, [x2, #4]
-    ldr x1, [x0, #8]
-    str x1, [x2, #8]
-
-    mov x3, x2
-    dc cvau, x3
-    add x3, x3, #8
-    dc cvau, x3
+/*
+ * void lwp_user_thread_entry(args, text, ustack, kstack);
+ */
+.global lwp_user_thread_entry
+.type lwp_user_thread_entry, % function
+lwp_user_thread_entry:
+    sub x4, x2, #0x10
+    adr x2, lwp_thread_return
+    ldr x5, [x2]
+    str x5, [x4]
+    ldr x5, [x2, #4]
+    str x5, [x4, #4]
+    ldr x5, [x2, #8]
+    str x5, [x4, #8]
+
+    mov x5, x4
+    dc cvau, x5
+    add x5, x5, #8
+    dc cvau, x5
     dsb sy
     ic ialluis
     dsb sy
 
-    msr sp_el0, x2
-    ret
+    msr sp_el0, x4
+
+    mov sp, x3
+    mov x4, #(SPSR_Mode(0) | SPSR_A64)
+    msr daifset, #3
+    dsb sy
+    mrs x30, sp_el0
+    msr spsr_el1, x4
+    msr elr_el1, x1
+    eret
+
 /*
 void lwp_set_thread_context(void *exit_addr, void *new_thread_stack, void *user_stack, void **thread_sp);
 */

+ 34 - 22
components/lwp/arch/arm/cortex-a/lwp_gcc.S

@@ -29,7 +29,7 @@
 .text
 
 /*
- * void lwp_user_entry(args, text, data, kstack);
+ * void lwp_user_entry(args, text, ustack, kstack);
  */
 .global lwp_user_entry
 .type lwp_user_entry, % function
@@ -41,38 +41,50 @@ lwp_user_entry:
     msr     spsr, r9
     mov     sp, r3
 
-    ldr     r3, =0x80000000 ;/* user stack top */
+    mov     r3, r2 ;/* user stack top */
     /* set data address. */
     movs    pc, r1
 
-.global set_user_context
-set_user_context:
+/*
+ * void lwp_user_thread_entry(args, text, ustack, kstack);
+ */
+.global lwp_user_thread_entry
+.type lwp_user_thread_entry, % function
+lwp_user_thread_entry:
     cps #Mode_SYS
-    sub sp, r0, #12
-    ldr r0, =lwp_thread_return
-    ldr r1, [r0]
-    str r1, [sp]
-    ldr r1, [r0, #4]
-    str r1, [sp, #4]
-    ldr r1, [r0, #8]
-    str r1, [sp, #8]
-
-    mov r1, sp
-    mcr p15, 0, r1, c7, c11, 1   ;//dc cmvau
-    add r1, #4
-    mcr p15, 0, r1, c7, c11, 1   ;//dc cmvau
-    add r1, #4
-    mcr p15, 0, r1, c7, c11, 1   ;//dc cmvau
+    sub sp, r2, #12
+    ldr r2, =lwp_thread_return
+    ldr r4, [r2]
+    str r4, [sp]
+    ldr r4, [r2, #4]
+    str r4, [sp, #4]
+    ldr r4, [r2, #8]
+    str r4, [sp, #8]
+
+    mov r4, sp
+    mcr p15, 0, r4, c7, c11, 1   ;//dc cmvau
+    add r4, #4
+    mcr p15, 0, r4, c7, c11, 1   ;//dc cmvau
+    add r4, #4
+    mcr p15, 0, r4, c7, c11, 1   ;//dc cmvau
     dsb
     isb
-    mcr p15, 0, r0, c7, c5, 0   ;//iciallu
+    mcr p15, 0, r4, c7, c5, 0   ;//iciallu
     dsb
     isb
 
     mov lr, sp
-    mov r0, #0
     cps #Mode_SVC
-    mov pc, lr
+
+    mrs     r9, cpsr
+    bic     r9, #0x1f
+    orr     r9, #Mode_USR
+    cpsid i
+    msr     spsr, r9
+    mov     sp, r3
+
+    /* set data address. */
+    movs    pc, r1
 
 /*
 void lwp_set_thread_context(void *exit_addr, void *new_thread_stack, void *user_stack, void **thread_sp);

+ 2 - 2
components/lwp/lwp.c

@@ -40,7 +40,7 @@
 
 static const char elf_magic[] = {0x7f, 'E', 'L', 'F'};
 
-extern void lwp_user_entry(void *args, const void *text, void *data, void *k_stack);
+extern void lwp_user_entry(void *args, const void *text, void *ustack, void *k_stack);
 extern int libc_stdio_get_console(void);
 int load_ldso(struct rt_lwp *lwp, char *exec_name, char *const argv[], char *const envp[]);
 
@@ -998,7 +998,7 @@ static void lwp_thread_entry(void *parameter)
     }
 #endif
 
-    lwp_user_entry(lwp->args, lwp->text_entry, lwp->data_entry, tid->stack_addr + tid->stack_size);
+    lwp_user_entry(lwp->args, lwp->text_entry, (void *)USER_STACK_VEND, tid->stack_addr + tid->stack_size);
 }
 
 struct rt_lwp *lwp_self(void)

+ 2 - 6
components/lwp/lwp_syscall.c

@@ -65,8 +65,7 @@ struct musl_sockaddr
     char     sa_data[14];
 };
 
-extern void lwp_user_entry(void *args, const void *text, void *data, void *user_stack);
-extern void set_user_context(void *stack);
+extern void lwp_user_thread_entry(void *args, const void *text, void *ustack, void *user_stack);
 
 void lwp_cleanup(struct rt_thread *tid);
 #ifdef RT_USING_USERSPACE
@@ -343,16 +342,13 @@ static void lwp_user_thread(void *parameter)
 {
     rt_thread_t tid;
     rt_size_t user_stack;
-    struct rt_lwp *lwp;
 
     tid = rt_thread_self();
-    lwp = lwp_self();
 
     user_stack = (rt_size_t)tid->user_stack + tid->user_stack_size;
     user_stack &= ~7; //align 8
-    set_user_context((void *)user_stack);
 
-    lwp_user_entry(parameter, tid->user_entry, lwp->data_entry, tid->stack_addr + tid->stack_size);
+    lwp_user_thread_entry(parameter, tid->user_entry, (void *)user_stack, tid->stack_addr + tid->stack_size);
 }
 
 /* thread/process */