Add some missing macros
[reactos.git] / reactos / ntoskrnl / include / internal / amd64 / mm.h
1 /*
2 * Lowlevel memory managment definitions
3 */
4
5 #ifndef __NTOSKRNL_INCLUDE_INTERNAL_AMD64_MM_H
6 #define __NTOSKRNL_INCLUDE_INTERNAL_AMD64_MM_H
7
8 struct _EPROCESS;
9
10 PULONG64
11 FORCEINLINE
12 MmGetPageDirectory(VOID)
13 {
14 return (PULONG64)__readcr3();
15 }
16
17 #define PAGE_MASK(x) ((x)&(~0xfff))
18 #define PAE_PAGE_MASK(x) ((x)&(~0xfffLL))
19
20 /* Base addresses of PTE and PDE */
21 //#define PAGETABLE_MAP PTE_BASE
22 //#define PAGEDIRECTORY_MAP (0xc0000000 + (PAGETABLE_MAP / (1024)))
23
24 /* Converting address to a corresponding PDE or PTE entry */
25 #define MiAddressToPxe(x) \
26 ((PMMPTE)(((((ULONG64)(x)) >> PXI_SHIFT) << 3) + PXE_BASE))
27 #define MiAddressToPpe(x) \
28 ((PMMPTE)(((((ULONG64)(x)) >> PPI_SHIFT) << 3) + PPE_BASE))
29 #define MiAddressToPde(x) \
30 ((PMMPTE)(((((ULONG64)(x)) >> PDI_SHIFT) << 3) + PDE_BASE))
31 #define MiAddressToPte(x) \
32 ((PMMPTE)(((((ULONG64)(x)) >> PTI_SHIFT) << 3) + PTE_BASE))
33
34 /* Convert a PTE into a corresponding address */
35 #define MiPteToAddress(PTE) ((PVOID)((ULONG64)(PTE) << 9))
36
37 //#define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (1024 * PAGE_SIZE))
38 //#define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE)))
39 //#define ADDR_TO_PTE_OFFSET(v) ((((ULONG)(v)) % (1024 * PAGE_SIZE)) / PAGE_SIZE)
40
41 #define VAtoPXI(va) ((((ULONG64)va) >> PXI_SHIFT) & 0x1FF)
42 #define VAtoPPI(va) ((((ULONG64)va) >> PPI_SHIFT) & 0x1FF)
43 #define VAtoPDI(va) ((((ULONG64)va) >> PDI_SHIFT) & 0x1FF)
44 #define VAtoPTI(va) ((((ULONG64)va) >> PTI_SHIFT) & 0x1FF)
45
46
47 /* Easy accessing PFN in PTE */
48 #define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber)
49
50 // FIXME, only copied from x86
51 #define MI_MAKE_LOCAL_PAGE(x) ((x)->u.Hard.Global = 0)
52 #define MI_MAKE_DIRTY_PAGE(x) ((x)->u.Hard.Dirty = 1)
53 #define MI_PAGE_DISABLE_CACHE(x) ((x)->u.Hard.CacheDisable = 1)
54 #define MI_PAGE_WRITE_THROUGH(x) ((x)->u.Hard.WriteThrough = 1)
55 #define MI_PAGE_WRITE_COMBINED(x) ((x)->u.Hard.WriteThrough = 0)
56 #define MI_IS_PAGE_WRITEABLE(x) ((x)->u.Hard.Write == 1)
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
60 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_AMD64_MM_H */