diff --git a/arch/arm64/include/irq.h b/arch/arm64/include/irq.h index a47544d7f268e..f4c91fdd0da6f 100644 --- a/arch/arm64/include/irq.h +++ b/arch/arm64/include/irq.h @@ -407,14 +407,15 @@ static inline void up_irq_restore(irqstate_t flags) #define up_update_task(t) modify_sysreg(t, ~1ul, tpidr_el1) #define up_interrupt_context() (read_sysreg(tpidr_el1) & 1) -#define up_switch_context(tcb, rtcb) \ - do { \ - if (!up_interrupt_context()) \ - { \ - sys_call2(SYS_switch_context, (uintptr_t)&rtcb->xcp.regs, \ - (uintptr_t)tcb->xcp.regs); \ - } \ - } while (0) +#define up_switch_context(tcb, rtcb) \ + do \ + { \ + if (!up_interrupt_context()) \ + { \ + sys_call2(SYS_switch_context, (uintptr_t)rtcb, (uintptr_t)tcb); \ + } \ + } \ + while (0) /**************************************************************************** * Name: up_getusrpc diff --git a/arch/arm64/src/common/arm64_exit.c b/arch/arm64/src/common/arm64_exit.c index ba81dbb97f895..793533f76ebfb 100644 --- a/arch/arm64/src/common/arm64_exit.c +++ b/arch/arm64/src/common/arm64_exit.c @@ -76,5 +76,5 @@ void up_exit(int status) /* Then switch contexts */ - arm64_fullcontextrestore(tcb->xcp.regs); + arm64_fullcontextrestore(tcb); } diff --git a/arch/arm64/src/common/arm64_internal.h b/arch/arm64/src/common/arm64_internal.h index de5bc209806d2..5badadb9af2c6 100644 --- a/arch/arm64/src/common/arm64_internal.h +++ b/arch/arm64/src/common/arm64_internal.h @@ -112,10 +112,10 @@ /* Context switching */ -#define arm64_fullcontextrestore(restoreregs) \ +#define arm64_fullcontextrestore(next) \ do \ { \ - sys_call1(SYS_restore_context, (uintptr_t)restoreregs); \ + sys_call1(SYS_restore_context, (uintptr_t)next); \ } \ while (1) diff --git a/arch/arm64/src/common/arm64_sigdeliver.c b/arch/arm64/src/common/arm64_sigdeliver.c index fff7e1ccee516..5ef6b592cdfe2 100644 --- a/arch/arm64/src/common/arm64_sigdeliver.c +++ b/arch/arm64/src/common/arm64_sigdeliver.c @@ -160,5 +160,5 @@ void arm64_sigdeliver(void) leave_critical_section(flags); rtcb->irqcount--; #endif - arm64_fullcontextrestore(rtcb->xcp.regs); + arm64_fullcontextrestore(rtcb); } diff --git a/arch/arm64/src/common/arm64_syscall.c b/arch/arm64/src/common/arm64_syscall.c index a192cabafba92..780286892f534 100644 --- a/arch/arm64/src/common/arm64_syscall.c +++ b/arch/arm64/src/common/arm64_syscall.c @@ -182,7 +182,7 @@ uint64_t *arm64_syscall(uint64_t *regs) * At this point, the following values are saved in context: * * x0 = SYS_restore_context - * x1 = restoreregs( xcp->regs, callee saved register save area) + * x1 = next */ case SYS_restore_context: @@ -192,8 +192,8 @@ uint64_t *arm64_syscall(uint64_t *regs) * set will determine the restored context. */ - ret_regs = (uint64_t *)regs[REG_X1]; - regs[REG_X1] = 0; /* set the saveregs = 0 */ + tcb = (struct tcb_s *)regs[REG_X1]; + ret_regs = tcb->xcp.regs; DEBUGASSERT(ret_regs); } @@ -201,13 +201,13 @@ uint64_t *arm64_syscall(uint64_t *regs) /* x0 = SYS_switch_context: This a switch context command: * - * void arm64_switchcontext(uint64_t *saveregs, uint64_t *restoreregs); + * void arm64_switchcontext(struct tcb_s *prev, struct tcb_s *next); * * At this point, the following values are saved in context: * * x0 = SYS_switch_context - * x1 = saveregs (xcp->regs, callee saved register save area) - * x2 = restoreregs (xcp->regs, callee saved register save area) + * x1 = prev + * x2 = next * * In this case, we do both: We save the context registers to the save * register area reference by the saved contents of x1 and then set @@ -217,10 +217,13 @@ uint64_t *arm64_syscall(uint64_t *regs) case SYS_switch_context: { + struct tcb_s *rtcb = (struct tcb_s *)regs[REG_X1]; + tcb = (struct tcb_s *)regs[REG_X2]; + DEBUGASSERT(regs[REG_X1] != 0 && regs[REG_X2] != 0); - *(uint64_t **)regs[REG_X1] = regs; + rtcb->xcp.regs = regs; - ret_regs = (uint64_t *)regs[REG_X2]; + ret_regs = tcb->xcp.regs; } break;