diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2010-11-20 00:39:29 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2010-11-20 00:39:29 +0000 |
commit | 5eae3bcf7b345513044bceaebede0969bab4946d (patch) | |
tree | b827da1499744d503114c5f538007f93234903f9 /nuttx/arch/arm/src/lm3s | |
parent | 631c85af1216657895832c12d41625f08911a928 (diff) | |
download | px4-nuttx-5eae3bcf7b345513044bceaebede0969bab4946d.tar.gz px4-nuttx-5eae3bcf7b345513044bceaebede0969bab4946d.tar.bz2 px4-nuttx-5eae3bcf7b345513044bceaebede0969bab4946d.zip |
Fix Cortex-M3 nested interrupt hard fault
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3119 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch/arm/src/lm3s')
-rw-r--r-- | nuttx/arch/arm/src/lm3s/lm3s_vectors.S | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/nuttx/arch/arm/src/lm3s/lm3s_vectors.S b/nuttx/arch/arm/src/lm3s/lm3s_vectors.S index 5d6f7962e..b88b52c8b 100644 --- a/nuttx/arch/arm/src/lm3s/lm3s_vectors.S +++ b/nuttx/arch/arm/src/lm3s/lm3s_vectors.S @@ -607,7 +607,7 @@ lm3s_irqcommon: * values to the stack.
*/
- add r1, r0, #SW_XCPT_SIZE /* R1=Address of HW save area in reg array */
+ add r1, r0, #SW_XCPT_SIZE /* R1=Address of HW save area in reg array */
ldmia r1, {r4-r11} /* Fetch eight registers in HW save area */
ldr r1, [r0, #(4*REG_SP)] /* R1=Value of SP before interrupt */
stmdb r1!, {r4-r11} /* Store eight registers in HW save area */
@@ -622,17 +622,18 @@ lm3s_irqcommon: 2:
msr msp, r1 /* Recover the return MSP value */
- /* Do we need to restore interrupts? */
+ /* Restore the interrupt state. Preload r14 with the special return
+ * value first (so that the return actually occurs with interrupts
+ * still disabled).
+ */
- tst r3, #1 /* PRIMASK bit 1=1 means that interrupts are masked */
- bne 3f
- cpsie i /* Restore interrupts */
+ ldr r14, =EXC_RETURN /* Load the special value */
+ msr primask, r3 /* Restore interrupts */
/* Always return with R14 containing the special value that will: (1)
* return to thread mode, and (2) continue to use the MSP
*/
-3:
- ldr r14, =EXC_RETURN /* Load the special value */
+
bx r14 /* And return */
.size handlers, .-handlers
|