interrupt.h 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #pragma once
  2. #include <types/types.h>
  3. #define INTERRUPT_GATE_TYPE (0x8e)
  4. struct regs_32 {
  5. uint32_t edi;
  6. uint32_t esi;
  7. uint32_t ebp;
  8. uint32_t esp;
  9. uint32_t ebx;
  10. uint32_t edx;
  11. uint32_t ecx;
  12. uint32_t eax;
  13. };
  14. // external interrupt handler function
  15. // stub in assembly MUST be called irqN
  16. #define SET_UP_IRQ(N, SELECTOR) \
  17. extern void irq##N(); \
  18. ptr_t addr_irq##N = (ptr_t)irq##N; \
  19. SET_IDT_ENTRY(0x20 + (N), (addr_irq##N), (SELECTOR));
  20. #define SET_IDT_ENTRY_FN(N, FUNC_NAME, SELECTOR) \
  21. extern void FUNC_NAME(); \
  22. ptr_t addr_##FUNC_NAME = (ptr_t)FUNC_NAME; \
  23. SET_IDT_ENTRY((N), (addr_##FUNC_NAME), (SELECTOR));
  24. #define SET_IDT_ENTRY(N, ADDR, SELECTOR) \
  25. IDT[(N)].offset_low = (ADDR)&0x0000ffff; \
  26. IDT[(N)].selector = (SELECTOR); \
  27. IDT[(N)].zero = 0; \
  28. IDT[(N)].type_attr = INTERRUPT_GATE_TYPE; \
  29. IDT[(N)].offset_high = ((ADDR)&0xffff0000) >> 16
  30. struct IDT_entry {
  31. uint16_t offset_low;
  32. uint16_t selector;
  33. uint8_t zero;
  34. uint8_t type_attr;
  35. uint16_t offset_high;
  36. };
  37. #ifndef _INTERRUPT_C_
  38. extern struct IDT_entry IDT[256];
  39. #endif
  40. void init_idt();
  41. // idt_descriptor: uint16_t[3]
  42. // [0] bit 0 :15 => limit
  43. // [1] bit 16:47 => address
  44. extern void asm_load_idt(uint16_t idt_descriptor[3]);
  45. void int13_handler(
  46. struct regs_32 s_regs,
  47. uint32_t error_code,
  48. ptr_t eip,
  49. uint16_t cs,
  50. uint32_t eflags);
  51. void irq0_handler(void);
  52. void irq1_handler(void);
  53. void irq2_handler(void);
  54. void irq3_handler(void);
  55. void irq4_handler(void);
  56. void irq5_handler(void);
  57. void irq6_handler(void);
  58. void irq7_handler(void);
  59. void irq8_handler(void);
  60. void irq9_handler(void);
  61. void irq10_handler(void);
  62. void irq11_handler(void);
  63. void irq12_handler(void);
  64. void irq13_handler(void);
  65. void irq14_handler(void);
  66. void irq15_handler(void);