12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- #ifndef IRQ_H
- #define IRQ_H
- #include "compiler.h"
- #include "picorv32.h"
- #include "iodevs.h" /* For _IRQ constants */
- typedef void (*irqhandler_t)(unsigned int);
- extern irqhandler_t __irq_handler_table[];
- #define IRQHANDLER_DECL(x,n) \
- void irqhandler_##x##_##n (unsigned int vector __unused)
- #define IRQHANDLER(x,n) \
- IRQHANDLER_DECL(x,n); \
- __hot __text_hot IRQHANDLER_DECL(x,n)
- IRQHANDLER_DECL(spurious,0);
- typedef unsigned int irqmask_t;
- /* Disable IRQs except fatal system errors (to facilitate debugging) */
- static inline irqmask_t disable_irqs(void)
- {
- return p_maskirq(~((1 << EBREAK_IRQ)|(1 << BUSERR_IRQ)), 0);
- }
- static inline irqmask_t restore_irqs(irqmask_t mask)
- {
- return p_maskirq(mask, 0);
- }
- static inline irqmask_t restore_irq(irqmask_t mask, unsigned int vector)
- {
- const irqmask_t bit = 1U << vector;
- return p_maskirq(mask & bit, ~bit);
- }
- static inline irqmask_t mask_irqs(irqmask_t mask)
- {
- return p_maskirq(mask, ~mask);
- }
- static inline irqmask_t mask_irq(unsigned int vector)
- {
- return mask_irqs(1U << vector);
- }
- static inline irqmask_t unmask_irqs(irqmask_t mask)
- {
- return p_maskirq(0, ~mask);
- }
- static inline irqmask_t unmask_irq(unsigned int vector)
- {
- return unmask_irqs(1U << vector);
- }
- static inline irqmask_t irqmask(void)
- {
- return p_maskirq(0, ~0);
- }
- static inline irqmask_t waitfor(unsigned int vector)
- {
- const irqmask_t mask = 1U << vector;
- return p_waitirq(mask, 0);
- }
- /* Wait for any enabled IRQ */
- static inline irqmask_t wait_for_irq(void)
- {
- const irqmask_t mask = irqmask();
- return p_waitirq(mask, mask);
- }
- size_t rdxreg(unsigned int reg);
- void wrxreg(unsigned int reg, size_t val);
- #define IRQ_PC_REGISTER "s10"
- #define IRQ_VECTOR_MASK_REGISTER "s11"
- #endif /* IRQ_H */
|