summaryrefslogtreecommitdiff
path: root/nuttx/arch/sh
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-11-08 16:27:21 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-11-08 16:27:21 +0000
commit48ca47d791830d3f34ab157e22a7823ae0373b54 (patch)
treeaa3c6f72a9464cba98b2149a51e60094e24dfd08 /nuttx/arch/sh
parent94ad22d83ced0c372de9dc5d38317293c66d629c (diff)
downloadpx4-nuttx-48ca47d791830d3f34ab157e22a7823ae0373b54.tar.gz
px4-nuttx-48ca47d791830d3f34ab157e22a7823ae0373b54.tar.bz2
px4-nuttx-48ca47d791830d3f34ab157e22a7823ae0373b54.zip
Add interrupt stack
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@1168 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch/sh')
-rw-r--r--nuttx/arch/sh/src/common/up_doirq.c13
-rw-r--r--nuttx/arch/sh/src/sh1/sh1_vector.S67
2 files changed, 73 insertions, 7 deletions
diff --git a/nuttx/arch/sh/src/common/up_doirq.c b/nuttx/arch/sh/src/common/up_doirq.c
index 01aa21500..2c3943b06 100644
--- a/nuttx/arch/sh/src/common/up_doirq.c
+++ b/nuttx/arch/sh/src/common/up_doirq.c
@@ -83,13 +83,21 @@ void up_doirq(int irq, uint32* regs)
/* Mask and acknowledge the interrupt (if supported by the chip) */
+#ifndef CONFIG_ARCH_NOINTC
up_maskack_irq(irq);
+#endif
/* Deliver the IRQ */
irq_dispatch(irq, regs);
- /* Indicate that we are no long in an interrupt handler */
+ /* Get the current value of regs... it may have changed because
+ * of a context switch performed during interrupt processing.
+ */
+
+ regs = current_regs;
+
+ /* Indicate that we are no longer in an interrupt handler */
current_regs = NULL;
@@ -97,8 +105,11 @@ void up_doirq(int irq, uint32* regs)
* disabled.
*/
+#ifndef CONFIG_ARCH_NOINTC
up_enable_irq(irq);
+#endif
}
up_ledoff(LED_INIRQ);
#endif
+ return regs;
}
diff --git a/nuttx/arch/sh/src/sh1/sh1_vector.S b/nuttx/arch/sh/src/sh1/sh1_vector.S
index 1df2838d0..a9efa214a 100644
--- a/nuttx/arch/sh/src/sh1/sh1_vector.S
+++ b/nuttx/arch/sh/src/sh1/sh1_vector.S
@@ -67,6 +67,29 @@
.section .reset
/*****************************************************************************
+ * Name: _up_fullcontextrestore
+ *
+ * Description:
+ * restore context from a set of save registers
+ *
+ * R4 : Points to a the register save structure
+ *
+ *****************************************************************************/
+ .section irq
+ .global _up_fullcontextrestore
+ .type _up_fullcontextrestore, #function
+
+_up_fullcontextrestore:
+ stc sr, r8 /* Mask all interrupts */
+ mov.l .Lintmask, r9
+ or r9, r8
+ ldc r8, sr
+
+ mov r5, r15 /* Replace stack pointer with the context save */
+ bra _up_restoreregs
+ .size _up_fullcontextrestore, .-_up_fullcontextrestore
+
+/*****************************************************************************
* Name: _up_vector
*
* Description:
@@ -100,7 +123,7 @@ _up_vector:
mov.l r9, @-r15
mov.l r8, @-r15
- stc sr, r8 /* Mask all interrupts */
+ stc sr, r8 /* Mask all interrupts */
mov.l .Lintmask, r9
or r9, r8
ldc r8, sr
@@ -111,15 +134,18 @@ _up_vector:
mov.l r3, @-r15
mov.l r2, @-r15
mov.l r1, @-r15
- mov.l r0, @-r15
+ mov.l r0, @r15
/* Setup parameters: R4=IRQ number, R5=base of saved state */
mov r15, r5
- add #-XCPTCONTEXT_SIZE, r5
/* Switch to the interrupt stack */
+#if CONFIG_ARCH_INTERRUPTSTACK > 3
+ mov.l .Lintstack, r15 /* SP = interrupt stack base */
+ mov.l r5, @sp /* Save the user stack pointer */
+#endif
/* Dispatch the interrupt */
mov.l .Ldoirq, r0
@@ -131,11 +157,14 @@ _up_vector:
* one that we passed in via r5.
*/
- add #XCPTCONTEXT_SIZE, r0
+ add #-XCPTCONTEXT_SIZE, r0
mov r0, r15
- /* Restore registers */
+ /* Restore registers. R15 may point to either the stack or a saved
+ * context structure inside of a TCB.
+ */
+_up_restoreregs:
mov.l @r15+, r0
mov.l @r15+, r1
mov.l @r15+, r2
@@ -157,15 +186,41 @@ _up_vector:
lds.l @r15+, macl
mov.l @r15+, r4
- add #4, r15
+ mov.l @r15, r15 /* The real stack pointer */
rte
nop
.align 2
.Lintmask:
.long 0x000000f0
+#if CONFIG_ARCH_INTERRUPTSTACK > 3
+.Lintstack:
+ .long _up_stackbase
+#endif
.Ldoirq:
.long _up_doirq
.size _up_vector, .-_up_vector
+
+/************************************************************************************
+ * Name: up_interruptstack/g_userstack
+ *
+ * Description:
+ * Shouldn't happen
+ *
+ ************************************************************************************/
+
+#if CONFIG_ARCH_INTERRUPTSTACK > 3
+ .bss
+ .align 4
+ .globl _g_userstack
+ .type _g_userstack, object
+_up_interruptstack:
+ .skip ((CONFIG_ARCH_INTERRUPTSTACK & ~3) - 4)
+_g_userstack:
+_up_stackbase:
+ .skip 4
+ .size _g_userstack, 4
+ .size _up_interruptstack, (CONFIG_ARCH_INTERRUPTSTACK & ~3)
+#endif
.end