Blame view

include/asm-x86_64/pgtable.h 14.3 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  #ifndef _X86_64_PGTABLE_H
  #define _X86_64_PGTABLE_H
6df95fd7a   Randy Dunlap   consolidate asm/c...
3
  #include <linux/const.h>
9d291e787   Vivek Goyal   [PATCH] x86-64: A...
4
  #ifndef __ASSEMBLY__
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
6
7
8
9
  /*
   * This file contains the functions and defines necessary to modify and use
   * the x86-64 page table tree.
   */
  #include <asm/processor.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
11
12
13
14
  #include <asm/bitops.h>
  #include <linux/threads.h>
  #include <asm/pda.h>
  
  extern pud_t level3_kernel_pgt[512];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
16
17
18
  extern pud_t level3_ident_pgt[512];
  extern pmd_t level2_kernel_pgt[512];
  extern pgd_t init_level4_pgt[];
  extern unsigned long __supported_pte_mask;
e3ebadd95   Linus Torvalds   Revert "[PATCH] x...
19
  #define swapper_pg_dir init_level4_pgt
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
  extern void paging_init(void);
  extern void clear_kernel_mapping(unsigned long addr, unsigned long size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
24
25
26
27
  /*
   * ZERO_PAGE is a global shared page that is always zero: used
   * for zero-mapped memory areas etc..
   */
  extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)];
e3ebadd95   Linus Torvalds   Revert "[PATCH] x...
28
  #define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29

9d291e787   Vivek Goyal   [PATCH] x86-64: A...
30
  #endif /* !__ASSEMBLY__ */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
  /*
   * PGDIR_SHIFT determines what a top-level page table entry can map
   */
  #define PGDIR_SHIFT	39
  #define PTRS_PER_PGD	512
  
  /*
   * 3rd level page
   */
  #define PUD_SHIFT	30
  #define PTRS_PER_PUD	512
  
  /*
   * PMD_SHIFT determines the size of the area a middle-level
   * page table can map
   */
  #define PMD_SHIFT	21
  #define PTRS_PER_PMD	512
  
  /*
   * entries per page directory level
   */
  #define PTRS_PER_PTE	512
