summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2009-05-07 15:59:13 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2009-05-07 15:59:13 +0000
commitae1239087a624dbd33b7b527cb15a829acd1a0c9 (patch)
treeb9c71126c395bfbf12c89c1bb1818663c3dfb61c
parente69c915f57a6e3d5612b13064b84b62870890958 (diff)
downloadnuttx-ae1239087a624dbd33b7b527cb15a829acd1a0c9.tar.gz
nuttx-ae1239087a624dbd33b7b527cb15a829acd1a0c9.tar.bz2
nuttx-ae1239087a624dbd33b7b527cb15a829acd1a0c9.zip
Add irqsave/restore() macros for Cortex-M3
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@1758 42af7a65-404d-4744-a932-0658087f49c3
-rw-r--r--nuttx/arch/arm/include/irq.h52
-rw-r--r--nuttx/arch/arm/include/types.h9
-rw-r--r--nuttx/configs/eagle100/README.txt4
3 files changed, 59 insertions, 6 deletions
diff --git a/nuttx/arch/arm/include/irq.h b/nuttx/arch/arm/include/irq.h
index 1d5fddd79..b2cd3d9c0 100644
--- a/nuttx/arch/arm/include/irq.h
+++ b/nuttx/arch/arm/include/irq.h
@@ -1,7 +1,7 @@
/****************************************************************************
* arch/arm/include/irq.h
*
- * Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
@@ -33,8 +33,8 @@
*
****************************************************************************/
-/* This file should never be included directed but, rather,
- * only indirectly through nuttx/irq.h
+/* This file should never be included directed but, rather, only indirectly
+ * through nuttx/irq.h
*/
#ifndef __ARCH_ARM_INCLUDE_IRQ_H
@@ -157,6 +157,49 @@ struct xcptcontext
#ifndef __ASSEMBLY__
+#ifdef __thumb2__
+
+/* Save the current interrupt enable state & disable IRQs */
+
+static inline irqstate_t irqsave(void)
+{
+ unsigned short primask;
+
+ /* Return the the current value of primask register and set
+ * bit 0 of the primask register to disable interrupts
+ */
+
+ __asm__ __volatile__
+ (
+ "\tmrs %0, primask\n"
+ "\tcpsid i\n"
+ : "=r" (primask)
+ :
+ : "memory");
+ return primask;
+}
+
+/* Restore saved IRQ & FIQ state */
+
+static inline void irqrestore(irqstate_t primask)
+{
+ /* If bit 0 of the primask is 0, then we need to restore
+ * interupts.
+ */
+
+ __asm__ __volatile__
+ (
+ "\ttst %0, #1\n"
+ "\tbne 1f\n"
+ "\tcpsie i\n"
+ "1:\n"
+ :
+ : "r" (primask)
+ : "memory");
+}
+
+#else /* __thumb2__ */
+
/* Save the current interrupt enable state & disable IRQs */
static inline irqstate_t irqsave(void)
@@ -201,7 +244,8 @@ static inline void system_call(swint_t func, int parm1,
"r" ((long)(parm2)), "r" ((long)(parm3))
: "r0", "r1", "r2", "r3", "lr");
}
-#endif
+#endif /* __thumb2__ */
+#endif /* __ASSEMBLY__ */
/****************************************************************************
* Public Variables
diff --git a/nuttx/arch/arm/include/types.h b/nuttx/arch/arm/include/types.h
index f72e6de8c..964ce8960 100644
--- a/nuttx/arch/arm/include/types.h
+++ b/nuttx/arch/arm/include/types.h
@@ -67,11 +67,16 @@ typedef unsigned int uint32;
typedef long long sint64;
typedef unsigned long long uint64;
-/* This is the size of the interrupt state save returned by
- * irqsave()
+/* This is the size of the interrupt state save returned by irqsave(). For
+ * ARM, a 32 register value is returned, for the thumb2, Cortex-M3, the 16-bit
+ * primask register value is returned,
*/
+#ifdef __thumb2__
+typedef unsigned short irqstate_t;
+#else /* __thumb2__ */
typedef unsigned int irqstate_t;
+#endif /* __thumb2__ */
#endif /* __ASSEMBLY__ */
diff --git a/nuttx/configs/eagle100/README.txt b/nuttx/configs/eagle100/README.txt
index f60dcd48c..27a725cf9 100644
--- a/nuttx/configs/eagle100/README.txt
+++ b/nuttx/configs/eagle100/README.txt
@@ -33,6 +33,10 @@ Toolchain
8. Edit setenv.h, if necessary, so that the PATH variable includes
the path to the newly built binaries.
+ See the file configs/README.txt in the buildroot source tree. That has more
+ detailed PLUS some special instructions that you will need to follow if you are
+ building a Cortex-M3 toolchain for Cygwin under Windows.
+
Eagle100-specific Configuration Options
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^