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