1 /******************************************************************************/
2 /* src/kernel/MemMng/MemMngCtrl.c */
4 /* Copyright (C) 2017 Mochi. */
5 /******************************************************************************/
6 /******************************************************************************/
8 /******************************************************************************/
14 #include <hardware/IA32/IA32Paging.h>
24 /******************************************************************************/
26 /******************************************************************************/
28 #ifdef DEBUG_LOG_ENABLE
29 #define DEBUG_LOG( ... ) \
30 DebugLogOutput( CMN_MODULE_MEMMNG_CTRL, \
34 #define DEBUG_LOG( ... )
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サイズ */
45 /******************************************************************************/
47 /******************************************************************************/
48 /******************************************************************************/
50 * @brief メモリコピー(仮想->物理)
51 * @details 仮想アドレス空間から物理アドレス空間へメモリコピーを行う。
53 * @param[in] pPAddr コピー先物理アドレス
54 * @param[in] pVAddr コピー元仮想アドレス
55 * @param[in] size コピーサイズ
57 * @attention 引数pPhysAddrは4KiBアライメントであること。
59 /******************************************************************************/
60 void MemMngCtrlCopyVirtToPhys( void *pPAddr,
64 uint32_t dirId; /* ページディレクトリID */
65 uint32_t idx; /* インデックス */
66 size_t count; /* コピーサイズ */
69 DEBUG_LOG( "%s() start.", __func__ );
70 DEBUG_LOG( " pPAddr=%010p, pVAddr=%010p, size=%#X",
76 dirId = MemMngPageGetDirId();
78 /* 物理マッピング用領域サイズ毎に繰り返し */
79 for ( idx = 0; idx < size; idx += CTRL_MAP_SIZE ) {
81 if ( ( size - idx ) > CTRL_MAP_SIZE ) {
85 count = CTRL_MAP_SIZE;
96 ( void * ) CTRL_MAP_ADDR1,
104 memcpy( ( void * ) CTRL_MAP_ADDR1, pVAddr + idx, count );
108 MemMngPageUnset( dirId, ( void * ) CTRL_MAP_ADDR1, CTRL_MAP_SIZE );
111 DEBUG_LOG( "%s() end.", __func__ );
117 /******************************************************************************/
120 * @details 物理アドレス空間のメモリ領域に指定値を設定する。
122 * @param[in] pPAddr 設定先物理アドレス
123 * @param[in] value 設定値
124 * @param[in] size サイズ
126 * @attention 引数pPhysAddrは4KiBアライメントであること。
128 /******************************************************************************/
129 void MemMngCtrlSet( void *pPAddr,
133 uint32_t dirId; /* ページディレクトリID */
134 uint32_t idx; /* インデックス */
135 size_t count; /* コピーサイズ */
138 DEBUG_LOG( "%s() start. pPAddr=%010p, value=%0#4X, size=%#X",
145 dirId = MemMngPageGetDirId();
147 /* 物理マッピング用領域サイズ毎に繰り返し */
148 for ( idx = 0; idx < size; idx += CTRL_MAP_SIZE ) {
150 if ( ( size - idx ) > CTRL_MAP_SIZE ) {
154 count = CTRL_MAP_SIZE;
164 MemMngPageSet( dirId,
165 ( void * ) CTRL_MAP_ADDR1,
173 memset( ( void * ) CTRL_MAP_ADDR1, value, count );
177 MemMngPageUnset( dirId, ( void * ) CTRL_MAP_ADDR1, CTRL_MAP_SIZE );
180 DEBUG_LOG( "%s() end.", __func__ );
186 /******************************************************************************/