OSDN Git Service

MochiBooterの大幅改造(ATA-PIOreadによるカーネルロード)、VMイメージ作成ツール追加など
[mochi/master.git] / src / booter / IntMng / IntMngIdt.c
1 /******************************************************************************/
2 /* src/booter/IntMng/IntMngIdt.c                                              */
3 /*                                                                 2017/07/03 */
4 /* Copyright (C) 2017 Mochi.                                                  */
5 /******************************************************************************/
6 /******************************************************************************/
7 /* インクルード                                                               */
8 /******************************************************************************/
9 /* 共通ヘッダ */
10 #include <string.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 <IntMng.h>
18
19 /* 内部モジュールヘッダ */
20 #include "IntMngIdt.h"
21
22
23 /******************************************************************************/
24 /* 定義                                                                       */
25 /******************************************************************************/
26 /* デバッグトレースログ出力マクロ */
27 #ifdef DEBUG_LOG_ENABLE
28 #define DEBUG_LOG( ... )                   \
29     DebugLogOutput( CMN_MODULE_INTMNG_IDT, \
30                     __LINE__,              \
31                     __VA_ARGS__ )
32 #else
33 #define DEBUG_LOG( ... )
34 #endif
35
36
37 /******************************************************************************/
38 /* 変数定義                                                                   */
39 /******************************************************************************/
40 /* IDT */
41 static IA32DescriptorGate_t gIdt[ INTMNG_IDT_ENTRY_NUM ];
42
43
44 /******************************************************************************/
45 /* グローバル関数定義                                                         */
46 /******************************************************************************/
47 /******************************************************************************/
48 /**
49  * @brief       IDT管理初期化
50  * @details     IDT管理サブモジュールの初期化を行う。
51  */
52 /******************************************************************************/
53 void IntMngIdtInit( void )
54 {
55     /* デバッグトレースログ出力 */
56     DEBUG_LOG( "%s() start.", __func__ );
57     
58     /* IDT初期化 */
59     memset( gIdt, 0, sizeof ( gIdt ) );
60     
61     /* IDTR設定 */
62     IA32InstructionLidt( ( IA32Descriptor_t * ) gIdt, sizeof ( gIdt ) - 1 );
63     
64     /* デバッグトレースログ出力 */
65     DEBUG_LOG( "%s() end.", __func__ );
66     
67     return;
68 }
69
70
71 /******************************************************************************/
72 /**
73  * @brief       IDTエントリ設定
74  * @details     IDTにエントリを設定する。
75  * 
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    引数コピーカウント
82  * @param[in]   type     タイプ
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
100  */
101 /******************************************************************************/
102 void IntMngIdtSet( uint32_t index,
103                    uint16_t selector,
104                    void     *pOffset,
105                    uint8_t  count,
106                    uint8_t  type,
107                    uint8_t  level )
108 {
109     /* デバッグトレースログ出力 */
110     DEBUG_LOG( "%s() start.", __func__ );
111     DEBUG_LOG( " index=%#X, selector=%#X, pOffset=%#p,",
112                index,
113                selector,
114                pOffset );
115     DEBUG_LOG( " count=%#X, type=%#X, level=%#X",
116                count,
117                type,
118                level );
119     
120     /* ディスクリプタ設定 */
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 );
129     
130     /* デバッグトレースログ出力 */
131     DEBUG_LOG( "%s() end.", __func__ );
132     
133     return;
134 }
135
136
137 /******************************************************************************/