Advertisement
Guest User

Untitled

a guest
Sep 15th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.46 KB | None | 0 0
  1. struct idt_entry_t {
  2. uint16_t offset_lo;
  3. uint16_t selector;
  4. uint8_t ist;
  5. uint8_t type_attr;
  6. uint16_t offset_mid;
  7. uint32_t offset_hi;
  8. uint32_t zero;
  9. };
  10.  
  11. struct idt_ptr_t {
  12. uint16_t size;
  13. /* Start address */
  14. uint64_t address;
  15. } __attribute((packed));
  16.  
  17. static struct idt_entry_t idt[256];
  18.  
  19. void init_idt(void) {
  20. /* Exception handlers */
  21. register_interrupt_handler(0x0, exc_div0_handler, 0, 0x8e);
  22. register_interrupt_handler(0x1, exc_debug_handler, 0, 0x8e);
  23. register_interrupt_handler(0x2, exc_nmi_handler, 0, 0x8e);
  24. register_interrupt_handler(0x3, exc_breakpoint_handler, 0, 0x8e);
  25. register_interrupt_handler(0x4, exc_overflow_handler, 0, 0x8e);
  26. register_interrupt_handler(0x5, exc_bound_range_handler, 0, 0x8e);
  27. register_interrupt_handler(0x6, exc_inv_opcode_handler, 0, 0x8e);
  28. register_interrupt_handler(0x7, exc_no_dev_handler, 0, 0x8e);
  29. register_interrupt_handler(0x8, exc_double_fault_handler, 1, 0x8e);
  30. register_interrupt_handler(0xa, exc_inv_tss_handler, 0, 0x8e);
  31. register_interrupt_handler(0xb, exc_no_segment_handler, 0, 0x8e);
  32. register_interrupt_handler(0xc, exc_ss_fault_handler, 0, 0x8e);
  33. register_interrupt_handler(0xd, exc_gpf_handler, 0, 0x8e);
  34. register_interrupt_handler(0xe, exc_page_fault_handler, 0, 0x8e);
  35. register_interrupt_handler(0x10, exc_x87_fp_handler, 0, 0x8e);
  36. register_interrupt_handler(0x11, exc_alignment_check_handler, 0, 0x8e);
  37. register_interrupt_handler(0x12, exc_machine_check_handler, 0, 0x8e);
  38. register_interrupt_handler(0x13, exc_simd_fp_handler, 0, 0x8e);
  39. register_interrupt_handler(0x14, exc_virt_handler, 0, 0x8e);
  40. /* 0x15 .. 0x1d resv. */
  41. register_interrupt_handler(0x1e, exc_security_handler, 0, 0x8e);
  42.  
  43. register_interrupt_handler(0x20, irq0_handler, 0, 0x8e);
  44. register_interrupt_handler(0x21, irq1_handler, 0, 0x8e);
  45.  
  46. struct idt_ptr_t idt_ptr = {
  47. sizeof(idt) - 1,
  48. (uint64_t)idt
  49. };
  50.  
  51. asm volatile (
  52. "lidt %0"
  53. :
  54. : "m" (idt_ptr)
  55. );
  56. }
  57.  
  58. int register_interrupt_handler(size_t vec, void (*handler)(void), uint8_t ist, uint8_t type) {
  59. uint64_t p = (uint64_t)handler;
  60.  
  61. idt[vec].offset_lo = (uint16_t)p;
  62. idt[vec].selector = 0x08;
  63. idt[vec].ist = ist;
  64. idt[vec].type_attr = type;
  65. idt[vec].offset_mid = (uint16_t)(p >> 16);
  66. idt[vec].offset_hi = (uint32_t)(p >> 32);
  67. idt[vec].zero = 0;
  68.  
  69. return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement