diff --git a/sdk/xtdk/amd64/mmtypes.h b/sdk/xtdk/amd64/mmtypes.h index 9dcf761..aa30263 100644 --- a/sdk/xtdk/amd64/mmtypes.h +++ b/sdk/xtdk/amd64/mmtypes.h @@ -25,8 +25,50 @@ typedef enum _PAGE_SIZE Size1G } PAGE_SIZE, *PPAGE_SIZE; -/* Page Table entry structure definition */ +/* Page Table Entry structure definition */ typedef struct _HARDWARE_PTE +{ + ULONGLONG Valid:1; + ULONGLONG Writable:1; + ULONGLONG Owner:1; + ULONGLONG WriteThrough:1; + ULONGLONG CacheDisable:1; + ULONGLONG Accessed:1; + ULONGLONG Dirty:1; + ULONGLONG LargePage:1; + ULONGLONG Global:1; + ULONGLONG CopyOnWrite:1; + ULONGLONG Prototype:1; + ULONGLONG Reserved1:1; + ULONGLONG PageFrameNumber:36; + ULONGLONG Reserved2:4; + ULONGLONG SoftwareWsIndex:11; + ULONGLONG NoExecute:1; +} HARDWARE_PTE, *PHARDWARE_PTE; + +/* A Page Table Entry on AMD64 system */ +typedef struct _MMPTE_HARDWARE +{ + ULONGLONG Valid:1; + ULONGLONG Writable:1; + ULONGLONG Owner:1; + ULONGLONG WriteThrough:1; + ULONGLONG CacheDisable:1; + ULONGLONG Accessed:1; + ULONGLONG Dirty:1; + ULONGLONG LargePage:1; + ULONGLONG Global:1; + ULONGLONG CopyOnWrite:1; + ULONGLONG Prototype:1; + ULONGLONG Write:1; + ULONGLONG PageFrameNumber:36; + ULONGLONG Reserved1:2; + ULONGLONG SoftwareWsIndex:11; + ULONGLONG NoExecute:1; +} MMPTE_HARDWARE, *PMMPTE_HARDWARE; + +/* A Page Table Entry on AMD64 system with large pages */ +typedef struct _MMPTE_HARDWARE_LARGEPAGE { ULONGLONG Valid:1; ULONGLONG Write:1; @@ -39,11 +81,93 @@ typedef struct _HARDWARE_PTE ULONGLONG Global:1; ULONGLONG CopyOnWrite:1; ULONGLONG Prototype:1; - ULONGLONG Reserved0:1; - ULONGLONG PageFrameNumber:28; - ULONGLONG Reserved1:12; - ULONGLONG SoftwareWsIndex:11; - ULONGLONG NoExecute:1; -} HARDWARE_PTE, *PHARDWARE_PTE; + ULONGLONG Reserved1:1; + ULONGLONG PAT:1; + ULONGLONG Reserved2:8; + ULONGLONG PageFrameNumber:19; + ULONGLONG Reserved3:24; +} MMPTE_HARDWARE_LARGEPAGE, *PMMPTE_HARDWARE_LARGEPAGE; + +/* Page Table Entry list structure definition */ +typedef struct _MMPTE_LIST +{ + ULONGLONG Valid:1; + ULONGLONG OneEntry:1; + ULONGLONG Reserved1:3; + ULONGLONG Protection:5; + ULONGLONG Prototype:1; + ULONGLONG Transition:1; + ULONGLONG Reserved2:20; + ULONGLONG NextEntry:32; +} MMPTE_LIST, *PMMPTE_LIST; + +/* Page Table Entry prototype structure definition */ +typedef struct _MMPTE_PROTOTYPE +{ + ULONGLONG Valid:1; + ULONGLONG Reserved1:7; + ULONGLONG ReadOnly:1; + ULONGLONG Reserved2:1; + ULONGLONG Prototype:1; + ULONGLONG Protection:5; + LONGLONG ProtoAddress:48; +} MMPTE_PROTOTYPE, *PMMPTE_PROTOTYPE; + +/* Software Page Table Entry structure definition */ +typedef struct _MMPTE_SOFTWARE +{ + ULONGLONG Valid:1; + ULONGLONG PageFileLow:4; + ULONGLONG Protection:5; + ULONGLONG Prototype:1; + ULONGLONG Transition:1; + ULONGLONG UsedPageTableEntries:10; + ULONGLONG Reserved:10; + ULONGLONG PageFileHigh:32; +} MMPTE_SOFTWARE, *PMMPTE_SOFTWARE; + +/* Page Table Entry subsection structure definition */ +typedef struct _MMPTE_SUBSECTION +{ + ULONGLONG Valid:1; + ULONGLONG Reserved1:4; + ULONGLONG Protection:5; + ULONGLONG Prototype:1; + ULONGLONG Reserved2:5; + LONGLONG SubsectionAddress:48; +} MMPTE_SUBSECTION, *PMMPTE_SUBSECTION; + +/* Page Table Entry transition structure definition */ +typedef struct _MMPTE_TRANSITION +{ + ULONGLONG Valid:1; + ULONGLONG Write:1; + ULONGLONG Owner:1; + ULONGLONG WriteThrough:1; + ULONGLONG CacheDisable:1; + ULONGLONG Protection:5; + ULONGLONG Prototype:1; + ULONGLONG Transition:1; + ULONGLONG PageFrameNumber:36; + ULONGLONG Unused:16; +} MMPTE_TRANSITION, *PMMPTE_TRANSITION; + +/* Page Table Entry structure definition */ +typedef union _MMPTE +{ + ULONGLONG Long; + HARDWARE_PTE Flush; + MMPTE_HARDWARE Hardware; + MMPTE_PROTOTYPE Prototype; + MMPTE_SOFTWARE Software; + MMPTE_TRANSITION Transition; + MMPTE_SUBSECTION Subsection; + MMPTE_LIST List; +} MMPTE, *PMMPTE; + +/* Page Directory Entry structure definitions */ +typedef union _MMPTE MMPDE, *PMMPDE; +typedef union _MMPTE MMPPE, *PMMPPE; +typedef union _MMPTE MMPXE, *PMMPXE; #endif /* __XTDK_AMD64_MMTYPES_H */ diff --git a/sdk/xtdk/i686/mmtypes.h b/sdk/xtdk/i686/mmtypes.h index 5ba22d0..2beb12c 100644 --- a/sdk/xtdk/i686/mmtypes.h +++ b/sdk/xtdk/i686/mmtypes.h @@ -29,7 +29,7 @@ typedef enum _PAGE_SIZE typedef struct _HARDWARE_PTE { ULONGLONG Valid:1; - ULONGLONG Write:1; + ULONGLONG Writable:1; ULONGLONG Owner:1; ULONGLONG WriteThrough:1; ULONGLONG CacheDisable:1; @@ -40,10 +40,218 @@ typedef struct _HARDWARE_PTE ULONGLONG CopyOnWrite:1; ULONGLONG Prototype:1; ULONGLONG Reserved0:1; - ULONGLONG PageFrameNumber:28; - ULONGLONG Reserved1:12; + ULONGLONG PageFrameNumber:26; + ULONGLONG Reserved1:14; ULONGLONG SoftwareWsIndex:11; ULONGLONG NoExecute:1; } HARDWARE_PTE, *PHARDWARE_PTE; +/* Page Table Entry on PAE enabled system */ +typedef struct _MMPTE_HARDWARE +{ + ULONGLONG Valid:1; + ULONGLONG Writable:1; + ULONGLONG Owner:1; + ULONGLONG WriteThrough:1; + ULONGLONG CacheDisable:1; + ULONGLONG Accessed:1; + ULONGLONG Dirty:1; + ULONGLONG LargePage:1; + ULONGLONG Global:1; + ULONGLONG CopyOnWrite:1; + ULONGLONG Prototype:1; + ULONGLONG Write:1; + ULONGLONG PageFrameNumber:26; + ULONGLONG Reserved1:25; + ULONGLONG NoExecute:1; +} MMPTE_HARDWARE, *PMMPTE_HARDWARE; + +/* Page Table Entry list structure definition (with PAE support) */ +typedef struct _MMPTE_LIST +{ + ULONGLONG Valid:1; + ULONGLONG OneEntry:1; + ULONGLONG Reserved1:8; + ULONGLONG Prototype:1; + ULONGLONG Reserved2:21; + ULONGLONG NextEntry:32; +} MMPTE_LIST, *PMMPTE_LIST; + +/* Page Table Entry subsection structure definition (with PAE support) */ +typedef struct _MMPTE_PROTOTYPE +{ + ULONGLONG Valid:1; + ULONGLONG Reserved1:7; + ULONGLONG ReadOnly:1; + ULONGLONG Reserved2:1; + ULONGLONG Prototype:1; + ULONGLONG Protection:5; + ULONGLONG Reserved3:16; + ULONGLONG ProtoAddress:32; +} MMPTE_PROTOTYPE, *PMMPTE_PROTOTYPE; + +/* Page Table Entry software structure definition (with PAE support) */ +typedef struct _MMPTE_SOFTWARE +{ + ULONGLONG Valid:1; + ULONGLONG PageFileLow:4; + ULONGLONG Protection:5; + ULONGLONG Prototype:1; + ULONGLONG Transition:1; + ULONGLONG Reserved1:20; + ULONGLONG PageFileHigh:32; +} MMPTE_SOFTWARE, *PMMPTE_SOFTWARE; + +/* Page Table Entry subsection structure definition (with PAE support) */ +typedef struct _MMPTE_SUBSECTION +{ + ULONGLONG Valid:1; + ULONGLONG Reserved1:4; + ULONGLONG Protection:5; + ULONGLONG Prototype:1; + ULONGLONG Reserved2:21; + ULONGLONG SubsectionAddress:32; +} MMPTE_SUBSECTION, *PMMPTE_SUBSECTION; + +/* Page Table Entry transition structure definition (with PAE support) */ +typedef struct _MMPTE_TRANSITION +{ + ULONGLONG Valid:1; + ULONGLONG Write:1; + ULONGLONG Owner:1; + ULONGLONG WriteThrough:1; + ULONGLONG CacheDisable:1; + ULONGLONG Protection:5; + ULONGLONG Prototype:1; + ULONGLONG Transition:1; + ULONGLONG PageFrameNumber:26; + ULONGLONG Unused:26; +} MMPTE_TRANSITION, *PMMPTE_TRANSITION; + +/* Page Table Entry structure definition (with PAE support) */ +typedef union _MMPTE +{ + ULONGLONG Long; + HARDWARE_PTE Flush; + MMPTE_HARDWARE Hardware; + MMPTE_PROTOTYPE Prototype; + MMPTE_SOFTWARE Software; + MMPTE_TRANSITION Transition; + MMPTE_SUBSECTION Subsection; + MMPTE_LIST List; +} MMPTE, *PMMPTE; + +/* Page Directory Entry structure definition (with PAE support) */ +typedef union _MMPTE MMPDE, *PMMPDE; + +/* Legacy Page Table entry structure definition (without PAE support) */ +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; + +/* Legacy Page Table Entry on non-PAE system */ +typedef struct _MMPTE_LEGACY_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; +} MMPTE_LEGACY_HARDWARE, *PMMPTE_LEGACY_HARDWARE; + +/* Legacy Page Table Entry list structure definition (without PAE support) */ +typedef struct _MMPTE_LEGACY_LIST +{ + ULONG Valid:1; + ULONG OneEntry:1; + ULONG Reserved1:8; + ULONG Prototype:1; + ULONG Reserved2:1; + ULONG NextEntry:20; +} MMPTE_LEGACY_LIST, *PMMPTE_LEGACY_LIST; + +/* Legacy Page Table Entry prototype structure definition (without PAE support) */ +typedef struct _MMPTE_LEGACY_PROTOTYPE +{ + ULONG Valid:1; + ULONG ProtoAddressLow:7; + ULONG ReadOnly:1; + ULONG WhichPool:1; + ULONG Prototype:1; + ULONG ProtoAddressHigh:21; +} MMPTE_LEGACY_PROTOTYPE, *PMMPTE_LEGACY_PROTOTYPE; + +/* Legacy Page Table Entry software structure definition (without PAE support) */ +typedef struct _MMPTE_LEGACY_SOFTWARE +{ + ULONG Valid:1; + ULONG PageFileLow:4; + ULONG Protection:5; + ULONG Prototype:1; + ULONG Transition:1; + ULONG PageFileHigh:20; +} MMPTE_LEGACY_SOFTWARE, *PMMPTE_LEGACY_SOFTWARE; + +/* Legacy Page Table Entry subsection structure definition (without PAE support) */ +typedef struct _MMPTE_LEGACY_SUBSECTION +{ + ULONG Valid:1; + ULONG SubsectionAddressLow:4; + ULONG Protection:5; + ULONG Prototype:1; + ULONG SubsectionAddressHigh:20; + ULONG WhichPool:1; +} MMPTE_LEGACY_SUBSECTION, *PMMPTE_LEGACY_SUBSECTION; + +/* Legacy Page Table Entry transition structure definition (without PAE support) */ +typedef struct _MMPTE_LEGACY_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; +} MMPTE_LEGACY_TRANSITION, *PMMPTE_LEGACY_TRANSITION; + +/* Legacy Page Table Entry structure definition (without PAE support) */ +typedef union _MMPTE_LEGACY +{ + ULONG Long; + HARDWARE_LEGACY_PTE Flush; + MMPTE_LEGACY_HARDWARE Hardware; + MMPTE_LEGACY_PROTOTYPE Prototype; + MMPTE_LEGACY_SOFTWARE Software; + MMPTE_LEGACY_TRANSITION Transition; + MMPTE_LEGACY_SUBSECTION Subsection; + MMPTE_LEGACY_LIST List; +} MMPTE_LEGACY, *PMMPTE_LEGACY; + +/* Page Directory Entry structure definition (without PAE support) */ +typedef union _MMPTE_LEGACY MMPDE_LEGACY, *PMMPDE_LEGACY; + #endif /* __XTDK_I686_MMTYPES_H */ diff --git a/xtldr/arch/amd64/memory.c b/xtldr/arch/amd64/memory.c index 010bd4d..edd2a63 100644 --- a/xtldr/arch/amd64/memory.c +++ b/xtldr/arch/amd64/memory.c @@ -214,7 +214,7 @@ BlMapPage(IN PXTBL_PAGE_MAPPING PageMap, /* Set paging entry settings */ Pml1[Pml1Entry].PageFrameNumber = PageFrameNumber; Pml1[Pml1Entry].Valid = 1; - Pml1[Pml1Entry].Write = 1; + Pml1[Pml1Entry].Writable = 1; /* Take next virtual address and PFN */ VirtualAddress += EFI_PAGE_SIZE; diff --git a/xtldr/arch/i686/memory.c b/xtldr/arch/i686/memory.c index 8e80388..2877e6d 100644 --- a/xtldr/arch/i686/memory.c +++ b/xtldr/arch/i686/memory.c @@ -219,7 +219,7 @@ BlMapPage(IN PXTBL_PAGE_MAPPING PageMap, /* Set paging entry settings */ Pml1[Pml1Entry].PageFrameNumber = PageFrameNumber; Pml1[Pml1Entry].Valid = 1; - Pml1[Pml1Entry].Write = 1; + Pml1[Pml1Entry].Writable = 1; /* Take next virtual address and PFN */ VirtualAddress += EFI_PAGE_SIZE; diff --git a/xtldr/memory.c b/xtldr/memory.c index 3002208..d89f22d 100644 --- a/xtldr/memory.c +++ b/xtldr/memory.c @@ -789,7 +789,7 @@ BlpGetNextPageTable(IN PXTBL_PAGE_MAPPING PageMap, /* Set paging entry settings */ PageTable[Entry].PageFrameNumber = Address / EFI_PAGE_SIZE; PageTable[Entry].Valid = 1; - PageTable[Entry].Write = 1; + PageTable[Entry].Writable = 1; PmlPointer = (ULONGLONG)Address; }