summaryrefslogtreecommitdiff
path: root/nuttx/arch
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx/arch')
-rw-r--r--nuttx/arch/avr/include/avr/irq.h40
1 files changed, 35 insertions, 5 deletions
diff --git a/nuttx/arch/avr/include/avr/irq.h b/nuttx/arch/avr/include/avr/irq.h
index 16966d194..c18f6c4b8 100644
--- a/nuttx/arch/avr/include/avr/irq.h
+++ b/nuttx/arch/avr/include/avr/irq.h
@@ -93,21 +93,51 @@ struct xcptcontext
#ifndef __ASSEMBLY__
+/* Read/write the SREG */
+
+static inline irqstate_t getsreg(void)
+{
+ irqstate_t sreg;
+ asm volatile ("in %0, __SREG__" : =r (sreg) :: );
+ return sreg;
+}
+
+static inline void putsreg(irqstate_t sreg)
+{
+ asm volatile ("out __SREG__, %s" : : "r" (sreg) : );
+}
+
+/* Interrupt enable/disable */
+
+static inline void irqenable()
+{
+ asm volatile ("sei" ::);
+}
+
+static inline void irqdisable()
+{
+ asm volatile ("cli" ::);
+}
+
/* Save the current interrupt enable state & disable all interrupts */
static inline irqstate_t irqsave(void)
{
- /* Needs to return the current interrupt state, then disable interrupts */
-#warning "Not implemented"
- return 0
+ irqstate_t sreg;
+ asm volatile
+ (
+ "\tin %0, __SREG__\n"
+ "\tcli\n
+ : "=&r" (sreg) ::
+ );
+ return sreg;
}
/* Restore saved interrupt state */
static inline void irqrestore(irqstate_t flags)
{
- /* Based on the provided interrupt flags, conditionally enable interrupts */
-#warning "Not implemented"
+ asm volatile ("out __SREG__, %s" : : "r" (flags) : );
}
#endif /* __ASSEMBLY__ */