| 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 */
 |