interrupt.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. // present: When set, the page fault was caused by a page-protection violation.
  16. // When not set, it was caused by a non-present page.
  17. // write: When set, the page fault was caused by a write access.
  18. // When not set, it was caused by a read access.
  19. // user: When set, the page fault was caused while CPL = 3.
  20. // This does not necessarily mean that the page fault was a privilege violation.
  21. // from https://wiki.osdev.org/Exceptions#Page_Fault
  22. struct page_fault_error_code {
  23. uint32_t present : 1;
  24. uint32_t write : 1;
  25. uint32_t user : 1;
  26. uint32_t reserved_write : 1;
  27. uint32_t instruction_fetch : 1;
  28. uint32_t protection_key : 1;
  29. uint32_t shadow_stack : 1;
  30. uint32_t software_guard_extensions : 1;
  31. };
  32. // external interrupt handler function
  33. // stub in assembly MUST be called irqN
  34. #define SET_UP_IRQ(N, SELECTOR) \
  35. extern void irq##N(); \
  36. ptr_t addr_irq##N = (ptr_t)irq##N; \
  37. SET_IDT_ENTRY(0x20 + (N), (addr_irq##N), (SELECTOR));
  38. #define SET_IDT_ENTRY_FN(N, FUNC_NAME, SELECTOR) \
  39. extern void FUNC_NAME(); \
  40. ptr_t addr_##FUNC_NAME = (ptr_t)FUNC_NAME; \
  41. SET_IDT_ENTRY((N), (addr_##FUNC_NAME), (SELECTOR));
  42. #define SET_IDT_ENTRY(N, ADDR, SELECTOR) \
  43. IDT[(N)].offset_low = (ADDR)&0x0000ffff; \
  44. IDT[(N)].selector = (SELECTOR); \
  45. IDT[(N)].zero = 0; \
  46. IDT[(N)].type_attr = INTERRUPT_GATE_TYPE; \
  47. IDT[(N)].offset_high = ((ADDR)&0xffff0000) >> 16
  48. struct IDT_entry {
  49. uint16_t offset_low;
  50. uint16_t selector;
  51. uint8_t zero;
  52. uint8_t type_attr;
  53. uint16_t offset_high;
  54. };
  55. #ifndef _INTERRUPT_C_
  56. extern struct IDT_entry IDT[256];
  57. #endif
  58. void init_idt(void);
  59. void init_pic(void);
  60. // idt_descriptor: uint16_t[3]
  61. // [0] bit 0 :15 => limit
  62. // [1] bit 16:47 => address
  63. extern void asm_load_idt(uint16_t idt_descriptor[3], int sti);
  64. void int13_handler(
  65. struct regs_32 s_regs,
  66. uint32_t error_code,
  67. ptr_t eip,
  68. uint16_t cs,
  69. uint32_t eflags);
  70. void int14_handler(
  71. linr_ptr_t l_addr,
  72. struct regs_32 s_regs,
  73. struct page_fault_error_code error_code,
  74. void* v_eip,
  75. uint16_t cs,
  76. uint32_t eflags);
  77. void irq0_handler(void);
  78. void irq1_handler(void);
  79. void irq2_handler(void);
  80. void irq3_handler(void);
  81. void irq4_handler(void);
  82. void irq5_handler(void);
  83. void irq6_handler(void);
  84. void irq7_handler(void);
  85. void irq8_handler(void);
  86. void irq9_handler(void);
  87. void irq10_handler(void);
  88. void irq11_handler(void);
  89. void irq12_handler(void);
  90. void irq13_handler(void);
  91. void irq14_handler(void);
  92. void irq15_handler(void);