patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / include / asm-ppc / tlbflush.h
1 /*
2  * include/asm-ppc/tlbflush.h
3  *
4  *  This program is free software; you can redistribute it and/or
5  *  modify it under the terms of the GNU General Public License
6  *  as published by the Free Software Foundation; either version
7  *  2 of the License, or (at your option) any later version.
8  */
9 #ifdef __KERNEL__
10 #ifndef _PPC_TLBFLUSH_H
11 #define _PPC_TLBFLUSH_H
12
13 #include <linux/config.h>
14 #include <linux/mm.h>
15
16 extern void _tlbie(unsigned long address);
17 extern void _tlbia(void);
18
19 #if defined(CONFIG_4xx)
20
21 #ifndef CONFIG_44x
22 #define __tlbia()       asm volatile ("sync; tlbia; isync" : : : "memory")
23 #else
24 #define __tlbia         _tlbia
25 #endif
26
27 static inline void flush_tlb_mm(struct mm_struct *mm)
28         { __tlbia(); }
29 static inline void flush_tlb_page(struct vm_area_struct *vma,
30                                 unsigned long vmaddr)
31         { _tlbie(vmaddr); }
32 static inline void flush_tlb_page_nohash(struct vm_area_struct *vma,
33                                          unsigned long vmaddr)
34         { _tlbie(vmaddr); }
35 static inline void flush_tlb_range(struct vm_area_struct *vma,
36                                 unsigned long start, unsigned long end)
37         { __tlbia(); }
38 static inline void flush_tlb_kernel_range(unsigned long start,
39                                 unsigned long end)
40         { __tlbia(); }
41
42 #elif defined(CONFIG_8xx)
43 #define __tlbia()       asm volatile ("tlbia; sync" : : : "memory")
44
45 static inline void flush_tlb_mm(struct mm_struct *mm)
46         { __tlbia(); }
47 static inline void flush_tlb_page(struct vm_area_struct *vma,
48                                 unsigned long vmaddr)
49         { _tlbie(vmaddr); }
50 static inline void flush_tlb_page_nohash(struct vm_area_struct *vma,
51                                          unsigned long vmaddr)
52         { _tlbie(vmaddr); }
53 static inline void flush_tlb_range(struct mm_struct *mm,
54                                 unsigned long start, unsigned long end)
55         { __tlbia(); }
56 static inline void flush_tlb_kernel_range(unsigned long start,
57                                 unsigned long end)
58         { __tlbia(); }
59
60 #else   /* 6xx, 7xx, 7xxx cpus */
61 struct mm_struct;
62 struct vm_area_struct;
63 extern void flush_tlb_mm(struct mm_struct *mm);
64 extern void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
65 extern void flush_tlb_page_nohash(struct vm_area_struct *vma, unsigned long addr);
66 extern void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
67                             unsigned long end);
68 extern void flush_tlb_kernel_range(unsigned long start, unsigned long end);
69 #endif
70
71 /*
72  * This is called in munmap when we have freed up some page-table
73  * pages.  We don't need to do anything here, there's nothing special
74  * about our page-table pages.  -- paulus
75  */
76 static inline void flush_tlb_pgtables(struct mm_struct *mm,
77                                       unsigned long start, unsigned long end)
78 {
79 }
80
81 /*
82  * This gets called at the end of handling a page fault, when
83  * the kernel has put a new PTE into the page table for the process.
84  * We use it to ensure coherency between the i-cache and d-cache
85  * for the page which has just been mapped in.
86  * On machines which use an MMU hash table, we use this to put a
87  * corresponding HPTE into the hash table ahead of time, instead of
88  * waiting for the inevitable extra hash-table miss exception.
89  */
90 extern void update_mmu_cache(struct vm_area_struct *, unsigned long, pte_t);
91
92 #endif /* _PPC_TLBFLUSH_H */
93 #endif /*__KERNEL__ */