1 /******************************************************************************/
2 /* src/kernel/include/hardware/IA32/IA32Paging.h */
4 /* Copyright (C) 2017 Mochi. */
5 /******************************************************************************/
8 /******************************************************************************/
10 /******************************************************************************/
14 /******************************************************************************/
16 /******************************************************************************/
18 #define IA32_PAGING_SET_PDBR( _PDBR, _PBASE, _PCD, _PWT ) \
20 *( ( uint32_t * ) &( _PDBR ) ) = \
21 ( ( uint32_t ) ( _PBASE ) ) & 0xFFFFF000; \
22 ( _PDBR ).attr_pcd = ( _PCD ); \
23 ( _PDBR ).attr_pwt = ( _PWT ); \
26 /** ページディレクトリエントリインデックス取得マクロ */
27 #define IA32_PAGING_GET_PDE_IDX( _PADDR ) \
28 ( ( ( ( uint32_t ) ( _PADDR ) ) >> 22 ) & 0x3FF )
29 /** ページテーブルエントリインデックス取得マクロ */
30 #define IA32_PAGING_GET_PTE_IDX( _PADDR ) \
31 ( ( ( ( uint32_t ) ( _PADDR ) ) >> 12 ) & 0x3FF )
33 /** ページテーブル・ページベースアドレス設定マクロ */
34 #define IA32_PAGING_SET_BASE( _PENTRY, _PBASE ) \
35 ( *( ( uint32_t * ) ( _PENTRY ) ) = \
36 ( ( ( uint32_t ) ( _PBASE ) ) & 0xFFFFF000 ) | \
37 ( *( ( uint32_t * ) ( _PENTRY ) ) & 0x00000FFF ) )
38 /** ページテーブル・ページベースアドレス取得マクロ */
39 #define IA32_PAGING_GET_BASE( _PENTRY ) \
40 ( ( void * ) ( *( ( uint32_t * ) ( _PENTRY ) ) & 0xFFFFF000 ) )
42 /* ページテーブル・ページ存在フラグ */
43 #define IA32_PAGING_P_NO ( 0 ) /** ページテーブル・ページ無し */
44 #define IA32_PAGING_P_YES ( 1 ) /** ページテーブル・ページ有り */
47 #define IA32_PAGING_RW_R ( 0 ) /** 読込専用ページ */
48 #define IA32_PAGING_RW_RW ( 1 ) /** 読込/書込可ページ */
51 #define IA32_PAGING_US_SV ( 0 ) /** スーパバイザ特権レベル */
52 #define IA32_PAGING_US_USER ( 1 ) /** ユーザ特権レベル */
55 #define IA32_PAGING_PWT_WB ( 0 ) /** ライトバックキャッシング */
56 #define IA32_PAGING_PWT_WT ( 1 ) /** ライトスルーキャッシング */
58 /* ページレベルキャッシュディスエーブルフラグ */
59 #define IA32_PAGING_PCD_ENABLE ( 0 ) /** キャッシング有効 */
60 #define IA32_PAGING_PCD_DISABLE ( 1 ) /** キャッシング無効 */
63 #define IA32_PAGING_A_NO ( 0 ) /** 未アクセス */
64 #define IA32_PAGING_A_YES ( 1 ) /** アクセス済み */
67 #define IA32_PAGING_D_NO ( 0 ) /** 未書込み */
68 #define IA32_PAGING_D_YES ( 1 ) /** 書込み済み */
71 #define IA32_PAGING_PS_4K ( 0 ) /** 4KiBページサイズ */
72 #define IA32_PAGING_PS_4M2M ( 1 ) /** 4MiBまたは2MiBページサイズ */
75 #define IA32_PAGING_G_NO ( 0 ) /** 非グローバルページ */
76 #define IA32_PAGING_G_YES ( 1 ) /** グローバルページ */
79 #define IA32_PAGING_PDE_NUM ( 1024 ) /** ページディレクトリエントリ数 */
80 #define IA32_PAGING_PTE_NUM ( 1024 ) /** ページテーブルエントリ数 */
83 #define IA32_PAGING_PAGE_SIZE ( 4096 )
87 uint32_t reserved2:3; /**< 予約済み */
88 uint32_t attr_pwt :1; /**< ページレベルライトスルーフラグ */
89 uint32_t attr_pcd :1; /**< ページレベルキャッシュディスエーブルフラグ */
90 uint32_t reserved1:7; /**< 予約済み */
91 uint32_t base :20; /**< ページディレクトリベースアドレス */
96 uint32_t attr_p :1; /**< 存在フラグ */
97 uint32_t attr_rw :1; /**< 読込/書込フラグ */
98 uint32_t attr_us :1; /**< ユーザ/スーパバイザフラグ */
99 uint32_t attr_pwt:1; /**< ページレベルライトスルーフラグ */
100 uint32_t attr_pcd:1; /**< ページレベルキャッシュディスエーブルフラグ */
101 uint32_t attr_a :1; /**< アクセス済みフラグ */
102 uint32_t reserved:1; /**< 予約済 */
103 uint32_t attr_ps :1; /**< ページサイズフラグ */
104 uint32_t attr_g :1; /**< グローバルページ */
105 uint32_t attr_avl:3; /**< 未使用 */
106 uint32_t base :20; /**< ページテーブルベースアドレス */
111 IA32PagingPDE_t entry[ IA32_PAGING_PDE_NUM ]; /**< エントリ */
112 } __attribute__( ( aligned( 4096 ) ) ) IA32PagingDir_t;
116 uint32_t attr_p :1; /**< 存在フラグ */
117 uint32_t attr_rw :1; /**< 読込/書込フラグ */
118 uint32_t attr_us :1; /**< ユーザ/スーパバイザフラグ */
119 uint32_t attr_pwt:1; /**< ページレベルライトスルーフラグ */
120 uint32_t attr_pcd:1; /**< ページレベルキャッシュディスエーブルフラグ */
121 uint32_t attr_a :1; /**< アクセス済みフラグ */
122 uint32_t attr_d :1; /**< ダーティフラグ */
123 uint32_t attr_pat:1; /**< ページ属性テーブルインデックスフラグ */
124 uint32_t attr_g :1; /**< グローバルフラグ */
125 uint32_t attr_avl:3; /**< 未使用 */
126 uint32_t base :20; /**< ページベースアドレス */
131 IA32PagingPTE_t entry[ IA32_PAGING_PTE_NUM ]; /**< エントリ */
132 } __attribute__( ( aligned( 4096 ) ) ) IA32PagingTbl_t;
135 /******************************************************************************/