OSDN Git Service

VGAヘッダ追加、ページ管理・メモリ制御モジュール追加
[mochi/master.git] / src / kernel / MemMng / MemMngCtrl.c
1 /******************************************************************************/
2 /* src/kernel/MemMng/MemMngCtrl.c                                             */
3 /*                                                                 2017/05/19 */
4 /* Copyright (C) 2017 Mochi.                                                  */
5 /******************************************************************************/
6 /******************************************************************************/
7 /* インクルード                                                               */
8 /******************************************************************************/
9 /* 共通ヘッダ */
10 #include <stdarg.h>
11 #include <stddef.h>
12 #include <stdint.h>
13 #include <string.h>
14 #include <hardware/IA32/IA32Paging.h>
15
16 /* 外部モジュールヘッダ */
17 #include <Cmn.h>
18 #include <Debug.h>
19 #include <MemMng.h>
20
21 /* 内部モジュールヘッダ */
22
23
24 /******************************************************************************/
25 /* 定義                                                                       */
26 /******************************************************************************/
27 /* デバッグトレースログ出力マクロ */
28 #ifdef DEBUG_LOG_ENABLE
29 #define DEBUG_LOG( ... )                     \
30     DebugLogOutput( CMN_MODULE_MEMMNG_CTRL,  \
31                     __LINE__,                \
32                     __VA_ARGS__ )
33 #else
34 #define DEBUG_LOG( ... )
35 #endif
36
37 /* 物理マッピング用領域定義 */
38 #define CTRL_MAP_ADDR1 ( 0x3F000000 )   /** 物理マッピング用領域1先頭アドレス */
39 #define CTRL_MAP_ADDR2 ( 0x3F800000 )   /** 物理マッピング用領域2先頭アドレス */
40 #define CTRL_MAP_SIZE  ( 0x01000000 )   /** 物理マッピング用領域全サイズ      */
41 #define CTRL_MAP_SIZE1 ( 0x00800000 )   /** 物理マッピング用領域1サイズ       */
42 #define CTRL_MAP_SIZE2 ( 0x00800000 )   /** 物理マッピング用領域2サイズ       */
43
44
45 /******************************************************************************/
46 /* グローバル関数定義                                                         */
47 /******************************************************************************/
48 /******************************************************************************/
49 /**
50  * @brief       メモリコピー(仮想->物理)
51  * @details     仮想アドレス空間から物理アドレス空間へメモリコピーを行う。
52  * 
53  * @param[in]   pPAddr コピー先物理アドレス
54  * @param[in]   pVAddr コピー元仮想アドレス
55  * @param[in]   size   コピーサイズ
56  * 
57  * @attention   引数pPhysAddrは4KiBアライメントであること。
58  */
59 /******************************************************************************/
60 void MemMngCtrlCopyVirtToPhys( void   *pPAddr,
61                                void   *pVAddr,
62                                size_t size     )
63 {
64     uint32_t dirId; /* ページディレクトリID */
65     uint32_t idx;   /* インデックス         */
66     size_t   count; /* コピーサイズ         */
67     
68     /* デバッグトレースログ出力 */
69     DEBUG_LOG( "%s() start.", __func__ );
70     DEBUG_LOG( " pPAddr=%010p, pVAddr=%010p, size=%#X",
71                pPAddr,
72                pVAddr,
73                size );
74     
75     /* ページディレクトリID取得 */
76     dirId = MemMngPageGetDirId();
77     
78     /* 物理マッピング用領域サイズ毎に繰り返し */
79     for ( idx = 0; idx < size; idx += CTRL_MAP_SIZE ) {
80         /* 次コピー有無判定 */
81         if ( ( size - idx ) > CTRL_MAP_SIZE ) {
82             /* 次コピー有 */
83             
84             /* コピーサイズ設定 */
85             count = CTRL_MAP_SIZE;
86             
87         } else {
88             /* 次コピー無 */
89             
90             /* コピーサイズ設定 */
91             count = size - idx;
92         }
93         
94         /* ページマッピング設定 */
95         MemMngPageSet( dirId,
96                        ( void * ) CTRL_MAP_ADDR1,
97                        pPAddr + idx,
98                        count,
99                        IA32_PAGING_G_NO,
100                        IA32_PAGING_US_SV,
101                        IA32_PAGING_RW_RW  );
102         
103         /* コピー */
104         memcpy( ( void * ) CTRL_MAP_ADDR1, pVAddr + idx, count );
105     }
106     
107     /* ページマッピング解除 */
108     MemMngPageUnset( dirId, ( void * ) CTRL_MAP_ADDR1, CTRL_MAP_SIZE );
109     
110     /* デバッグトレースログ出力 */
111     DEBUG_LOG( "%s() end.", __func__ );
112     
113     return;
114 }
115
116
117 /******************************************************************************/
118 /**
119  * @brief       メモリ設定
120  * @details     物理アドレス空間のメモリ領域に指定値を設定する。
121  * 
122  * @param[in]   pPAddr 設定先物理アドレス
123  * @param[in]   value  設定値
124  * @param[in]   size   サイズ
125  * 
126  * @attention   引数pPhysAddrは4KiBアライメントであること。
127  */
128 /******************************************************************************/
129 void MemMngCtrlSet( void    *pPAddr,
130                     uint8_t value,
131                     size_t  size     )
132 {
133     uint32_t dirId; /* ページディレクトリID */
134     uint32_t idx;   /* インデックス         */
135     size_t   count; /* コピーサイズ         */
136     
137     /* デバッグトレースログ出力 */
138     DEBUG_LOG( "%s() start. pPAddr=%010p, value=%0#4X, size=%#X",
139                __func__,
140                pPAddr,
141                value,
142                size );
143     
144     /* ページディレクトリID取得 */
145     dirId = MemMngPageGetDirId();
146     
147     /* 物理マッピング用領域サイズ毎に繰り返し */
148     for ( idx = 0; idx < size; idx += CTRL_MAP_SIZE ) {
149         /* 次設定有無判定 */
150         if ( ( size - idx ) > CTRL_MAP_SIZE ) {
151             /* 次設定有 */
152             
153             /* サイズ設定 */
154             count = CTRL_MAP_SIZE;
155             
156         } else {
157             /* 次設定無 */
158             
159             /* サイズ設定 */
160             count = size - idx;
161         }
162         
163         /* ページマッピング設定 */
164         MemMngPageSet( dirId,
165                        ( void * ) CTRL_MAP_ADDR1,
166                        pPAddr + idx,
167                        count,
168                        IA32_PAGING_G_NO,
169                        IA32_PAGING_US_SV,
170                        IA32_PAGING_RW_RW  );
171         
172         /* メモリ設定 */
173         memset( ( void * ) CTRL_MAP_ADDR1, value, count );
174     }
175     
176     /* ページマッピング解除 */
177     MemMngPageUnset( dirId, ( void * ) CTRL_MAP_ADDR1, CTRL_MAP_SIZE );
178     
179     /* デバッグトレースログ出力 */
180     DEBUG_LOG( "%s() end.", __func__ );
181     
182     return;
183 }
184
185
186 /******************************************************************************/