You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ma...@apache.org on 2022/03/23 10:08:50 UTC
[incubator-nuttx] 03/03: arm/schedulesigaction: update the SP to signal context top
This is an automated email from the ASF dual-hosted git repository.
masayuki pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 7b736063004bf65445afaad26e9b9acee01daaba
Author: chao.an <an...@xiaomi.com>
AuthorDate: Wed Mar 23 13:13:03 2022 +0800
arm/schedulesigaction: update the SP to signal context top
Signed-off-by: chao.an <an...@xiaomi.com>
---
arch/arm/src/arm/arm_schedulesigaction.c | 18 ++++++-----
arch/arm/src/armv6-m/arm_schedulesigaction.c | 45 +++++++++++++++-------------
arch/arm/src/armv7-a/arm_schedulesigaction.c | 45 +++++++++++++++-------------
arch/arm/src/armv7-m/arm_schedulesigaction.c | 45 +++++++++++++++-------------
arch/arm/src/armv7-r/arm_schedulesigaction.c | 18 ++++++-----
arch/arm/src/armv8-m/arm_schedulesigaction.c | 45 +++++++++++++++-------------
6 files changed, 120 insertions(+), 96 deletions(-)
diff --git a/arch/arm/src/arm/arm_schedulesigaction.c b/arch/arm/src/arm/arm_schedulesigaction.c
index 9e37043..2d37ec6 100644
--- a/arch/arm/src/arm/arm_schedulesigaction.c
+++ b/arch/arm/src/arm/arm_schedulesigaction.c
@@ -134,13 +134,14 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* delivered.
*/
- CURRENT_REGS =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)CURRENT_REGS -
- (uint32_t)XCPTCONTEXT_SIZE);
+ CURRENT_REGS = (FAR void *)
+ ((uint32_t)CURRENT_REGS -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy((FAR uint32_t *)CURRENT_REGS, tcb->xcp.saved_regs,
XCPTCONTEXT_SIZE);
- CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS;
+ CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up to vector to the trampoline with interrupts
* disabled
@@ -175,12 +176,13 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* delivered.
*/
- tcb->xcp.regs =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)tcb->xcp.regs -
- (uint32_t)XCPTCONTEXT_SIZE);
+ tcb->xcp.regs = (FAR void *)
+ ((uint32_t)tcb->xcp.regs -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy(tcb->xcp.regs, tcb->xcp.saved_regs, XCPTCONTEXT_SIZE);
- tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs;
+ tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up to vector to the trampoline with interrupts
* disabled
diff --git a/arch/arm/src/armv6-m/arm_schedulesigaction.c b/arch/arm/src/armv6-m/arm_schedulesigaction.c
index 23e4290..1f30fed 100644
--- a/arch/arm/src/armv6-m/arm_schedulesigaction.c
+++ b/arch/arm/src/armv6-m/arm_schedulesigaction.c
@@ -136,13 +136,14 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* delivered.
*/
- CURRENT_REGS =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)CURRENT_REGS -
- (uint32_t)XCPTCONTEXT_SIZE);
+ CURRENT_REGS = (FAR void *)
+ ((uint32_t)CURRENT_REGS -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy((FAR uint32_t *)CURRENT_REGS, tcb->xcp.saved_regs,
XCPTCONTEXT_SIZE);
- CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS;
+ CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up to vector to the trampoline with interrupts
* disabled. The kernel-space trampoline must run in
@@ -182,12 +183,13 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* delivered.
*/
- tcb->xcp.regs =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)tcb->xcp.regs -
- (uint32_t)XCPTCONTEXT_SIZE);
+ tcb->xcp.regs = (FAR void *)
+ ((uint32_t)tcb->xcp.regs -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy(tcb->xcp.regs, tcb->xcp.saved_regs, XCPTCONTEXT_SIZE);
- tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs;
+ tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up to vector to the trampoline with interrupts
* disabled. We must already be in privileged thread mode to be
@@ -285,13 +287,14 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* been delivered.
*/
- tcb->xcp.regs =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)tcb->xcp.regs -
- (uint32_t)XCPTCONTEXT_SIZE);
+ tcb->xcp.regs = (FAR void *)
+ ((uint32_t)tcb->xcp.regs -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy(tcb->xcp.regs, tcb->xcp.saved_regs,
XCPTCONTEXT_SIZE);
- tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs;
+ tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up vector to the trampoline with interrupts
* disabled. We must already be in privileged thread mode
@@ -328,13 +331,14 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* been delivered.
*/
- CURRENT_REGS =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)CURRENT_REGS -
- (uint32_t)XCPTCONTEXT_SIZE);
+ CURRENT_REGS = (FAR void *)
+ ((uint32_t)CURRENT_REGS -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy((FAR uint32_t *)CURRENT_REGS, tcb->xcp.saved_regs,
XCPTCONTEXT_SIZE);
- CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS;
+ CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up vector to the trampoline with interrupts
* disabled. The kernel-space trampoline must run in
@@ -395,12 +399,13 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* delivered.
*/
- tcb->xcp.regs =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)tcb->xcp.regs -
- (uint32_t)XCPTCONTEXT_SIZE);
+ tcb->xcp.regs = (FAR void *)
+ ((uint32_t)tcb->xcp.regs -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy(tcb->xcp.regs, tcb->xcp.saved_regs, XCPTCONTEXT_SIZE);
- tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs;
+ tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Increment the IRQ lock count so that when the task is restarted,
* it will hold the IRQ spinlock.
diff --git a/arch/arm/src/armv7-a/arm_schedulesigaction.c b/arch/arm/src/armv7-a/arm_schedulesigaction.c
index aaf03c0..497cec2 100644
--- a/arch/arm/src/armv7-a/arm_schedulesigaction.c
+++ b/arch/arm/src/armv7-a/arm_schedulesigaction.c
@@ -139,13 +139,14 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* delivered.
*/
- CURRENT_REGS =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)CURRENT_REGS -
- (uint32_t)XCPTCONTEXT_SIZE);
+ CURRENT_REGS = (FAR void *)
+ ((uint32_t)CURRENT_REGS -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy((FAR uint32_t *)CURRENT_REGS, tcb->xcp.saved_regs,
XCPTCONTEXT_SIZE);
- CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS;
+ CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up to vector to the trampoline with interrupts
* disabled
@@ -183,12 +184,13 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* delivered.
*/
- tcb->xcp.regs =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)tcb->xcp.regs -
- (uint32_t)XCPTCONTEXT_SIZE);
+ tcb->xcp.regs = (FAR void *)
+ ((uint32_t)tcb->xcp.regs -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy(tcb->xcp.regs, tcb->xcp.saved_regs, XCPTCONTEXT_SIZE);
- tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs;
+ tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up to vector to the trampoline with interrupts
* disabled
@@ -284,13 +286,14 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* been delivered.
*/
- tcb->xcp.regs =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)tcb->xcp.regs -
- (uint32_t)XCPTCONTEXT_SIZE);
+ tcb->xcp.regs = (FAR void *)
+ ((uint32_t)tcb->xcp.regs -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy(tcb->xcp.regs, tcb->xcp.saved_regs,
XCPTCONTEXT_SIZE);
- tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs;
+ tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up to vector to the trampoline with interrupts
* disabled
@@ -326,13 +329,14 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* been delivered.
*/
- CURRENT_REGS =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)CURRENT_REGS -
- (uint32_t)XCPTCONTEXT_SIZE);
+ CURRENT_REGS = (FAR void *)
+ ((uint32_t)CURRENT_REGS -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy((FAR uint32_t *)CURRENT_REGS, tcb->xcp.saved_regs,
XCPTCONTEXT_SIZE);
- CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS;
+ CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up vector to the trampoline with interrupts
* disabled. The kernel-space trampoline must run in
@@ -393,12 +397,13 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* delivered.
*/
- tcb->xcp.regs =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)tcb->xcp.regs -
- (uint32_t)XCPTCONTEXT_SIZE);
+ tcb->xcp.regs = (FAR void *)
+ ((uint32_t)tcb->xcp.regs -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy(tcb->xcp.regs, tcb->xcp.saved_regs, XCPTCONTEXT_SIZE);
- tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs;
+ tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Increment the IRQ lock count so that when the task is restarted,
* it will hold the IRQ spinlock.
diff --git a/arch/arm/src/armv7-m/arm_schedulesigaction.c b/arch/arm/src/armv7-m/arm_schedulesigaction.c
index 9bcf40e..b8c224f 100644
--- a/arch/arm/src/armv7-m/arm_schedulesigaction.c
+++ b/arch/arm/src/armv7-m/arm_schedulesigaction.c
@@ -137,13 +137,14 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* delivered.
*/
- CURRENT_REGS =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)CURRENT_REGS -
- (uint32_t)XCPTCONTEXT_SIZE);
+ CURRENT_REGS = (FAR void *)
+ ((uint32_t)CURRENT_REGS -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy((FAR uint32_t *)CURRENT_REGS, tcb->xcp.saved_regs,
XCPTCONTEXT_SIZE);
- CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS;
+ CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up to vector to the trampoline with interrupts
* disabled. The kernel-space trampoline must run in
@@ -187,12 +188,13 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* delivered.
*/
- tcb->xcp.regs =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)tcb->xcp.regs -
- (uint32_t)XCPTCONTEXT_SIZE);
+ tcb->xcp.regs = (FAR void *)
+ ((uint32_t)tcb->xcp.regs -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy(tcb->xcp.regs, tcb->xcp.saved_regs, XCPTCONTEXT_SIZE);
- tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs;
+ tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up to vector to the trampoline with interrupts
* disabled. We must already be in privileged thread mode to be
@@ -294,13 +296,14 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* been delivered.
*/
- tcb->xcp.regs =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)tcb->xcp.regs -
- (uint32_t)XCPTCONTEXT_SIZE);
+ tcb->xcp.regs = (FAR void *)
+ ((uint32_t)tcb->xcp.regs -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy(tcb->xcp.regs, tcb->xcp.saved_regs,
XCPTCONTEXT_SIZE);
- tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs;
+ tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up vector to the trampoline with interrupts
* disabled. We must already be in privileged thread mode
@@ -341,13 +344,14 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* been delivered.
*/
- CURRENT_REGS =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)CURRENT_REGS -
- (uint32_t)XCPTCONTEXT_SIZE);
+ CURRENT_REGS = (FAR void *)
+ ((uint32_t)CURRENT_REGS -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy((FAR uint32_t *)CURRENT_REGS, tcb->xcp.saved_regs,
XCPTCONTEXT_SIZE);
- CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS;
+ CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up vector to the trampoline with interrupts
* disabled. The kernel-space trampoline must run in
@@ -412,12 +416,13 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* delivered.
*/
- tcb->xcp.regs =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)tcb->xcp.regs -
- (uint32_t)XCPTCONTEXT_SIZE);
+ tcb->xcp.regs = (FAR void *)
+ ((uint32_t)tcb->xcp.regs -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy(tcb->xcp.regs, tcb->xcp.saved_regs, XCPTCONTEXT_SIZE);
- tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs;
+ tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Increment the IRQ lock count so that when the task is restarted,
* it will hold the IRQ spinlock.
diff --git a/arch/arm/src/armv7-r/arm_schedulesigaction.c b/arch/arm/src/armv7-r/arm_schedulesigaction.c
index 284ca3d..2456963 100644
--- a/arch/arm/src/armv7-r/arm_schedulesigaction.c
+++ b/arch/arm/src/armv7-r/arm_schedulesigaction.c
@@ -134,13 +134,14 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* delivered.
*/
- CURRENT_REGS =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)CURRENT_REGS -
- (uint32_t)XCPTCONTEXT_SIZE);
+ CURRENT_REGS = (FAR void *)
+ ((uint32_t)CURRENT_REGS -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy((FAR uint32_t *)CURRENT_REGS, tcb->xcp.saved_regs,
XCPTCONTEXT_SIZE);
- CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS;
+ CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up to vector to the trampoline with interrupts
* disabled
@@ -179,12 +180,13 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* delivered.
*/
- tcb->xcp.regs =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)tcb->xcp.regs -
- (uint32_t)XCPTCONTEXT_SIZE);
+ tcb->xcp.regs = (FAR void *)
+ ((uint32_t)tcb->xcp.regs -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy(tcb->xcp.regs, tcb->xcp.saved_regs, XCPTCONTEXT_SIZE);
- tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs;
+ tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up to vector to the trampoline with interrupts
* disabled
diff --git a/arch/arm/src/armv8-m/arm_schedulesigaction.c b/arch/arm/src/armv8-m/arm_schedulesigaction.c
index 228efad..495aed8 100644
--- a/arch/arm/src/armv8-m/arm_schedulesigaction.c
+++ b/arch/arm/src/armv8-m/arm_schedulesigaction.c
@@ -137,13 +137,14 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* delivered.
*/
- CURRENT_REGS =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)CURRENT_REGS -
- (uint32_t)XCPTCONTEXT_SIZE);
+ CURRENT_REGS = (FAR void *)
+ ((uint32_t)CURRENT_REGS -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy((FAR uint32_t *)CURRENT_REGS, tcb->xcp.saved_regs,
XCPTCONTEXT_SIZE);
- CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS;
+ CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up to vector to the trampoline with interrupts
* disabled. The kernel-space trampoline must run in
@@ -187,12 +188,13 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* delivered.
*/
- tcb->xcp.regs =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)tcb->xcp.regs -
- (uint32_t)XCPTCONTEXT_SIZE);
+ tcb->xcp.regs = (FAR void *)
+ ((uint32_t)tcb->xcp.regs -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy(tcb->xcp.regs, tcb->xcp.saved_regs, XCPTCONTEXT_SIZE);
- tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs;
+ tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up to vector to the trampoline with interrupts
* disabled. We must already be in privileged thread mode to be
@@ -294,13 +296,14 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* been delivered.
*/
- tcb->xcp.regs =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)tcb->xcp.regs -
- (uint32_t)XCPTCONTEXT_SIZE);
+ tcb->xcp.regs = (FAR void *)
+ ((uint32_t)tcb->xcp.regs -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy(tcb->xcp.regs, tcb->xcp.saved_regs,
XCPTCONTEXT_SIZE);
- tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs;
+ tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up vector to the trampoline with interrupts
* disabled. We must already be in privileged thread mode
@@ -341,13 +344,14 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* been delivered.
*/
- CURRENT_REGS =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)CURRENT_REGS -
- (uint32_t)XCPTCONTEXT_SIZE);
+ CURRENT_REGS = (FAR void *)
+ ((uint32_t)CURRENT_REGS -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy((FAR uint32_t *)CURRENT_REGS, tcb->xcp.saved_regs,
XCPTCONTEXT_SIZE);
- CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS;
+ CURRENT_REGS[REG_SP] = (uint32_t)CURRENT_REGS +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Then set up vector to the trampoline with interrupts
* disabled. The kernel-space trampoline must run in
@@ -416,12 +420,13 @@ void up_schedule_sigaction(struct tcb_s *tcb, sig_deliver_t sigdeliver)
* delivered.
*/
- tcb->xcp.regs =
- (FAR void *)STACK_ALIGN_DOWN((uint32_t)tcb->xcp.regs -
- (uint32_t)XCPTCONTEXT_SIZE);
+ tcb->xcp.regs = (FAR void *)
+ ((uint32_t)tcb->xcp.regs -
+ (uint32_t)XCPTCONTEXT_SIZE);
memcpy(tcb->xcp.regs, tcb->xcp.saved_regs, XCPTCONTEXT_SIZE);
- tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs;
+ tcb->xcp.regs[REG_SP] = (uint32_t)tcb->xcp.regs +
+ (uint32_t)XCPTCONTEXT_SIZE;
/* Increment the IRQ lock count so that when the task is restarted,
* it will hold the IRQ spinlock.