OSDN Git Service

ba2448dda89fe6cc874fa7a35b8b65b9ef3a4656
[mochi/master.git] / src / kernel / ProcMng / ProcMngTss.c
1 /******************************************************************************/
2 /* src/kernel/ProcMng/ProcMngTss.c                                            */
3 /*                                                                 2017/03/01 */
4 /* Copyright (C) 2017 Mochi.                                                  */
5 /******************************************************************************/
6 /******************************************************************************/
7 /* インクルード                                                               */
8 /******************************************************************************/
9 /* 共通ヘッダ */
10 #include <string.h>
11 #include <hardware/IA32/IA32.h>
12 #include <hardware/IA32/IA32Descriptor.h>
13 #include <hardware/IA32/IA32Instruction.h>
14 #include <hardware/IA32/IA32Tss.h>
15
16 /* 外部モジュールヘッダ */
17 #include <MemMng.h>
18
19 /* 内部モジュールヘッダ */
20
21
22 /******************************************************************************/
23 /* 変数定義                                                                   */
24 /******************************************************************************/
25 /** TSS */
26 static IA32Tss_t gTss;
27
28
29 /******************************************************************************/
30 /* グローバル関数定義                                                         */
31 /******************************************************************************/
32 /******************************************************************************/
33 /**
34  * @brief       TSS管理初期化
35  * @details     TSS管理サブモジュールの初期化を行う。
36  */
37 /******************************************************************************/
38 void ProcMngTssInit( void )
39 {
40     uint16_t index;     /* GDTエントリ番号    */
41     uint16_t selector;  /* セグメントセレクタ */
42     
43     /* TSS初期化 */
44     memset( &gTss, 0, sizeof ( IA32Tss_t ) );
45     
46     /* TSSディスクリプタ設定 */
47     index = MemMngGdtAdd(
48                 &gTss,                          /* セグメントベース     */
49                 sizeof ( IA32Tss_t ) - 1,       /* セグメントサイズ     */
50                 IA32_DESCRIPTOR_G_BYTE,         /* リミット粒度         */
51                 IA32_DESCRIPTOR_S_SYSTEM,       /* システムフラグ       */
52                 IA32_DESCRIPTOR_TYPE_TSS32,     /* セグメントタイプ     */
53                 IA32_DESCRIPTOR_DPL_0,          /* セグメント特権レベル */
54                 IA32_DESCRIPTOR_DB_UNUSED   );  /* オペレーションサイズ */
55     
56     /* セグメントセレクタ設定 */
57     selector = IA32_SEGMENT_SELECTOR( index,            /* インデックス */
58                                       IA32_TI_GDT,      /* TI           */
59                                       IA32_RPL_0   );   /* RPL          */
60     
61     /* TR設定 */
62     IA32InstructionLtr( selector );
63     
64     return;
65 }
66
67
68 /******************************************************************************/
69 /**
70  * @brief       ESP0設定
71  * @details     TSSのESP0フィールドを設定する。
72  * 
73  * @param[in]   esp0 ESP0設定値
74  */
75 /******************************************************************************/
76 void ProcMngTssSetEsp0( uint32_t esp0 )
77 {
78     /* esp0設定 */
79     gTss.esp0 = esp0;
80     
81     return;
82 }
83
84
85 /******************************************************************************/