diff --git a/components/lwp/arch/aarch64/cortex-a/lwp_gcc.S b/components/lwp/arch/aarch64/cortex-a/lwp_gcc.S index d5d2ade5bc33ae58779002390e26a62c9cf46b66..910679e359ed2c2baab19d326573726c13beed32 100644 --- a/components/lwp/arch/aarch64/cortex-a/lwp_gcc.S +++ b/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); */ diff --git a/components/lwp/arch/arm/cortex-a/lwp_gcc.S b/components/lwp/arch/arm/cortex-a/lwp_gcc.S index 433946bcd9f888d85b132b0fc100cfaac84852f8..009c751945892f756c96f4c8774db6e6af50c15f 100644 --- a/components/lwp/arch/arm/cortex-a/lwp_gcc.S +++ b/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); diff --git a/components/lwp/lwp.c b/components/lwp/lwp.c index fe4dc80665a99406799e0983c1741dd27434befb..5230a4ff05b30deaa0240f196e44f06e7bf70281 100644 --- a/components/lwp/lwp.c +++ b/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) diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index d24c00aded88031ead1725fc0e50be3d800b4edd..2886c8ecc96fb76159db499b3303412344f1392f 100644 --- a/components/lwp/lwp_syscall.c +++ b/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 */