github.com/jlmucb/cloudproxy@v0.0.0-20170830161738-b5aa0b619bc4/cpvmm/vmm/host/hw/em64t/em64t_idt.c (about) 1 /* 2 * Copyright (c) 2013 Intel Corporation 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * Unless required by applicable law or agreed to in writing, software 9 * distributed under the License is distributed on an "AS IS" BASIS, 10 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 * See the License for the specific language governing permissions and 12 * limitations under the License. 13 */ 14 15 16 17 // This code is assumed to be running in 32-bit mode, 18 // but configure IDT for 64-bit mode. 19 #include "vmm_defs.h" 20 #include "common_libc.h" 21 #include "heap.h" 22 #include "em64t_defs.h" 23 #include "hw_utils.h" 24 #include "isr_generated.h" 25 #include "idt.h" 26 27 extern void dump_memory(const void * mem_location,UINT32 count,UINT32 size); 28 #define IDT_VECTOR_COUNT 256 29 #define IA32E_IDT_GATE_TYPE_INTERRUPT_GATE 0xE 30 #define IA32E_IDT_GATE_TYPE_TRAP_GATE 0xF 31 32 33 static EM64T_IDT_TABLE idt; // pointer to IDTs for all CPUs 34 static UINT8 ist_used[32] = { 35 0, 36 0, 37 1, // NMI 38 0, 39 0, 40 0, 41 2, // UNDEFINED_OPCODE 42 0, 43 3, // DOUBLE_FAULT 44 0, 45 0, 46 0, 47 4, // STACK_SEGMENT_FAULT 48 5, // GENERAL_PROTECTION_FAULT 49 6, // PAGE_FAULT 50 }; 51 52 extern void isr_entry_00(void); 53 extern void isr_entry_01(void); 54 static ADDRESS isr_handler_table[256]; 55 56 #if 0 // not used 57 static void init_isr_handler_table() { 58 isr_handler_table[0] = (ADDRESS)(isr_entry_00); 59 isr_handler_table[1] = (ADDRESS)(isr_entry_01); 60 isr_handler_table[2] = (ADDRESS)(isr_entry_02); 61 isr_handler_table[3] = (ADDRESS)(isr_entry_03); 62 isr_handler_table[4] = (ADDRESS)(isr_entry_04); 63 isr_handler_table[5] = (ADDRESS)(isr_entry_05); 64 isr_handler_table[6] = (ADDRESS)(isr_entry_06); 65 isr_handler_table[7] = (ADDRESS)(isr_entry_07); 66 isr_handler_table[8] = (ADDRESS)(isr_entry_08); 67 isr_handler_table[9] = (ADDRESS)(isr_entry_09); 68 isr_handler_table[10] = (ADDRESS)(isr_entry_0a); 69 isr_handler_table[11] = (ADDRESS)(isr_entry_0b); 70 isr_handler_table[12] = (ADDRESS)(isr_entry_0c); 71 isr_handler_table[13] = (ADDRESS)(isr_entry_0d); 72 isr_handler_table[14] = (ADDRESS)(isr_entry_0e); 73 isr_handler_table[15] = (ADDRESS)(isr_entry_0f); 74 isr_handler_table[16] = (ADDRESS)(isr_entry_10); 75 isr_handler_table[17] = (ADDRESS)(isr_entry_11); 76 isr_handler_table[18] = (ADDRESS)(isr_entry_12); 77 isr_handler_table[19] = (ADDRESS)(isr_entry_13); 78 isr_handler_table[20] = (ADDRESS)(isr_entry_14); 79 isr_handler_table[21] = (ADDRESS)(isr_entry_15); 80 isr_handler_table[22] = (ADDRESS)(isr_entry_16); 81 isr_handler_table[23] = (ADDRESS)(isr_entry_17); 82 isr_handler_table[24] = (ADDRESS)(isr_entry_18); 83 isr_handler_table[25] = (ADDRESS)(isr_entry_19); 84 isr_handler_table[26] = (ADDRESS)(isr_entry_1a); 85 isr_handler_table[27] = (ADDRESS)(isr_entry_1b); 86 isr_handler_table[28] = (ADDRESS)(isr_entry_1c); 87 isr_handler_table[29] = (ADDRESS)(isr_entry_1d); 88 isr_handler_table[30] = (ADDRESS)(isr_entry_1e); 89 isr_handler_table[31] = (ADDRESS)(isr_entry_1f); 90 isr_handler_table[32] = (ADDRESS)(isr_entry_20); 91 isr_handler_table[33] = (ADDRESS)(isr_entry_21); 92 isr_handler_table[34] = (ADDRESS)(isr_entry_22); 93 isr_handler_table[35] = (ADDRESS)(isr_entry_23); 94 isr_handler_table[36] = (ADDRESS)(isr_entry_24); 95 isr_handler_table[37] = (ADDRESS)(isr_entry_25); 96 isr_handler_table[38] = (ADDRESS)(isr_entry_26); 97 isr_handler_table[39] = (ADDRESS)(isr_entry_27); 98 isr_handler_table[40] = (ADDRESS)(isr_entry_28); 99 isr_handler_table[41] = (ADDRESS)(isr_entry_29); 100 isr_handler_table[42] = (ADDRESS)(isr_entry_2a); 101 isr_handler_table[43] = (ADDRESS)(isr_entry_2b); 102 isr_handler_table[44] = (ADDRESS)(isr_entry_2c); 103 isr_handler_table[45] = (ADDRESS)(isr_entry_2d); 104 isr_handler_table[46] = (ADDRESS)(isr_entry_2e); 105 isr_handler_table[47] = (ADDRESS)(isr_entry_2f); 106 isr_handler_table[48] = (ADDRESS)(isr_entry_30); 107 isr_handler_table[49] = (ADDRESS)(isr_entry_31); 108 isr_handler_table[50] = (ADDRESS)(isr_entry_32); 109 isr_handler_table[51] = (ADDRESS)(isr_entry_33); 110 isr_handler_table[52] = (ADDRESS)(isr_entry_34); 111 isr_handler_table[53] = (ADDRESS)(isr_entry_35); 112 isr_handler_table[54] = (ADDRESS)(isr_entry_36); 113 isr_handler_table[55] = (ADDRESS)(isr_entry_37); 114 isr_handler_table[56] = (ADDRESS)(isr_entry_38); 115 isr_handler_table[57] = (ADDRESS)(isr_entry_39); 116 isr_handler_table[58] = (ADDRESS)(isr_entry_3a); 117 isr_handler_table[59] = (ADDRESS)(isr_entry_3b); 118 isr_handler_table[60] = (ADDRESS)(isr_entry_3c); 119 isr_handler_table[61] = (ADDRESS)(isr_entry_3d); 120 isr_handler_table[62] = (ADDRESS)(isr_entry_3e); 121 isr_handler_table[63] = (ADDRESS)(isr_entry_3f); 122 isr_handler_table[64] = (ADDRESS)(isr_entry_40); 123 isr_handler_table[65] = (ADDRESS)(isr_entry_41); 124 isr_handler_table[66] = (ADDRESS)(isr_entry_42); 125 isr_handler_table[67] = (ADDRESS)(isr_entry_43); 126 isr_handler_table[68] = (ADDRESS)(isr_entry_44); 127 isr_handler_table[69] = (ADDRESS)(isr_entry_45); 128 isr_handler_table[70] = (ADDRESS)(isr_entry_46); 129 isr_handler_table[71] = (ADDRESS)(isr_entry_47); 130 isr_handler_table[72] = (ADDRESS)(isr_entry_48); 131 isr_handler_table[73] = (ADDRESS)(isr_entry_49); 132 isr_handler_table[74] = (ADDRESS)(isr_entry_4a); 133 isr_handler_table[75] = (ADDRESS)(isr_entry_4b); 134 isr_handler_table[76] = (ADDRESS)(isr_entry_4c); 135 isr_handler_table[77] = (ADDRESS)(isr_entry_4d); 136 isr_handler_table[78] = (ADDRESS)(isr_entry_4e); 137 isr_handler_table[79] = (ADDRESS)(isr_entry_4f); 138 isr_handler_table[80] = (ADDRESS)(isr_entry_50); 139 isr_handler_table[81] = (ADDRESS)(isr_entry_51); 140 isr_handler_table[82] = (ADDRESS)(isr_entry_52); 141 isr_handler_table[83] = (ADDRESS)(isr_entry_53); 142 isr_handler_table[84] = (ADDRESS)(isr_entry_54); 143 isr_handler_table[85] = (ADDRESS)(isr_entry_55); 144 isr_handler_table[86] = (ADDRESS)(isr_entry_56); 145 isr_handler_table[87] = (ADDRESS)(isr_entry_57); 146 isr_handler_table[88] = (ADDRESS)(isr_entry_58); 147 isr_handler_table[89] = (ADDRESS)(isr_entry_59); 148 isr_handler_table[90] = (ADDRESS)(isr_entry_5a); 149 isr_handler_table[91] = (ADDRESS)(isr_entry_5b); 150 isr_handler_table[92] = (ADDRESS)(isr_entry_5c); 151 isr_handler_table[93] = (ADDRESS)(isr_entry_5d); 152 isr_handler_table[94] = (ADDRESS)(isr_entry_5e); 153 isr_handler_table[95] = (ADDRESS)(isr_entry_5f); 154 isr_handler_table[96] = (ADDRESS)(isr_entry_60); 155 isr_handler_table[97] = (ADDRESS)(isr_entry_61); 156 isr_handler_table[98] = (ADDRESS)(isr_entry_62); 157 isr_handler_table[99] = (ADDRESS)(isr_entry_63); 158 isr_handler_table[100] = (ADDRESS)(isr_entry_64); 159 isr_handler_table[101] = (ADDRESS)(isr_entry_65); 160 isr_handler_table[102] = (ADDRESS)(isr_entry_66); 161 isr_handler_table[103] = (ADDRESS)(isr_entry_67); 162 isr_handler_table[104] = (ADDRESS)(isr_entry_68); 163 isr_handler_table[105] = (ADDRESS)(isr_entry_69); 164 isr_handler_table[106] = (ADDRESS)(isr_entry_6a); 165 isr_handler_table[107] = (ADDRESS)(isr_entry_6b); 166 isr_handler_table[108] = (ADDRESS)(isr_entry_6c); 167 isr_handler_table[109] = (ADDRESS)(isr_entry_6d); 168 isr_handler_table[110] = (ADDRESS)(isr_entry_6e); 169 isr_handler_table[111] = (ADDRESS)(isr_entry_6f); 170 isr_handler_table[112] = (ADDRESS)(isr_entry_70); 171 isr_handler_table[113] = (ADDRESS)(isr_entry_71); 172 isr_handler_table[114] = (ADDRESS)(isr_entry_72); 173 isr_handler_table[115] = (ADDRESS)(isr_entry_73); 174 isr_handler_table[116] = (ADDRESS)(isr_entry_74); 175 isr_handler_table[117] = (ADDRESS)(isr_entry_75); 176 isr_handler_table[118] = (ADDRESS)(isr_entry_76); 177 isr_handler_table[119] = (ADDRESS)(isr_entry_77); 178 isr_handler_table[120] = (ADDRESS)(isr_entry_78); 179 isr_handler_table[121] = (ADDRESS)(isr_entry_79); 180 isr_handler_table[122] = (ADDRESS)(isr_entry_7a); 181 isr_handler_table[123] = (ADDRESS)(isr_entry_7b); 182 isr_handler_table[124] = (ADDRESS)(isr_entry_7c); 183 isr_handler_table[125] = (ADDRESS)(isr_entry_7d); 184 isr_handler_table[126] = (ADDRESS)(isr_entry_7e); 185 isr_handler_table[127] = (ADDRESS)(isr_entry_7f); 186 isr_handler_table[128] = (ADDRESS)(isr_entry_80); 187 isr_handler_table[129] = (ADDRESS)(isr_entry_81); 188 isr_handler_table[130] = (ADDRESS)(isr_entry_82); 189 isr_handler_table[131] = (ADDRESS)(isr_entry_83); 190 isr_handler_table[132] = (ADDRESS)(isr_entry_84); 191 isr_handler_table[133] = (ADDRESS)(isr_entry_85); 192 isr_handler_table[134] = (ADDRESS)(isr_entry_86); 193 isr_handler_table[135] = (ADDRESS)(isr_entry_87); 194 isr_handler_table[136] = (ADDRESS)(isr_entry_88); 195 isr_handler_table[137] = (ADDRESS)(isr_entry_89); 196 isr_handler_table[138] = (ADDRESS)(isr_entry_8a); 197 isr_handler_table[139] = (ADDRESS)(isr_entry_8b); 198 isr_handler_table[140] = (ADDRESS)(isr_entry_8c); 199 isr_handler_table[141] = (ADDRESS)(isr_entry_8d); 200 isr_handler_table[142] = (ADDRESS)(isr_entry_8e); 201 isr_handler_table[143] = (ADDRESS)(isr_entry_8f); 202 isr_handler_table[144] = (ADDRESS)(isr_entry_90); 203 isr_handler_table[145] = (ADDRESS)(isr_entry_91); 204 isr_handler_table[146] = (ADDRESS)(isr_entry_92); 205 isr_handler_table[147] = (ADDRESS)(isr_entry_93); 206 isr_handler_table[148] = (ADDRESS)(isr_entry_94); 207 isr_handler_table[149] = (ADDRESS)(isr_entry_95); 208 isr_handler_table[150] = (ADDRESS)(isr_entry_96); 209 isr_handler_table[151] = (ADDRESS)(isr_entry_97); 210 isr_handler_table[152] = (ADDRESS)(isr_entry_98); 211 isr_handler_table[153] = (ADDRESS)(isr_entry_99); 212 isr_handler_table[154] = (ADDRESS)(isr_entry_9a); 213 isr_handler_table[155] = (ADDRESS)(isr_entry_9b); 214 isr_handler_table[156] = (ADDRESS)(isr_entry_9c); 215 isr_handler_table[157] = (ADDRESS)(isr_entry_9d); 216 isr_handler_table[158] = (ADDRESS)(isr_entry_9e); 217 isr_handler_table[159] = (ADDRESS)(isr_entry_9f); 218 isr_handler_table[160] = (ADDRESS)(isr_entry_a0); 219 isr_handler_table[161] = (ADDRESS)(isr_entry_a1); 220 isr_handler_table[162] = (ADDRESS)(isr_entry_a2); 221 isr_handler_table[163] = (ADDRESS)(isr_entry_a3); 222 isr_handler_table[164] = (ADDRESS)(isr_entry_a4); 223 isr_handler_table[165] = (ADDRESS)(isr_entry_a5); 224 isr_handler_table[166] = (ADDRESS)(isr_entry_a6); 225 isr_handler_table[167] = (ADDRESS)(isr_entry_a7); 226 isr_handler_table[168] = (ADDRESS)(isr_entry_a8); 227 isr_handler_table[169] = (ADDRESS)(isr_entry_a9); 228 isr_handler_table[170] = (ADDRESS)(isr_entry_aa); 229 isr_handler_table[171] = (ADDRESS)(isr_entry_ab); 230 isr_handler_table[172] = (ADDRESS)(isr_entry_ac); 231 isr_handler_table[173] = (ADDRESS)(isr_entry_ad); 232 isr_handler_table[174] = (ADDRESS)(isr_entry_ae); 233 isr_handler_table[175] = (ADDRESS)(isr_entry_af); 234 isr_handler_table[176] = (ADDRESS)(isr_entry_b0); 235 isr_handler_table[177] = (ADDRESS)(isr_entry_b1); 236 isr_handler_table[178] = (ADDRESS)(isr_entry_b2); 237 isr_handler_table[179] = (ADDRESS)(isr_entry_b3); 238 isr_handler_table[180] = (ADDRESS)(isr_entry_b4); 239 isr_handler_table[181] = (ADDRESS)(isr_entry_b5); 240 isr_handler_table[182] = (ADDRESS)(isr_entry_b6); 241 isr_handler_table[183] = (ADDRESS)(isr_entry_b7); 242 isr_handler_table[184] = (ADDRESS)(isr_entry_b8); 243 isr_handler_table[185] = (ADDRESS)(isr_entry_b9); 244 isr_handler_table[186] = (ADDRESS)(isr_entry_ba); 245 isr_handler_table[187] = (ADDRESS)(isr_entry_bb); 246 isr_handler_table[188] = (ADDRESS)(isr_entry_bc); 247 isr_handler_table[189] = (ADDRESS)(isr_entry_bd); 248 isr_handler_table[190] = (ADDRESS)(isr_entry_be); 249 isr_handler_table[191] = (ADDRESS)(isr_entry_bf); 250 isr_handler_table[192] = (ADDRESS)(isr_entry_c0); 251 isr_handler_table[193] = (ADDRESS)(isr_entry_c1); 252 isr_handler_table[194] = (ADDRESS)(isr_entry_c2); 253 isr_handler_table[195] = (ADDRESS)(isr_entry_c3); 254 isr_handler_table[196] = (ADDRESS)(isr_entry_c4); 255 isr_handler_table[197] = (ADDRESS)(isr_entry_c5); 256 isr_handler_table[198] = (ADDRESS)(isr_entry_c6); 257 isr_handler_table[199] = (ADDRESS)(isr_entry_c7); 258 isr_handler_table[200] = (ADDRESS)(isr_entry_c8); 259 isr_handler_table[201] = (ADDRESS)(isr_entry_c9); 260 isr_handler_table[202] = (ADDRESS)(isr_entry_ca); 261 isr_handler_table[203] = (ADDRESS)(isr_entry_cb); 262 isr_handler_table[204] = (ADDRESS)(isr_entry_cc); 263 isr_handler_table[205] = (ADDRESS)(isr_entry_cd); 264 isr_handler_table[206] = (ADDRESS)(isr_entry_ce); 265 isr_handler_table[207] = (ADDRESS)(isr_entry_cf); 266 isr_handler_table[208] = (ADDRESS)(isr_entry_d0); 267 isr_handler_table[209] = (ADDRESS)(isr_entry_d1); 268 isr_handler_table[210] = (ADDRESS)(isr_entry_d2); 269 isr_handler_table[211] = (ADDRESS)(isr_entry_d3); 270 isr_handler_table[212] = (ADDRESS)(isr_entry_d4); 271 isr_handler_table[213] = (ADDRESS)(isr_entry_d5); 272 isr_handler_table[214] = (ADDRESS)(isr_entry_d6); 273 isr_handler_table[215] = (ADDRESS)(isr_entry_d7); 274 isr_handler_table[216] = (ADDRESS)(isr_entry_d8); 275 isr_handler_table[217] = (ADDRESS)(isr_entry_d9); 276 isr_handler_table[218] = (ADDRESS)(isr_entry_da); 277 isr_handler_table[219] = (ADDRESS)(isr_entry_db); 278 isr_handler_table[220] = (ADDRESS)(isr_entry_dc); 279 isr_handler_table[221] = (ADDRESS)(isr_entry_dd); 280 isr_handler_table[222] = (ADDRESS)(isr_entry_de); 281 isr_handler_table[223] = (ADDRESS)(isr_entry_df); 282 isr_handler_table[224] = (ADDRESS)(isr_entry_e0); 283 isr_handler_table[225] = (ADDRESS)(isr_entry_e1); 284 isr_handler_table[226] = (ADDRESS)(isr_entry_e2); 285 isr_handler_table[227] = (ADDRESS)(isr_entry_e3); 286 isr_handler_table[228] = (ADDRESS)(isr_entry_e4); 287 isr_handler_table[229] = (ADDRESS)(isr_entry_e5); 288 isr_handler_table[230] = (ADDRESS)(isr_entry_e6); 289 isr_handler_table[231] = (ADDRESS)(isr_entry_e7); 290 isr_handler_table[232] = (ADDRESS)(isr_entry_e8); 291 isr_handler_table[233] = (ADDRESS)(isr_entry_e9); 292 isr_handler_table[234] = (ADDRESS)(isr_entry_ea); 293 isr_handler_table[235] = (ADDRESS)(isr_entry_eb); 294 isr_handler_table[236] = (ADDRESS)(isr_entry_ec); 295 isr_handler_table[237] = (ADDRESS)(isr_entry_ed); 296 isr_handler_table[238] = (ADDRESS)(isr_entry_ee); 297 isr_handler_table[239] = (ADDRESS)(isr_entry_ef); 298 isr_handler_table[240] = (ADDRESS)(isr_entry_f0); 299 isr_handler_table[241] = (ADDRESS)(isr_entry_f1); 300 isr_handler_table[242] = (ADDRESS)(isr_entry_f2); 301 isr_handler_table[243] = (ADDRESS)(isr_entry_f3); 302 isr_handler_table[244] = (ADDRESS)(isr_entry_f4); 303 isr_handler_table[245] = (ADDRESS)(isr_entry_f5); 304 isr_handler_table[246] = (ADDRESS)(isr_entry_f6); 305 isr_handler_table[247] = (ADDRESS)(isr_entry_f7); 306 isr_handler_table[248] = (ADDRESS)(isr_entry_f8); 307 isr_handler_table[249] = (ADDRESS)(isr_entry_f9); 308 isr_handler_table[250] = (ADDRESS)(isr_entry_fa); 309 isr_handler_table[251] = (ADDRESS)(isr_entry_fb); 310 isr_handler_table[252] = (ADDRESS)(isr_entry_fc); 311 isr_handler_table[253] = (ADDRESS)(isr_entry_fd); 312 isr_handler_table[254] = (ADDRESS)(isr_entry_fe); 313 isr_handler_table[255] = (ADDRESS)(isr_entry_ff); 314 } 315 #endif 316 // (ADDRESS) isr_entry_fa, 317 // (ADDRESS) isr_entry_fb, 318 // (ADDRESS) isr_entry_fc, 319 // (ADDRESS) isr_entry_fd, 320 // (ADDRESS) isr_entry_fe, 321 // (ADDRESS) isr_entry_ff 322 323 324 // FUNCTION : hw_idt_register_handler() 325 // PURPOSE : Register interrupt handler at spec. vector 326 // ARGUMENTS : UINT8 vector_id 327 // : ADDRESS isr_handler_address - address of function 328 void hw_idt_register_handler( VECTOR_ID vector_id, ADDRESS isr_handler_address) 329 { 330 // fill IDT entries 331 idt[vector_id].offset_0_15 = (UINT32) GET_2BYTE(isr_handler_address, 0); 332 idt[vector_id].offset_15_31 = (UINT32) GET_2BYTE(isr_handler_address, 1); 333 idt[vector_id].offset_32_63 = (UINT32) GET_4BYTE(isr_handler_address, 1); 334 idt[vector_id].ist = vector_id < NELEMENTS(ist_used) ? ist_used[vector_id] : 0; 335 idt[vector_id].gate_type = IA32E_IDT_GATE_TYPE_INTERRUPT_GATE; 336 idt[vector_id].dpl = 0; 337 idt[vector_id].present = 1; 338 idt[vector_id].css = CODE64_GDT_ENTRY_OFFSET; 339 } 340 341 342 // FUNCTION : hw_idt_setup() 343 // PURPOSE : Build and populate IDT table, used by all CPUs 344 void hw_idt_setup(void) 345 { 346 unsigned vector_id; 347 348 for (vector_id = 0; vector_id < IDT_VECTOR_COUNT; ++vector_id) { 349 hw_idt_register_handler((VECTOR_ID) vector_id, isr_handler_table[vector_id]); 350 } 351 } 352 353 354 // FUNCTION : hw_idt_load() 355 // PURPOSE : Load IDT descriptor into IDTR of CPU, currently excuted 356 void hw_idt_load(void) 357 { 358 EM64T_IDT_DESCRIPTOR idt_desc; 359 360 idt_desc.base = (ADDRESS) idt; 361 idt_desc.limit = sizeof(idt) - 1; 362 hw_lidt((void*)&idt_desc); 363 } 364 365 366 // FUNCTION : idt_get_extra_stacks_required() 367 // PURPOSE : Returns the number of extra stacks required by ISRs 368 // RETURNS : number between 0..7 369 // NOTES : per CPU 370 UINT8 idt_get_extra_stacks_required(void) 371 { 372 return 6; // the number of no-zero elements in array <ist_used> 373 } 374