diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2009-05-07 15:59:13 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2009-05-07 15:59:13 +0000 |
commit | ae1239087a624dbd33b7b527cb15a829acd1a0c9 (patch) | |
tree | b9c71126c395bfbf12c89c1bb1818663c3dfb61c /nuttx/arch/arm | |
parent | e69c915f57a6e3d5612b13064b84b62870890958 (diff) | |
download | px4-nuttx-ae1239087a624dbd33b7b527cb15a829acd1a0c9.tar.gz px4-nuttx-ae1239087a624dbd33b7b527cb15a829acd1a0c9.tar.bz2 px4-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
Diffstat (limited to 'nuttx/arch/arm')
-rw-r--r-- | nuttx/arch/arm/include/irq.h | 52 | ||||
-rw-r--r-- | nuttx/arch/arm/include/types.h | 9 |
2 files changed, 55 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__ */ |