OSDN Git Service

デバッグ制御モジュール(トレースログ管理サブモジュール)追加
[mochi/master.git] / src / kernel / IntMng / IntMngIdt.c
1 /******************************************************************************/
2 /* src/kernel/IntMng/IntMngIdt.c                                              */
3 /*                                                                 2017/03/11 */
4 /* Copyright (C) 2016-2017 Mochi.                                             */
5 /******************************************************************************/
6 /******************************************************************************/
7 /* インクルード                                                               */
8 /******************************************************************************/
9 /* 共通ヘッダ */
10 #include <stdarg.h>
11 #include <string.h>
12 #include <hardware/IA32/IA32Descriptor.h>
13 #include <hardware/IA32/IA32Instruction.h>
14
15
16 /* 外部モジュールヘッダ */
17 #include <Cmn.h>
18 #include <Debug.h>
19 #include <IntMng.h>
20
21 /* 内部モジュールヘッダ */
22 #include "IntMngIdt.h"
23
24
25 /******************************************************************************/
26 /* 定義                                                                       */
27 /******************************************************************************/
28 /* デバッグトレースログ出力マクロ */
29 #ifdef DEBUG_LOG_ENABLE
30 #define DEBUG_LOG( ... )                \
31     DebugLogOutput( CMN_MODULE_INT_IDT, \
32                     __LINE__,           \
33                     __VA_ARGS__ )
34 #else
35 #define DEBUG_LOG( ... )
36 #endif
37
38
39 /******************************************************************************/
40 /* 変数定義                                                                   */
41 /******************************************************************************/
42 /* IDT */
43 static IA32DescriptorGate_t gIdt[ INTMNG_IDT_ENTRY_NUM ];
44
45
46 /******************************************************************************/
47 /* グローバル関数定義                                                         */
48 /******************************************************************************/
49 /******************************************************************************/
50 /**
51  * @brief       IDT管理初期化
52  * @details     IDT管理サブモジュールの初期化を行う。
53  */
54 /******************************************************************************/
55 void IntMngIdtInit( void )
56 {
57     /* IDT初期化 */
58     memset( gIdt, 0, sizeof ( gIdt ) );
59     
60     /* IDTR設定 */
61     IA32InstructionLidt( ( IA32Descriptor_t * ) gIdt, sizeof ( gIdt ) - 1 );
62     
63     return;
64 }
65
66
67 /******************************************************************************/
68 /**
69  * @brief       IDTエントリ設定
70  * @details     IDTにエントリを設定する。
71  * 
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    引数コピーカウント
78  * @param[in]   type     タイプ
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
96  */
97 /******************************************************************************/
98 void IntMngIdtSet( uint32_t index,
99                    uint16_t selector,
100                    void     *pOffset,
101                    uint8_t  count,
102                    uint8_t  type,
103                    uint8_t  level )
104 {
105     /* ディスクリプタ設定 */
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 );
114     
115     return;
116 }
117
118
119 /******************************************************************************/