Advertisement
Guest User

Untitled

a guest
Mar 28th, 2015
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.40 KB | None | 0 0
  1. #include <hardware/idt.h>
  2. #include <hardware/isr.h>
  3. #include <system/system.h>
  4. #include <system/typedef.h>
  5. #include <io/memory.h>
  6. #include <io/terminal.h>
  7. #include <io/ports.h>
  8.  
  9. idtentry_t idt[IDT_ENTRIES];
  10. idtptr_t idt_ptr;
  11.  
  12. void idt_set_gate (uint8_t, uint32_t, uint16_t, uint8_t);
  13. void idt_set_exceptions (void);
  14. void idt_set_irqs (void);
  15. void idt_set_syscalls (void);
  16. void idt_remap (void);
  17. void idt_handle_exception (stackframe_t *);
  18. void idt_handle_irq (stackframe_t *);
  19.  
  20. void init_idt (void) {
  21. idt_remap ();
  22.  
  23. idt_ptr.limit = (sizeof (idtentry_t) * IDT_ENTRIES) - 1;
  24. idt_ptr.base = (uint32_t) &idt;
  25.  
  26. idt_set_exceptions ();
  27. idt_set_irqs ();
  28. idt_set_syscalls ();
  29.  
  30. memset (&idt, 0, sizeof (idtentry_t) * IDT_ENTRIES);
  31.  
  32. idt_load ();
  33. }
  34.  
  35. void idt_set_gate (uint8_t num, uint32_t base, uint16_t sel, uint8_t flags) {
  36. idt[num].base_low = (base) & 0xFFFF;
  37. idt[num].base_high = (base >> 16) & 0xFFFF;
  38. idt[num].sel = (sel);
  39. idt[num].flags = (flags);
  40. idt[num].zero = 0;
  41. }
  42.  
  43. void idt_remap (void) {
  44. outb (0x20, 0x11);
  45. outb (0xA0, 0x11);
  46. outb (0x21, 0x20);
  47. outb (0xA1, 0x28);
  48. outb (0x21, 0x04);
  49. outb (0xA1, 0x02);
  50. outb (0x21, 0x01);
  51. outb (0xA1, 0x01);
  52. outb (0x21, 0x0);
  53. outb (0xA1, 0x0);
  54. }
  55.  
  56. stackframe_t *idt_handle_general (stackframe_t *frame) {
  57. if (frame->intr <= 0x1F) {
  58. idt_handle_exception (frame);
  59. } else if (frame->intr >= 0x20 && frame->intr <= 0x2F) {
  60. idt_handle_irq (frame);
  61. if (frame->intr >= 0x28)
  62. outb (0xA0, 0x20);
  63. outb (0x20, 0x20);
  64. }
  65. return frame;
  66. }
  67.  
  68. void idt_handle_exception (stackframe_t *frame) {
  69. puts ("x");
  70. }
  71.  
  72. void idt_handle_irq (stackframe_t *frame) {
  73. puts (".");
  74. }
  75.  
  76. void idt_set_exceptions (void) {
  77. idt_set_gate (0x00, (uint32_t) isr0, 0x08, 0x8E);
  78. idt_set_gate (0x01, (uint32_t) isr1, 0x08, 0x8E);
  79. idt_set_gate (0x02, (uint32_t) isr2, 0x08, 0x8E);
  80. idt_set_gate (0x03, (uint32_t) isr3, 0x08, 0x8E);
  81. idt_set_gate (0x04, (uint32_t) isr4, 0x08, 0x8E);
  82. idt_set_gate (0x05, (uint32_t) isr5, 0x08, 0x8E);
  83. idt_set_gate (0x06, (uint32_t) isr6, 0x08, 0x8E);
  84. idt_set_gate (0x07, (uint32_t) isr7, 0x08, 0x8E);
  85. idt_set_gate (0x08, (uint32_t) exc8, 0x08, 0x8E);
  86. idt_set_gate (0x09, (uint32_t) isr9, 0x08, 0x8E);
  87. idt_set_gate (0x0A, (uint32_t) exc10, 0x08, 0x8E);
  88. idt_set_gate (0x0B, (uint32_t) exc11, 0x08, 0x8E);
  89. idt_set_gate (0x0C, (uint32_t) exc12, 0x08, 0x8E);
  90. idt_set_gate (0x0D, (uint32_t) exc13, 0x08, 0x8E);
  91. idt_set_gate (0x0E, (uint32_t) exc14, 0x08, 0x8E);
  92. idt_set_gate (0x0F, (uint32_t) isr15, 0x08, 0x8E);
  93. idt_set_gate (0x10, (uint32_t) isr16, 0x08, 0x8E);
  94. idt_set_gate (0x11, (uint32_t) isr17, 0x08, 0x8E);
  95. idt_set_gate (0x12, (uint32_t) isr18, 0x08, 0x8E);
  96. idt_set_gate (0x13, (uint32_t) isr19, 0x08, 0x8E);
  97. idt_set_gate (0x14, (uint32_t) isr20, 0x08, 0x8E);
  98. idt_set_gate (0x15, (uint32_t) isr21, 0x08, 0x8E);
  99. idt_set_gate (0x16, (uint32_t) isr22, 0x08, 0x8E);
  100. idt_set_gate (0x17, (uint32_t) isr23, 0x08, 0x8E);
  101. idt_set_gate (0x18, (uint32_t) isr24, 0x08, 0x8E);
  102. idt_set_gate (0x19, (uint32_t) isr25, 0x08, 0x8E);
  103. idt_set_gate (0x1A, (uint32_t) isr26, 0x08, 0x8E);
  104. idt_set_gate (0x1B, (uint32_t) isr27, 0x08, 0x8E);
  105. idt_set_gate (0x1C, (uint32_t) isr28, 0x08, 0x8E);
  106. idt_set_gate (0x1D, (uint32_t) isr29, 0x08, 0x8E);
  107. idt_set_gate (0x1E, (uint32_t) isr30, 0x08, 0x8E);
  108. idt_set_gate (0x1F, (uint32_t) isr31, 0x08, 0x8E);
  109. }
  110.  
  111. void idt_set_irqs (void) {
  112. idt_set_gate (0x20, (uint32_t) irq0, 0x08, 0x8E);
  113. idt_set_gate (0x21, (uint32_t) irq1, 0x08, 0x8E);
  114. idt_set_gate (0x22, (uint32_t) irq2, 0x08, 0x8E);
  115. idt_set_gate (0x23, (uint32_t) irq3, 0x08, 0x8E);
  116. idt_set_gate (0x24, (uint32_t) irq4, 0x08, 0x8E);
  117. idt_set_gate (0x25, (uint32_t) irq5, 0x08, 0x8E);
  118. idt_set_gate (0x26, (uint32_t) irq6, 0x08, 0x8E);
  119. idt_set_gate (0x27, (uint32_t) irq7, 0x08, 0x8E);
  120. idt_set_gate (0x28, (uint32_t) irq8, 0x08, 0x8E);
  121. idt_set_gate (0x29, (uint32_t) irq9, 0x08, 0x8E);
  122. idt_set_gate (0x2A, (uint32_t) irq10, 0x08, 0x8E);
  123. idt_set_gate (0x2B, (uint32_t) irq11, 0x08, 0x8E);
  124. idt_set_gate (0x2C, (uint32_t) irq12, 0x08, 0x8E);
  125. idt_set_gate (0x2D, (uint32_t) irq13, 0x08, 0x8E);
  126. idt_set_gate (0x2E, (uint32_t) irq14, 0x08, 0x8E);
  127. idt_set_gate (0x2F, (uint32_t) irq15, 0x08, 0x8E);
  128. }
  129.  
  130. void idt_set_syscalls (void) {
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement