interrupt.h 2.0 KB

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