+++ /dev/null
-/*++ \r
-\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
- VirtualMemory.h\r
- \r
-Abstract:\r
-\r
- x64 Long Mode Virtual Memory Management Definitions \r
-\r
- References:\r
- 1) IA-32 Intel(R) Atchitecture Software Developer's Manual Volume 1:Basic Architecture, Intel\r
- 2) IA-32 Intel(R) Atchitecture Software Developer's Manual Volume 2:Instruction Set Reference, Intel\r
- 3) IA-32 Intel(R) Atchitecture Software Developer's Manual Volume 3:System Programmer's Guide, Intel\r
- 4) AMD64 Architecture Programmer's Manual Volume 2: System Programming\r
---*/ \r
-#ifndef _VIRTUAL_MEMORY_H_\r
-#define _VIRTUAL_MEMORY_H_\r
-\r
-\r
-#pragma pack(1)\r
-\r
-//\r
-// Page-Map Level-4 Offset (PML4) and\r
-// Page-Directory-Pointer Offset (PDPE) entries 4K & 2MB\r
-//\r
-\r
-typedef union {\r
- struct {\r
- UINT64 Present:1; // 0 = Not present in memory, 1 = Present in memory\r
- UINT64 ReadWrite:1; // 0 = Read-Only, 1= Read/Write\r
- UINT64 UserSupervisor:1; // 0 = Supervisor, 1=User\r
- UINT64 WriteThrough:1; // 0 = Write-Back caching, 1=Write-Through caching\r
- UINT64 CacheDisabled:1; // 0 = Cached, 1=Non-Cached\r
- UINT64 Accessed:1; // 0 = Not accessed, 1 = Accessed (set by CPU)\r
- UINT64 Reserved:1; // Reserved\r
- UINT64 MustBeZero:2; // Must Be Zero\r
- UINT64 Available:3; // Available for use by system software\r
- UINT64 PageTableBaseAddress:40; // Page Table Base Address\r
- UINT64 AvabilableHigh:11; // Available for use by system software\r
- UINT64 Nx:1; // No Execute bit\r
- } Bits;\r
- UINT64 Uint64;\r
-} x64_PAGE_MAP_AND_DIRECTORY_POINTER_2MB_4K;\r
-\r
-//\r
-// Page-Directory Offset 4K\r
-//\r
-typedef union {\r
- struct {\r
- UINT64 Present:1; // 0 = Not present in memory, 1 = Present in memory\r
- UINT64 ReadWrite:1; // 0 = Read-Only, 1= Read/Write\r
- UINT64 UserSupervisor:1; // 0 = Supervisor, 1=User\r
- UINT64 WriteThrough:1; // 0 = Write-Back caching, 1=Write-Through caching\r
- UINT64 CacheDisabled:1; // 0 = Cached, 1=Non-Cached\r
- UINT64 Accessed:1; // 0 = Not accessed, 1 = Accessed (set by CPU)\r
- UINT64 Reserved:1; // Reserved\r
- UINT64 MustBeZero:1; // Must Be Zero\r
- UINT64 Reserved2:1; // Reserved\r
- UINT64 Available:3; // Available for use by system software\r
- UINT64 PageTableBaseAddress:40; // Page Table Base Address\r
- UINT64 AvabilableHigh:11; // Available for use by system software\r
- UINT64 Nx:1; // No Execute bit\r
- } Bits;\r
- UINT64 Uint64;\r
-} x64_PAGE_DIRECTORY_ENTRY_4K;\r
-\r
-//\r
-// Page Table Entry 4K\r
-//\r
-typedef union {\r
- struct {\r
- UINT64 Present:1; // 0 = Not present in memory, 1 = Present in memory\r
- UINT64 ReadWrite:1; // 0 = Read-Only, 1= Read/Write\r
- UINT64 UserSupervisor:1; // 0 = Supervisor, 1=User\r
- UINT64 WriteThrough:1; // 0 = Write-Back caching, 1=Write-Through caching\r
- UINT64 CacheDisabled:1; // 0 = Cached, 1=Non-Cached\r
- UINT64 Accessed:1; // 0 = Not accessed, 1 = Accessed (set by CPU)\r
- UINT64 Dirty:1; // 0 = Not Dirty, 1 = written by processor on access to page\r
- UINT64 PAT:1; // 0 = Ignore Page Attribute Table \r
- UINT64 Global:1; // 0 = Not global page, 1 = global page TLB not cleared on CR3 write\r
- UINT64 Available:3; // Available for use by system software\r
- UINT64 PageTableBaseAddress:40; // Page Table Base Address\r
- UINT64 AvabilableHigh:11; // Available for use by system software\r
- UINT64 Nx:1; // 0 = Execute Code, 1 = No Code Execution\r
- } Bits;\r
- UINT64 Uint64;\r
-} x64_PAGE_TABLE_ENTRY_4K;\r
-\r
-\r
-//\r
-// Page Table Entry 2MB\r
-//\r
-typedef union {\r
- struct {\r
- UINT64 Present:1; // 0 = Not present in memory, 1 = Present in memory\r
- UINT64 ReadWrite:1; // 0 = Read-Only, 1= Read/Write\r
- UINT64 UserSupervisor:1; // 0 = Supervisor, 1=User\r
- UINT64 WriteThrough:1; // 0 = Write-Back caching, 1=Write-Through caching\r
- UINT64 CacheDisabled:1; // 0 = Cached, 1=Non-Cached\r
- UINT64 Accessed:1; // 0 = Not accessed, 1 = Accessed (set by CPU)\r
- UINT64 Dirty:1; // 0 = Not Dirty, 1 = written by processor on access to page\r
- UINT64 MustBe1:1; // Must be 1 \r
- UINT64 Global:1; // 0 = Not global page, 1 = global page TLB not cleared on CR3 write\r
- UINT64 Available:3; // Available for use by system software\r
- UINT64 PAT:1; //\r
- UINT64 MustBeZero:8; // Must be zero;\r
- UINT64 PageTableBaseAddress:31; // Page Table Base Address\r
- UINT64 AvabilableHigh:11; // Available for use by system software\r
- UINT64 Nx:1; // 0 = Execute Code, 1 = No Code Execution\r
- } Bits;\r
- UINT64 Uint64;\r
-} x64_PAGE_TABLE_ENTRY_2M;\r
-\r
-typedef union {\r
- UINT64 Present:1; // 0 = Not present in memory, 1 = Present in memory\r
- UINT64 ReadWrite:1; // 0 = Read-Only, 1= Read/Write\r
- UINT64 UserSupervisor:1; // 0 = Supervisor, 1=User\r
- UINT64 WriteThrough:1; // 0 = Write-Back caching, 1=Write-Through caching\r
- UINT64 CacheDisabled:1; // 0 = Cached, 1=Non-Cached\r
- UINT64 Accessed:1; // 0 = Not accessed, 1 = Accessed (set by CPU)\r
- UINT64 Dirty:1; // 0 = Not Dirty, 1 = written by processor on access to page\r
- UINT64 Reserved:57;\r
-} x64_PAGE_TABLE_ENTRY_COMMON;\r
-\r
-typedef union {\r
- x64_PAGE_TABLE_ENTRY_4K Page4k;\r
- x64_PAGE_TABLE_ENTRY_2M Page2Mb;\r
- x64_PAGE_TABLE_ENTRY_COMMON Common;\r
-} x64_PAGE_TABLE_ENTRY;\r
-\r
-//\r
-// MTRR Definitions\r
-//\r
-typedef enum {\r
- Uncached = 0,\r
- WriteCombining = 1,\r
- WriteThrough = 4,\r
- WriteProtected = 5,\r
- WriteBack = 6\r
-} x64_MTRR_MEMORY_TYPE;\r
-\r
-typedef union {\r
- struct {\r
- UINT32 VCNT:8; // The number of Variable Range MTRRs\r
- UINT32 FIX:1; // 1=Fixed Range MTRRs supported. 0=Fixed Range MTRRs not supported\r
- UINT32 Reserved_0; // Reserved\r
- UINT32 WC:1; // Write combining memory type supported\r
- UINT32 Reserved_1:21; // Reserved\r
- UINT32 Reserved_2:32; // Reserved\r
- } Bits;\r
- UINT64 Uint64;\r
-} x64_MTRRCAP_MSR;\r
-\r
-typedef union {\r
- struct {\r
- UINT32 Type:8; // Default Memory Type\r
- UINT32 Reserved_0:2; // Reserved\r
- UINT32 FE:1; // 1=Fixed Range MTRRs enabled. 0=Fixed Range MTRRs disabled\r
- UINT32 E:1; // 1=MTRRs enabled, 0=MTRRs disabled\r
- UINT32 Reserved_1:20; // Reserved\r
- UINT32 Reserved_2:32; // Reserved\r
- } Bits;\r
- UINT64 Uint64;\r
-} x64_MTRR_DEF_TYPE_MSR;\r
-\r
-typedef union {\r
- UINT8 Type[8]; // The 8 Memory Type values in the 64-bit MTRR\r
- UINT64 Uint64; // The full 64-bit MSR\r
-} x64_MTRR_FIXED_RANGE_MSR;\r
-\r
-typedef struct {\r
- x64_MTRRCAP_MSR Capabilities; // MTRR Capabilities MSR value\r
- x64_MTRR_DEF_TYPE_MSR DefaultType; // Default Memory Type MSR Value\r
- x64_MTRR_FIXED_RANGE_MSR Fixed[11]; // The 11 Fixed MTRR MSR Values\r
-} x64_MTRR_FIXED_RANGE;\r
-\r
-\r
-typedef union {\r
- struct {\r
- UINT64 Type:8; // Memory Type\r
- UINT64 Reserved0:4; // Reserved\r
- UINT64 PhysBase:40; // The physical base address(bits 35..12) of the MTRR\r
- UINT64 Reserved1:12 ; // Reserved\r
- } Bits;\r
- UINT64 Uint64;\r
-} x64_MTRR_PHYSBASE_MSR;\r
-\r
-typedef union {\r
- struct {\r
- UINT64 Reserved0:11; // Reserved\r
- UINT64 Valid:1; // 1=MTRR is valid, 0=MTRR is not valid\r
- UINT64 PhysMask:40; // The physical address mask (bits 35..12) of the MTRR\r
- UINT64 Reserved1:12; // Reserved\r
- } Bits;\r
- UINT64 Uint64;\r
-} x64_MTRR_PHYSMASK_MSR;\r
-\r
-typedef struct {\r
- x64_MTRR_PHYSBASE_MSR PhysBase; // Variable MTRR Physical Base MSR\r
- x64_MTRR_PHYSMASK_MSR PhysMask; // Variable MTRR Physical Mask MSR\r
-} x64_MTRR_VARIABLE_RANGE;\r
-\r
-#pragma pack()\r
-\r
-x64_MTRR_MEMORY_TYPE\r
-EfiGetMTRRMemoryType (\r
- IN EFI_PHYSICAL_ADDRESS Address\r
- )\r
-;\r
-\r
-BOOLEAN\r
-CanNotUse2MBPage (\r
- IN EFI_PHYSICAL_ADDRESS BaseAddress\r
- )\r
-;\r
-\r
-VOID\r
-Convert2MBPageTo4KPages ( \r
- IN x64_PAGE_TABLE_ENTRY_2M *PageDirectoryEntry2MB, \r
- IN EFI_PHYSICAL_ADDRESS PageAddress\r
- )\r
-;\r
-\r
-EFI_PHYSICAL_ADDRESS\r
-CreateIdentityMappingPageTables (\r
- IN UINT32 NumberOfProcessorPhysicalAddressBits\r
- )\r
-;\r
-\r
-#endif \r