interrupt.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #pragma once
  2. #include <types/types.h>
  3. #define INTERRUPT_GATE_TYPE (0x8e)
  4. // external interrupt handler function
  5. // stub in assembly MUST be called irqN
  6. #define SET_UP_IRQ(N, SELECTOR) \
  7. extern void irq##N(); \
  8. ptr_t addr_irq##N = (ptr_t)irq##N; \
  9. SET_IDT_ENTRY(0x20 + (N), (addr_irq##N), (SELECTOR));
  10. #define SET_IDT_ENTRY(N, ADDR, SELECTOR) \
  11. IDT[(N)].offset_low = (ADDR)&0x0000ffff; \
  12. IDT[(N)].selector = (SELECTOR); \
  13. IDT[(N)].zero = 0; \
  14. IDT[(N)].type_attr = INTERRUPT_GATE_TYPE; \
  15. IDT[(N)].offset_high = ((ADDR)&0xffff0000) >> 16
  16. struct IDT_entry {
  17. uint16_t offset_low;
  18. uint16_t selector;
  19. uint8_t zero;
  20. uint8_t type_attr;
  21. uint16_t offset_high;
  22. };
  23. #ifndef _INTERRUPT_C_
  24. extern struct IDT_entry IDT[256];
  25. #endif
  26. void init_idt();
  27. // idt_descriptor: uint16_t[3]
  28. // [0] bit 0 :15 => limit
  29. // [1] bit 16:47 => address
  30. extern void asm_load_idt(uint16_t idt_descriptor[3]);
  31. void irq0_handler(void);
  32. void irq1_handler(void);
  33. void irq2_handler(void);
  34. void irq3_handler(void);
  35. void irq4_handler(void);
  36. void irq5_handler(void);
  37. void irq6_handler(void);
  38. void irq7_handler(void);
  39. void irq8_handler(void);
  40. void irq9_handler(void);
  41. void irq10_handler(void);
  42. void irq11_handler(void);
  43. void irq12_handler(void);
  44. void irq13_handler(void);
  45. void irq14_handler(void);
  46. void irq15_handler(void);