idt.c (10835B)
1 #include <stdint.h> 2 #include "idt.h" 3 4 static void idt_set_entry(unsigned int pos, uint32_t base, 5 uint16_t selector, uint8_t type_attributes) 6 { 7 idt[pos].base_lower = base & 0xffff; 8 idt[pos].selector = selector; 9 idt[pos].unused = 0x0; 10 idt[pos].type_attributes = type_attributes; 11 idt[pos].base_higher = (base >> 16) & 0xffff; 12 } 13 14 extern void int_handler_0(); 15 extern void int_handler_1(); 16 extern void int_handler_2(); 17 extern void int_handler_3(); 18 extern void int_handler_4(); 19 extern void int_handler_5(); 20 extern void int_handler_6(); 21 extern void int_handler_7(); 22 extern void int_handler_8(); 23 extern void int_handler_9(); 24 extern void int_handler_10(); 25 extern void int_handler_11(); 26 extern void int_handler_12(); 27 extern void int_handler_13(); 28 extern void int_handler_14(); 29 extern void int_handler_15(); 30 extern void int_handler_16(); 31 extern void int_handler_17(); 32 extern void int_handler_18(); 33 extern void int_handler_19(); 34 extern void int_handler_20(); 35 extern void int_handler_21(); 36 extern void int_handler_22(); 37 extern void int_handler_23(); 38 extern void int_handler_24(); 39 extern void int_handler_25(); 40 extern void int_handler_26(); 41 extern void int_handler_27(); 42 extern void int_handler_28(); 43 extern void int_handler_29(); 44 extern void int_handler_30(); 45 extern void int_handler_31(); 46 extern void int_handler_32(); 47 extern void int_handler_33(); 48 extern void int_handler_34(); 49 extern void int_handler_35(); 50 extern void int_handler_36(); 51 extern void int_handler_37(); 52 extern void int_handler_38(); 53 extern void int_handler_39(); 54 extern void int_handler_40(); 55 extern void int_handler_41(); 56 extern void int_handler_42(); 57 extern void int_handler_43(); 58 extern void int_handler_44(); 59 extern void int_handler_45(); 60 extern void int_handler_46(); 61 extern void int_handler_47(); 62 extern void int_handler_48(); 63 extern void int_handler_49(); 64 extern void int_handler_50(); 65 extern void int_handler_51(); 66 extern void int_handler_52(); 67 extern void int_handler_53(); 68 extern void int_handler_54(); 69 extern void int_handler_55(); 70 extern void int_handler_56(); 71 extern void int_handler_57(); 72 extern void int_handler_58(); 73 extern void int_handler_59(); 74 extern void int_handler_60(); 75 extern void int_handler_61(); 76 extern void int_handler_62(); 77 extern void int_handler_63(); 78 extern void int_handler_64(); 79 extern void int_handler_65(); 80 extern void int_handler_66(); 81 extern void int_handler_67(); 82 extern void int_handler_68(); 83 extern void int_handler_69(); 84 extern void int_handler_70(); 85 extern void int_handler_71(); 86 extern void int_handler_72(); 87 extern void int_handler_73(); 88 extern void int_handler_74(); 89 extern void int_handler_75(); 90 extern void int_handler_76(); 91 extern void int_handler_77(); 92 extern void int_handler_78(); 93 extern void int_handler_79(); 94 extern void int_handler_80(); 95 extern void int_handler_81(); 96 extern void int_handler_82(); 97 extern void int_handler_83(); 98 extern void int_handler_84(); 99 extern void int_handler_85(); 100 extern void int_handler_86(); 101 extern void int_handler_87(); 102 extern void int_handler_88(); 103 extern void int_handler_89(); 104 extern void int_handler_90(); 105 extern void int_handler_91(); 106 extern void int_handler_92(); 107 extern void int_handler_93(); 108 extern void int_handler_94(); 109 extern void int_handler_95(); 110 extern void int_handler_96(); 111 extern void int_handler_97(); 112 extern void int_handler_98(); 113 extern void int_handler_99(); 114 115 void idt_setup() 116 { 117 idt_desc.limit = IDT_ENTRIES * sizeof(struct idt_entry) - 1; 118 idt_desc.base = (uint32_t) (uintptr_t) idt; 119 120 idt_set_entry(0, (uint32_t)(uintptr_t)&int_handler_0, 0x8, 0x8e); 121 idt_set_entry(1, (uint32_t)(uintptr_t)&int_handler_1, 0x8, 0x8e); 122 idt_set_entry(2, (uint32_t)(uintptr_t)&int_handler_2, 0x8, 0x8e); 123 idt_set_entry(3, (uint32_t)(uintptr_t)&int_handler_3, 0x8, 0x8e); 124 idt_set_entry(4, (uint32_t)(uintptr_t)&int_handler_4, 0x8, 0x8e); 125 idt_set_entry(5, (uint32_t)(uintptr_t)&int_handler_5, 0x8, 0x8e); 126 idt_set_entry(6, (uint32_t)(uintptr_t)&int_handler_6, 0x8, 0x8e); 127 idt_set_entry(7, (uint32_t)(uintptr_t)&int_handler_7, 0x8, 0x8e); 128 idt_set_entry(8, (uint32_t)(uintptr_t)&int_handler_8, 0x8, 0x8e); 129 idt_set_entry(9, (uint32_t)(uintptr_t)&int_handler_9, 0x8, 0x8e); 130 idt_set_entry(10, (uint32_t)(uintptr_t)&int_handler_10, 0x8, 0x8e); 131 idt_set_entry(11, (uint32_t)(uintptr_t)&int_handler_11, 0x8, 0x8e); 132 idt_set_entry(12, (uint32_t)(uintptr_t)&int_handler_12, 0x8, 0x8e); 133 idt_set_entry(13, (uint32_t)(uintptr_t)&int_handler_13, 0x8, 0x8e); 134 idt_set_entry(14, (uint32_t)(uintptr_t)&int_handler_14, 0x8, 0x8e); 135 idt_set_entry(15, (uint32_t)(uintptr_t)&int_handler_15, 0x8, 0x8e); 136 idt_set_entry(16, (uint32_t)(uintptr_t)&int_handler_16, 0x8, 0x8e); 137 idt_set_entry(17, (uint32_t)(uintptr_t)&int_handler_17, 0x8, 0x8e); 138 idt_set_entry(18, (uint32_t)(uintptr_t)&int_handler_18, 0x8, 0x8e); 139 idt_set_entry(19, (uint32_t)(uintptr_t)&int_handler_19, 0x8, 0x8e); 140 idt_set_entry(20, (uint32_t)(uintptr_t)&int_handler_20, 0x8, 0x8e); 141 idt_set_entry(21, (uint32_t)(uintptr_t)&int_handler_21, 0x8, 0x8e); 142 idt_set_entry(22, (uint32_t)(uintptr_t)&int_handler_22, 0x8, 0x8e); 143 idt_set_entry(23, (uint32_t)(uintptr_t)&int_handler_23, 0x8, 0x8e); 144 idt_set_entry(24, (uint32_t)(uintptr_t)&int_handler_24, 0x8, 0x8e); 145 idt_set_entry(25, (uint32_t)(uintptr_t)&int_handler_25, 0x8, 0x8e); 146 idt_set_entry(26, (uint32_t)(uintptr_t)&int_handler_26, 0x8, 0x8e); 147 idt_set_entry(27, (uint32_t)(uintptr_t)&int_handler_27, 0x8, 0x8e); 148 idt_set_entry(28, (uint32_t)(uintptr_t)&int_handler_28, 0x8, 0x8e); 149 idt_set_entry(29, (uint32_t)(uintptr_t)&int_handler_29, 0x8, 0x8e); 150 idt_set_entry(30, (uint32_t)(uintptr_t)&int_handler_30, 0x8, 0x8e); 151 idt_set_entry(31, (uint32_t)(uintptr_t)&int_handler_31, 0x8, 0x8e); 152 idt_set_entry(32, (uint32_t)(uintptr_t)&int_handler_32, 0x8, 0x8e); 153 idt_set_entry(33, (uint32_t)(uintptr_t)&int_handler_33, 0x8, 0x8e); 154 idt_set_entry(34, (uint32_t)(uintptr_t)&int_handler_34, 0x8, 0x8e); 155 idt_set_entry(35, (uint32_t)(uintptr_t)&int_handler_35, 0x8, 0x8e); 156 idt_set_entry(36, (uint32_t)(uintptr_t)&int_handler_36, 0x8, 0x8e); 157 idt_set_entry(37, (uint32_t)(uintptr_t)&int_handler_37, 0x8, 0x8e); 158 idt_set_entry(38, (uint32_t)(uintptr_t)&int_handler_38, 0x8, 0x8e); 159 idt_set_entry(39, (uint32_t)(uintptr_t)&int_handler_39, 0x8, 0x8e); 160 idt_set_entry(40, (uint32_t)(uintptr_t)&int_handler_40, 0x8, 0x8e); 161 idt_set_entry(41, (uint32_t)(uintptr_t)&int_handler_41, 0x8, 0x8e); 162 idt_set_entry(42, (uint32_t)(uintptr_t)&int_handler_42, 0x8, 0x8e); 163 idt_set_entry(43, (uint32_t)(uintptr_t)&int_handler_43, 0x8, 0x8e); 164 idt_set_entry(44, (uint32_t)(uintptr_t)&int_handler_44, 0x8, 0x8e); 165 idt_set_entry(45, (uint32_t)(uintptr_t)&int_handler_45, 0x8, 0x8e); 166 idt_set_entry(46, (uint32_t)(uintptr_t)&int_handler_46, 0x8, 0x8e); 167 idt_set_entry(47, (uint32_t)(uintptr_t)&int_handler_47, 0x8, 0x8e); 168 idt_set_entry(48, (uint32_t)(uintptr_t)&int_handler_48, 0x8, 0x8e); 169 idt_set_entry(49, (uint32_t)(uintptr_t)&int_handler_49, 0x8, 0x8e); 170 idt_set_entry(50, (uint32_t)(uintptr_t)&int_handler_50, 0x8, 0x8e); 171 idt_set_entry(51, (uint32_t)(uintptr_t)&int_handler_51, 0x8, 0x8e); 172 idt_set_entry(52, (uint32_t)(uintptr_t)&int_handler_52, 0x8, 0x8e); 173 idt_set_entry(53, (uint32_t)(uintptr_t)&int_handler_53, 0x8, 0x8e); 174 idt_set_entry(54, (uint32_t)(uintptr_t)&int_handler_54, 0x8, 0x8e); 175 idt_set_entry(55, (uint32_t)(uintptr_t)&int_handler_55, 0x8, 0x8e); 176 idt_set_entry(56, (uint32_t)(uintptr_t)&int_handler_56, 0x8, 0x8e); 177 idt_set_entry(57, (uint32_t)(uintptr_t)&int_handler_57, 0x8, 0x8e); 178 idt_set_entry(58, (uint32_t)(uintptr_t)&int_handler_58, 0x8, 0x8e); 179 idt_set_entry(59, (uint32_t)(uintptr_t)&int_handler_59, 0x8, 0x8e); 180 idt_set_entry(60, (uint32_t)(uintptr_t)&int_handler_60, 0x8, 0x8e); 181 idt_set_entry(61, (uint32_t)(uintptr_t)&int_handler_61, 0x8, 0x8e); 182 idt_set_entry(62, (uint32_t)(uintptr_t)&int_handler_62, 0x8, 0x8e); 183 idt_set_entry(63, (uint32_t)(uintptr_t)&int_handler_63, 0x8, 0x8e); 184 idt_set_entry(64, (uint32_t)(uintptr_t)&int_handler_64, 0x8, 0x8e); 185 idt_set_entry(65, (uint32_t)(uintptr_t)&int_handler_65, 0x8, 0x8e); 186 idt_set_entry(66, (uint32_t)(uintptr_t)&int_handler_66, 0x8, 0x8e); 187 idt_set_entry(67, (uint32_t)(uintptr_t)&int_handler_67, 0x8, 0x8e); 188 idt_set_entry(68, (uint32_t)(uintptr_t)&int_handler_68, 0x8, 0x8e); 189 idt_set_entry(69, (uint32_t)(uintptr_t)&int_handler_69, 0x8, 0x8e); 190 idt_set_entry(70, (uint32_t)(uintptr_t)&int_handler_70, 0x8, 0x8e); 191 idt_set_entry(71, (uint32_t)(uintptr_t)&int_handler_71, 0x8, 0x8e); 192 idt_set_entry(72, (uint32_t)(uintptr_t)&int_handler_72, 0x8, 0x8e); 193 idt_set_entry(73, (uint32_t)(uintptr_t)&int_handler_73, 0x8, 0x8e); 194 idt_set_entry(74, (uint32_t)(uintptr_t)&int_handler_74, 0x8, 0x8e); 195 idt_set_entry(75, (uint32_t)(uintptr_t)&int_handler_75, 0x8, 0x8e); 196 idt_set_entry(76, (uint32_t)(uintptr_t)&int_handler_76, 0x8, 0x8e); 197 idt_set_entry(77, (uint32_t)(uintptr_t)&int_handler_77, 0x8, 0x8e); 198 idt_set_entry(78, (uint32_t)(uintptr_t)&int_handler_78, 0x8, 0x8e); 199 idt_set_entry(79, (uint32_t)(uintptr_t)&int_handler_79, 0x8, 0x8e); 200 idt_set_entry(80, (uint32_t)(uintptr_t)&int_handler_80, 0x8, 0x8e); 201 idt_set_entry(81, (uint32_t)(uintptr_t)&int_handler_81, 0x8, 0x8e); 202 idt_set_entry(82, (uint32_t)(uintptr_t)&int_handler_82, 0x8, 0x8e); 203 idt_set_entry(83, (uint32_t)(uintptr_t)&int_handler_83, 0x8, 0x8e); 204 idt_set_entry(84, (uint32_t)(uintptr_t)&int_handler_84, 0x8, 0x8e); 205 idt_set_entry(85, (uint32_t)(uintptr_t)&int_handler_85, 0x8, 0x8e); 206 idt_set_entry(86, (uint32_t)(uintptr_t)&int_handler_86, 0x8, 0x8e); 207 idt_set_entry(87, (uint32_t)(uintptr_t)&int_handler_87, 0x8, 0x8e); 208 idt_set_entry(88, (uint32_t)(uintptr_t)&int_handler_88, 0x8, 0x8e); 209 idt_set_entry(89, (uint32_t)(uintptr_t)&int_handler_89, 0x8, 0x8e); 210 idt_set_entry(90, (uint32_t)(uintptr_t)&int_handler_90, 0x8, 0x8e); 211 idt_set_entry(91, (uint32_t)(uintptr_t)&int_handler_91, 0x8, 0x8e); 212 idt_set_entry(92, (uint32_t)(uintptr_t)&int_handler_92, 0x8, 0x8e); 213 idt_set_entry(93, (uint32_t)(uintptr_t)&int_handler_93, 0x8, 0x8e); 214 idt_set_entry(94, (uint32_t)(uintptr_t)&int_handler_94, 0x8, 0x8e); 215 idt_set_entry(95, (uint32_t)(uintptr_t)&int_handler_95, 0x8, 0x8e); 216 idt_set_entry(96, (uint32_t)(uintptr_t)&int_handler_96, 0x8, 0x8e); 217 idt_set_entry(97, (uint32_t)(uintptr_t)&int_handler_97, 0x8, 0x8e); 218 idt_set_entry(98, (uint32_t)(uintptr_t)&int_handler_98, 0x8, 0x8e); 219 for (int i = 99; i < IDT_ENTRIES; i++) { 220 idt_set_entry(i, (uint32_t)(uintptr_t)&int_handler_99, 221 0x8, 0x8e); 222 } 223 224 asm volatile("lidt (%0)" :: "m"(idt_desc)); 225 asm volatile("xchg %bx, %bx"); 226 asm volatile("sti"); 227 }