/*++ NDK Version: 0095 Copyright (c) Alex Ionescu. All rights reserved. Header Name: mmtypes.h (X86) Abstract: i386 Type definitions for the Memory Manager Author: Alex Ionescu (alex.ionescu@reactos.com) 06-Oct-2004 --*/ #ifndef _I386_MMTYPES_H #define _I386_MMTYPES_H #ifdef __cplusplus extern "C" { #endif // // Dependencies // // // Page-related Macros // #define PAGE_SIZE 0x1000 #define PAGE_SHIFT 12L #define MM_ALLOCATION_GRANULARITY 0x10000 #define MM_ALLOCATION_GRANULARITY_SHIFT 16L #define MM_PAGE_FRAME_NUMBER_SIZE 20 // // User space range limit // #define MI_HIGHEST_USER_ADDRESS (PVOID)0x7FFEFFFF // // Address of the shared user page // #define MM_SHARED_USER_DATA_VA 0x7FFE0000 // // Sanity checks for Paging Macros // #ifdef C_ASSERT C_ASSERT(PAGE_SIZE == (1 << PAGE_SHIFT)); C_ASSERT(MM_ALLOCATION_GRANULARITY == (1 << MM_ALLOCATION_GRANULARITY_SHIFT)); C_ASSERT(MM_ALLOCATION_GRANULARITY && !(MM_ALLOCATION_GRANULARITY & (MM_ALLOCATION_GRANULARITY - 1))); C_ASSERT(MM_ALLOCATION_GRANULARITY >= PAGE_SIZE); #endif // // PAE SEG0 Base? // #define KSEG0_BASE_PAE 0xE0000000 // // Page Table Entry Definitions // typedef struct _HARDWARE_PTE_X86 { ULONG Valid:1; ULONG Write: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 reserved: 1; ULONG PageFrameNumber:20; } HARDWARE_PTE_X86, *PHARDWARE_PTE_X86; typedef struct _MMPTE_SOFTWARE { ULONG Valid:1; ULONG PageFileLow:4; ULONG Protection:5; ULONG Prototype:1; ULONG Transition:1; ULONG PageFileHigh:20; } MMPTE_SOFTWARE; typedef struct _MMPTE_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_TRANSITION; typedef struct _MMPTE_PROTOTYPE { ULONG Valid:1; ULONG ProtoAddressLow:7; ULONG ReadOnly:1; ULONG WhichPool:1; ULONG Prototype:1; ULONG ProtoAddressHigh:21; } MMPTE_PROTOTYPE; typedef struct _MMPTE_SUBSECTION { ULONG Valid:1; ULONG SubsectionAddressLow:4; ULONG Protection:5; ULONG Prototype:1; ULONG SubsectionAddressHigh:20; ULONG WhichPool:1; } MMPTE_SUBSECTION; typedef struct _MMPTE_LIST { ULONG Valid:1; ULONG OneEntry:1; ULONG filler0:8; ULONG Prototype:1; ULONG filler1:1; ULONG NextEntry:20; } MMPTE_LIST; #ifndef CONFIG_SMP typedef struct _MMPTE_HARDWARE { ULONG Valid:1; ULONG Write: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 reserved:1; ULONG PageFrameNumber:20; } MMPTE_HARDWARE, *PMMPTE_HARDWARE; #else typedef struct _MMPTE_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_HARDWARE, *PMMPTE_HARDWARE; #endif // // Use the right PTE structure // #define HARDWARE_PTE HARDWARE_PTE_X86 #define PHARDWARE_PTE PHARDWARE_PTE_X86 typedef struct _MMPTE { union { ULONG_PTR Long; HARDWARE_PTE Flush; MMPTE_HARDWARE Hard; MMPTE_PROTOTYPE Proto; MMPTE_SOFTWARE Soft; MMPTE_TRANSITION Trans; MMPTE_SUBSECTION Subsect; MMPTE_LIST List; } u; } MMPTE, *PMMPTE, MMPDE, *PMMPDE; #ifdef __cplusplus }; // extern "C" #endif #endif