OSDN Git Service

5d89a8cb4d7b546288644c731f8297002d47fab9
[mochi/master.git] / src / kernel / IntMng / IntMngHdl.c
1 /******************************************************************************/
2 /* src/kernel/IntMng/IntMngHdl.c                                              */
3 /*                                                                 2017/03/11 */
4 /* Copyright (C) 2016-2017 Mochi.                                             */
5 /******************************************************************************/
6 /******************************************************************************/
7 /* インクルード                                                               */
8 /******************************************************************************/
9 /* 共通ヘッダ */
10 #include <stdarg.h>
11 #include <hardware/IA32/IA32Descriptor.h>
12 #include <hardware/IA32/IA32Instruction.h>
13
14 /* 外部モジュールヘッダ */
15 #include <Cmn.h>
16 #include <Debug.h>
17 #include <MemMng.h>
18 #include <IntMng.h>
19
20 /* 内部モジュールヘッダ */
21 #include "IntMngIdt.h"
22
23
24 /******************************************************************************/
25 /* 定義                                                                       */
26 /******************************************************************************/
27 /* デバッグトレースログ出力マクロ */
28 #ifdef DEBUG_LOG_ENABLE
29 #define DEBUG_LOG( ... )                \
30     DebugLogOutput( CMN_MODULE_INT_HDL, \
31                     __LINE__,           \
32                     __VA_ARGS__ )
33 #else
34 #define DEBUG_LOG( ... )
35 #endif
36
37 /** 割込みハンドラ共通関数定義マクロ */
38 #define HDL_CMN_PROC( _INT_NO )                             \
39     static void HdlCmnProc##_INT_NO( void )                 \
40     {                                                       \
41         /* コンテキスト保存 */                              \
42         IA32InstructionPushDs();                            \
43         IA32InstructionPushEs();                            \
44         IA32InstructionPushFs();                            \
45         IA32InstructionPushGs();                            \
46         IA32InstructionPushad();                            \
47                                                             \
48         /* 割込みハンドラ呼出し */                          \
49         IA32InstructionPush( _INT_NO );                     \
50         IA32InstructionCall( gHdlIntProcTbl[ _INT_NO ] );   \
51         IA32InstructionAddEsp( 4 );                         \
52                                                             \
53         /* コンテキスト復帰 */                              \
54         IA32InstructionPopad();                             \
55         IA32InstructionPopGs();                             \
56         IA32InstructionPopFs();                             \
57         IA32InstructionPopEs();                             \
58         IA32InstructionPopDs();                             \
59                                                             \
60         /* return */                                        \
61         IA32InstructionIretd();                             \
62     }
63
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 )       \
81     HDL_CMN_PROC( _X##F )
82
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 );
101
102
103 /** 割込みハンドラ共通関数リスト連続定義マクロ */
104 #define HDL_CMN_PROC_LIST_16X( _X ) \
105     HdlCmnProc##_X##0,              \
106     HdlCmnProc##_X##1,              \
107     HdlCmnProc##_X##2,              \
108     HdlCmnProc##_X##3,              \
109     HdlCmnProc##_X##4,              \
110     HdlCmnProc##_X##5,              \
111     HdlCmnProc##_X##6,              \
112     HdlCmnProc##_X##7,              \
113     HdlCmnProc##_X##8,              \
114     HdlCmnProc##_X##9,              \
115     HdlCmnProc##_X##A,              \
116     HdlCmnProc##_X##B,              \
117     HdlCmnProc##_X##C,              \
118     HdlCmnProc##_X##D,              \
119     HdlCmnProc##_X##E,              \
120     HdlCmnProc##_X##F
121
122 /* 割込みハンドラ共通関数型 */
123 typedef void ( *hdlCmnProc_t )( void );
124
125
126 /******************************************************************************/
127 /* ローカル関数プロトタイプ宣言                                               */
128 /******************************************************************************/
129 /* 割込みハンドラ共通関数 */
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 )
146
147 /* 無視割込みハンドラ */
148 static void HdlIgnore( uint32_t intNo );
149
150
151 /******************************************************************************/
152 /* 変数定義                                                                   */
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 )  };
172
173 /** 割込みハンドラ管理テーブル */
174 static IntMngHdl_t gHdlIntProcTbl[ INTMNG_INT_NO_NUM ];
175
176
177 /******************************************************************************/
178 /* グローバル関数定義                                                         */
179 /******************************************************************************/
180 /******************************************************************************/
181 /**
182  * @brief       ハンドラ管理初期化
183  * @details     ハンドラ管理サブモジュールの初期化を行う。
184  */
185 /******************************************************************************/
186 void IntMngHdlInit( void )
187 {
188     uint32_t intNo;     /* 割込み番号 */
189     
190     /* 全割込み番号毎に繰り返し */
191     for ( intNo =  INTMNG_INT_NO_MIN;
192           intNo <= INTMNG_INT_NO_MAX;
193           intNo++ ) {
194         /* 割込みハンドラ管理テーブル設定 */
195         gHdlIntProcTbl[ intNo ] = HdlIgnore;
196         
197         /* IDT登録 */
198         IntMngIdtSet(
199             intNo,                              /* IDTエントリ番号    */
200             MEMMNG_SEGSEL_KERNEL_CODE,          /* セレクタ           */
201             gHdlCmnProcTbl[ intNo ],            /* オフセット         */
202             0,                                  /* 引数コピーカウント */
203             IA32_DESCRIPTOR_TYPE_GATE32_INT,    /* タイプ             */
204             IA32_DESCRIPTOR_DPL_3            ); /* 特権レベル         */
205     }
206     
207     return;
208 }
209
210
211 /******************************************************************************/
212 /**
213  * @brief       割込みハンドラ登録
214  * @details     割込みハンドラを登録する。
215  * 
216  * @param[in]   intNo 割込み番号
217  *                  - INTMNG_INT_NO_MIN 割込み番号最小値
218  *                  - INTMNG_INT_NO_MAX 割込み番号最大値
219  * @param[in]   func  割込みハンドラ
220  */
221 /******************************************************************************/
222 void IntMngHdlSet( uint32_t    intNo,
223                    IntMngHdl_t func )
224 {
225     /* 割込みハンドラ管理テーブル設定 */
226     gHdlIntProcTbl[ intNo ] = func;
227     
228     return;
229 }
230
231
232 /******************************************************************************/
233 /* ローカル関数定義                                                           */
234 /******************************************************************************/
235 /* 割込みハンドラ共通関数 */
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 )
252
253
254 /******************************************************************************/
255 /**
256  * @brief       無視割込みハンドラ
257  * @details     割込み処理として何もしない割込みハンドラ。
258  * 
259  * @param[in]   intNo 割込み番号
260  */
261 /******************************************************************************/
262 static void HdlIgnore( uint32_t intNo )
263 {
264     /* 何もしない */
265     return;
266 }
267
268
269 /******************************************************************************/