interrupt.h 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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 irq0_handler(void);
  53. void irq1_handler(void);
  54. void irq2_handler(void);
  55. void irq3_handler(void);
  56. void irq4_handler(void);
  57. void irq5_handler(void);
  58. void irq6_handler(void);
  59. void irq7_handler(void);
  60. void irq8_handler(void);
  61. void irq9_handler(void);
  62. void irq10_handler(void);
  63. void irq11_handler(void);
  64. void irq12_handler(void);
  65. void irq13_handler(void);
  66. void irq14_handler(void);
  67. void irq15_handler(void);