Home | History | Annotate | Download | only in X64
      1 /** @file
      2   x64 Long Mode Virtual Memory Management Definitions
      3 
      4   References:
      5     1) IA-32 Intel(R) Architecture Software Developer's Manual Volume 1:Basic Architecture, Intel
      6     2) IA-32 Intel(R) Architecture Software Developer's Manual Volume 2:Instruction Set Reference, Intel
      7     3) IA-32 Intel(R) Architecture 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 - 2015, 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 #ifndef _VIRTUAL_MEMORY_H_
     21 #define _VIRTUAL_MEMORY_H_
     22 
     23 
     24 #define SYS_CODE64_SEL 0x38
     25 
     26 #pragma pack(1)
     27 
     28 typedef union {
     29   struct {
     30     UINT32  LimitLow    : 16;
     31     UINT32  BaseLow     : 16;
     32     UINT32  BaseMid     : 8;
     33     UINT32  Type        : 4;
     34     UINT32  System      : 1;
     35     UINT32  Dpl         : 2;
     36     UINT32  Present     : 1;
     37     UINT32  LimitHigh   : 4;
     38     UINT32  Software    : 1;
     39     UINT32  Reserved    : 1;
     40     UINT32  DefaultSize : 1;
     41     UINT32  Granularity : 1;
     42     UINT32  BaseHigh    : 8;
     43   } Bits;
     44   UINT64  Uint64;
     45 } IA32_GDT;
     46 
     47 typedef struct {
     48   IA32_IDT_GATE_DESCRIPTOR  Ia32IdtEntry;
     49   UINT32                    Offset32To63;
     50   UINT32                    Reserved;
     51 } X64_IDT_GATE_DESCRIPTOR;
     52 
     53 //
     54 // Page-Map Level-4 Offset (PML4) and
     55 // Page-Directory-Pointer Offset (PDPE) entries 4K & 2MB
     56 //
     57 
     58 typedef union {
     59   struct {
     60     UINT64  Present:1;                // 0 = Not present in memory, 1 = Present in memory
     61     UINT64  ReadWrite:1;              // 0 = Read-Only, 1= Read/Write
     62     UINT64  UserSupervisor:1;         // 0 = Supervisor, 1=User
     63     UINT64  WriteThrough:1;           // 0 = Write-Back caching, 1=Write-Through caching
     64     UINT64  CacheDisabled:1;          // 0 = Cached, 1=Non-Cached
     65     UINT64  Accessed:1;               // 0 = Not accessed, 1 = Accessed (set by CPU)
     66     UINT64  Reserved:1;               // Reserved
     67     UINT64  MustBeZero:2;             // Must Be Zero
     68     UINT64  Available:3;              // Available for use by system software
     69     UINT64  PageTableBaseAddress:40;  // Page Table Base Address
     70     UINT64  AvabilableHigh:11;        // Available for use by system software
     71     UINT64  Nx:1;                     // No Execute bit
     72   } Bits;
     73   UINT64    Uint64;
     74 } PAGE_MAP_AND_DIRECTORY_POINTER;
     75 
     76 //
     77 // Page Table Entry 4KB
     78 //
     79 typedef union {
     80   struct {
     81     UINT64  Present:1;                // 0 = Not present in memory, 1 = Present in memory
     82     UINT64  ReadWrite:1;              // 0 = Read-Only, 1= Read/Write
     83     UINT64  UserSupervisor:1;         // 0 = Supervisor, 1=User
     84     UINT64  WriteThrough:1;           // 0 = Write-Back caching, 1=Write-Through caching
     85     UINT64  CacheDisabled:1;          // 0 = Cached, 1=Non-Cached
     86     UINT64  Accessed:1;               // 0 = Not accessed, 1 = Accessed (set by CPU)
     87     UINT64  Dirty:1;                  // 0 = Not Dirty, 1 = written by processor on access to page
     88     UINT64  PAT:1;                    //
     89     UINT64  Global:1;                 // 0 = Not global page, 1 = global page TLB not cleared on CR3 write
     90     UINT64  Available:3;              // Available for use by system software
     91     UINT64  PageTableBaseAddress:40;  // Page Table Base Address
     92     UINT64  AvabilableHigh:11;        // Available for use by system software
     93     UINT64  Nx:1;                     // 0 = Execute Code, 1 = No Code Execution
     94   } Bits;
     95   UINT64    Uint64;
     96 } PAGE_TABLE_4K_ENTRY;
     97 
     98 //
     99 // Page Table Entry 2MB
    100 //
    101 typedef union {
    102   struct {
    103     UINT64  Present:1;                // 0 = Not present in memory, 1 = Present in memory
    104     UINT64  ReadWrite:1;              // 0 = Read-Only, 1= Read/Write
    105     UINT64  UserSupervisor:1;         // 0 = Supervisor, 1=User
    106     UINT64  WriteThrough:1;           // 0 = Write-Back caching, 1=Write-Through caching
    107     UINT64  CacheDisabled:1;          // 0 = Cached, 1=Non-Cached
    108     UINT64  Accessed:1;               // 0 = Not accessed, 1 = Accessed (set by CPU)
    109     UINT64  Dirty:1;                  // 0 = Not Dirty, 1 = written by processor on access to page
    110     UINT64  MustBe1:1;                // Must be 1
    111     UINT64  Global:1;                 // 0 = Not global page, 1 = global page TLB not cleared on CR3 write
    112     UINT64  Available:3;              // Available for use by system software
    113     UINT64  PAT:1;                    //
    114     UINT64  MustBeZero:8;             // Must be zero;
    115     UINT64  PageTableBaseAddress:31;  // Page Table Base Address
    116     UINT64  AvabilableHigh:11;        // Available for use by system software
    117     UINT64  Nx:1;                     // 0 = Execute Code, 1 = No Code Execution
    118   } Bits;
    119   UINT64    Uint64;
    120 } PAGE_TABLE_ENTRY;
    121 
    122 //
    123 // Page Table Entry 1GB
    124 //
    125 typedef union {
    126   struct {
    127     UINT64  Present:1;                // 0 = Not present in memory, 1 = Present in memory
    128     UINT64  ReadWrite:1;              // 0 = Read-Only, 1= Read/Write
    129     UINT64  UserSupervisor:1;         // 0 = Supervisor, 1=User
    130     UINT64  WriteThrough:1;           // 0 = Write-Back caching, 1=Write-Through caching
    131     UINT64  CacheDisabled:1;          // 0 = Cached, 1=Non-Cached
    132     UINT64  Accessed:1;               // 0 = Not accessed, 1 = Accessed (set by CPU)
    133     UINT64  Dirty:1;                  // 0 = Not Dirty, 1 = written by processor on access to page
    134     UINT64  MustBe1:1;                // Must be 1
    135     UINT64  Global:1;                 // 0 = Not global page, 1 = global page TLB not cleared on CR3 write
    136     UINT64  Available:3;              // Available for use by system software
    137     UINT64  PAT:1;                    //
    138     UINT64  MustBeZero:17;            // Must be zero;
    139     UINT64  PageTableBaseAddress:22;  // Page Table Base Address
    140     UINT64  AvabilableHigh:11;        // Available for use by system software
    141     UINT64  Nx:1;                     // 0 = Execute Code, 1 = No Code Execution
    142   } Bits;
    143   UINT64    Uint64;
    144 } PAGE_TABLE_1G_ENTRY;
    145 
    146 #pragma pack()
    147 
    148 #define IA32_PG_P                   BIT0
    149 #define IA32_PG_RW                  BIT1
    150 
    151 /**
    152   Enable Execute Disable Bit.
    153 
    154 **/
    155 VOID
    156 EnableExecuteDisableBit (
    157   VOID
    158   );
    159 
    160 /**
    161   Split 2M page to 4K.
    162 
    163   @param[in]      PhysicalAddress       Start physical address the 2M page covered.
    164   @param[in, out] PageEntry2M           Pointer to 2M page entry.
    165   @param[in]      StackBase             Stack base address.
    166   @param[in]      StackSize             Stack size.
    167 
    168 **/
    169 VOID
    170 Split2MPageTo4K (
    171   IN EFI_PHYSICAL_ADDRESS               PhysicalAddress,
    172   IN OUT UINT64                         *PageEntry2M,
    173   IN EFI_PHYSICAL_ADDRESS               StackBase,
    174   IN UINTN                              StackSize
    175   );
    176 
    177 /**
    178   Allocates and fills in the Page Directory and Page Table Entries to
    179   establish a 1:1 Virtual to Physical mapping.
    180 
    181   @param[in] StackBase  Stack base address.
    182   @param[in] StackSize  Stack size.
    183 
    184   @return The address of 4 level page map.
    185 
    186 **/
    187 UINTN
    188 CreateIdentityMappingPageTables (
    189   IN EFI_PHYSICAL_ADDRESS   StackBase,
    190   IN UINTN                  StackSize
    191   );
    192 
    193 
    194 /**
    195 
    196   Fix up the vector number in the vector code.
    197 
    198   @param VectorBase   Base address of the vector handler.
    199   @param VectorNum    Index of vector.
    200 
    201 **/
    202 VOID
    203 EFIAPI
    204 AsmVectorFixup (
    205   VOID    *VectorBase,
    206   UINT8   VectorNum
    207   );
    208 
    209 
    210 /**
    211 
    212   Get the information of vector template.
    213 
    214   @param TemplateBase   Base address of the template code.
    215 
    216   @return               Size of the Template code.
    217 
    218 **/
    219 UINTN
    220 EFIAPI
    221 AsmGetVectorTemplatInfo (
    222   OUT   VOID  **TemplateBase
    223   );
    224 
    225 
    226 #endif
    227