1 /******************************************************************************/
2 /* src/kernel/IntMng/IntMngIdt.c */
4 /* Copyright (C) 2016-2017 Mochi. */
5 /******************************************************************************/
6 /******************************************************************************/
8 /******************************************************************************/
12 #include <hardware/IA32/IA32Descriptor.h>
13 #include <hardware/IA32/IA32Instruction.h>
22 #include "IntMngIdt.h"
25 /******************************************************************************/
27 /******************************************************************************/
29 #ifdef DEBUG_LOG_ENABLE
30 #define DEBUG_LOG( ... ) \
31 DebugLogOutput( CMN_MODULE_INT_IDT, \
35 #define DEBUG_LOG( ... )
39 /******************************************************************************/
41 /******************************************************************************/
43 static IA32DescriptorGate_t gIdt[ INTMNG_IDT_ENTRY_NUM ];
46 /******************************************************************************/
48 /******************************************************************************/
49 /******************************************************************************/
52 * @details IDT管理サブモジュールの初期化を行う。
54 /******************************************************************************/
55 void IntMngIdtInit( void )
58 memset( gIdt, 0, sizeof ( gIdt ) );
61 IA32InstructionLidt( ( IA32Descriptor_t * ) gIdt, sizeof ( gIdt ) - 1 );
67 /******************************************************************************/
70 * @details IDTにエントリを設定する。
72 * @param[in] index IDTエントリ番号
73 * - INTMNG_IDT_ENTRY_MIN 割込み番号(最小値)
74 * - INTMNG_IDT_ENTRY_MAX 割込み番号(最大値)
75 * @param[in] selector セレクタ
76 * @param[in] *pOffset オフセット
77 * @param[in] count 引数コピーカウント
79 * - IA32_DESCRIPTOR_TYPE_TSS16 16bitTSS
80 * - IA32_DESCRIPTOR_TYPE_LDT LDT
81 * - IA32_DESCRIPTOR_TYPE_TSS16_BUSY 16bitTSS(ビジー)
82 * - IA32_DESCRIPTOR_TYPE_GATE16_CALL 16bitコールゲート
83 * - IA32_DESCRIPTOR_TYPE_GATE_TASK タスクゲート
84 * - IA32_DESCRIPTOR_TYPE_GATE16_INT 16bit割込みゲート
85 * - IA32_DESCRIPTOR_TYPE_GATE16_TRAP 16bitトラップゲート
86 * - IA32_DESCRIPTOR_TYPE_TSS32 32bitTSS
87 * - IA32_DESCRIPTOR_TYPE_TSS32_BUSY 32bitTSS(ビジー)
88 * - IA32_DESCRIPTOR_TYPE_GATE32_CALL 32bitコールゲート
89 * - IA32_DESCRIPTOR_TYPE_GATE32_INT 32bit割込みゲート
90 * - IA32_DESCRIPTOR_TYPE_GATE32_TRAP 32bitトラップゲート
91 * @param[in] level 特権レベル
92 * - IA32_DESCRIPTOR_DPL_0 特権レベル0
93 * - IA32_DESCRIPTOR_DPL_1 特権レベル1
94 * - IA32_DESCRIPTOR_DPL_2 特権レベル2
95 * - IA32_DESCRIPTOR_DPL_3 特権レベル3
97 /******************************************************************************/
98 void IntMngIdtSet( uint32_t index,
106 gIdt[ index ].offset_low = IA32_DESCRIPTOR_OFFSET_LOW( pOffset );
107 gIdt[ index ].selector = selector;
108 gIdt[ index ].count = count;
109 gIdt[ index ].attr_type = type;
110 gIdt[ index ].attr_s = IA32_DESCRIPTOR_S_SYSTEM;
111 gIdt[ index ].attr_dpl = level;
112 gIdt[ index ].attr_p = IA32_DESCRIPTOR_P_YES;
113 gIdt[ index ].offset_high = IA32_DESCRIPTOR_OFFSET_HIGH( pOffset );
119 /******************************************************************************/