9d291e787   Vivek Goyal   [PATCH] x86-64: A...
54
  #ifndef __ASSEMBLY__
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  #define pte_ERROR(e) \
  	printk("%s:%d: bad pte %p(%016lx).
  ", __FILE__, __LINE__, &(e), pte_val(e))
  #define pmd_ERROR(e) \
  	printk("%s:%d: bad pmd %p(%016lx).
  ", __FILE__, __LINE__, &(e), pmd_val(e))
  #define pud_ERROR(e) \
  	printk("%s:%d: bad pud %p(%016lx).
  ", __FILE__, __LINE__, &(e), pud_val(e))
  #define pgd_ERROR(e) \
  	printk("%s:%d: bad pgd %p(%016lx).
  ", __FILE__, __LINE__, &(e), pgd_val(e))
  
  #define pgd_none(x)	(!pgd_val(x))
  #define pud_none(x)	(!pud_val(x))
  
  static inline void set_pte(pte_t *dst, pte_t val)
  {
  	pte_val(*dst) = pte_val(val);
  } 
  #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)
  
  static inline void set_pmd(pmd_t *dst, pmd_t val)
  {
          pmd_val(*dst) = pmd_val(val); 
  } 
  
  static inline void set_pud(pud_t *dst, pud_t val)
  {
  	pud_val(*dst) = pud_val(val);
  }
9c0aa0f9a   Adrian Bunk   [PATCH] Replace e...
86
  static inline void pud_clear (pud_t *pud)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
87
88
89
90
91
92
93
94
  {
  	set_pud(pud, __pud(0));
  }
  
  static inline void set_pgd(pgd_t *dst, pgd_t val)
  {
  	pgd_val(*dst) = pgd_val(val); 
  } 
9c0aa0f9a   Adrian Bunk   [PATCH] Replace e...
95
  static inline void pgd_clear (pgd_t * pgd)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96
97
98
  {
  	set_pgd(pgd, __pgd(0));
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
  #define ptep_get_and_clear(mm,addr,xp)	__pte(xchg(&(xp)->pte, 0))
61e06037e   Zachary Amsden   [PATCH] x86_64: a...
100

8c65b4a60   Tim Schmielau   [PATCH] fix remai...
101
  struct mm_struct;
61e06037e   Zachary Amsden   [PATCH] x86_64: a...
102
103
104
105
106
107
108
109
110
111
112
  static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, unsigned long addr, pte_t *ptep, int full)
  {
  	pte_t pte;
  	if (full) {
  		pte = *ptep;
  		*ptep = __pte(0);
  	} else {
  		pte = ptep_get_and_clear(mm, addr, ptep);
  	}
  	return pte;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113
  #define pte_same(a, b)		((a).pte == (b).pte)
c728252c7   Arjan van de Ven   [PATCH] x86/x86_6...
114
  #define pte_pgprot(a)	(__pgprot((a).pte & ~PHYSICAL_PAGE_MASK))
9d291e787   Vivek Goyal   [PATCH] x86-64: A...
115
116
117
  #endif /* !__ASSEMBLY__ */
  
  #define PMD_SIZE	(_AC(1,UL) << PMD_SHIFT)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118
  #define PMD_MASK	(~(PMD_SIZE-1))
9d291e787   Vivek Goyal   [PATCH] x86-64: A...
119
  #define PUD_SIZE	(_AC(1,UL) << PUD_SHIFT)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120
  #define PUD_MASK	(~(PUD_SIZE-1))
9d291e787   Vivek Goyal   [PATCH] x86-64: A...
121
  #define PGDIR_SIZE	(_AC(1,UL) << PGDIR_SHIFT)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
122
  #define PGDIR_MASK	(~(PGDIR_SIZE-1))
f83f2b5fb   Jan Beulich   [PATCH] x86_64: f...
123
  #define USER_PTRS_PER_PGD	((TASK_SIZE-1)/PGDIR_SIZE+1)
d455a3696   Hugh Dickins   [PATCH] freepgt: ...
124
  #define FIRST_USER_ADDRESS	0
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
125

63f6564d3   Randy Dunlap   x86_64: kill 1900...
126
127
128
129
130
  #define MAXMEM		 _AC(0x3fffffffffff, UL)
  #define VMALLOC_START    _AC(0xffffc20000000000, UL)
  #define VMALLOC_END      _AC(0xffffe1ffffffffff, UL)
  #define MODULES_VADDR    _AC(0xffffffff88000000, UL)
  #define MODULES_END      _AC(0xfffffffffff00000, UL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
  #define MODULES_LEN   (MODULES_END - MODULES_VADDR)
  
  #define _PAGE_BIT_PRESENT	0
  #define _PAGE_BIT_RW		1
  #define _PAGE_BIT_USER		2
  #define _PAGE_BIT_PWT		3
  #define _PAGE_BIT_PCD		4
  #define _PAGE_BIT_ACCESSED	5
  #define _PAGE_BIT_DIRTY		6
  #define _PAGE_BIT_PSE		7	/* 4 MB (or 2MB) page */
  #define _PAGE_BIT_GLOBAL	8	/* Global TLB entry PPro+ */
  #define _PAGE_BIT_NX           63       /* No execute: only valid after cpuid check */
  
  #define _PAGE_PRESENT	0x001
  #define _PAGE_RW	0x002
  #define _PAGE_USER	0x004
  #define _PAGE_PWT	0x008
  #define _PAGE_PCD	0x010
  #define _PAGE_ACCESSED	0x020
  #define _PAGE_DIRTY	0x040
  #define _PAGE_PSE	0x080	/* 2MB page */
9b4ee40eb   Paolo 'Blaisorblade' Giarrusso   [PATCH] mm: corre...
152
  #define _PAGE_FILE	0x040	/* nonlinear file mapping, saved PTE; unset:swap */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
153
154
155
  #define _PAGE_GLOBAL	0x100	/* Global TLB entry */
  
  #define _PAGE_PROTNONE	0x080	/* If not present */
9d291e787   Vivek Goyal   [PATCH] x86-64: A...
156
  #define _PAGE_NX        (_AC(1,UL)<<_PAGE_BIT_NX)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
  
  #define _PAGE_TABLE	(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY)
  #define _KERNPG_TABLE	(_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
  
  #define _PAGE_CHG_MASK	(PTE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY)
  
  #define PAGE_NONE	__pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED)
  #define PAGE_SHARED	__pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)
  #define PAGE_SHARED_EXEC __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED)
  #define PAGE_COPY_NOEXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)
  #define PAGE_COPY PAGE_COPY_NOEXEC
  #define PAGE_COPY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
  #define PAGE_READONLY	__pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)
  #define PAGE_READONLY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
  #define __PAGE_KERNEL \
  	(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_NX)
  #define __PAGE_KERNEL_EXEC \
  	(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
  #define __PAGE_KERNEL_NOCACHE \
  	(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_PCD | _PAGE_ACCESSED | _PAGE_NX)
  #define __PAGE_KERNEL_RO \
  	(_PAGE_PRESENT | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_NX)
  #define __PAGE_KERNEL_VSYSCALL \
  	(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
  #define __PAGE_KERNEL_VSYSCALL_NOCACHE \
  	(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_PCD)
  #define __PAGE_KERNEL_LARGE \
  	(__PAGE_KERNEL | _PAGE_PSE)
8bf275566   Eric W. Biederman   [PATCH] x86_64 ma...
185
186
  #define __PAGE_KERNEL_LARGE_EXEC \
  	(__PAGE_KERNEL_EXEC | _PAGE_PSE)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
  
  #define MAKE_GLOBAL(x) __pgprot((x) | _PAGE_GLOBAL)
  
  #define PAGE_KERNEL MAKE_GLOBAL(__PAGE_KERNEL)
  #define PAGE_KERNEL_EXEC MAKE_GLOBAL(__PAGE_KERNEL_EXEC)
  #define PAGE_KERNEL_RO MAKE_GLOBAL(__PAGE_KERNEL_RO)
  #define PAGE_KERNEL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_NOCACHE)
  #define PAGE_KERNEL_VSYSCALL32 __pgprot(__PAGE_KERNEL_VSYSCALL)
  #define PAGE_KERNEL_VSYSCALL MAKE_GLOBAL(__PAGE_KERNEL_VSYSCALL)
  #define PAGE_KERNEL_LARGE MAKE_GLOBAL(__PAGE_KERNEL_LARGE)
  #define PAGE_KERNEL_VSYSCALL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_VSYSCALL_NOCACHE)
  
  /*         xwr */
  #define __P000	PAGE_NONE
  #define __P001	PAGE_READONLY
  #define __P010	PAGE_COPY
  #define __P011	PAGE_COPY
  #define __P100	PAGE_READONLY_EXEC
  #define __P101	PAGE_READONLY_EXEC
  #define __P110	PAGE_COPY_EXEC
  #define __P111	PAGE_COPY_EXEC
  
  #define __S000	PAGE_NONE
  #define __S001	PAGE_READONLY
  #define __S010	PAGE_SHARED
  #define __S011	PAGE_SHARED
  #define __S100	PAGE_READONLY_EXEC
  #define __S101	PAGE_READONLY_EXEC
  #define __S110	PAGE_SHARED_EXEC
  #define __S111	PAGE_SHARED_EXEC
9d291e787   Vivek Goyal   [PATCH] x86-64: A...
217
  #ifndef __ASSEMBLY__
eab724e5d   Jan Beulich   [PATCH] x86-64: a...
218
219
220
221
  static inline unsigned long pgd_bad(pgd_t pgd)
  {
  	return pgd_val(pgd) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
222
223
224
  
  static inline unsigned long pud_bad(pud_t pud)
  {
eab724e5d   Jan Beulich   [PATCH] x86-64: a...
225
226
227
228
229
230
  	return pud_val(pud) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER);
  }
  
  static inline unsigned long pmd_bad(pmd_t pmd)
  {
  	return pmd_val(pmd) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
231
232
233
234
235
236
237
238
239
  }
  
  #define pte_none(x)	(!pte_val(x))
  #define pte_present(x)	(pte_val(x) & (_PAGE_PRESENT | _PAGE_PROTNONE))
  #define pte_clear(mm,addr,xp)	do { set_pte_at(mm, addr, xp, __pte(0)); } while (0)
  
  #define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT))	/* FIXME: is this
  						   right? */
  #define pte_page(x)	pfn_to_page(pte_pfn(x))
6b75aeedd   Andi Kleen   [PATCH] x86_64: D...
240
  #define pte_pfn(x)  ((pte_val(x) & __PHYSICAL_MASK) >> PAGE_SHIFT)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
241
242
243
244
245
246
247
248
249
250
251
252
253
254
  
  static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot)
  {
  	pte_t pte;
  	pte_val(pte) = (page_nr << PAGE_SHIFT);
  	pte_val(pte) |= pgprot_val(pgprot);
  	pte_val(pte) &= __supported_pte_mask;
  	return pte;
  }
  
  /*
   * The following only work if pte_present() is true.
   * Undefined behaviour if not..
   */
32e51a8c9   Adam Litke   [PATCH] hugetlb: ...
255
  #define __LARGE_PTE (_PAGE_PSE|_PAGE_PRESENT)
4839057ca   Adrian Bunk   [PATCH] x86_64: "...
256
257
258
  static inline int pte_dirty(pte_t pte)		{ return pte_val(pte) & _PAGE_DIRTY; }
  static inline int pte_young(pte_t pte)		{ return pte_val(pte) & _PAGE_ACCESSED; }
  static inline int pte_write(pte_t pte)		{ return pte_val(pte) & _PAGE_RW; }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
259
  static inline int pte_file(pte_t pte)		{ return pte_val(pte) & _PAGE_FILE; }
8f860591f   Zhang, Yanmin   [PATCH] Enable mp...
260
  static inline int pte_huge(pte_t pte)		{ return pte_val(pte) & _PAGE_PSE; }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
261

4839057ca   Adrian Bunk   [PATCH] x86_64: "...
262
263
264
  static inline pte_t pte_mkclean(pte_t pte)	{ set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_DIRTY)); return pte; }
  static inline pte_t pte_mkold(pte_t pte)	{ set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_ACCESSED)); return pte; }
  static inline pte_t pte_wrprotect(pte_t pte)	{ set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_RW)); return pte; }
