Home | History | Annotate | Download | only in GenPage
      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