OSDN Git Service

MochiBooterの大幅改造(ATA-PIOreadによるカーネルロード)、VMイメージ作成ツール追加など
[mochi/master.git] / src / booter / IntMng / IntMngPic.c
1 /******************************************************************************/
2 /* src/booter/IntMng/IntMngPic.c                                              */
3 /*                                                                 2017/07/03 */
4 /* Copyright (C) 2017 Mochi.                                                  */
5 /******************************************************************************/
6 /******************************************************************************/
7 /* インクルード                                                               */
8 /******************************************************************************/
9 /* 共通ヘッダ */
10 #include <stdarg.h>
11 #include <hardware/IA32/IA32Instruction.h>
12 #include <hardware/I8259A/I8259A.h>
13
14 /* 外部モジュールヘッダ */
15 #include <Cmn.h>
16 #include <Debug.h>
17
18 /* 内部モジュールヘッダ */
19 #include "IntMng.h"
20
21
22 /******************************************************************************/
23 /* 定義                                                                       */
24 /******************************************************************************/
25 /* デバッグトレースログ出力マクロ */
26 #ifdef DEBUG_LOG_ENABLE
27 #define DEBUG_LOG( ... )                   \
28     DebugLogOutput( CMN_MODULE_INTMNG_PIC, \
29                     __LINE__,              \
30                     __VA_ARGS__ )
31 #else
32 #define DEBUG_LOG( ... )
33 #endif
34
35 /* 割込みマスク状態定義 */
36 #define PIC_MASK_STATE_DISABLE ( 0 )    /**< マスク無効状態 */
37 #define PIC_MASK_STATE_ENABLE  ( 1 )    /**< マスク有効状態 */
38
39 /* PIC定義 */
40 #define PIC_NUM                ( 2 )    /**< PIC数        */
41 #define PIC_MASTER             ( 0 )    /**< PIC1マスタ   */
42 #define PIC_SLAVE              ( 1 )    /**< PIC2スレーブ */
43
44 /** PIC管理テーブル型 */
45 typedef struct {
46     uint8_t maskState;          /**< PICマスク状態 */
47     uint8_t mask[ PIC_NUM ];    /**< PICマスク値   */
48     uint8_t reserved;           /**< パディング    */
49 } picTbl_t;
50
51
52 /******************************************************************************/
53 /* 変数定義                                                                   */
54 /******************************************************************************/
55 /** PIC管理テーブル */
56 static picTbl_t gPicTbl;
57
58
59 /******************************************************************************/
60 /* グローバル関数定義                                                         */
61 /******************************************************************************/
62 /******************************************************************************/
63 /**
64  * @brief       PIC管理初期化
65  * @details     PIC管理サブモジュールの初期化を行う。
66  */
67 /******************************************************************************/
68 void IntMngPicInit( void )
69 {
70     /* デバッグトレースログ出力 */
71     DEBUG_LOG( "%s() start.", __func__ );
72     
73     /* PIC2(スレーブ)設定 */
74     IA32InstructionOutByte( I8259A_S_PORT_ICW1, 0x11 );
75     IA32InstructionOutByte( I8259A_S_PORT_ICW2, 0x28 );
76     IA32InstructionOutByte( I8259A_S_PORT_ICW3, 0x02 );
77     IA32InstructionOutByte( I8259A_S_PORT_ICW4, 0x01 );
78     
79     /* PIC1(マスタ)設定 */
80     IA32InstructionOutByte( I8259A_M_PORT_ICW1, 0x11 );
81     IA32InstructionOutByte( I8259A_M_PORT_ICW2, 0x20 );
82     IA32InstructionOutByte( I8259A_M_PORT_ICW3, 0x04 );
83     IA32InstructionOutByte( I8259A_M_PORT_ICW4, 0x01 );
84     
85     /* PIC管理テーブル初期化 */
86     gPicTbl.mask[ PIC_MASTER ] = 0xFF;
87     gPicTbl.mask[ PIC_SLAVE  ] = 0xFF;
88     
89     /* 割込み無効化 */
90     IntMngPicDisable();
91     
92     /* デバッグトレースログ出力 */
93     DEBUG_LOG( "%s() end.", __func__ );
94     
95     return;
96 }
97
98
99 /******************************************************************************/
100 /**
101  * @brief       PIC割込み許可
102  * @details     PICに指定したIRQ番号の割込み許可設定を行う。
103  * 
104  * @param[in]   irqNo IRQ番号
105  *                  - I8259A_IRQ0  IRQ0
106  *                  - I8259A_IRQ1  IRQ1
107  *                  - I8259A_IRQ2  IRQ2
108  *                  - I8259A_IRQ3  IRQ3
109  *                  - I8259A_IRQ4  IRQ4
110  *                  - I8259A_IRQ5  IRQ5
111  *                  - I8259A_IRQ6  IRQ6
112  *                  - I8259A_IRQ7  IRQ7
113  *                  - I8259A_IRQ8  IRQ8
114  *                  - I8259A_IRQ9  IRQ9
115  *                  - I8259A_IRQ10 IRQ10
116  *                  - I8259A_IRQ11 IRQ11
117  *                  - I8259A_IRQ12 IRQ12
118  *                  - I8259A_IRQ13 IRQ13
119  *                  - I8259A_IRQ14 IRQ14
120  *                  - I8259A_IRQ15 IRQ15
121  */
122 /******************************************************************************/
123 void IntMngPicAllowIrq( uint8_t irqNo )
124 {
125     /* デバッグトレースログ出力 */
126     DEBUG_LOG( "%s() start. irqNo=%#X", __func__, irqNo );
127     
128     /* PIC割込み番号判定 */
129     if ( ( irqNo >= I8259A_IRQ0 ) &&
130          ( irqNo <= I8259A_IRQ7 )    ) {
131         /* PIC1(マスタ)向け割込み番号 */
132         
133         /* PIC1(マスタ)用マスク設定 */
134         gPicTbl.mask[ PIC_MASTER ] &= ~( 0x01 << irqNo );
135         
136     } else {
137         /* PIC2(スレーブ)向け割込み番号 */
138         
139         /* PIC1(マスタ)用マスク設定 */
140         gPicTbl.mask[ PIC_MASTER ] &= ~I8259A_OCW1_M2;
141         
142         /* PIC2(スレーブ)用マスク設定 */
143         gPicTbl.mask[ PIC_SLAVE ]  &= ~( 0x01 << ( irqNo - I8259A_IRQ8 ) );
144     }
145     
146     /* PIC割込みマスク状態判定 */
147     if ( gPicTbl.maskState == PIC_MASK_STATE_ENABLE ) {
148         /* 割込み有効 */
149         
150         /* PIC割込みマスク設定 */
151         IntMngPicEnable();
152     }
153     
154     /* デバッグトレースログ出力 */
155     DEBUG_LOG( "%s() end.", __func__ );
156     
157     return;
158 }
159
160
161 /******************************************************************************/
162 /**
163  * @brief       PIC割込み拒否
164  * @details     PICに指定したIRQ番号の割込み拒否設定を行う。
165  * 
166  * @param[in]   irqNo IRQ番号
167  *                  - I8259A_IRQ0 IRQ0
168  *                  - I8259A_IRQ1 IRQ1
169  *                  - I8259A_IRQ2 IRQ2
170  *                  - I8259A_IRQ3 IRQ3
171  *                  - I8259A_IRQ4 IRQ4
172  *                  - I8259A_IRQ5 IRQ5
173  *                  - I8259A_IRQ6 IRQ6
174  *                  - I8259A_IRQ7 IRQ7
175  *                  - I8259A_IRQ8 IRQ8
176  *                  - I8259A_IRQ9 IRQ9
177  *                  - I8259A_IRQ10 IRQ10
178  *                  - I8259A_IRQ11 IRQ11
179  *                  - I8259A_IRQ12 IRQ12
180  *                  - I8259A_IRQ13 IRQ13
181  *                  - I8259A_IRQ14 IRQ14
182  *                  - I8259A_IRQ15 IRQ15
183  */
184 /******************************************************************************/
185 void IntMngPicDenyIrq( uint8_t irqNo )
186 {
187     /* デバッグトレースログ出力 */
188     DEBUG_LOG( "%s() start. irqNo=%#X", __func__, irqNo );
189     
190     /* PIC割込み番号判定 */
191     if ( ( irqNo >= I8259A_IRQ0 ) &&
192          ( irqNo <= I8259A_IRQ7 )    ) {
193         /* PIC1(マスタ)向け割込み番号 */
194         
195         /* PIC1(マスタ)用マスク設定 */
196         gPicTbl.mask[ PIC_MASTER ] |= 0x01 << irqNo;
197         
198     } else {
199         /* PIC2(スレーブ)向け割込み番号 */
200         
201         /* PIC2(スレーブ)用マスク設定 */
202         gPicTbl.mask[ PIC_SLAVE ]  |= ( 0x01 << ( irqNo - I8259A_IRQ8 ) );
203         
204         /* PIC2(スレーブ)の全マスク判定 */
205         if ( gPicTbl.mask[ PIC_SLAVE ] == 0xFF ) {
206             /* 全マスク */
207             
208             /* PIC1(マスタ)用マスク設定 */
209             gPicTbl.mask[ PIC_MASTER ] |= I8259A_OCW1_M2;
210         }
211     }
212     
213     /* PIC割込みマスク状態判定 */
214     if ( gPicTbl.maskState == PIC_MASK_STATE_ENABLE ) {
215         /* 割込み有効 */
216         
217         /* PIC割込みマスク設定 */
218         IntMngPicEnable();
219     }
220     
221     /* デバッグトレースログ出力 */
222     DEBUG_LOG( "%s() end.", __func__ );
223     
224     return;
225 }
226
227
228 /******************************************************************************/
229 /**
230  * @brief       PIC割込み無効化
231  * @details     PIC割込みを無効化する。
232  */
233 /******************************************************************************/
234 void IntMngPicDisable( void )
235 {
236     /* デバッグトレースログ出力 */
237     DEBUG_LOG( "%s() start.", __func__ );
238     
239     /* 割込みマスク状態変更 */
240     gPicTbl.maskState = PIC_MASK_STATE_DISABLE;
241     
242     /* PIC1(マスタ)割込みマスク設定 */
243     IA32InstructionOutByte( I8259A_M_PORT_OCW1, 0xFF );
244     
245     /* PIC2(スレーブ)割込みマスク設定 */
246     IA32InstructionOutByte( I8259A_S_PORT_OCW1, 0xFF );
247     
248     /* デバッグトレースログ出力 */
249     DEBUG_LOG( "%s() end.", __func__ );
250     
251     return;
252 }
253
254
255 /******************************************************************************/
256 /**
257  * @brief       PIC割込み有効化
258  * @details     PIC割込みを有効化する。
259  */
260 /******************************************************************************/
261 void IntMngPicEnable( void )
262 {
263     /* デバッグトレースログ出力 */
264     DEBUG_LOG( "%s() start.", __func__ );
265     
266     /* 割込みマスク状態変更 */
267     gPicTbl.maskState = PIC_MASK_STATE_ENABLE;
268     
269     /* PIC1(マスタ)割込みマスク設定 */
270     IA32InstructionOutByte( I8259A_M_PORT_OCW1, gPicTbl.mask[ PIC_MASTER ] );
271     
272     /* PIC2(スレーブ)割込みマスク設定 */
273     IA32InstructionOutByte( I8259A_S_PORT_OCW1, gPicTbl.mask[ PIC_SLAVE  ] );
274     
275     /* デバッグトレースログ出力 */
276     DEBUG_LOG( "%s() end.", __func__ );
277     
278     return;
279 }
280
281
282 /******************************************************************************/
283 /**
284  * @brief       PIC割込みEOI通知
285  * @details     PICに指定したIRQ番号のEOI通知を行う。
286  * 
287  * @param[in]   irqNo IRQ番号
288  *                  - I8259A_IRQ0 IRQ0
289  *                  - I8259A_IRQ1 IRQ1
290  *                  - I8259A_IRQ2 IRQ2
291  *                  - I8259A_IRQ3 IRQ3
292  *                  - I8259A_IRQ4 IRQ4
293  *                  - I8259A_IRQ5 IRQ5
294  *                  - I8259A_IRQ6 IRQ6
295  *                  - I8259A_IRQ7 IRQ7
296  *                  - I8259A_IRQ8 IRQ8
297  *                  - I8259A_IRQ9 IRQ9
298  *                  - I8259A_IRQ10 IRQ10
299  *                  - I8259A_IRQ11 IRQ11
300  *                  - I8259A_IRQ12 IRQ12
301  *                  - I8259A_IRQ13 IRQ13
302  *                  - I8259A_IRQ14 IRQ14
303  *                  - I8259A_IRQ15 IRQ15
304  */
305 /******************************************************************************/
306 void IntMngPicEoi( uint8_t irqNo )
307 {
308     /* デバッグトレースログ出力 *//*
309     DEBUG_LOG( "%s() start. irqNo=%#X", __func__, irqNo );*/
310     
311     /* PIC割込み番号判定 */
312     if ( ( irqNo >= I8259A_IRQ0 ) &&
313          ( irqNo <= I8259A_IRQ7 )    ) {
314         /* PIC1(マスタ)向け割込み番号 */
315         
316         /* PIC1(マスタ)EOI通知 */
317         IA32InstructionOutByte( I8259A_M_PORT_OCW2,
318                                 I8259A_OCW2_SL  | 
319                                 I8259A_OCW2_EOI |
320                                 irqNo               );
321         
322     } else {
323         /* PIC2(スレーブ)向け割込み番号 */
324         
325         /* IRQ番号変換 */
326         irqNo -= I8259A_IRQ8;
327         
328         /* PIC2(スレーブ)EOI通知 */
329         IA32InstructionOutByte( I8259A_S_PORT_OCW2,
330                                 I8259A_OCW2_SL  |
331                                 I8259A_OCW2_EOI |
332                                 irqNo               );
333         
334         /* PIC2(スレーブ)EOI通知 */
335         IA32InstructionOutByte( I8259A_M_PORT_OCW2,
336                                 I8259A_OCW2_SL  |
337                                 I8259A_OCW2_EOI |
338                                 I8259A_IRQ2         );
339     }
340     
341     /* デバッグトレースログ出力 *//*
342     DEBUG_LOG( "%s() end.", __func__ );*/
343     
344     return;
345 }
346
347
348 /******************************************************************************/