irq.c 987 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #include "picorv32.h"
  2. #include "fw.h"
  3. #include "console.h"
  4. /* Invalid interrupt */
  5. static void spurious_irq_handler(unsigned int vector)
  6. {
  7. mask_irq(vector);
  8. }
  9. /* Valid edge-triggered interrupt just to wake up waitirq */
  10. void null_irq_handler(unsigned int vector)
  11. {
  12. }
  13. irq_handler_t __irq_handler_table[IRQ_VECTORS] =
  14. { [0 ... IRQ_VECTORS-1] = spurious_irq_handler };
  15. irq_handler_t register_irq(unsigned int vector, irq_handler_t handler,
  16. bool enable)
  17. {
  18. irq_handler_t old_handler;
  19. if (vector >= IRQ_VECTORS)
  20. return NULL; /* Invalid vector */
  21. mask_irq(vector);
  22. if (!handler) {
  23. enable = false;
  24. handler = spurious_irq_handler;
  25. }
  26. old_handler = __irq_handler_table[vector];
  27. __irq_handler_table[vector] = handler;
  28. if (enable && handler)
  29. unmask_irq(vector);
  30. if (old_handler == spurious_irq_handler)
  31. handler = NULL;
  32. con_printf("irq: register vector %u, mask = %08x\n",
  33. vector, irqmask());
  34. return old_handler;
  35. }