Add PTE management routines
Todas las comprobaciones han sido exitosas
Todas las comprobaciones han sido exitosas
Este commit está contenido en:
@@ -21,13 +21,24 @@ namespace MM
|
|||||||
STATIC PPAGEMAP PmlRoutines;
|
STATIC PPAGEMAP PmlRoutines;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
STATIC XTAPI PMMPTE AdvancePte(PMMPTE Pte,
|
||||||
|
ULONG Count);
|
||||||
STATIC XTAPI VOID ClearPte(PHARDWARE_PTE PtePointer);
|
STATIC XTAPI VOID ClearPte(PHARDWARE_PTE PtePointer);
|
||||||
STATIC XTAPI VOID FlushTlb(VOID);
|
STATIC XTAPI VOID FlushTlb(VOID);
|
||||||
|
STATIC XTAPI ULONG_PTR GetEmptyPteList(VOID);
|
||||||
|
STATIC XTAPI ULONG_PTR GetNextEntry(PMMPTE Pte);
|
||||||
|
STATIC XTAPI PMMPTE GetNextPte(PMMPTE Pte);
|
||||||
|
STATIC XTAPI BOOLEAN GetOneEntry(PMMPTE Pte);
|
||||||
STATIC XTAPI PMMPDE GetPdeAddress(PVOID Address);
|
STATIC XTAPI PMMPDE GetPdeAddress(PVOID Address);
|
||||||
STATIC XTAPI PMMPPE GetPpeAddress(PVOID Address);
|
STATIC XTAPI PMMPPE GetPpeAddress(PVOID Address);
|
||||||
STATIC XTAPI PMMPTE GetPteAddress(PVOID Address);
|
STATIC XTAPI PMMPTE GetPteAddress(PVOID Address);
|
||||||
|
STATIC XTAPI ULONG GetPteSize(VOID);
|
||||||
STATIC XTAPI VOID InitializePageMapSupport(VOID);
|
STATIC XTAPI VOID InitializePageMapSupport(VOID);
|
||||||
STATIC XTAPI BOOLEAN PteValid(PHARDWARE_PTE PtePointer);
|
STATIC XTAPI BOOLEAN PteValid(PHARDWARE_PTE PtePointer);
|
||||||
|
STATIC XTAPI VOID SetNextEntry(PMMPTE Pte,
|
||||||
|
ULONG_PTR Value);
|
||||||
|
STATIC XTAPI VOID SetOneEntry(PMMPTE Pte,
|
||||||
|
BOOLEAN Value);
|
||||||
STATIC XTAPI VOID SetPte(PHARDWARE_PTE PtePointer,
|
STATIC XTAPI VOID SetPte(PHARDWARE_PTE PtePointer,
|
||||||
PFN_NUMBER PageFrameNumber,
|
PFN_NUMBER PageFrameNumber,
|
||||||
BOOLEAN Writable);
|
BOOLEAN Writable);
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ PMMPTE
|
|||||||
MM::PageMap::AdvancePte(PMMPTE Pte,
|
MM::PageMap::AdvancePte(PMMPTE Pte,
|
||||||
ULONG Count)
|
ULONG Count)
|
||||||
{
|
{
|
||||||
|
/* Return advanced PTE pointer */
|
||||||
return (PMMPTE)((ULONG_PTR)Pte + (Count * sizeof(MMPTE)));
|
return (PMMPTE)((ULONG_PTR)Pte + (Count * sizeof(MMPTE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,28 @@
|
|||||||
#include <xtos.hh>
|
#include <xtos.hh>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Advances a PTE pointer by a given number of entries, considering the actual PTE size.
|
||||||
|
*
|
||||||
|
* @param Pte
|
||||||
|
* The PTE pointer to advance.
|
||||||
|
*
|
||||||
|
* @param Count
|
||||||
|
* The number of PTE entries to advance by.
|
||||||
|
*
|
||||||
|
* @return The advanced PTE pointer.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
PMMPTE
|
||||||
|
MM::Paging::AdvancePte(PMMPTE Pte,
|
||||||
|
ULONG Count)
|
||||||
|
{
|
||||||
|
/* Return advanced PTE pointer */
|
||||||
|
return PmlRoutines->AdvancePte(Pte, Count);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clears the contents of a page table entry (PTE).
|
* Clears the contents of a page table entry (PTE).
|
||||||
*
|
*
|
||||||
@@ -23,6 +45,7 @@ XTAPI
|
|||||||
VOID
|
VOID
|
||||||
MM::Paging::ClearPte(PHARDWARE_PTE PtePointer)
|
MM::Paging::ClearPte(PHARDWARE_PTE PtePointer)
|
||||||
{
|
{
|
||||||
|
/* Clear PTE */
|
||||||
PmlRoutines->ClearPte(PtePointer);
|
PmlRoutines->ClearPte(PtePointer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,6 +101,75 @@ MM::Paging::FlushTlb(VOID)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value representing an empty PTE list.
|
||||||
|
*
|
||||||
|
* @return This routine returns the value representing an empty PTE list.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
ULONG_PTR
|
||||||
|
MM::Paging::GetEmptyPteList(VOID)
|
||||||
|
{
|
||||||
|
/* Return empty PTE list mask */
|
||||||
|
return (ULONG_PTR)PmlRoutines->GetEmptyPteList();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the next entry in a PTE list.
|
||||||
|
*
|
||||||
|
* @param Pte
|
||||||
|
* The PTE pointer to get the next entry from.
|
||||||
|
*
|
||||||
|
* @return This routine returns the next entry in the PTE list.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
ULONG_PTR
|
||||||
|
MM::Paging::GetNextEntry(PMMPTE Pte)
|
||||||
|
{
|
||||||
|
/* Return next entry in PTE list */
|
||||||
|
return PmlRoutines->GetNextEntry(Pte);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Advances a PTE pointer, considering the actual PTE size.
|
||||||
|
*
|
||||||
|
* @param Pte
|
||||||
|
* The PTE pointer to advance.
|
||||||
|
*
|
||||||
|
* @return The advanced PTE pointer.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
PMMPTE
|
||||||
|
MM::Paging::GetNextPte(PMMPTE Pte)
|
||||||
|
{
|
||||||
|
/* Return advanced PTE pointer */
|
||||||
|
return PmlRoutines->GetNextPte(Pte);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a PTE list contains only one entry.
|
||||||
|
*
|
||||||
|
* @param Pte
|
||||||
|
* The PTE pointer to check.
|
||||||
|
*
|
||||||
|
* @return This routine returns TRUE if the PTE list has only one entry, FALSE otherwise.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
BOOLEAN
|
||||||
|
MM::Paging::GetOneEntry(PMMPTE Pte)
|
||||||
|
{
|
||||||
|
/* Return one entry status */
|
||||||
|
return PmlRoutines->GetOneEntry(Pte);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the page map routines for basic paging mode (non-XPA).
|
* Gets the page map routines for basic paging mode (non-XPA).
|
||||||
*
|
*
|
||||||
@@ -90,6 +182,8 @@ MM::PPAGEMAP
|
|||||||
MM::Paging::GetPageMapBasicRoutines(VOID)
|
MM::Paging::GetPageMapBasicRoutines(VOID)
|
||||||
{
|
{
|
||||||
static MM::PageMapBasic PageMapBasicRoutines;
|
static MM::PageMapBasic PageMapBasicRoutines;
|
||||||
|
|
||||||
|
/* Return non-XPA page map routines */
|
||||||
return &PageMapBasicRoutines;
|
return &PageMapBasicRoutines;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,6 +199,8 @@ MM::PPAGEMAP
|
|||||||
MM::Paging::GetPageMapXpaRoutines(VOID)
|
MM::Paging::GetPageMapXpaRoutines(VOID)
|
||||||
{
|
{
|
||||||
static MM::PageMapXpa PageMapXpaRoutines;
|
static MM::PageMapXpa PageMapXpaRoutines;
|
||||||
|
|
||||||
|
/* Return XPA page map routines */
|
||||||
return &PageMapXpaRoutines;
|
return &PageMapXpaRoutines;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,6 +218,7 @@ XTAPI
|
|||||||
PMMPDE
|
PMMPDE
|
||||||
MM::Paging::GetPdeAddress(PVOID Address)
|
MM::Paging::GetPdeAddress(PVOID Address)
|
||||||
{
|
{
|
||||||
|
/* Return PDE address */
|
||||||
return PmlRoutines->GetPdeAddress(Address);
|
return PmlRoutines->GetPdeAddress(Address);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,6 +236,7 @@ XTAPI
|
|||||||
PMMPPE
|
PMMPPE
|
||||||
MM::Paging::GetPpeAddress(PVOID Address)
|
MM::Paging::GetPpeAddress(PVOID Address)
|
||||||
{
|
{
|
||||||
|
/* Return PPE address */
|
||||||
return PmlRoutines->GetPpeAddress(Address);
|
return PmlRoutines->GetPpeAddress(Address);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,9 +254,25 @@ XTAPI
|
|||||||
PMMPTE
|
PMMPTE
|
||||||
MM::Paging::GetPteAddress(PVOID Address)
|
MM::Paging::GetPteAddress(PVOID Address)
|
||||||
{
|
{
|
||||||
|
/* Return PTE address */
|
||||||
return PmlRoutines->GetPteAddress(Address);
|
return PmlRoutines->GetPteAddress(Address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the size of a PTE.
|
||||||
|
*
|
||||||
|
* @return This routine returns the size of a PTE.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
ULONG
|
||||||
|
MM::Paging::GetPteSize(VOID)
|
||||||
|
{
|
||||||
|
/* Return the size of MMPTE */
|
||||||
|
return PmlRoutines->GetPteSize();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Detects if eXtended Physical Addressing (XPA) is enabled and initializes page map support.
|
* Detects if eXtended Physical Addressing (XPA) is enabled and initializes page map support.
|
||||||
*
|
*
|
||||||
@@ -200,9 +314,54 @@ XTAPI
|
|||||||
BOOLEAN
|
BOOLEAN
|
||||||
MM::Paging::PteValid(PHARDWARE_PTE PtePointer)
|
MM::Paging::PteValid(PHARDWARE_PTE PtePointer)
|
||||||
{
|
{
|
||||||
|
/* Check if PTE is valid */
|
||||||
return PmlRoutines->PteValid(PtePointer);
|
return PmlRoutines->PteValid(PtePointer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the next entry in a PTE list.
|
||||||
|
*
|
||||||
|
* @param Pte
|
||||||
|
* The PTE pointer to modify.
|
||||||
|
*
|
||||||
|
* @param Value
|
||||||
|
* The value to set as the next entry.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
MM::Paging::SetNextEntry(PMMPTE Pte,
|
||||||
|
ULONG_PTR Value)
|
||||||
|
{
|
||||||
|
/* Set next entry in PTE list */
|
||||||
|
PmlRoutines->SetNextEntry(Pte, Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the flag indicating whether a PTE list contains only one entry.
|
||||||
|
*
|
||||||
|
* @param Pte
|
||||||
|
* The PTE pointer to modify.
|
||||||
|
*
|
||||||
|
* @param Value
|
||||||
|
* The value to set. TRUE if the list has only one entry, FALSE otherwise.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
MM::Paging::SetOneEntry(PMMPTE Pte,
|
||||||
|
BOOLEAN Value)
|
||||||
|
{
|
||||||
|
/* Set one entry status */
|
||||||
|
PmlRoutines->SetOneEntry(Pte, Value);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets a PML2 page table entry (PTE) with the specified physical page and access flags.
|
* Sets a PML2 page table entry (PTE) with the specified physical page and access flags.
|
||||||
*
|
*
|
||||||
@@ -225,6 +384,7 @@ MM::Paging::SetPte(PHARDWARE_PTE PtePointer,
|
|||||||
PFN_NUMBER PageFrameNumber,
|
PFN_NUMBER PageFrameNumber,
|
||||||
BOOLEAN Writable)
|
BOOLEAN Writable)
|
||||||
{
|
{
|
||||||
|
/* Set PTE */
|
||||||
PmlRoutines->SetPte(PtePointer, PageFrameNumber, Writable);
|
PmlRoutines->SetPte(PtePointer, PageFrameNumber, Writable);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -250,5 +410,6 @@ MM::Paging::SetPteCaching(PHARDWARE_PTE PtePointer,
|
|||||||
BOOLEAN CacheDisable,
|
BOOLEAN CacheDisable,
|
||||||
BOOLEAN WriteThrough)
|
BOOLEAN WriteThrough)
|
||||||
{
|
{
|
||||||
|
/* Set caching attributes */
|
||||||
PmlRoutines->SetPteCaching(PtePointer, CacheDisable, WriteThrough);
|
PmlRoutines->SetPteCaching(PtePointer, CacheDisable, WriteThrough);
|
||||||
}
|
}
|
||||||
|
|||||||
Referencia en una nueva incidencia
Block a user