From 07bea9331c321dc095f156daf06a991afb09f06c Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Wed, 16 Jun 2021 12:23:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=86=E5=88=86=E5=8E=9Flwp=5Fuser=5Fentry?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E4=B8=BAlwp=5Fuser=5Fentry(=E7=94=A8?= =?UTF-8?q?=E4=BA=8Elibc=E5=85=A5=E5=8F=A3)=E5=8F=8Alwp=5Fuser=5Fthread=5F?= =?UTF-8?q?entry(=E7=94=A8=E4=BA=8Ert=5Fthread=5Fcreate),=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E5=85=A5=E5=8F=A3=E5=8F=82=E6=95=B0=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E4=B8=BAargs,=20text=5Fentry,=20ustack,=20kstack=E4=BB=A5?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=90=84=E5=B9=B3=E5=8F=B0=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lwp/arch/aarch64/cortex-a/lwp_gcc.S | 51 ++++++++++------- components/lwp/arch/arm/cortex-a/lwp_gcc.S | 56 +++++++++++-------- components/lwp/lwp.c | 4 +- components/lwp/lwp_syscall.c | 8 +-- 4 files changed, 70 insertions(+), 49 deletions(-) diff --git a/components/lwp/arch/aarch64/cortex-a/lwp_gcc.S b/components/lwp/arch/aarch64/cortex-a/lwp_gcc.S index d5d2ade5bc..910679e359 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 433946bcd9..009c751945 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 fe4dc80665..5230a4ff05 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 d24c00aded..2886c8ecc9 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 */ -- Gitee