• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2 x64 Long Mode Virtual Memory Management Definitions
3 
4   References:
5     1) IA-32 Intel(R) Atchitecture Software Developer's Manual Volume 1:Basic Architecture, Intel
6     2) IA-32 Intel(R) Atchitecture Software Developer's Manual Volume 2:Instruction Set Reference, Intel
7     3) IA-32 Intel(R) Atchitecture Software Developer's Manual Volume 3:System Programmer's Guide, Intel
8     4) AMD64 Architecture Programmer's Manual Volume 2: System Programming
9 
10 Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
11 This program and the accompanying materials
12 are licensed and made available under the terms and conditions of the BSD License
13 which accompanies this distribution.  The full text of the license may be found at
14 http://opensource.org/licenses/bsd-license.php
15 
16 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
17 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 
19 **/
20 
21 #ifndef _VIRTUAL_MEMORY_H_
22 #define _VIRTUAL_MEMORY_H_
23 
24 #include "CommonLib.h"
25 
26 #pragma pack(1)
27 
28 //
29 // Page-Map Level-4 Offset (PML4) and
30 // Page-Directory-Pointer Offset (PDPE) entries 4K & 2MB
31 //
32 
33 typedef union {
34   struct {
35     UINT64  Present:1;                // 0 = Not present in memory, 1 = Present in memory
36     UINT64  ReadWrite:1;              // 0 = Read-Only, 1= Read/Write
37     UINT64  UserSupervisor:1;         // 0 = Supervisor, 1=User
38     UINT64  WriteThrough:1;           // 0 = Write-Back caching, 1=Write-Through caching
39     UINT64  CacheDisabled:1;          // 0 = Cached, 1=Non-Cached
40     UINT64  Accessed:1;               // 0 = Not accessed, 1 = Accessed (set by CPU)
41     UINT64  Reserved:1;               // Reserved
42     UINT64  MustBeZero:2;             // Must Be Zero
43     UINT64  Available:3;              // Available for use by system software
44     UINT64  PageTableBaseAddress:40;  // Page Table Base Address
45     UINT64  AvabilableHigh:11;        // Available for use by system software
46     UINT64  Nx:1;                     // No Execute bit
47   } Bits;
48   UINT64    Uint64;
49 } X64_PAGE_MAP_AND_DIRECTORY_POINTER_2MB_4K;
50 
51 //
52 // Page-Directory Offset 4K
53 //
54 typedef union {
55   struct {
56     UINT64  Present:1;                // 0 = Not present in memory, 1 = Present in memory
57     UINT64  ReadWrite:1;              // 0 = Read-Only, 1= Read/Write
58     UINT64  UserSupervisor:1;         // 0 = Supervisor, 1=User
59     UINT64  WriteThrough:1;           // 0 = Write-Back caching, 1=Write-Through caching
60     UINT64  CacheDisabled:1;          // 0 = Cached, 1=Non-Cached
61     UINT64  Accessed:1;               // 0 = Not accessed, 1 = Accessed (set by CPU)
62     UINT64  Reserved:1;               // Reserved
63     UINT64  MustBeZero:1;             // Must Be Zero
64     UINT64  Reserved2:1;              // Reserved
65     UINT64  Available:3;              // Available for use by system software
66     UINT64  PageTableBaseAddress:40;  // Page Table Base Address
67     UINT64  AvabilableHigh:11;        // Available for use by system software
68     UINT64  Nx:1;                     // No Execute bit
69   } Bits;
70   UINT64    Uint64;
71 } X64_PAGE_DIRECTORY_ENTRY_4K;
72 
73 //
74 // Page Table Entry 4K
75 //
76 typedef union {
77   struct {
78     UINT64  Present:1;                // 0 = Not present in memory, 1 = Present in memory
79     UINT64  ReadWrite:1;              // 0 = Read-Only, 1= Read/Write
80     UINT64  UserSupervisor:1;         // 0 = Supervisor, 1=User
81     UINT64  WriteThrough:1;           // 0 = Write-Back caching, 1=Write-Through caching
82     UINT64  CacheDisabled:1;          // 0 = Cached, 1=Non-Cached
83     UINT64  Accessed:1;               // 0 = Not accessed, 1 = Accessed (set by CPU)
84     UINT64  Dirty:1;                  // 0 = Not Dirty, 1 = written by processor on access to page
85     UINT64  PAT:1;                    // 0 = Ignore Page Attribute Table
86     UINT64  Global:1;                 // 0 = Not global page, 1 = global page TLB not cleared on CR3 write
87     UINT64  Available:3;              // Available for use by system software
88     UINT64  PageTableBaseAddress:40;  // Page Table Base Address
89     UINT64  AvabilableHigh:11;        // Available for use by system software
90     UINT64  Nx:1;                     // 0 = Execute Code, 1 = No Code Execution
91   } Bits;
92   UINT64    Uint64;
93 } X64_PAGE_TABLE_ENTRY_4K;
94 
95 
96 //
97 // Page Table Entry 2MB
98 //
99 typedef union {
100   struct {
101     UINT64  Present:1;                // 0 = Not present in memory, 1 = Present in memory
102     UINT64  ReadWrite:1;              // 0 = Read-Only, 1= Read/Write
103     UINT64  UserSupervisor:1;         // 0 = Supervisor, 1=User
104     UINT64  WriteThrough:1;           // 0 = Write-Back caching, 1=Write-Through caching
105     UINT64  CacheDisabled:1;          // 0 = Cached, 1=Non-Cached
106     UINT64  Accessed:1;               // 0 = Not accessed, 1 = Accessed (set by CPU)
107     UINT64  Dirty:1;                  // 0 = Not Dirty, 1 = written by processor on access to page
108     UINT64  MustBe1:1;                // Must be 1
109     UINT64  Global:1;                 // 0 = Not global page, 1 = global page TLB not cleared on CR3 write
110     UINT64  Available:3;              // Available for use by system software
111     UINT64  PAT:1;                    //
112     UINT64  MustBeZero:8;             // Must be zero;
113     UINT64  PageTableBaseAddress:31;  // Page Table Base Address
114     UINT64  AvabilableHigh:11;        // Available for use by system software
115     UINT64  Nx:1;                     // 0 = Execute Code, 1 = No Code Execution
116   } Bits;
117   UINT64    Uint64;
118 } X64_PAGE_TABLE_ENTRY_2M;
119 
120 #pragma pack()
121 
122 #endif
123