Implement canonical address validation routine
This commit is contained in:
@@ -23,6 +23,7 @@ namespace MM
|
|||||||
public:
|
public:
|
||||||
XTAPI PMMPTE AdvancePte(IN PMMPTE Pte,
|
XTAPI PMMPTE AdvancePte(IN PMMPTE Pte,
|
||||||
IN LONG Count);
|
IN LONG Count);
|
||||||
|
XTAPI BOOLEAN CanonicalAddress(IN PVOID VirtualAddress);
|
||||||
XTAPI VOID ClearPte(IN PMMPTE PtePointer);
|
XTAPI VOID ClearPte(IN PMMPTE PtePointer);
|
||||||
XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte);
|
XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte);
|
||||||
XTAPI PMMPTE GetNextPte(IN PMMPTE Pte);
|
XTAPI PMMPTE GetNextPte(IN PMMPTE Pte);
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ namespace MM
|
|||||||
public:
|
public:
|
||||||
STATIC XTAPI PMMPTE AdvancePte(IN PMMPTE Pte,
|
STATIC XTAPI PMMPTE AdvancePte(IN PMMPTE Pte,
|
||||||
IN LONG Count);
|
IN LONG Count);
|
||||||
|
STATIC XTAPI BOOLEAN CanonicalAddress(IN PVOID VirtualAddress);
|
||||||
STATIC XTAPI VOID ClearPte(IN PMMPTE PtePointer);
|
STATIC XTAPI VOID ClearPte(IN PMMPTE PtePointer);
|
||||||
STATIC XTAPI VOID FlushTlb(VOID);
|
STATIC XTAPI VOID FlushTlb(VOID);
|
||||||
STATIC XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte);
|
STATIC XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte);
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ namespace MM
|
|||||||
public:
|
public:
|
||||||
VIRTUAL XTAPI PMMPTE AdvancePte(IN PMMPTE Pte,
|
VIRTUAL XTAPI PMMPTE AdvancePte(IN PMMPTE Pte,
|
||||||
IN ULONG Count) = 0;
|
IN ULONG Count) = 0;
|
||||||
|
XTAPI BOOLEAN CanonicalAddress(IN PVOID VirtualAddress);
|
||||||
VIRTUAL XTAPI VOID ClearPte(IN PMMPTE PtePointer) = 0;
|
VIRTUAL XTAPI VOID ClearPte(IN PMMPTE PtePointer) = 0;
|
||||||
VIRTUAL XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte) = 0;
|
VIRTUAL XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte) = 0;
|
||||||
VIRTUAL XTAPI PMMPTE GetNextPte(IN PMMPTE Pte) = 0;
|
VIRTUAL XTAPI PMMPTE GetNextPte(IN PMMPTE Pte) = 0;
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ namespace MM
|
|||||||
public:
|
public:
|
||||||
STATIC XTAPI PMMPTE AdvancePte(IN PMMPTE Pte,
|
STATIC XTAPI PMMPTE AdvancePte(IN PMMPTE Pte,
|
||||||
IN LONG Count);
|
IN LONG Count);
|
||||||
|
STATIC XTAPI BOOLEAN CanonicalAddress(IN PVOID VirtualAddress);
|
||||||
STATIC XTAPI VOID ClearPte(IN PMMPTE PtePointer);
|
STATIC XTAPI VOID ClearPte(IN PMMPTE PtePointer);
|
||||||
STATIC XTAPI VOID FlushTlb(VOID);
|
STATIC XTAPI VOID FlushTlb(VOID);
|
||||||
STATIC XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte);
|
STATIC XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte);
|
||||||
|
|||||||
@@ -31,6 +31,29 @@ MM::PageMap::AdvancePte(IN PMMPTE Pte,
|
|||||||
return (PMMPTE)((ULONG_PTR)Pte + (Count * sizeof(MMPTE)));
|
return (PMMPTE)((ULONG_PTR)Pte + (Count * sizeof(MMPTE)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the given address is canonical.
|
||||||
|
*
|
||||||
|
* @param VirtualAddress
|
||||||
|
* Specifies the virtual address to check.
|
||||||
|
*
|
||||||
|
* @return This routine returns TRUE if the address is canonical, FALSE otherwise.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
BOOLEAN
|
||||||
|
MM::PageMap::CanonicalAddress(IN PVOID VirtualAddress)
|
||||||
|
{
|
||||||
|
ULONG Shift;
|
||||||
|
|
||||||
|
/* Calculate the number of unused upper bits based on the paging mode */
|
||||||
|
Shift = 64 - PageMapInfo.VaBits;
|
||||||
|
|
||||||
|
/* Sign-extend via arithmetic shifts to verify the canonical form */
|
||||||
|
return ((((LONGLONG)VirtualAddress << Shift) >> Shift) == (LONGLONG)VirtualAddress);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clears the contents of a page table entry (PTE).
|
* Clears the contents of a page table entry (PTE).
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -9,6 +9,24 @@
|
|||||||
#include <xtos.hh>
|
#include <xtos.hh>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the given address is canonical.
|
||||||
|
*
|
||||||
|
* @param VirtualAddress
|
||||||
|
* Specifies the virtual address to check.
|
||||||
|
*
|
||||||
|
* @return This routine returns TRUE, as all addresses in i686 are canonical.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
BOOLEAN
|
||||||
|
MM::PageMap::CanonicalAddress(IN PVOID VirtualAddress)
|
||||||
|
{
|
||||||
|
/* All addresses in i686 are canonical */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets Page Map Level (PML) for current paging mode.
|
* Gets Page Map Level (PML) for current paging mode.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -31,6 +31,24 @@ MM::Paging::AdvancePte(IN PMMPTE Pte,
|
|||||||
return PmlRoutines->AdvancePte(Pte, Count);
|
return PmlRoutines->AdvancePte(Pte, Count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the given address is canonical.
|
||||||
|
*
|
||||||
|
* @param VirtualAddress
|
||||||
|
* Specifies the virtual address to check.
|
||||||
|
*
|
||||||
|
* @return This routine returns TRUE if the address is canonical, FALSE otherwise.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
BOOLEAN
|
||||||
|
MM::Paging::CanonicalAddress(IN PVOID VirtualAddress)
|
||||||
|
{
|
||||||
|
/* Return canonical address status */
|
||||||
|
return PmlRoutines->CanonicalAddress(VirtualAddress);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clears the contents of a page table entry (PTE).
|
* Clears the contents of a page table entry (PTE).
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user