Merge trunk HEAD (r46369)
[reactos.git] / reactos / ntoskrnl / include / internal / i386 / mm.h
1 /*
2 * Lowlevel memory managment definitions
3 */
4
5 #ifndef __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H
6 #define __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H
7
8 struct _EPROCESS;
9 PULONG MmGetPageDirectory(VOID);
10
11 #define PAGE_MASK(x) ((x)&(~0xfff))
12 #define PAE_PAGE_MASK(x) ((x)&(~0xfffLL))
13
14 /* Base addresses of PTE and PDE */
15 #define PAGETABLE_MAP (0xc0000000)
16 #define PAGEDIRECTORY_MAP (0xc0000000 + (PAGETABLE_MAP / (1024)))
17
18 #define PTE_BASE 0xC0000000
19 #define PDE_BASE 0xC0300000
20 #define PTE_TOP 0xC03FFFFF
21 #define PDE_TOP 0xC0300FFF
22 #define PTE_PER_PAGE 1024
23 #define HYPER_SPACE 0xC0400000
24 #define HYPER_SPACE_END 0xC07FFFFF
25
26 /* Converting address to a corresponding PDE or PTE entry */
27 #define MiAddressToPde(x) \
28 ((PMMPTE)(((((ULONG)(x)) >> 22) << 2) + PAGEDIRECTORY_MAP))
29 #define MiAddressToPte(x) \
30 ((PMMPTE)(((((ULONG)(x)) >> 12) << 2) + PAGETABLE_MAP))
31 #define MiAddressToPteOffset(x) \
32 ((((ULONG)(x)) << 10) >> 22)
33
34 //
35 // Convert a PTE into a corresponding address
36 //
37 #define MiPteToAddress(PTE) ((PVOID)((ULONG)(PTE) << 10))
38 #define MiIsPdeForAddressValid(Pde) (MiAddressToPde(Address)->u.Hard.Valid)
39
40 #define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (1024 * PAGE_SIZE))
41 #define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE)))
42 #define ADDR_TO_PTE_OFFSET(v) ((((ULONG)(v)) % (1024 * PAGE_SIZE)) / PAGE_SIZE)
43
44 /* Easy accessing PFN in PTE */
45 #define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber)
46
47 #define MI_MAKE_LOCAL_PAGE(x) ((x)->u.Hard.Global = 0)
48 #define MI_MAKE_DIRTY_PAGE(x) ((x)->u.Hard.Dirty = 1)
49 #define MI_PAGE_DISABLE_CACHE(x) ((x)->u.Hard.CacheDisable = 1)
50 #define MI_PAGE_WRITE_THROUGH(x) ((x)->u.Hard.WriteThrough = 1)
51 #define MI_PAGE_WRITE_COMBINED(x) ((x)->u.Hard.WriteThrough = 0)
52 #if !defined(CONFIG_SMP)
53 #define MI_IS_PAGE_WRITEABLE(x) ((x)->u.Hard.Write == 1)
54 #else
55 #define MI_IS_PAGE_WRITEABLE(x) ((x)->u.Hard.Writable == 1)
56 #endif
57 #define MI_IS_PAGE_COPY_ON_WRITE(x)((x)->u.Hard.CopyOnWrite == 1)
58 #define MI_IS_PAGE_DIRTY(x) ((x)->u.Hard.Dirty == 1)
59 #define MI_MAKE_OWNER_PAGE(x) ((x)->u.Hard.Owner = 1)
60 #if !defined(CONFIG_SMP)
61 #define MI_MAKE_WRITE_PAGE(x) ((x)->u.Hard.Write = 1)
62 #else
63 #define MI_MAKE_WRITE_PAGE(x) ((x)->u.Hard.Writable = 1)
64 #endif
65
66 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H */