Refactor MMU for multi-paging support and add 5-Level paging #16
@ -22,6 +22,10 @@ VOID
|
|||||||
MmZeroPages(IN PVOID Address,
|
MmZeroPages(IN PVOID Address,
|
||||||
IN ULONG Size);
|
IN ULONG Size);
|
||||||
|
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
MmpClearPte(PHARDWARE_PTE PtePointer);
|
||||||
|
|
||||||
XTAPI
|
XTAPI
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
MmpGetExtendedPhysicalAddressingStatus(VOID);
|
MmpGetExtendedPhysicalAddressingStatus(VOID);
|
||||||
@ -50,4 +54,20 @@ XTAPI
|
|||||||
VOID
|
VOID
|
||||||
MmpInitializeArchitecture(VOID);
|
MmpInitializeArchitecture(VOID);
|
||||||
|
|
||||||
|
XTAPI
|
||||||
|
BOOLEAN
|
||||||
|
MmpPteValid(PHARDWARE_PTE PtePointer);
|
||||||
|
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
MmpSetPte(PHARDWARE_PTE PtePointer,
|
||||||
|
PFN_NUMBER PageFrameNumber,
|
||||||
|
BOOLEAN Writable);
|
||||||
|
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
MmpSetPteCaching(PHARDWARE_PTE PtePointer,
|
||||||
|
BOOLEAN CacheDisable,
|
||||||
|
BOOLEAN WriteThrough);
|
||||||
|
|
||||||
#endif /* __XTOSKRNL_AMD64_MMI_H */
|
#endif /* __XTOSKRNL_AMD64_MMI_H */
|
||||||
|
@ -11,16 +11,16 @@
|
|||||||
|
|
||||||
/* Page mapping routines for systems using 4-level paging (PML4) */
|
/* Page mapping routines for systems using 4-level paging (PML4) */
|
||||||
CMMPAGEMAP_ROUTINES MmpPml4Routines = {
|
CMMPAGEMAP_ROUTINES MmpPml4Routines = {
|
||||||
// .ClearPte = MmpClearPte,
|
.ClearPte = MmpClearPte,
|
||||||
// .PteValid = MmpPml2PteValid,
|
.PteValid = MmpPteValid,
|
||||||
// .SetPteCaching = MmpSetPml2PteCaching,
|
.SetPteCaching = MmpSetPteCaching,
|
||||||
// .SetPte = MmpSetPml2Pte,
|
.SetPte = MmpSetPte,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Page mapping routines for systems using 5-level paging (PML5) */
|
/* Page mapping routines for systems using 5-level paging (PML5) */
|
||||||
CMMPAGEMAP_ROUTINES MmpPml5Routines = {
|
CMMPAGEMAP_ROUTINES MmpPml5Routines = {
|
||||||
// .ClearPte = MmpClearPte,
|
.ClearPte = MmpClearPte,
|
||||||
// .PteValid = MmpPml3PteValid,
|
.PteValid = MmpPteValid,
|
||||||
// .SetPteCaching = MmpSetPml3PteCaching,
|
.SetPteCaching = MmpSetPteCaching,
|
||||||
// .SetPte = MmpSetPml3Pte,
|
.SetPte = MmpSetPte,
|
||||||
};
|
};
|
||||||
|
@ -9,6 +9,27 @@
|
|||||||
#include <xtos.h>
|
#include <xtos.h>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears the contents of a page table entry (PTE).
|
||||||
|
*
|
||||||
|
* @param PtePointer
|
||||||
|
* Pointer to the page table entry (PTE) to be cleared.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
MmpClearPte(PHARDWARE_PTE PtePointer)
|
||||||
|
{
|
||||||
|
PtePointer->CacheDisable = 0;
|
||||||
|
PtePointer->PageFrameNumber = 0;
|
||||||
|
PtePointer->Valid = 0;
|
||||||
|
PtePointer->Writable = 0;
|
||||||
|
PtePointer->WriteThrough = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if eXtended Physical Addressing (XPA) is enabled.
|
* Checks if eXtended Physical Addressing (XPA) is enabled.
|
||||||
*
|
*
|
||||||
@ -123,3 +144,47 @@ MmpGetPxeAddress(PVOID Address)
|
|||||||
Offset = (((ULONGLONG)Address >> MM_PXI_SHIFT) << MM_PTE_SHIFT);
|
Offset = (((ULONGLONG)Address >> MM_PXI_SHIFT) << MM_PTE_SHIFT);
|
||||||
return (PMMPXE)(MmpPageMapInfo.PxeBase + Offset);
|
return (PMMPXE)(MmpPageMapInfo.PxeBase + Offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the given page table entry (PTE) is valid.
|
||||||
|
*
|
||||||
|
* @param PtePointer
|
||||||
|
* Pointer to the page table entry (PTE) to check.
|
||||||
|
*
|
||||||
|
* @return Returns TRUE if the entry is valid, FALSE otherwise.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
BOOLEAN
|
||||||
|
MmpPteValid(PHARDWARE_PTE PtePointer)
|
||||||
|
{
|
||||||
|
return (BOOLEAN)PtePointer->Valid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a page table entry (PTE) with the specified physical page and access flags.
|
||||||
|
*
|
||||||
|
* @param PtePointer
|
||||||
|
* Pointer to the page table entry (PTE) to set.
|
||||||
|
*
|
||||||
|
* @param PageFrameNumber
|
||||||
|
* Physical frame number to map.
|
||||||
|
*
|
||||||
|
* @param Writable
|
||||||
|
* Indicates whether the page should be writable.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
MmpSetPte(PHARDWARE_PTE PtePointer,
|
||||||
|
PFN_NUMBER PageFrameNumber,
|
||||||
|
BOOLEAN Writable)
|
||||||
|
{
|
||||||
|
PtePointer->PageFrameNumber = PageFrameNumber;
|
||||||
|
PtePointer->Valid = 1;
|
||||||
|
PtePointer->Writable = Writable;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user