1#ifndef _ASM_POWERPC_PGTABLE_PPC32_H
2#define _ASM_POWERPC_PGTABLE_PPC32_H
3
4#include <asm-generic/pgtable-nopmd.h>
5
6#ifndef __ASSEMBLY__
7#include <linux/sched.h>
8#include <linux/threads.h>
9#include <asm/io.h>
10
11extern unsigned long va_to_phys(unsigned long address);
12extern pte_t *va_to_pte(unsigned long address);
13extern unsigned long ioremap_bot, ioremap_base;
14
15#ifdef CONFIG_44x
16extern int icache_44x_need_flush;
17#endif
18
19#endif
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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#define PGDIR_SHIFT (PAGE_SHIFT + PTE_SHIFT)
82#define PGDIR_SIZE (1UL << PGDIR_SHIFT)
83#define PGDIR_MASK (~(PGDIR_SIZE-1))
84
85
86
87
88
89#ifndef __ASSEMBLY__
90#define PTE_TABLE_SIZE (sizeof(pte_t) << PTE_SHIFT)
91#define PGD_TABLE_SIZE (sizeof(pgd_t) << (32 - PGDIR_SHIFT))
92#endif
93
94#define PTRS_PER_PTE (1 << PTE_SHIFT)
95#define PTRS_PER_PMD 1
96#define PTRS_PER_PGD (1 << (32 - PGDIR_SHIFT))
97
98#define USER_PTRS_PER_PGD (TASK_SIZE / PGDIR_SIZE)
99#define FIRST_USER_ADDRESS 0
100
101#define pte_ERROR(e) \
102 printk("%s:%d: bad pte %llx.\n", __FILE__, __LINE__, \
103 (unsigned long long)pte_val(e))
104#define pgd_ERROR(e) \
105 printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124#define VMALLOC_OFFSET (0x1000000)
125#ifdef PPC_PIN_SIZE
126#define VMALLOC_START (((_ALIGN((long)high_memory, PPC_PIN_SIZE) + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)))
127#else
128#define VMALLOC_START ((((long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)))
129#endif
130#define VMALLOC_END ioremap_bot
131
132
133
134
135
136
137#if defined(CONFIG_40x)
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166#define _PAGE_GUARDED 0x001
167#define _PAGE_FILE 0x001
168#define _PAGE_PRESENT 0x002
169#define _PAGE_NO_CACHE 0x004
170#define _PAGE_WRITETHRU 0x008
171#define _PAGE_USER 0x010
172#define _PAGE_RW 0x040
173#define _PAGE_DIRTY 0x080
174#define _PAGE_HWWRITE 0x100
175#define _PAGE_HWEXEC 0x200
176#define _PAGE_ACCESSED 0x400
177
178#define _PMD_PRESENT 0x400
179#define _PMD_BAD 0x802
180#define _PMD_SIZE 0x0e0
181#define _PMD_SIZE_4M 0x0c0
182#define _PMD_SIZE_16M 0x0e0
183#define PMD_PAGE_SIZE(pmdval) (1024 << (((pmdval) & _PMD_SIZE) >> 4))
184
185
186#define PTE_ATOMIC_UPDATES 1
187
188#elif defined(CONFIG_44x)
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
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259#define _PAGE_PRESENT 0x00000001
260#define _PAGE_RW 0x00000002
261#define _PAGE_FILE 0x00000004
262#define _PAGE_HWEXEC 0x00000004
263#define _PAGE_ACCESSED 0x00000008
264#define _PAGE_DIRTY 0x00000010
265#define _PAGE_SPECIAL 0x00000020
266#define _PAGE_USER 0x00000040
267#define _PAGE_ENDIAN 0x00000080
268#define _PAGE_GUARDED 0x00000100
269#define _PAGE_COHERENT 0x00000200
270#define _PAGE_NO_CACHE 0x00000400
271#define _PAGE_WRITETHRU 0x00000800
272
273
274#define _PMD_PRESENT 0
275#define _PMD_PRESENT_MASK (PAGE_MASK)
276#define _PMD_BAD (~PAGE_MASK)
277
278
279#define _PTE_NONE_MASK 0xffffffff00000000ULL
280
281#define __HAVE_ARCH_PTE_SPECIAL
282
283#elif defined(CONFIG_FSL_BOOKE)
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298#define _PAGE_PRESENT 0x00001
299#define _PAGE_USER 0x00002
300#define _PAGE_FILE 0x00002
301#define _PAGE_RW 0x00004
302#define _PAGE_DIRTY 0x00008
303#define _PAGE_HWEXEC 0x00010
304#define _PAGE_ACCESSED 0x00020
305
306#define _PAGE_ENDIAN 0x00040
307#define _PAGE_GUARDED 0x00080
308#define _PAGE_COHERENT 0x00100
309#define _PAGE_NO_CACHE 0x00200
310#define _PAGE_WRITETHRU 0x00400
311#define _PAGE_SPECIAL 0x00800
312
313#ifdef CONFIG_PTE_64BIT
314
315#define _PTE_NONE_MASK 0xffffffffffff0000ULL
316#endif
317
318#define _PMD_PRESENT 0
319#define _PMD_PRESENT_MASK (PAGE_MASK)
320#define _PMD_BAD (~PAGE_MASK)
321
322#define __HAVE_ARCH_PTE_SPECIAL
323
324#elif defined(CONFIG_8xx)
325
326#define _PAGE_PRESENT 0x0001
327#define _PAGE_FILE 0x0002
328#define _PAGE_NO_CACHE 0x0002
329#define _PAGE_SHARED 0x0004
330
331
332
333
334#define _PAGE_EXEC 0x0008
335#define _PAGE_GUARDED 0x0010
336#define _PAGE_DIRTY 0x0020
337#define _PAGE_RW 0x0040
338#define _PAGE_ACCESSED 0x0080
339
340
341
342
343
344#define _PAGE_HWWRITE 0x0100
345#define _PAGE_USER 0x0800
346
347#define _PMD_PRESENT 0x0001
348#define _PMD_BAD 0x0ff0
349#define _PMD_PAGE_MASK 0x000c
350#define _PMD_PAGE_8M 0x000c
351
352#define _PTE_NONE_MASK _PAGE_ACCESSED
353
354
355#define PTE_ATOMIC_UPDATES 1
356
357#else
358
359#define _PAGE_PRESENT 0x001
360#define _PAGE_HASHPTE 0x002
361#define _PAGE_FILE 0x004
362#define _PAGE_USER 0x004
363#define _PAGE_GUARDED 0x008
364#define _PAGE_COHERENT 0x010
365#define _PAGE_NO_CACHE 0x020
366#define _PAGE_WRITETHRU 0x040
367#define _PAGE_DIRTY 0x080
368#define _PAGE_ACCESSED 0x100
369#define _PAGE_EXEC 0x200
370#define _PAGE_RW 0x400
371#define _PAGE_SPECIAL 0x800
372
373#ifdef CONFIG_PTE_64BIT
374
375#define _PTE_NONE_MASK (0xffffffff00000000ULL | _PAGE_HASHPTE)
376#else
377#define _PTE_NONE_MASK _PAGE_HASHPTE
378#endif
379
380#define _PMD_PRESENT 0
381#define _PMD_PRESENT_MASK (PAGE_MASK)
382#define _PMD_BAD (~PAGE_MASK)
383
384
385#define PTE_ATOMIC_UPDATES 1
386
387#define __HAVE_ARCH_PTE_SPECIAL
388
389#endif
390
391
392
393
394#ifndef _PAGE_HASHPTE
395#define _PAGE_HASHPTE 0
396#endif
397#ifndef _PTE_NONE_MASK
398#define _PTE_NONE_MASK 0
399#endif
400#ifndef _PAGE_SHARED
401#define _PAGE_SHARED 0
402#endif
403#ifndef _PAGE_HWWRITE
404#define _PAGE_HWWRITE 0
405#endif
406#ifndef _PAGE_HWEXEC
407#define _PAGE_HWEXEC 0
408#endif
409#ifndef _PAGE_EXEC
410#define _PAGE_EXEC 0
411#endif
412#ifndef _PAGE_ENDIAN
413#define _PAGE_ENDIAN 0
414#endif
415#ifndef _PAGE_COHERENT
416#define _PAGE_COHERENT 0
417#endif
418#ifndef _PAGE_WRITETHRU
419#define _PAGE_WRITETHRU 0
420#endif
421#ifndef _PAGE_SPECIAL
422#define _PAGE_SPECIAL 0
423#endif
424#ifndef _PMD_PRESENT_MASK
425#define _PMD_PRESENT_MASK _PMD_PRESENT
426#endif
427#ifndef _PMD_SIZE
428#define _PMD_SIZE 0
429#define PMD_PAGE_SIZE(pmd) bad_call_to_PMD_PAGE_SIZE()
430#endif
431
432#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY | \
433 _PAGE_SPECIAL)
434
435
436#define PAGE_PROT_BITS (_PAGE_GUARDED | _PAGE_COHERENT | _PAGE_NO_CACHE | \
437 _PAGE_WRITETHRU | _PAGE_ENDIAN | \
438 _PAGE_USER | _PAGE_ACCESSED | \
439 _PAGE_RW | _PAGE_HWWRITE | _PAGE_DIRTY | \
440 _PAGE_EXEC | _PAGE_HWEXEC)
441
442
443
444
445
446
447
448#if defined(CONFIG_SMP) || defined(CONFIG_PPC_STD_MMU)
449#define _PAGE_BASE (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_COHERENT)
450#else
451#define _PAGE_BASE (_PAGE_PRESENT | _PAGE_ACCESSED)
452#endif
453#define _PAGE_BASE_NC (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_NO_CACHE)
454
455#define _PAGE_WRENABLE (_PAGE_RW | _PAGE_DIRTY | _PAGE_HWWRITE)
456#define _PAGE_KERNEL (_PAGE_BASE | _PAGE_SHARED | _PAGE_WRENABLE)
457#define _PAGE_KERNEL_NC (_PAGE_BASE_NC | _PAGE_SHARED | _PAGE_WRENABLE)
458
459#ifdef CONFIG_PPC_STD_MMU
460
461
462#define _PAGE_KERNEL_RO (_PAGE_BASE | _PAGE_SHARED | _PAGE_USER)
463#else
464#define _PAGE_KERNEL_RO (_PAGE_BASE | _PAGE_SHARED)
465#endif
466
467#define _PAGE_IO (_PAGE_KERNEL_NC | _PAGE_GUARDED)
468#define _PAGE_RAM (_PAGE_KERNEL | _PAGE_HWEXEC)
469
470#if defined(CONFIG_KGDB) || defined(CONFIG_XMON) || defined(CONFIG_BDI_SWITCH) ||\
471 defined(CONFIG_KPROBES)
472
473
474#define _PAGE_RAM_TEXT _PAGE_RAM
475#else
476#define _PAGE_RAM_TEXT (_PAGE_KERNEL_RO | _PAGE_HWEXEC)
477#endif
478
479#define PAGE_NONE __pgprot(_PAGE_BASE)
480#define PAGE_READONLY __pgprot(_PAGE_BASE | _PAGE_USER)
481#define PAGE_READONLY_X __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_EXEC)
482#define PAGE_SHARED __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_RW)
483#define PAGE_SHARED_X __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_RW | _PAGE_EXEC)
484#define PAGE_COPY __pgprot(_PAGE_BASE | _PAGE_USER)
485#define PAGE_COPY_X __pgprot(_PAGE_BASE | _PAGE_USER | _PAGE_EXEC)
486
487#define PAGE_KERNEL __pgprot(_PAGE_RAM)
488#define PAGE_KERNEL_NOCACHE __pgprot(_PAGE_IO)
489
490
491
492
493
494
495
496#define __P000 PAGE_NONE
497#define __P001 PAGE_READONLY_X
498#define __P010 PAGE_COPY
499#define __P011 PAGE_COPY_X
500#define __P100 PAGE_READONLY
501#define __P101 PAGE_READONLY_X
502#define __P110 PAGE_COPY
503#define __P111 PAGE_COPY_X
504
505#define __S000 PAGE_NONE
506#define __S001 PAGE_READONLY_X
507#define __S010 PAGE_SHARED
508#define __S011 PAGE_SHARED_X
509#define __S100 PAGE_READONLY
510#define __S101 PAGE_READONLY_X
511#define __S110 PAGE_SHARED
512#define __S111 PAGE_SHARED_X
513
514#ifndef __ASSEMBLY__
515
516
517extern unsigned long bad_call_to_PMD_PAGE_SIZE(void);
518
519
520
521
522
523
524
525#if defined(CONFIG_FSL_BOOKE) && defined(CONFIG_PTE_64BIT)
526#define PFN_SHIFT_OFFSET (PAGE_SHIFT + 8)
527#else
528#define PFN_SHIFT_OFFSET (PAGE_SHIFT)
529#endif
530
531#define pte_pfn(x) (pte_val(x) >> PFN_SHIFT_OFFSET)
532#define pte_page(x) pfn_to_page(pte_pfn(x))
533
534#define pfn_pte(pfn, prot) __pte(((pte_basic_t)(pfn) << PFN_SHIFT_OFFSET) |\
535 pgprot_val(prot))
536#define mk_pte(page, prot) pfn_pte(page_to_pfn(page), prot)
537#endif
538
539#define pte_none(pte) ((pte_val(pte) & ~_PTE_NONE_MASK) == 0)
540#define pte_present(pte) (pte_val(pte) & _PAGE_PRESENT)
541#define pte_clear(mm, addr, ptep) \
542 do { pte_update(ptep, ~_PAGE_HASHPTE, 0); } while (0)
543
544#define pmd_none(pmd) (!pmd_val(pmd))
545#define pmd_bad(pmd) (pmd_val(pmd) & _PMD_BAD)
546#define pmd_present(pmd) (pmd_val(pmd) & _PMD_PRESENT_MASK)
547#define pmd_clear(pmdp) do { pmd_val(*(pmdp)) = 0; } while (0)
548
549#ifndef __ASSEMBLY__
550
551
552
553
554static inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW; }
555static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; }
556static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; }
557static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE; }
558static inline int pte_special(pte_t pte) { return pte_val(pte) & _PAGE_SPECIAL; }
559
560static inline pte_t pte_wrprotect(pte_t pte) {
561 pte_val(pte) &= ~(_PAGE_RW | _PAGE_HWWRITE); return pte; }
562static inline pte_t pte_mkclean(pte_t pte) {
563 pte_val(pte) &= ~(_PAGE_DIRTY | _PAGE_HWWRITE); return pte; }
564static inline pte_t pte_mkold(pte_t pte) {
565 pte_val(pte) &= ~_PAGE_ACCESSED; return pte; }
566
567static inline pte_t pte_mkwrite(pte_t pte) {
568 pte_val(pte) |= _PAGE_RW; return pte; }
569static inline pte_t pte_mkdirty(pte_t pte) {
570 pte_val(pte) |= _PAGE_DIRTY; return pte; }
571static inline pte_t pte_mkyoung(pte_t pte) {
572 pte_val(pte) |= _PAGE_ACCESSED; return pte; }
573static inline pte_t pte_mkspecial(pte_t pte) {
574 pte_val(pte) |= _PAGE_SPECIAL; return pte; }
575static inline pgprot_t pte_pgprot(pte_t pte)
576{
577 return __pgprot(pte_val(pte) & PAGE_PROT_BITS);
578}
579
580static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
581{
582 pte_val(pte) = (pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot);
583 return pte;
584}
585
586
587
588
589
590extern int flush_hash_pages(unsigned context, unsigned long va,
591 unsigned long pmdval, int count);
592
593
594extern void add_hash_page(unsigned context, unsigned long va,
595 unsigned long pmdval);
596
597
598extern void flush_hash_entry(struct mm_struct *mm, pte_t *ptep,
599 unsigned long address);
600
601
602
603
604
605
606
607
608#ifndef CONFIG_PTE_64BIT
609static inline unsigned long pte_update(pte_t *p,
610 unsigned long clr,
611 unsigned long set)
612{
613#ifdef PTE_ATOMIC_UPDATES
614 unsigned long old, tmp;
615
616 __asm__ __volatile__("\
6171: lwarx %0,0,%3\n\
618 andc %1,%0,%4\n\
619 or %1,%1,%5\n"
620 PPC405_ERR77(0,%3)
621" stwcx. %1,0,%3\n\
622 bne- 1b"
623 : "=&r" (old), "=&r" (tmp), "=m" (*p)
624 : "r" (p), "r" (clr), "r" (set), "m" (*p)
625 : "cc" );
626#else
627 unsigned long old = pte_val(*p);
628 *p = __pte((old & ~clr) | set);
629#endif
630
631#ifdef CONFIG_44x
632 if ((old & _PAGE_USER) && (old & _PAGE_HWEXEC))
633 icache_44x_need_flush = 1;
634#endif
635 return old;
636}
637#else
638static inline unsigned long long pte_update(pte_t *p,
639 unsigned long clr,
640 unsigned long set)
641{
642#ifdef PTE_ATOMIC_UPDATES
643 unsigned long long old;
644 unsigned long tmp;
645
646 __asm__ __volatile__("\
6471: lwarx %L0,0,%4\n\
648 lwzx %0,0,%3\n\
649 andc %1,%L0,%5\n\
650 or %1,%1,%6\n"
651 PPC405_ERR77(0,%3)
652" stwcx. %1,0,%4\n\
653 bne- 1b"
654 : "=&r" (old), "=&r" (tmp), "=m" (*p)
655 : "r" (p), "r" ((unsigned long)(p) + 4), "r" (clr), "r" (set), "m" (*p)
656 : "cc" );
657#else
658 unsigned long long old = pte_val(*p);
659 *p = __pte((old & ~(unsigned long long)clr) | set);
660#endif
661
662#ifdef CONFIG_44x
663 if ((old & _PAGE_USER) && (old & _PAGE_HWEXEC))
664 icache_44x_need_flush = 1;
665#endif
666 return old;
667}
668#endif
669
670
671
672
673
674
675
676static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr,
677 pte_t *ptep, pte_t pte)
678{
679#if (_PAGE_HASHPTE != 0) && defined(CONFIG_SMP) && !defined(CONFIG_PTE_64BIT)
680 pte_update(ptep, ~_PAGE_HASHPTE, pte_val(pte) & ~_PAGE_HASHPTE);
681#elif defined(CONFIG_PTE_64BIT) && defined(CONFIG_SMP)
682#if _PAGE_HASHPTE != 0
683 if (pte_val(*ptep) & _PAGE_HASHPTE)
684 flush_hash_entry(mm, ptep, addr);
685#endif
686 __asm__ __volatile__("\
687 stw%U0%X0 %2,%0\n\
688 eieio\n\
689 stw%U0%X0 %L2,%1"
690 : "=m" (*ptep), "=m" (*((unsigned char *)ptep+4))
691 : "r" (pte) : "memory");
692#else
693 *ptep = __pte((pte_val(*ptep) & _PAGE_HASHPTE)
694 | (pte_val(pte) & ~_PAGE_HASHPTE));
695#endif
696}
697
698
699static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
700 pte_t *ptep, pte_t pte)
701{
702#if defined(CONFIG_PTE_64BIT) && defined(CONFIG_SMP) && defined(CONFIG_DEBUG_VM)
703 WARN_ON(pte_present(*ptep));
704#endif
705 __set_pte_at(mm, addr, ptep, pte);
706}
707
708
709
710
711
712#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
713static inline int __ptep_test_and_clear_young(unsigned int context, unsigned long addr, pte_t *ptep)
714{
715 unsigned long old;
716 old = pte_update(ptep, _PAGE_ACCESSED, 0);
717#if _PAGE_HASHPTE != 0
718 if (old & _PAGE_HASHPTE) {
719 unsigned long ptephys = __pa(ptep) & PAGE_MASK;
720 flush_hash_pages(context, addr, ptephys, 1);
721 }
722#endif
723 return (old & _PAGE_ACCESSED) != 0;
724}
725#define ptep_test_and_clear_young(__vma, __addr, __ptep) \
726 __ptep_test_and_clear_young((__vma)->vm_mm->context.id, __addr, __ptep)
727
728#define __HAVE_ARCH_PTEP_GET_AND_CLEAR
729static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
730 pte_t *ptep)
731{
732 return __pte(pte_update(ptep, ~_PAGE_HASHPTE, 0));
733}
734
735#define __HAVE_ARCH_PTEP_SET_WRPROTECT
736static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,
737 pte_t *ptep)
738{
739 pte_update(ptep, (_PAGE_RW | _PAGE_HWWRITE), 0);
740}
741static inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
742 unsigned long addr, pte_t *ptep)
743{
744 ptep_set_wrprotect(mm, addr, ptep);
745}
746
747
748#define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
749static inline void __ptep_set_access_flags(pte_t *ptep, pte_t entry, int dirty)
750{
751 unsigned long bits = pte_val(entry) &
752 (_PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_RW);
753 pte_update(ptep, 0, bits);
754}
755
756#define ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \
757({ \
758 int __changed = !pte_same(*(__ptep), __entry); \
759 if (__changed) { \
760 __ptep_set_access_flags(__ptep, __entry, __dirty); \
761 flush_tlb_page_nohash(__vma, __address); \
762 } \
763 __changed; \
764})
765
766#define __HAVE_ARCH_PTE_SAME
767#define pte_same(A,B) (((pte_val(A) ^ pte_val(B)) & ~_PAGE_HASHPTE) == 0)
768
769
770
771
772
773
774
775
776#ifndef CONFIG_BOOKE
777#define pmd_page_vaddr(pmd) \
778 ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK))
779#define pmd_page(pmd) \
780 (mem_map + (pmd_val(pmd) >> PAGE_SHIFT))
781#else
782#define pmd_page_vaddr(pmd) \
783 ((unsigned long) (pmd_val(pmd) & PAGE_MASK))
784#define pmd_page(pmd) \
785 pfn_to_page((__pa(pmd_val(pmd)) >> PAGE_SHIFT))
786#endif
787
788
789#define pgd_offset_k(address) pgd_offset(&init_mm, address)
790
791
792#define pgd_index(address) ((address) >> PGDIR_SHIFT)
793#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address))
794
795
796#define pte_index(address) \
797 (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
798#define pte_offset_kernel(dir, addr) \
799 ((pte_t *) pmd_page_vaddr(*(dir)) + pte_index(addr))
800#define pte_offset_map(dir, addr) \
801 ((pte_t *) kmap_atomic(pmd_page(*(dir)), KM_PTE0) + pte_index(addr))
802#define pte_offset_map_nested(dir, addr) \
803 ((pte_t *) kmap_atomic(pmd_page(*(dir)), KM_PTE1) + pte_index(addr))
804
805#define pte_unmap(pte) kunmap_atomic(pte, KM_PTE0)
806#define pte_unmap_nested(pte) kunmap_atomic(pte, KM_PTE1)
807
808
809
810
811
812
813
814#define __swp_type(entry) ((entry).val & 0x1f)
815#define __swp_offset(entry) ((entry).val >> 5)
816#define __swp_entry(type, offset) ((swp_entry_t) { (type) | ((offset) << 5) })
817#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) >> 3 })
818#define __swp_entry_to_pte(x) ((pte_t) { (x).val << 3 })
819
820
821#define PTE_FILE_MAX_BITS 29
822#define pte_to_pgoff(pte) (pte_val(pte) >> 3)
823#define pgoff_to_pte(off) ((pte_t) { ((off) << 3) | _PAGE_FILE })
824
825
826
827
828#define pgtable_cache_init() do { } while (0)
829
830extern int get_pteptr(struct mm_struct *mm, unsigned long addr, pte_t **ptep,
831 pmd_t **pmdp);
832
833#endif
834
835#endif
836