ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

mm.h
Go to the documentation of this file.
00001 /*
00002  * kernel internal memory managment definitions for amd64
00003  */
00004 #pragma once
00005 
00006 /* Memory layout base addresses */
00007 #define MI_LOWEST_VAD_ADDRESS           (PVOID)0x000000007FF00000ULL
00008 #define MI_HIGHEST_USER_ADDRESS         (PVOID)0x000007FFFFFEFFFFULL
00009 #define MI_USER_PROBE_ADDRESS           (PVOID)0x000007FFFFFF0000ULL
00010 #define MI_DEFAULT_SYSTEM_RANGE_START   (PVOID)0xFFFF080000000000ULL
00011 #define MI_REAL_SYSTEM_RANGE_START             0xFFFF800000000000ULL
00012 #define MI_PAGE_TABLE_BASE                     0xFFFFF68000000000ULL
00013 #define HYPER_SPACE                            0xFFFFF70000000000ULL
00014 #define HYPER_SPACE_END                        0xFFFFF77FFFFFFFFFULL
00015 #define MI_SHARED_SYSTEM_PAGE                  0xFFFFF78000000000ULL
00016 #define MI_SYSTEM_CACHE_WS_START               0xFFFFF78000001000ULL
00017 #define MI_LOADER_MAPPINGS                     0xFFFFF80000000000ULL
00018 #define MI_PAGED_SYSTEM_START                  0xFFFFF88000000000ULL
00019 #define MI_PAGED_POOL_START             (PVOID)0xFFFFF8A000000000ULL
00020 #define MI_PAGED_POOL_END                      0xFFFFF8BFFFFFFFFFULL
00021 #define MI_SESSION_SPACE_START                 0xFFFFF90000000000ULL
00022 #define MI_SESSION_VIEW_END                    0xFFFFF97FFF000000ULL
00023 #define MI_SESSION_SPACE_END                   0xFFFFF97FFFFFFFFFULL
00024 #define MM_SYSTEM_SPACE_START                  0xFFFFF98000000000ULL
00025 #define MI_PFN_DATABASE                        0xFFFFFA8000000000ULL
00026 #define MI_HIGHEST_SYSTEM_ADDRESS       (PVOID)0xFFFFFFFFFFFFFFFFULL
00027 
00028 /* WOW64 address definitions */
00029 #define MM_HIGHEST_USER_ADDRESS_WOW64   0x7FFEFFFF
00030 #define MM_SYSTEM_RANGE_START_WOW64     0x80000000
00031 
00032 #define MI_DEBUG_MAPPING                (PVOID)0xFFFFFFFF80000000ULL // FIXME
00033 #define MI_NON_PAGED_SYSTEM_START_MIN   MM_SYSTEM_SPACE_START // FIXME
00034 #define MI_SYSTEM_PTE_START             MM_SYSTEM_SPACE_START
00035 #define MI_SYSTEM_PTE_END               (MI_SYSTEM_PTE_START + MI_NUMBER_SYSTEM_PTES * PAGE_SIZE - 1)
00036 #define MI_SYSTEM_PTE_BASE              (PVOID)MiAddressToPte(KSEG0_BASE)
00037 #define MM_HIGHEST_VAD_ADDRESS          (PVOID)((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - (16 * PAGE_SIZE))
00038 #define MI_MAPPING_RANGE_START          HYPER_SPACE
00039 #define MI_MAPPING_RANGE_END            (MI_MAPPING_RANGE_START + MI_HYPERSPACE_PTES * PAGE_SIZE)
00040 #define MI_DUMMY_PTE                        (MI_MAPPING_RANGE_END + PAGE_SIZE)
00041 #define MI_VAD_BITMAP                       (MI_DUMMY_PTE + PAGE_SIZE)
00042 #define MI_WORKING_SET_LIST                 (MI_VAD_BITMAP + PAGE_SIZE)
00043 #define MI_NONPAGED_POOL_END 0
00044 
00045 /* Memory sizes */
00046 #define MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING ((255*1024*1024) >> PAGE_SHIFT)
00047 #define MI_MIN_PAGES_FOR_SYSPTE_TUNING        ((19*1024*1024) >> PAGE_SHIFT)
00048 #define MI_MIN_PAGES_FOR_SYSPTE_BOOST         ((32*1024*1024) >> PAGE_SHIFT)
00049 #define MI_MIN_INIT_PAGED_POOLSIZE            (32 * 1024 * 1024)
00050 #define MI_MAX_INIT_NONPAGED_POOL_SIZE        (128ULL * 1024 * 1024 * 1024)
00051 #define MI_MAX_NONPAGED_POOL_SIZE             (128ULL * 1024 * 1024 * 1024)
00052 #define MI_SYSTEM_VIEW_SIZE                   (16 * 1024 * 1024)
00053 #define MI_MIN_SECONDARY_COLORS               8
00054 #define MI_SECONDARY_COLORS                   64
00055 #define MI_MAX_SECONDARY_COLORS               1024
00056 #define MI_MIN_ALLOCATION_FRAGMENT            (4 * _1KB)
00057 #define MI_ALLOCATION_FRAGMENT                (64 * _1KB)
00058 #define MI_MAX_ALLOCATION_FRAGMENT            (2  * _1MB)
00059 #define MI_SESSION_WORKING_SET_SIZE           (4 * 1024 * 1024)
00060 #define MI_SESSION_VIEW_SIZE                  (20 * 1024 * 1024)
00061 #define MI_SESSION_POOL_SIZE                  (16 * 1024 * 1024)
00062 #define MI_SESSION_IMAGE_SIZE                 (8 * 1024 * 1024)
00063 #define MI_SESSION_SIZE                       (MI_SESSION_VIEW_SIZE + \
00064                                                MI_SESSION_POOL_SIZE + \
00065                                                MI_SESSION_IMAGE_SIZE + \
00066                                                MI_SESSION_WORKING_SET_SIZE)
00067 
00068 #define MmSystemRangeStart ((PVOID)MI_REAL_SYSTEM_RANGE_START)
00069 
00070 /* Misc constants */
00071 #define _MI_PAGING_LEVELS                   4
00072 #define MI_NUMBER_SYSTEM_PTES               22000
00073 #define MI_MAX_FREE_PAGE_LISTS              4
00074 #define NR_SECTION_PAGE_TABLES              1024
00075 #define NR_SECTION_PAGE_ENTRIES             1024
00076 #define MI_HYPERSPACE_PTES                  (256 - 1)
00077 #define MI_ZERO_PTES                        (32)
00078 /* FIXME - different architectures have different cache line sizes... */
00079 #define MM_CACHE_LINE_SIZE                  32
00080 
00081 /* Helper macros */
00082 #define PAGE_MASK(x)        ((x)&(~0xfff))
00083 #define PAE_PAGE_MASK(x)    ((x)&(~0xfffLL))
00084 #define IS_ALIGNED(addr, align) (((ULONG64)(addr) & (align - 1)) == 0)
00085 #define IS_PAGE_ALIGNED(addr) IS_ALIGNED(addr, PAGE_SIZE)
00086 
00087 #define MiIsPteOnPdeBoundary(PointerPte) \
00088     ((((ULONG_PTR)PointerPte) & (PAGE_SIZE - 1)) == 0)
00089 #define MiIsPteOnPpeBoundary(PointerPte) \
00090     ((((ULONG_PTR)PointerPte) & (PDE_PER_PAGE * PAGE_SIZE - 1)) == 0)
00091 #define MiIsPteOnPxeBoundary(PointerPte) \
00092     ((((ULONG_PTR)PointerPte) & (PPE_PER_PAGE * PDE_PER_PAGE * PAGE_SIZE - 1)) == 0)
00093 
00094 /* MMPTE related defines */
00095 #define MM_EMPTY_PTE_LIST  ((ULONG64)0xFFFFFFFF)
00096 #define MM_EMPTY_LIST  ((ULONG_PTR)-1)
00097 
00098 #define ADDR_TO_PAGE_TABLE(v) ((ULONG)(((ULONG_PTR)(v)) / (512 * PAGE_SIZE)))
00099 #define ADDR_TO_PDE_OFFSET(v) ((ULONG)((((ULONG_PTR)(v)) / (512 * PAGE_SIZE))))
00100 #define ADDR_TO_PTE_OFFSET(v)  ((ULONG)((((ULONG_PTR)(v)) % (512 * PAGE_SIZE)) / PAGE_SIZE))
00101 
00102 #define MiGetPdeOffset ADDR_TO_PDE_OFFSET
00103 
00104 #define VAtoPXI(va) ((((ULONG64)va) >> PXI_SHIFT) & 0x1FF)
00105 #define VAtoPPI(va) ((((ULONG64)va) >> PPI_SHIFT) & 0x1FF)
00106 #define VAtoPDI(va) ((((ULONG64)va) >> PDI_SHIFT) & 0x1FF)
00107 #define VAtoPTI(va) ((((ULONG64)va) >> PTI_SHIFT) & 0x1FF)
00108 
00109 /* Easy accessing PFN in PTE */
00110 #define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber)
00111 #define PFN_FROM_PDE(v) ((v)->u.Hard.PageFrameNumber)
00112 #define PFN_FROM_PPE(v) ((v)->u.Hard.PageFrameNumber)
00113 #define PFN_FROM_PXE(v) ((v)->u.Hard.PageFrameNumber)
00114 
00115 // FIXME, only copied from x86
00116 #define MI_MAKE_LOCAL_PAGE(x)      ((x)->u.Hard.Global = 0)
00117 #define MI_MAKE_DIRTY_PAGE(x)      ((x)->u.Hard.Dirty = 1)
00118 #define MI_MAKE_ACCESSED_PAGE(x)   ((x)->u.Hard.Accessed = 1)
00119 #define MI_PAGE_DISABLE_CACHE(x)   ((x)->u.Hard.CacheDisable = 1)
00120 #define MI_PAGE_WRITE_THROUGH(x)   ((x)->u.Hard.WriteThrough = 1)
00121 #define MI_PAGE_WRITE_COMBINED(x)  ((x)->u.Hard.WriteThrough = 0)
00122 #define MI_IS_PAGE_LARGE(x)        ((x)->u.Hard.LargePage == 1)
00123 #if !defined(CONFIG_SMP)
00124 #define MI_IS_PAGE_WRITEABLE(x)    ((x)->u.Hard.Write == 1)
00125 #else
00126 #define MI_IS_PAGE_WRITEABLE(x)    ((x)->u.Hard.Writable == 1)
00127 #endif
00128 #define MI_IS_PAGE_COPY_ON_WRITE(x)((x)->u.Hard.CopyOnWrite == 1)
00129 #define MI_IS_PAGE_DIRTY(x)        ((x)->u.Hard.Dirty == 1)
00130 #define MI_MAKE_OWNER_PAGE(x)      ((x)->u.Hard.Owner = 1)
00131 #if !defined(CONFIG_SMP)
00132 #define MI_MAKE_WRITE_PAGE(x)      ((x)->u.Hard.Write = 1)
00133 #else
00134 #define MI_MAKE_WRITE_PAGE(x)      ((x)->u.Hard.Writable = 1)
00135 #endif
00136 
00137 // FIXME!!!
00138 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
00139     ((x) / (4*1024*1024))
00140 #define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \
00141     ((((x)) % (4*1024*1024)) / (4*1024))
00142 
00143 //#define TEB_BASE                            0x7FFDE000
00144 
00145 /* On x86, these two are the same */
00146 #define MMPDE MMPTE
00147 #define PMMPDE PMMPTE
00148 #define MMPPE MMPTE
00149 #define PMMPPE PMMPTE
00150 #define MI_WRITE_VALID_PPE MI_WRITE_VALID_PTE
00151 
00152 #define ValidKernelPpe ValidKernelPde
00153 
00154 PULONG64
00155 FORCEINLINE
00156 MmGetPageDirectory(VOID)
00157 {
00158     return (PULONG64)__readcr3();
00159 }
00160 
00161 PMMPTE
00162 FORCEINLINE
00163 MiAddressToPxe(PVOID Address)
00164 {
00165     ULONG64 Offset = (ULONG64)Address >> (PXI_SHIFT - 3);
00166     Offset &= PXI_MASK << 3;
00167     return (PMMPTE)(PXE_BASE + Offset);
00168 }
00169 
00170 PMMPTE
00171 FORCEINLINE
00172 MiAddressToPpe(PVOID Address)
00173 {
00174     ULONG64 Offset = (ULONG64)Address >> (PPI_SHIFT - 3);
00175     Offset &= 0x3FFFF << 3;
00176     return (PMMPTE)(PPE_BASE + Offset);
00177 }
00178 
00179 PMMPTE
00180 FORCEINLINE
00181 _MiAddressToPde(PVOID Address)
00182 {
00183     ULONG64 Offset = (ULONG64)Address >> (PDI_SHIFT - 3);
00184     Offset &= 0x7FFFFFF << 3;
00185     return (PMMPTE)(PDE_BASE + Offset);
00186 }
00187 #define MiAddressToPde(x) _MiAddressToPde((PVOID)(x))
00188 
00189 PMMPTE
00190 FORCEINLINE
00191 _MiAddressToPte(PVOID Address)
00192 {
00193     ULONG64 Offset = (ULONG64)Address >> (PTI_SHIFT - 3);
00194     Offset &= 0xFFFFFFFFFULL << 3;
00195     return (PMMPTE)(PTE_BASE + Offset);
00196 }
00197 #define MiAddressToPte(x) _MiAddressToPte((PVOID)(x))
00198 
00199 ULONG
00200 FORCEINLINE
00201 MiAddressToPti(PVOID Address)
00202 {
00203     return ((((ULONG64)Address) >> PTI_SHIFT) & 0x1FF);
00204 }
00205 #define MiAddressToPteOffset(x) MiAddressToPti(x) // FIXME: bad name
00206 
00207 ULONG
00208 FORCEINLINE
00209 MiAddressToPxi(PVOID Address)
00210 {
00211     return ((((ULONG64)Address) >> PXI_SHIFT) & 0x1FF);
00212 }
00213 
00214 
00215 /* Convert a PTE into a corresponding address */
00216 PVOID
00217 FORCEINLINE
00218 MiPteToAddress(PMMPTE PointerPte)
00219 {
00220     /* Use signed math */
00221     return (PVOID)(((LONG64)PointerPte << 25) >> 16);
00222 }
00223 
00224 PVOID
00225 FORCEINLINE
00226 MiPdeToAddress(PMMPTE PointerPde)
00227 {
00228     /* Use signed math */
00229     return (PVOID)(((LONG64)PointerPde << 34) >> 16);
00230 }
00231 
00232 PVOID
00233 FORCEINLINE
00234 MiPpeToAddress(PMMPTE PointerPpe)
00235 {
00236     /* Use signed math */
00237     return (PVOID)(((LONG64)PointerPpe << 43) >> 16);
00238 }
00239 
00240 PVOID
00241 FORCEINLINE
00242 MiPxeToAddress(PMMPTE PointerPxe)
00243 {
00244     /* Use signed math */
00245     return (PVOID)(((LONG64)PointerPxe << 52) >> 16);
00246 }
00247 
00248 BOOLEAN
00249 FORCEINLINE
00250 MiIsPdeForAddressValid(PVOID Address)
00251 {
00252     return ((MiAddressToPxe(Address)->u.Hard.Valid) &&
00253             (MiAddressToPpe(Address)->u.Hard.Valid) &&
00254             (MiAddressToPde(Address)->u.Hard.Valid));
00255 }
00256 
00257 #define MiPdeToPte(PDE) ((PMMPTE)MiPteToAddress(PDE))
00258 #define MiPteToPde(PTE) ((PMMPDE)MiAddressToPte(PTE))
00259 #define MiPdeToPpe(Pde) ((PMMPPE)MiAddressToPte(Pde))
00260 
00261 /* Sign extend 48 bits */
00262 #define MiProtoPteToPte(x) (PMMPTE)(((LONG64)(x)->u.Long) >> 16)
00263 
00264 FORCEINLINE
00265 VOID
00266 MI_MAKE_PROTOTYPE_PTE(IN PMMPTE NewPte,
00267                       IN PMMPTE PointerPte)
00268 {
00269     /* Store the Address */
00270     NewPte->u.Long = (ULONG64)PointerPte << 16;
00271 
00272     /* Mark this as a prototype PTE */
00273     NewPte->u.Proto.Prototype = 1;
00274 
00275     ASSERT(MiProtoPteToPte(NewPte) == PointerPte);
00276 }
00277 
00278 VOID
00279 FORCEINLINE
00280 MmInitGlobalKernelPageDirectory(VOID)
00281 {
00282     /* Nothing to do */
00283 }
00284 

Generated on Sun May 27 2012 04:19:14 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.