+ void ISR_FUNC func(void); \
+ /* \
+ * FIXME: avoid the inlining of this function. \
+ * \
+ * This is terribly inefficient, but it's a \
+ * reliable workaround to avoid gcc blowing \
+ * away the stack (see the bug below): \
+ * \
+ * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41999 \
+ */ \
+ static NOINLINE void __isr_##func(void); \
+ void ISR_FUNC func(void) \
+ { \
+ asm volatile ( \
+ "sub lr, lr, #4\n\t" \
+ "stmfd sp!, {r0-r3, ip, lr}\n\t"); \
+ __isr_##func(); \
+ asm volatile ( \
+ "ldmfd sp!, {r0-r3, ip, pc}^\n\t"); \
+ } \
+ static NOINLINE void __isr_##func(void)