df992848f   Andi Kleen   [PATCH] Fix pte_e...
265
  static inline pte_t pte_mkexec(pte_t pte)	{ set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_NX)); return pte; }
4839057ca   Adrian Bunk   [PATCH] x86_64: "...
266
267
268
  static inline pte_t pte_mkdirty(pte_t pte)	{ set_pte(&pte, __pte(pte_val(pte) | _PAGE_DIRTY)); return pte; }
  static inline pte_t pte_mkyoung(pte_t pte)	{ set_pte(&pte, __pte(pte_val(pte) | _PAGE_ACCESSED)); return pte; }
  static inline pte_t pte_mkwrite(pte_t pte)	{ set_pte(&pte, __pte(pte_val(pte) | _PAGE_RW)); return pte; }
8f860591f   Zhang, Yanmin   [PATCH] Enable mp...
269
  static inline pte_t pte_mkhuge(pte_t pte)	{ set_pte(&pte, __pte(pte_val(pte) | _PAGE_PSE)); return pte; }
5e6b0bfe5   Andi Kleen   [PATCH] Use prope...
270
  static inline pte_t pte_clrhuge(pte_t pte)	{ set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_PSE)); return pte; }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
271
272
  
  struct vm_area_struct;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
273
274
275
276
  static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
  {
  	if (!pte_young(*ptep))
  		return 0;
3d1712c91   Akinobu Mita   [PATCH] x86_64: {...
277
  	return test_and_clear_bit(_PAGE_BIT_ACCESSED, &ptep->pte);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
278
279
280
281
  }
  
  static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
  {
3d1712c91   Akinobu Mita   [PATCH] x86_64: {...
282
  	clear_bit(_PAGE_BIT_RW, &ptep->pte);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
283
284
285
286
287
288
  }
  
  /*
   * Macro to mark a page protection value as "uncacheable".
   */
  #define pgprot_noncached(prot)	(__pgprot(pgprot_val(prot) | _PAGE_PCD | _PAGE_PWT))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
289
290
291
292
293
294
295
296
297
  static inline int pmd_large(pmd_t pte) { 
  	return (pmd_val(pte) & __LARGE_PTE) == __LARGE_PTE; 
  } 	
  
  
  /*
   * Conversion functions: convert a page and protection to a page entry,
   * and a page entry and page directory to the page they refer to.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
298
299
300
  /*
   * Level 4 access.
   */
46a82b2d5   Dave McCracken   [PATCH] Standardi...
301
302
  #define pgd_page_vaddr(pgd) ((unsigned long) __va((unsigned long)pgd_val(pgd) & PTE_MASK))
  #define pgd_page(pgd)		(pfn_to_page(pgd_val(pgd) >> PAGE_SHIFT))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
303
304
305
306
307
308
309
310
  #define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
  #define pgd_offset(mm, addr) ((mm)->pgd + pgd_index(addr))
  #define pgd_offset_k(address) (init_level4_pgt + pgd_index(address))
  #define pgd_present(pgd) (pgd_val(pgd) & _PAGE_PRESENT)
  #define mk_kernel_pgd(address) ((pgd_t){ (address) | _KERNPG_TABLE })
  
  /* PUD - Level3 access */
  /* to find an entry in a page-table-directory. */
46a82b2d5   Dave McCracken   [PATCH] Standardi...
311
312
  #define pud_page_vaddr(pud) ((unsigned long) __va(pud_val(pud) & PHYSICAL_PAGE_MASK))
  #define pud_page(pud)		(pfn_to_page(pud_val(pud) >> PAGE_SHIFT))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
313
  #define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD-1))
46a82b2d5   Dave McCracken   [PATCH] Standardi...
314
  #define pud_offset(pgd, address) ((pud_t *) pgd_page_vaddr(*(pgd)) + pud_index(address))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
315
  #define pud_present(pud) (pud_val(pud) & _PAGE_PRESENT)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
316
  /* PMD  - Level 2 access */
46a82b2d5   Dave McCracken   [PATCH] Standardi...
317
  #define pmd_page_vaddr(pmd) ((unsigned long) __va(pmd_val(pmd) & PTE_MASK))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
318
319
320
  #define pmd_page(pmd)		(pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
  
  #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
46a82b2d5   Dave McCracken   [PATCH] Standardi...
321
  #define pmd_offset(dir, address) ((pmd_t *) pud_page_vaddr(*(dir)) + \
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
322
323
324
325
  			pmd_index(address))
  #define pmd_none(x)	(!pmd_val(x))
  #define pmd_present(x)	(pmd_val(x) & _PAGE_PRESENT)
  #define pmd_clear(xp)	do { set_pmd(xp, __pmd(0)); } while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
326
  #define pfn_pmd(nr,prot) (__pmd(((nr) << PAGE_SHIFT) | pgprot_val(prot)))
6b75aeedd   Andi Kleen   [PATCH] x86_64: D...
327
  #define pmd_pfn(x)  ((pmd_val(x) & __PHYSICAL_MASK) >> PAGE_SHIFT)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
328
329
330
331
332
333
334
335
336
337
338
  
  #define pte_to_pgoff(pte) ((pte_val(pte) & PHYSICAL_PAGE_MASK) >> PAGE_SHIFT)
  #define pgoff_to_pte(off) ((pte_t) { ((off) << PAGE_SHIFT) | _PAGE_FILE })
  #define PTE_FILE_MAX_BITS __PHYSICAL_MASK_SHIFT
  
  /* PTE - Level 1 access. */
  
  /* page, protection -> pte */
  #define mk_pte(page, pgprot)	pfn_pte(page_to_pfn(page), (pgprot))
  #define mk_pte_huge(entry) (pte_val(entry) |= _PAGE_PRESENT | _PAGE_PSE)
   
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
339
  /* Change flags of a PTE */
9c0aa0f9a   Adrian Bunk   [PATCH] Replace e...
340
  static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
341
342
343
344
345
346
347
348
  { 
  	pte_val(pte) &= _PAGE_CHG_MASK;
  	pte_val(pte) |= pgprot_val(newprot);
  	pte_val(pte) &= __supported_pte_mask;
         return pte; 
  }
  
  #define pte_index(address) \
1294b118c   Kirill Korotaev   [PATCH] x86_64: A...
349
  		(((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
46a82b2d5   Dave McCracken   [PATCH] Standardi...
350
  #define pte_offset_kernel(dir, address) ((pte_t *) pmd_page_vaddr(*(dir)) + \
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
  			pte_index(address))
  
  /* x86-64 always has all page tables mapped. */
  #define pte_offset_map(dir,address) pte_offset_kernel(dir,address)
  #define pte_offset_map_nested(dir,address) pte_offset_kernel(dir,address)
  #define pte_unmap(pte) /* NOP */
  #define pte_unmap_nested(pte) /* NOP */ 
  
  #define update_mmu_cache(vma,address,pte) do { } while (0)
  
  /* We only update the dirty/accessed state if we set
   * the dirty bit by hand in the kernel, since the hardware
   * will do the accessed bit for us, and we don't want to
   * race with other CPU's that might be updating the dirty
   * bit at the same time. */
  #define  __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
  #define ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \
8dab5241d   Benjamin Herrenschmidt   Rework ptep_set_a...
368
369
370
371
372
373
374
375
  ({									  \
  	int __changed = !pte_same(*(__ptep), __entry);			  \
  	if (__changed && __dirty) {					  \
  		set_pte(__ptep, __entry);			  	  \
  		flush_tlb_page(__vma, __address);		  	  \
  	}								  \
  	__changed;							  \
  })
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
376
377
378
379
380
381
382
  
  /* Encode and de-code a swap entry */
  #define __swp_type(x)			(((x).val >> 1) & 0x3f)
  #define __swp_offset(x)			((x).val >> 8)
  #define __swp_entry(type, offset)	((swp_entry_t) { ((type) << 1) | ((offset) << 8) })
  #define __pte_to_swp_entry(pte)		((swp_entry_t) { pte_val(pte) })
  #define __swp_entry_to_pte(x)		((pte_t) { (x).val })
8c914cb70   Jan Beulich   [PATCH] x86_64: a...
383
  extern spinlock_t pgd_lock;
2bff73830   Christoph Lameter   [PATCH] x86-64: u...
384
  extern struct list_head pgd_list;
8c914cb70   Jan Beulich   [PATCH] x86_64: a...
385

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
386
  extern int kern_addr_valid(unsigned long addr); 
19d36ccdc   Andi Kleen   x86: Fix alternat...
387
  pte_t *lookup_address(unsigned long addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
388
389
  #define io_remap_pfn_range(vma, vaddr, pfn, size, prot)		\
  		remap_pfn_range(vma, vaddr, pfn, size, prot)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
390
391
392
  #define HAVE_ARCH_UNMAPPED_AREA
  
  #define pgtable_cache_init()   do { } while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
393
394
395
396
397
398
399
400
401
402
  
  #define PAGE_AGP    PAGE_KERNEL_NOCACHE
  #define HAVE_PAGE_AGP 1
  
  /* fs/proc/kcore.c */
  #define	kc_vaddr_to_offset(v) ((v) & __VIRTUAL_MASK)
  #define	kc_offset_to_vaddr(o) \
     (((o) & (1UL << (__VIRTUAL_MASK_SHIFT-1))) ? ((o) | (~__VIRTUAL_MASK)) : (o))
  
  #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
403
  #define __HAVE_ARCH_PTEP_GET_AND_CLEAR
61e06037e   Zachary Amsden   [PATCH] x86_64: a...
404
  #define __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
405
406
407
  #define __HAVE_ARCH_PTEP_SET_WRPROTECT
  #define __HAVE_ARCH_PTE_SAME
  #include <asm-generic/pgtable.h>
9d291e787   Vivek Goyal   [PATCH] x86-64: A...
408
  #endif /* !__ASSEMBLY__ */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
409
410
  
  #endif /* _X86_64_PGTABLE_H */