summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/common
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2009-05-13 16:19:05 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2009-05-13 16:19:05 +0000
commitd85a6b5e74dbbf82ef5ed1518d9c588356a11251 (patch)
treedea1afe1fb2cb6db6e1f6aaf63c72fe52a1a62f5 /nuttx/arch/arm/src/common
parent27bee603a196dd9049de194777cc3be0d7514075 (diff)
downloadpx4-nuttx-d85a6b5e74dbbf82ef5ed1518d9c588356a11251.tar.gz
px4-nuttx-d85a6b5e74dbbf82ef5ed1518d9c588356a11251.tar.bz2
px4-nuttx-d85a6b5e74dbbf82ef5ed1518d9c588356a11251.zip
1st cut at lm3s6918 interrupt handling
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@1776 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch/arm/src/common')
-rw-r--r--nuttx/arch/arm/src/common/up_assert.c3
-rw-r--r--nuttx/arch/arm/src/common/up_initialstate.c17
-rw-r--r--nuttx/arch/arm/src/common/up_schedulesigaction.c40
-rw-r--r--nuttx/arch/arm/src/common/up_sigdeliver.c14
4 files changed, 55 insertions, 19 deletions
diff --git a/nuttx/arch/arm/src/common/up_assert.c b/nuttx/arch/arm/src/common/up_assert.c
index 8460c6b71..88dd0bd49 100644
--- a/nuttx/arch/arm/src/common/up_assert.c
+++ b/nuttx/arch/arm/src/common/up_assert.c
@@ -134,7 +134,8 @@ static inline void up_registerdump(void)
}
#ifdef __thumb2__
- lldbg("xPSR: %08x\n", current_regs[REG_XPSR]);
+ lldbg("xPSR: %08x PRIMASK: %08x\n",
+ current_regs[REG_XPSR], current_regs[REG_PRIMASK]);
#else
lldbg("CPSR: %08x\n", current_regs[REG_CPSR]);
#endif
diff --git a/nuttx/arch/arm/src/common/up_initialstate.c b/nuttx/arch/arm/src/common/up_initialstate.c
index 2dd1695ba..a945b4c51 100644
--- a/nuttx/arch/arm/src/common/up_initialstate.c
+++ b/nuttx/arch/arm/src/common/up_initialstate.c
@@ -81,11 +81,18 @@ void up_initial_state(_TCB *tcb)
/* Initialize the initial exception register context structure */
memset(xcp, 0, sizeof(struct xcptcontext));
- xcp->regs[REG_SP] = (uint32)tcb->adj_stack_ptr;
- xcp->regs[REG_PC] = (uint32)tcb->start;
-#ifdef CONFIG_SUPPRESS_INTERRUPTS
- xcp->regs[REG_CPSR] = SVC_MODE | PSR_I_BIT | PSR_F_BIT;
+ xcp->regs[REG_SP] = (uint32)tcb->adj_stack_ptr;
+ xcp->regs[REG_PC] = (uint32)tcb->start;
+
+#ifdef __thumb2__
+# ifdef CONFIG_SUPPRESS_INTERRUPTS
+ xcp->regs[REG_PRIMASK] = 1;
+# endif
#else
- xcp->regs[REG_CPSR] = SVC_MODE | PSR_F_BIT;
+# ifdef CONFIG_SUPPRESS_INTERRUPTS
+ xcp->regs[REG_CPSR] = SVC_MODE | PSR_I_BIT | PSR_F_BIT;
+# else
+ xcp->regs[REG_CPSR] = SVC_MODE | PSR_F_BIT;
+# endif
#endif
}
diff --git a/nuttx/arch/arm/src/common/up_schedulesigaction.c b/nuttx/arch/arm/src/common/up_schedulesigaction.c
index 36be3eb24..fb6798468 100644
--- a/nuttx/arch/arm/src/common/up_schedulesigaction.c
+++ b/nuttx/arch/arm/src/common/up_schedulesigaction.c
@@ -146,16 +146,26 @@ void up_schedule_sigaction(_TCB *tcb, sig_deliver_t sigdeliver)
* the signals have been delivered.
*/
- tcb->xcp.sigdeliver = sigdeliver;
- tcb->xcp.saved_pc = current_regs[REG_PC];
- tcb->xcp.saved_cpsr = current_regs[REG_CPSR];
+ tcb->xcp.sigdeliver = sigdeliver;
+ tcb->xcp.saved_pc = current_regs[REG_PC];
+#ifdef __thumb2__
+ tcb->xcp.saved_primask = current_regs[REG_PRIMASK];
+ tcb->xcp.saved_xpsr = current_regs[REG_XPSR];
+#else
+ tcb->xcp.saved_cpsr = current_regs[REG_CPSR];
+#endif
/* Then set up to vector to the trampoline with interrupts
* disabled
*/
- current_regs[REG_PC] = (uint32)up_sigdeliver;
- current_regs[REG_CPSR] = SVC_MODE | PSR_I_BIT | PSR_F_BIT;
+ current_regs[REG_PC] = (uint32)up_sigdeliver;
+#ifdef __thumb2__
+ current_regs[REG_PRIMASK] = 1;
+ current_regs[REG_XPSR] = 0;
+#else
+ current_regs[REG_CPSR] = SVC_MODE | PSR_I_BIT | PSR_F_BIT;
+#endif
/* And make sure that the saved context in the TCB
* is the same as the interrupt return context.
@@ -178,16 +188,26 @@ void up_schedule_sigaction(_TCB *tcb, sig_deliver_t sigdeliver)
* the signals have been delivered.
*/
- tcb->xcp.sigdeliver = sigdeliver;
- tcb->xcp.saved_pc = tcb->xcp.regs[REG_PC];
- tcb->xcp.saved_cpsr = tcb->xcp.regs[REG_CPSR];
+ tcb->xcp.sigdeliver = sigdeliver;
+ tcb->xcp.saved_pc = tcb->xcp.regs[REG_PC];
+#ifdef __thumb2__
+ tcb->xcp.saved_primask = tcb->xcp.regs[REG_PRIMASK];
+ tcb->xcp.saved_xpsr = tcb->xcp.regs[REG_XPSR];
+#else
+ tcb->xcp.saved_cpsr = tcb->xcp.regs[REG_CPSR];
+#endif
/* Then set up to vector to the trampoline with interrupts
* disabled
*/
- tcb->xcp.regs[REG_PC] = (uint32)up_sigdeliver;
- tcb->xcp.regs[REG_CPSR] = SVC_MODE | PSR_I_BIT | PSR_F_BIT;
+ tcb->xcp.regs[REG_PC] = (uint32)up_sigdeliver;
+#ifdef __thumb2__
+ tcb->xcp.regs[REG_PRIMASK] = 1;
+ tcb->xcp.regs[REG_XPSR] = 0;
+#else
+ tcb->xcp.regs[REG_CPSR] = SVC_MODE | PSR_I_BIT | PSR_F_BIT;
+#endif
}
irqrestore(flags);
diff --git a/nuttx/arch/arm/src/common/up_sigdeliver.c b/nuttx/arch/arm/src/common/up_sigdeliver.c
index 16227ae21..bf5661696 100644
--- a/nuttx/arch/arm/src/common/up_sigdeliver.c
+++ b/nuttx/arch/arm/src/common/up_sigdeliver.c
@@ -102,9 +102,13 @@ void up_sigdeliver(void)
/* Save the real return state on the stack. */
up_copystate(regs, rtcb->xcp.regs);
- regs[REG_PC] = rtcb->xcp.saved_pc;
- regs[REG_CPSR] = rtcb->xcp.saved_cpsr;
-
+ regs[REG_PC] = rtcb->xcp.saved_pc;
+#ifdef __thumb2__
+ regs[REG_PRIMASK] = rtcb->xcp.saved_primask;
+ regs[REG_XPSR] = rtcb->xcp.saved_xpsr;
+#else
+ regs[REG_CPSR] = rtcb->xcp.saved_cpsr;
+#endif
/* Get a local copy of the sigdeliver function pointer.
* we do this so that we can nullify the sigdeliver
* function point in the TCB and accept more signal
@@ -117,7 +121,11 @@ void up_sigdeliver(void)
/* Then restore the task interrupt statat. */
+#ifdef __thumb2__
+ irqrestore((uint16)regs[REG_PRIMASK]);
+#else
irqrestore(regs[REG_CPSR]);
+#endif
/* Deliver the signals */