OSDN Git Service

67a96597b5ad8e63438faf54a728e37d9e7dcf53
[mochi/master.git] / src / include / hardware / IA32 / IA32Paging.h
1 /******************************************************************************/
2 /* src/kernel/include/hardware/IA32/IA32Paging.h                              */
3 /*                                                                 2017/06/16 */
4 /* Copyright (C) 2017 Mochi.                                                  */
5 /******************************************************************************/
6 #ifndef IA32_PAGING_H
7 #define IA32_PAGING_H
8 /******************************************************************************/
9 /* インクルード                                                               */
10 /******************************************************************************/
11 #include <stdint.h>
12
13
14 /******************************************************************************/
15 /* 定義                                                                       */
16 /******************************************************************************/
17 /** PDBR設定マクロ */
18 #define IA32_PAGING_SET_PDBR( _PDBR, _PBASE, _PCD, _PWT )   \
19     {                                                       \
20         *( ( uint32_t * ) &( _PDBR ) ) =                    \
21             ( ( uint32_t ) ( _PBASE ) ) & 0xFFFFF000;       \
22         ( _PDBR ).attr_pcd             = ( _PCD );          \
23         ( _PDBR ).attr_pwt             = ( _PWT );          \
24     }
25
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 )
32
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 ) )
41
42 /* ページテーブル・ページ存在フラグ */
43 #define IA32_PAGING_P_NO        ( 0 )       /** ページテーブル・ページ無し */
44 #define IA32_PAGING_P_YES       ( 1 )       /** ページテーブル・ページ有り */
45
46 /* 読込/書込フラグ */
47 #define IA32_PAGING_RW_R        ( 0 )       /** 読込専用ページ    */
48 #define IA32_PAGING_RW_RW       ( 1 )       /** 読込/書込可ページ */
49
50 /* ユーザ/スーパバイザフラグ */
51 #define IA32_PAGING_US_SV       ( 0 )       /** スーパバイザ特権レベル */
52 #define IA32_PAGING_US_USER     ( 1 )       /** ユーザ特権レベル       */
53
54 /* ページレベルライトスルーフラグ */
55 #define IA32_PAGING_PWT_WB      ( 0 )       /** ライトバックキャッシング */
56 #define IA32_PAGING_PWT_WT      ( 1 )       /** ライトスルーキャッシング */
57
58 /* ページレベルキャッシュディスエーブルフラグ */
59 #define IA32_PAGING_PCD_ENABLE  ( 0 )       /** キャッシング有効 */
60 #define IA32_PAGING_PCD_DISABLE ( 1 )       /** キャッシング無効 */
61
62 /* アクセス済みフラグ */
63 #define IA32_PAGING_A_NO        ( 0 )       /** 未アクセス   */
64 #define IA32_PAGING_A_YES       ( 1 )       /** アクセス済み */
65
66 /* ダーティフラグ */
67 #define IA32_PAGING_D_NO        ( 0 )       /** 未書込み   */
68 #define IA32_PAGING_D_YES       ( 1 )       /** 書込み済み */
69
70 /* ページサイズフラグ */
71 #define IA32_PAGING_PS_4K       ( 0 )       /** 4KiBページサイズ           */
72 #define IA32_PAGING_PS_4M2M     ( 1 )       /** 4MiBまたは2MiBページサイズ */
73
74 /* グローバルフラグ */
75 #define IA32_PAGING_G_NO        ( 0 )       /** 非グローバルページ */
76 #define IA32_PAGING_G_YES       ( 1 )       /** グローバルページ   */
77
78 /* エントリ数 */
79 #define IA32_PAGING_PDE_NUM     ( 1024 )    /** ページディレクトリエントリ数 */
80 #define IA32_PAGING_PTE_NUM     ( 1024 )    /** ページテーブルエントリ数     */
81
82 /** ページサイズ */
83 #define IA32_PAGING_PAGE_SIZE   ( 4096 )
84
85 /** PDBR */
86 typedef struct {
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;  /**< ページディレクトリベースアドレス           */
92 } IA32PagingPDBR_t;
93
94 /** ページディレクトリエントリ */
95 typedef struct {
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;   /**< ページテーブルベースアドレス               */
107 } IA32PagingPDE_t;
108
109 /** ページディレクトリ */
110 typedef struct {
111     IA32PagingPDE_t entry[ IA32_PAGING_PDE_NUM ];   /**< エントリ */
112 } __attribute__( ( aligned( 4096 ) ) ) IA32PagingDir_t;
113
114 /** ページテーブルエントリ */
115 typedef struct {
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;   /**< ページベースアドレス                       */
127 } IA32PagingPTE_t;
128
129 /** ページテーブル */
130 typedef struct {
131     IA32PagingPTE_t entry[ IA32_PAGING_PTE_NUM ];   /**< エントリ */
132 } __attribute__( ( aligned( 4096 ) ) ) IA32PagingTbl_t;
133
134
135 /******************************************************************************/
136 #endif