Refactor MMU for multi-paging support and add 5-Level paging #16

Open
harraiken wants to merge 35 commits from harraiken_mm into master
3 changed files with 12 additions and 5 deletions
Showing only changes of commit c409400cbf - Show all commits

View File

@ -101,6 +101,7 @@ typedef struct _MMPAGEMAP_INFO
ULONGLONG PpeBase; ULONGLONG PpeBase;
ULONGLONG PxeBase; ULONGLONG PxeBase;
ULONGLONG P5eBase; ULONGLONG P5eBase;
ULONG VaBits;
} MMPAGEMAP_INFO, *PMMPAGEMAP_INFO; } MMPAGEMAP_INFO, *PMMPAGEMAP_INFO;
/* A Page Table Entry on AMD64 system */ /* A Page Table Entry on AMD64 system */

View File

@ -36,6 +36,9 @@ MmInitializePageMapSupport(VOID)
MmpPageMapInfo.PpeBase = MM_PPE_LA57_BASE; MmpPageMapInfo.PpeBase = MM_PPE_LA57_BASE;
MmpPageMapInfo.PxeBase = MM_PXE_LA57_BASE; MmpPageMapInfo.PxeBase = MM_PXE_LA57_BASE;
MmpPageMapInfo.P5eBase = MM_P5E_LA57_BASE; MmpPageMapInfo.P5eBase = MM_P5E_LA57_BASE;
/* PML5 use 57-bit virtual addresses */
MmpPageMapInfo.VaBits = 57;
} }
else else
{ {
@ -51,6 +54,9 @@ MmInitializePageMapSupport(VOID)
MmpPageMapInfo.PpeBase = MM_PPE_BASE; MmpPageMapInfo.PpeBase = MM_PPE_BASE;
MmpPageMapInfo.PxeBase = MM_PXE_BASE; MmpPageMapInfo.PxeBase = MM_PXE_BASE;
MmpPageMapInfo.P5eBase = 0x0; MmpPageMapInfo.P5eBase = 0x0;
/* PML use 48-bit virtual addresses */
MmpPageMapInfo.VaBits = 48;
} }
} }

View File

@ -61,7 +61,7 @@ MmpGetP5eAddress(PVOID Address)
{ {
ULONGLONG Offset; ULONGLONG Offset;
Offset = (((ULONGLONG)Address >> MM_P5I_SHIFT) << MM_PTE_SHIFT); Offset = ((((ULONGLONG)Address & (((ULONGLONG)1 << MmpPageMapInfo.VaBits) - 1)) >> MM_P5I_SHIFT) << MM_PTE_SHIFT);
return (PMMP5E)((MmpPageMapInfo.P5eBase + Offset) * MmpPageMapInfo.Xpa); return (PMMP5E)((MmpPageMapInfo.P5eBase + Offset) * MmpPageMapInfo.Xpa);
} }
@ -81,7 +81,7 @@ MmpGetPdeAddress(PVOID Address)
{ {
ULONGLONG Offset; ULONGLONG Offset;
Offset = (((ULONGLONG)Address >> MM_PDI_SHIFT) << MM_PTE_SHIFT); Offset = ((((ULONGLONG)Address & (((ULONGLONG)1 << MmpPageMapInfo.VaBits) - 1)) >> MM_PDI_SHIFT) << MM_PTE_SHIFT);
return (PMMPDE)(MmpPageMapInfo.PdeBase + Offset); return (PMMPDE)(MmpPageMapInfo.PdeBase + Offset);
} }
@ -101,7 +101,7 @@ MmpGetPpeAddress(PVOID Address)
{ {
ULONGLONG Offset; ULONGLONG Offset;
Offset = (((ULONGLONG)Address >> MM_PPI_SHIFT) << MM_PTE_SHIFT); Offset = ((((ULONGLONG)Address & (((ULONGLONG)1 << MmpPageMapInfo.VaBits) - 1)) >> MM_PPI_SHIFT) << MM_PTE_SHIFT);
return (PMMPPE)(MmpPageMapInfo.PpeBase + Offset); return (PMMPPE)(MmpPageMapInfo.PpeBase + Offset);
} }
@ -121,7 +121,7 @@ MmpGetPteAddress(PVOID Address)
{ {
ULONGLONG Offset; ULONGLONG Offset;
Offset = (((ULONGLONG)Address >> MM_PTI_SHIFT) << MM_PTE_SHIFT); Offset = ((((ULONGLONG)Address & (((ULONGLONG)1 << MmpPageMapInfo.VaBits) - 1)) >> MM_PTI_SHIFT) << MM_PTE_SHIFT);
return (PMMPTE)(MmpPageMapInfo.PteBase + Offset); return (PMMPTE)(MmpPageMapInfo.PteBase + Offset);
} }
@ -141,7 +141,7 @@ MmpGetPxeAddress(PVOID Address)
{ {
ULONGLONG Offset; ULONGLONG Offset;
Offset = (((ULONGLONG)Address >> MM_PXI_SHIFT) << MM_PTE_SHIFT); Offset = ((((ULONGLONG)Address & (((ULONGLONG)1 << MmpPageMapInfo.VaBits) - 1)) >> MM_PXI_SHIFT) << MM_PTE_SHIFT);
return (PMMPXE)(MmpPageMapInfo.PxeBase + Offset); return (PMMPXE)(MmpPageMapInfo.PxeBase + Offset);
} }