1 /******************************************************************************/
2 /* src/kernel/IntMng/IntMngHdl.c */
4 /* Copyright (C) 2016-2017 Mochi. */
5 /******************************************************************************/
6 /******************************************************************************/
8 /******************************************************************************/
11 #include <hardware/IA32/IA32Descriptor.h>
12 #include <hardware/IA32/IA32Instruction.h>
21 #include "IntMngIdt.h"
24 /******************************************************************************/
26 /******************************************************************************/
28 #ifdef DEBUG_LOG_ENABLE
29 #define DEBUG_LOG( ... ) \
30 DebugLogOutput( CMN_MODULE_INT_HDL, \
34 #define DEBUG_LOG( ... )
37 /** 割込みハンドラ共通関数定義マクロ */
38 #define HDL_CMN_PROC( _INT_NO ) \
39 static void HdlCmnProc##_INT_NO( void ) \
42 IA32InstructionPushDs(); \
43 IA32InstructionPushEs(); \
44 IA32InstructionPushFs(); \
45 IA32InstructionPushGs(); \
46 IA32InstructionPushad(); \
49 IA32InstructionPush( _INT_NO ); \
50 IA32InstructionCall( gHdlIntProcTbl[ _INT_NO ] ); \
51 IA32InstructionAddEsp( 4 ); \
54 IA32InstructionPopad(); \
55 IA32InstructionPopGs(); \
56 IA32InstructionPopFs(); \
57 IA32InstructionPopEs(); \
58 IA32InstructionPopDs(); \
61 IA32InstructionIretd(); \
64 /** 割込みハンドラ共通関数連続定義マクロ */
65 #define HDL_CMN_PROC_16X( _X ) \
66 HDL_CMN_PROC( _X##0 ) \
67 HDL_CMN_PROC( _X##1 ) \
68 HDL_CMN_PROC( _X##2 ) \
69 HDL_CMN_PROC( _X##3 ) \
70 HDL_CMN_PROC( _X##4 ) \
71 HDL_CMN_PROC( _X##5 ) \
72 HDL_CMN_PROC( _X##6 ) \
73 HDL_CMN_PROC( _X##7 ) \
74 HDL_CMN_PROC( _X##8 ) \
75 HDL_CMN_PROC( _X##9 ) \
76 HDL_CMN_PROC( _X##A ) \
77 HDL_CMN_PROC( _X##B ) \
78 HDL_CMN_PROC( _X##C ) \
79 HDL_CMN_PROC( _X##D ) \
80 HDL_CMN_PROC( _X##E ) \
83 /** 割込みハンドラ共通関数宣言連続定義マクロ */
84 #define HDL_CMN_PROC_PROTOTYPE_16X( _X ) \
85 static void HdlCmnProc##_X##0( void ); \
86 static void HdlCmnProc##_X##1( void ); \
87 static void HdlCmnProc##_X##2( void ); \
88 static void HdlCmnProc##_X##3( void ); \
89 static void HdlCmnProc##_X##4( void ); \
90 static void HdlCmnProc##_X##5( void ); \
91 static void HdlCmnProc##_X##6( void ); \
92 static void HdlCmnProc##_X##7( void ); \
93 static void HdlCmnProc##_X##8( void ); \
94 static void HdlCmnProc##_X##9( void ); \
95 static void HdlCmnProc##_X##A( void ); \
96 static void HdlCmnProc##_X##B( void ); \
97 static void HdlCmnProc##_X##C( void ); \
98 static void HdlCmnProc##_X##D( void ); \
99 static void HdlCmnProc##_X##E( void ); \
100 static void HdlCmnProc##_X##F( void );
103 /** 割込みハンドラ共通関数リスト連続定義マクロ */
104 #define HDL_CMN_PROC_LIST_16X( _X ) \
123 typedef void ( *hdlCmnProc_t )( void );
126 /******************************************************************************/
128 /******************************************************************************/
130 HDL_CMN_PROC_PROTOTYPE_16X( 0x0 )
131 HDL_CMN_PROC_PROTOTYPE_16X( 0x1 )
132 HDL_CMN_PROC_PROTOTYPE_16X( 0x2 )
133 HDL_CMN_PROC_PROTOTYPE_16X( 0x3 )
134 HDL_CMN_PROC_PROTOTYPE_16X( 0x4 )
135 HDL_CMN_PROC_PROTOTYPE_16X( 0x5 )
136 HDL_CMN_PROC_PROTOTYPE_16X( 0x6 )
137 HDL_CMN_PROC_PROTOTYPE_16X( 0x7 )
138 HDL_CMN_PROC_PROTOTYPE_16X( 0x8 )
139 HDL_CMN_PROC_PROTOTYPE_16X( 0x9 )
140 HDL_CMN_PROC_PROTOTYPE_16X( 0xA )
141 HDL_CMN_PROC_PROTOTYPE_16X( 0xB )
142 HDL_CMN_PROC_PROTOTYPE_16X( 0xC )
143 HDL_CMN_PROC_PROTOTYPE_16X( 0xD )
144 HDL_CMN_PROC_PROTOTYPE_16X( 0xE )
145 HDL_CMN_PROC_PROTOTYPE_16X( 0xF )
148 static void HdlIgnore( uint32_t intNo );
151 /******************************************************************************/
153 /******************************************************************************/
154 /** 割込みハンドラ共通関数テーブル */
155 const hdlCmnProc_t gHdlCmnProcTbl[ INTMNG_INT_NO_NUM ] = {
156 HDL_CMN_PROC_LIST_16X( 0x0 ),
157 HDL_CMN_PROC_LIST_16X( 0x1 ),
158 HDL_CMN_PROC_LIST_16X( 0x2 ),
159 HDL_CMN_PROC_LIST_16X( 0x3 ),
160 HDL_CMN_PROC_LIST_16X( 0x4 ),
161 HDL_CMN_PROC_LIST_16X( 0x5 ),
162 HDL_CMN_PROC_LIST_16X( 0x6 ),
163 HDL_CMN_PROC_LIST_16X( 0x7 ),
164 HDL_CMN_PROC_LIST_16X( 0x8 ),
165 HDL_CMN_PROC_LIST_16X( 0x9 ),
166 HDL_CMN_PROC_LIST_16X( 0xA ),
167 HDL_CMN_PROC_LIST_16X( 0xB ),
168 HDL_CMN_PROC_LIST_16X( 0xC ),
169 HDL_CMN_PROC_LIST_16X( 0xD ),
170 HDL_CMN_PROC_LIST_16X( 0xE ),
171 HDL_CMN_PROC_LIST_16X( 0xF ) };
174 static IntMngHdl_t gHdlIntProcTbl[ INTMNG_INT_NO_NUM ];
177 /******************************************************************************/
179 /******************************************************************************/
180 /******************************************************************************/
183 * @details ハンドラ管理サブモジュールの初期化を行う。
185 /******************************************************************************/
186 void IntMngHdlInit( void )
188 uint32_t intNo; /* 割込み番号 */
191 for ( intNo = INTMNG_INT_NO_MIN;
192 intNo <= INTMNG_INT_NO_MAX;
194 /* 割込みハンドラ管理テーブル設定 */
195 gHdlIntProcTbl[ intNo ] = HdlIgnore;
199 intNo, /* IDTエントリ番号 */
200 MEMMNG_SEGSEL_KERNEL_CODE, /* セレクタ */
201 gHdlCmnProcTbl[ intNo ], /* オフセット */
203 IA32_DESCRIPTOR_TYPE_GATE32_INT, /* タイプ */
204 IA32_DESCRIPTOR_DPL_3 ); /* 特権レベル */
211 /******************************************************************************/
214 * @details 割込みハンドラを登録する。
216 * @param[in] intNo 割込み番号
217 * - INTMNG_INT_NO_MIN 割込み番号最小値
218 * - INTMNG_INT_NO_MAX 割込み番号最大値
219 * @param[in] func 割込みハンドラ
221 /******************************************************************************/
222 void IntMngHdlSet( uint32_t intNo,
225 /* 割込みハンドラ管理テーブル設定 */
226 gHdlIntProcTbl[ intNo ] = func;
232 /******************************************************************************/
234 /******************************************************************************/
236 HDL_CMN_PROC_16X( 0x0 )
237 HDL_CMN_PROC_16X( 0x1 )
238 HDL_CMN_PROC_16X( 0x2 )
239 HDL_CMN_PROC_16X( 0x3 )
240 HDL_CMN_PROC_16X( 0x4 )
241 HDL_CMN_PROC_16X( 0x5 )
242 HDL_CMN_PROC_16X( 0x6 )
243 HDL_CMN_PROC_16X( 0x7 )
244 HDL_CMN_PROC_16X( 0x8 )
245 HDL_CMN_PROC_16X( 0x9 )
246 HDL_CMN_PROC_16X( 0xA )
247 HDL_CMN_PROC_16X( 0xB )
248 HDL_CMN_PROC_16X( 0xC )
249 HDL_CMN_PROC_16X( 0xD )
250 HDL_CMN_PROC_16X( 0xE )
251 HDL_CMN_PROC_16X( 0xF )
254 /******************************************************************************/
257 * @details 割込み処理として何もしない割込みハンドラ。
259 * @param[in] intNo 割込み番号
261 /******************************************************************************/
262 static void HdlIgnore( uint32_t intNo )
269 /******************************************************************************/