1 /******************************************************************************/
2 /* src/booter/IntMng/IntMngIdt.c */
4 /* Copyright (C) 2017 Mochi. */
5 /******************************************************************************/
6 /******************************************************************************/
8 /******************************************************************************/
11 #include <hardware/IA32/IA32Descriptor.h>
12 #include <hardware/IA32/IA32Instruction.h>
20 #include "IntMngIdt.h"
23 /******************************************************************************/
25 /******************************************************************************/
27 #ifdef DEBUG_LOG_ENABLE
28 #define DEBUG_LOG( ... ) \
29 DebugLogOutput( CMN_MODULE_INTMNG_IDT, \
33 #define DEBUG_LOG( ... )
37 /******************************************************************************/
39 /******************************************************************************/
41 static IA32DescriptorGate_t gIdt[ INTMNG_IDT_ENTRY_NUM ];
44 /******************************************************************************/
46 /******************************************************************************/
47 /******************************************************************************/
50 * @details IDT管理サブモジュールの初期化を行う。
52 /******************************************************************************/
53 void IntMngIdtInit( void )
56 DEBUG_LOG( "%s() start.", __func__ );
59 memset( gIdt, 0, sizeof ( gIdt ) );
62 IA32InstructionLidt( ( IA32Descriptor_t * ) gIdt, sizeof ( gIdt ) - 1 );
65 DEBUG_LOG( "%s() end.", __func__ );
71 /******************************************************************************/
74 * @details IDTにエントリを設定する。
76 * @param[in] index IDTエントリ番号
77 * - INTMNG_IDT_ENTRY_MIN 割込み番号(最小値)
78 * - INTMNG_IDT_ENTRY_MAX 割込み番号(最大値)
79 * @param[in] selector セレクタ
80 * @param[in] *pOffset オフセット
81 * @param[in] count 引数コピーカウント
83 * - IA32_DESCRIPTOR_TYPE_TSS16 16bitTSS
84 * - IA32_DESCRIPTOR_TYPE_LDT LDT
85 * - IA32_DESCRIPTOR_TYPE_TSS16_BUSY 16bitTSS(ビジー)
86 * - IA32_DESCRIPTOR_TYPE_GATE16_CALL 16bitコールゲート
87 * - IA32_DESCRIPTOR_TYPE_GATE_TASK タスクゲート
88 * - IA32_DESCRIPTOR_TYPE_GATE16_INT 16bit割込みゲート
89 * - IA32_DESCRIPTOR_TYPE_GATE16_TRAP 16bitトラップゲート
90 * - IA32_DESCRIPTOR_TYPE_TSS32 32bitTSS
91 * - IA32_DESCRIPTOR_TYPE_TSS32_BUSY 32bitTSS(ビジー)
92 * - IA32_DESCRIPTOR_TYPE_GATE32_CALL 32bitコールゲート
93 * - IA32_DESCRIPTOR_TYPE_GATE32_INT 32bit割込みゲート
94 * - IA32_DESCRIPTOR_TYPE_GATE32_TRAP 32bitトラップゲート
95 * @param[in] level 特権レベル
96 * - IA32_DESCRIPTOR_DPL_0 特権レベル0
97 * - IA32_DESCRIPTOR_DPL_1 特権レベル1
98 * - IA32_DESCRIPTOR_DPL_2 特権レベル2
99 * - IA32_DESCRIPTOR_DPL_3 特権レベル3
101 /******************************************************************************/
102 void IntMngIdtSet( uint32_t index,
110 DEBUG_LOG( "%s() start.", __func__ );
111 DEBUG_LOG( " index=%#X, selector=%#X, pOffset=%#p,",
115 DEBUG_LOG( " count=%#X, type=%#X, level=%#X",
121 gIdt[ index ].offset_low = IA32_DESCRIPTOR_OFFSET_LOW( pOffset );
122 gIdt[ index ].selector = selector;
123 gIdt[ index ].count = count;
124 gIdt[ index ].attr_type = type;
125 gIdt[ index ].attr_s = IA32_DESCRIPTOR_S_SYSTEM;
126 gIdt[ index ].attr_dpl = level;
127 gIdt[ index ].attr_p = IA32_DESCRIPTOR_P_YES;
128 gIdt[ index ].offset_high = IA32_DESCRIPTOR_OFFSET_HIGH( pOffset );
131 DEBUG_LOG( "%s() end.", __func__ );
137 /******************************************************************************/