Separate types for legacy (PML2) and PAE (PML3) paging
This commit is contained in:
parent
3ca6d04f6b
commit
7e08dc286e
@ -28,7 +28,11 @@
|
|||||||
#define MM_PDI_SHIFT 21
|
#define MM_PDI_SHIFT 21
|
||||||
#define MM_PPI_SHIFT 30
|
#define MM_PPI_SHIFT 30
|
||||||
|
|
||||||
|
/* Page directory and page base legacy address */
|
||||||
|
#define MM_PDE_LEGACY_BASE 0xC0300000
|
||||||
|
|
||||||
/* PTE legacy shift values */
|
/* PTE legacy shift values */
|
||||||
|
#define MM_PTE_LEGACY_SHIFT 2
|
||||||
#define MM_PDI_LEGACY_SHIFT 22
|
#define MM_PDI_LEGACY_SHIFT 22
|
||||||
|
|
||||||
/* Minimum number of physical pages needed by the system */
|
/* Minimum number of physical pages needed by the system */
|
||||||
@ -58,8 +62,26 @@ typedef enum _PAGE_SIZE
|
|||||||
Size4M
|
Size4M
|
||||||
} PAGE_SIZE, *PPAGE_SIZE;
|
} PAGE_SIZE, *PPAGE_SIZE;
|
||||||
|
|
||||||
/* Page Table entry structure definition (with PAE support) */
|
/* Legacy Page Table entry structure definition (PML2) */
|
||||||
typedef struct _HARDWARE_PTE
|
typedef struct _HARDWARE_LEGACY_PTE
|
||||||
|
{
|
||||||
|
ULONG Valid:1;
|
||||||
|
ULONG Writable:1;
|
||||||
|
ULONG Owner:1;
|
||||||
|
ULONG WriteThrough:1;
|
||||||
|
ULONG CacheDisable:1;
|
||||||
|
ULONG Accessed:1;
|
||||||
|
ULONG Dirty:1;
|
||||||
|
ULONG LargePage:1;
|
||||||
|
ULONG Global:1;
|
||||||
|
ULONG CopyOnWrite:1;
|
||||||
|
ULONG Prototype:1;
|
||||||
|
ULONG Reserved0:1;
|
||||||
|
ULONG PageFrameNumber:20;
|
||||||
|
} HARDWARE_LEGACY_PTE, *PHARDWARE_LEGACY_PTE;
|
||||||
|
|
||||||
|
/* Page Table entry structure definition (PML3) */
|
||||||
|
typedef struct _HARDWARE_MODERN_PTE
|
||||||
{
|
{
|
||||||
ULONGLONG Valid:1;
|
ULONGLONG Valid:1;
|
||||||
ULONGLONG Writable:1;
|
ULONGLONG Writable:1;
|
||||||
@ -77,10 +99,116 @@ typedef struct _HARDWARE_PTE
|
|||||||
ULONGLONG Reserved1:14;
|
ULONGLONG Reserved1:14;
|
||||||
ULONGLONG SoftwareWsIndex:11;
|
ULONGLONG SoftwareWsIndex:11;
|
||||||
ULONGLONG NoExecute:1;
|
ULONGLONG NoExecute:1;
|
||||||
|
} HARDWARE_MODERN_PTE, *PHARDWARE_MODERN_PTE;
|
||||||
|
|
||||||
|
/* Generic Page Table entry union to abstract PML2 and PML3 formats */
|
||||||
|
typedef union _HARDWARE_PTE
|
||||||
|
{
|
||||||
|
ULONGLONG Long;
|
||||||
|
HARDWARE_LEGACY_PTE Pml2;
|
||||||
|
HARDWARE_MODERN_PTE Pml3;
|
||||||
} HARDWARE_PTE, *PHARDWARE_PTE;
|
} HARDWARE_PTE, *PHARDWARE_PTE;
|
||||||
|
|
||||||
/* Page Table Entry on PAE enabled system */
|
/* Page map information structure definition */
|
||||||
typedef struct _MMPTE_HARDWARE
|
typedef struct _MMPAGEMAP_INFO
|
||||||
|
{
|
||||||
|
BOOLEAN Xpa;
|
||||||
|
ULONG PdeBase;
|
||||||
|
ULONG PdiShift;
|
||||||
|
ULONG PteShift;
|
||||||
|
} MMPAGEMAP_INFO, *PMMPAGEMAP_INFO;
|
||||||
|
|
||||||
|
/* Legacy Page Table Entry hardware structure definition (PML2) */
|
||||||
|
typedef struct _MMPML2_PTE_HARDWARE
|
||||||
|
{
|
||||||
|
ULONG Valid:1;
|
||||||
|
ULONG Writable:1;
|
||||||
|
ULONG Owner:1;
|
||||||
|
ULONG WriteThrough:1;
|
||||||
|
ULONG CacheDisable:1;
|
||||||
|
ULONG Accessed:1;
|
||||||
|
ULONG Dirty:1;
|
||||||
|
ULONG LargePage:1;
|
||||||
|
ULONG Global:1;
|
||||||
|
ULONG CopyOnWrite:1;
|
||||||
|
ULONG Prototype:1;
|
||||||
|
ULONG Write:1;
|
||||||
|
ULONG PageFrameNumber:20;
|
||||||
|
} MMPML2_PTE_HARDWARE, *PMMPML2_PTE_HARDWARE;
|
||||||
|
|
||||||
|
/* Legacy Page Table Entry list structure definition (PML2) */
|
||||||
|
typedef struct _MMPML2_PTE_LIST
|
||||||
|
{
|
||||||
|
ULONG Valid:1;
|
||||||
|
ULONG OneEntry:1;
|
||||||
|
ULONG Reserved0:8;
|
||||||
|
ULONG Prototype:1;
|
||||||
|
ULONG Reserved1:1;
|
||||||
|
ULONG NextEntry:20;
|
||||||
|
} MMPML2_PTE_LIST, *PMMPML2_PTE_LIST;
|
||||||
|
|
||||||
|
/* Legacy Page Table Entry subsection structure definition (PML2) */
|
||||||
|
typedef struct _MMPML2_PTE_PROTOTYPE
|
||||||
|
{
|
||||||
|
ULONG Valid:1;
|
||||||
|
ULONG ProtoAddressLow:7;
|
||||||
|
ULONG ReadOnly:1;
|
||||||
|
ULONG WhichPool:1;
|
||||||
|
ULONG Prototype:1;
|
||||||
|
ULONG ProtoAddressHigh:21;
|
||||||
|
} MMPML2_PTE_PROTOTYPE, *PMMPML2_PTE_PROTOTYPE;
|
||||||
|
|
||||||
|
/* Legacy Page Table Entry software structure definition (PML2) */
|
||||||
|
typedef struct _MMPML2_PTE_SOFTWARE
|
||||||
|
{
|
||||||
|
ULONG Valid:1;
|
||||||
|
ULONG PageFileLow:4;
|
||||||
|
ULONG Protection:5;
|
||||||
|
ULONG Prototype:1;
|
||||||
|
ULONG Transition:1;
|
||||||
|
ULONG PageFileHigh:20;
|
||||||
|
} MMPML2_PTE_SOFTWARE, *PMMPML2_PTE_SOFTWARE;
|
||||||
|
|
||||||
|
/* Legacy Page Table Entry subsection structure definition (PML2) */
|
||||||
|
typedef struct _MMPML2_PTE_SUBSECTION
|
||||||
|
{
|
||||||
|
ULONG Valid:1;
|
||||||
|
ULONG SubsectionAddressLow:4;
|
||||||
|
ULONG Protection:5;
|
||||||
|
ULONG Prototype:1;
|
||||||
|
ULONG SubsectionAddressHigh:20;
|
||||||
|
ULONG WhichPool:1;
|
||||||
|
} MMPML2_PTE_SUBSECTION, *PMMPML2_PTE_SUBSECTION;
|
||||||
|
|
||||||
|
/* Legacy Page Table Entry transition structure definition (PML2) */
|
||||||
|
typedef struct _MMPML2_PTE_TRANSITION
|
||||||
|
{
|
||||||
|
ULONG Valid:1;
|
||||||
|
ULONG Write:1;
|
||||||
|
ULONG Owner:1;
|
||||||
|
ULONG WriteThrough:1;
|
||||||
|
ULONG CacheDisable:1;
|
||||||
|
ULONG Protection:5;
|
||||||
|
ULONG Prototype:1;
|
||||||
|
ULONG Transition:1;
|
||||||
|
ULONG PageFrameNumber:20;
|
||||||
|
} MMPML2_PTE_TRANSITION, *PMMPML2_PTE_TRANSITION;
|
||||||
|
|
||||||
|
/* Legacy Page Table Entry union definition (PML2) */
|
||||||
|
typedef union _MMPML2_PTE
|
||||||
|
{
|
||||||
|
ULONG Long;
|
||||||
|
HARDWARE_PTE Flush;
|
||||||
|
MMPML2_PTE_HARDWARE Hard;
|
||||||
|
MMPML2_PTE_PROTOTYPE Proto;
|
||||||
|
MMPML2_PTE_SOFTWARE Soft;
|
||||||
|
MMPML2_PTE_TRANSITION Trans;
|
||||||
|
MMPML2_PTE_SUBSECTION Subsect;
|
||||||
|
MMPML2_PTE_LIST List;
|
||||||
|
} MMPML2_PTE, *PMMPML2_PTE;
|
||||||
|
|
||||||
|
/* Page Table Entry hardware structure definition (PML3) */
|
||||||
|
typedef struct _MMPML3_PTE_HARDWARE
|
||||||
{
|
{
|
||||||
ULONGLONG Valid:1;
|
ULONGLONG Valid:1;
|
||||||
ULONGLONG Writable:1;
|
ULONGLONG Writable:1;
|
||||||
@ -95,59 +223,59 @@ typedef struct _MMPTE_HARDWARE
|
|||||||
ULONGLONG Prototype:1;
|
ULONGLONG Prototype:1;
|
||||||
ULONGLONG Write:1;
|
ULONGLONG Write:1;
|
||||||
ULONGLONG PageFrameNumber:26;
|
ULONGLONG PageFrameNumber:26;
|
||||||
ULONGLONG Reserved1:25;
|
ULONGLONG Reserved0:25;
|
||||||
ULONGLONG NoExecute:1;
|
ULONGLONG NoExecute:1;
|
||||||
} MMPTE_HARDWARE, *PMMPTE_HARDWARE;
|
} MMPML3_PTE_HARDWARE, *PMMPML3_PTE_HARDWARE;
|
||||||
|
|
||||||
/* Page Table Entry list structure definition (with PAE support) */
|
/* Page Table Entry list structure definition (PML3) */
|
||||||
typedef struct _MMPTE_LIST
|
typedef struct _MMPML3_PTE_LIST
|
||||||
{
|
{
|
||||||
ULONGLONG Valid:1;
|
ULONGLONG Valid:1;
|
||||||
ULONGLONG OneEntry:1;
|
ULONGLONG OneEntry:1;
|
||||||
ULONGLONG Reserved1:8;
|
ULONGLONG Reserved0:8;
|
||||||
ULONGLONG Prototype:1;
|
ULONGLONG Prototype:1;
|
||||||
ULONGLONG Reserved2:21;
|
ULONGLONG Reserved1:21;
|
||||||
ULONGLONG NextEntry:32;
|
ULONGLONG NextEntry:32;
|
||||||
} MMPTE_LIST, *PMMPTE_LIST;
|
} MMPML3_PTE_LIST, *PMMPML3_PTE_LIST;
|
||||||
|
|
||||||
/* Page Table Entry subsection structure definition (with PAE support) */
|
/* Page Table Entry subsection structure definition (PML3) */
|
||||||
typedef struct _MMPTE_PROTOTYPE
|
typedef struct _MMPML3_PTE_PROTOTYPE
|
||||||
{
|
{
|
||||||
ULONGLONG Valid:1;
|
ULONGLONG Valid:1;
|
||||||
ULONGLONG Reserved1:7;
|
ULONGLONG Reserved0:7;
|
||||||
ULONGLONG ReadOnly:1;
|
ULONGLONG ReadOnly:1;
|
||||||
ULONGLONG Reserved2:1;
|
ULONGLONG Reserved1:1;
|
||||||
ULONGLONG Prototype:1;
|
ULONGLONG Prototype:1;
|
||||||
ULONGLONG Protection:5;
|
ULONGLONG Protection:5;
|
||||||
ULONGLONG Reserved3:16;
|
ULONGLONG Reserved2:16;
|
||||||
ULONGLONG ProtoAddress:32;
|
ULONGLONG ProtoAddress:32;
|
||||||
} MMPTE_PROTOTYPE, *PMMPTE_PROTOTYPE;
|
} MMPML3_PTE_PROTOTYPE, *PMMPML3_PTE_PROTOTYPE;
|
||||||
|
|
||||||
/* Page Table Entry software structure definition (with PAE support) */
|
/* Page Table Entry software structure definition (PML3) */
|
||||||
typedef struct _MMPTE_SOFTWARE
|
typedef struct _MMPML3_PTE_SOFTWARE
|
||||||
{
|
{
|
||||||
ULONGLONG Valid:1;
|
ULONGLONG Valid:1;
|
||||||
ULONGLONG PageFileLow:4;
|
ULONGLONG PageFileLow:4;
|
||||||
ULONGLONG Protection:5;
|
ULONGLONG Protection:5;
|
||||||
ULONGLONG Prototype:1;
|
ULONGLONG Prototype:1;
|
||||||
ULONGLONG Transition:1;
|
ULONGLONG Transition:1;
|
||||||
ULONGLONG Reserved1:20;
|
ULONGLONG Reserved0:20;
|
||||||
ULONGLONG PageFileHigh:32;
|
ULONGLONG PageFileHigh:32;
|
||||||
} MMPTE_SOFTWARE, *PMMPTE_SOFTWARE;
|
} MMPML3_PTE_SOFTWARE, *PMMPML3_PTE_SOFTWARE;
|
||||||
|
|
||||||
/* Page Table Entry subsection structure definition (with PAE support) */
|
/* Page Table Entry subsection structure definition (PML3) */
|
||||||
typedef struct _MMPTE_SUBSECTION
|
typedef struct _MMPML3_PTE_SUBSECTION
|
||||||
{
|
{
|
||||||
ULONGLONG Valid:1;
|
ULONGLONG Valid:1;
|
||||||
ULONGLONG Reserved1:4;
|
ULONGLONG Reserved0:4;
|
||||||
ULONGLONG Protection:5;
|
ULONGLONG Protection:5;
|
||||||
ULONGLONG Prototype:1;
|
ULONGLONG Prototype:1;
|
||||||
ULONGLONG Reserved2:21;
|
ULONGLONG Reserved1:21;
|
||||||
ULONGLONG SubsectionAddress:32;
|
ULONGLONG SubsectionAddress:32;
|
||||||
} MMPTE_SUBSECTION, *PMMPTE_SUBSECTION;
|
} MMPML3_PTE_SUBSECTION, *PMMPML3_PTE_SUBSECTION;
|
||||||
|
|
||||||
/* Page Table Entry transition structure definition (with PAE support) */
|
/* Page Table Entry transition structure definition (PML3) */
|
||||||
typedef struct _MMPTE_TRANSITION
|
typedef struct _MMPML3_PTE_TRANSITION
|
||||||
{
|
{
|
||||||
ULONGLONG Valid:1;
|
ULONGLONG Valid:1;
|
||||||
ULONGLONG Write:1;
|
ULONGLONG Write:1;
|
||||||
@ -159,38 +287,28 @@ typedef struct _MMPTE_TRANSITION
|
|||||||
ULONGLONG Transition:1;
|
ULONGLONG Transition:1;
|
||||||
ULONGLONG PageFrameNumber:26;
|
ULONGLONG PageFrameNumber:26;
|
||||||
ULONGLONG Unused:26;
|
ULONGLONG Unused:26;
|
||||||
} MMPTE_TRANSITION, *PMMPTE_TRANSITION;
|
} MMPML3_PTE_TRANSITION, *PMMPML3_PTE_TRANSITION;
|
||||||
|
|
||||||
/* Page Table Entry structure definition (with PAE support) */
|
/* Page Table Entry union definition (PML3) */
|
||||||
typedef union _MMPTE
|
typedef union _MMPML3_PTE
|
||||||
{
|
{
|
||||||
ULONGLONG Long;
|
ULONGLONG Long;
|
||||||
HARDWARE_PTE Flush;
|
HARDWARE_PTE Flush;
|
||||||
MMPTE_HARDWARE Hardware;
|
MMPML3_PTE_HARDWARE Hardware;
|
||||||
MMPTE_PROTOTYPE Prototype;
|
MMPML3_PTE_PROTOTYPE Prototype;
|
||||||
MMPTE_SOFTWARE Software;
|
MMPML3_PTE_SOFTWARE Software;
|
||||||
MMPTE_TRANSITION Transition;
|
MMPML3_PTE_TRANSITION Transition;
|
||||||
MMPTE_SUBSECTION Subsection;
|
MMPML3_PTE_SUBSECTION Subsection;
|
||||||
MMPTE_LIST List;
|
MMPML3_PTE_LIST List;
|
||||||
} MMPTE, *PMMPTE;
|
} MMPML3_PTE, *PMMPML3_PTE;
|
||||||
|
|
||||||
/* Legacy Page Table entry structure definition (without PAE support) */
|
/* Generic Page Table Entry union to abstract PML2 and PML3 formats */
|
||||||
typedef struct _HARDWARE_LEGACY_PTE
|
typedef union _MMPTE
|
||||||
{
|
{
|
||||||
ULONG Valid:1;
|
ULONGLONG Long;
|
||||||
ULONG Writable:1;
|
MMPML2_PTE Pml2;
|
||||||
ULONG Owner:1;
|
MMPML3_PTE Pml3;
|
||||||
ULONG WriteThrough:1;
|
} MMPTE, *PMMPTE;
|
||||||
ULONG CacheDisable:1;
|
|
||||||
ULONG Accessed:1;
|
|
||||||
ULONG Dirty:1;
|
|
||||||
ULONG LargePage:1;
|
|
||||||
ULONG Global:1;
|
|
||||||
ULONG CopyOnWrite:1;
|
|
||||||
ULONG Prototype:1;
|
|
||||||
ULONG Reserved0:1;
|
|
||||||
ULONG PageFrameNumber:20;
|
|
||||||
} HARDWARE_LEGACY_PTE, *PHARDWARE_LEGACY_PTE;
|
|
||||||
|
|
||||||
/* Page Frame Number structure definition */
|
/* Page Frame Number structure definition */
|
||||||
typedef struct _MMPFN
|
typedef struct _MMPFN
|
||||||
|
Loading…
x
Reference in New Issue
Block a user