fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / include / asm-i386 / mach-xen / asm / tlbflush.h
1 #ifndef _I386_TLBFLUSH_H
2 #define _I386_TLBFLUSH_H
3
4 #include <linux/mm.h>
5 #include <asm/processor.h>
6
7 #ifdef CONFIG_PARAVIRT
8 #include <asm/paravirt.h>
9 #else
10 #define __flush_tlb() __native_flush_tlb()
11 #define __flush_tlb_global() __native_flush_tlb_global()
12 #define __flush_tlb_single(addr) __native_flush_tlb_single(addr)
13 #endif
14
15 #define __native_flush_tlb() xen_tlb_flush()
16 #define __native_flush_tlb_global() xen_tlb_flush()
17 #define __native_flush_tlb_single(addr) xen_invlpg(addr)
18 #define __flush_tlb_all() xen_tlb_flush()
19
20 #define cpu_has_invlpg  (boot_cpu_data.x86 > 3)
21
22 #define __flush_tlb_one(addr) __flush_tlb_single(addr)
23
24 /*
25  * TLB flushing:
26  *
27  *  - flush_tlb() flushes the current mm struct TLBs
28  *  - flush_tlb_all() flushes all processes TLBs
29  *  - flush_tlb_mm(mm) flushes the specified mm context TLB's
30  *  - flush_tlb_page(vma, vmaddr) flushes one page
31  *  - flush_tlb_range(vma, start, end) flushes a range of pages
32  *  - flush_tlb_kernel_range(start, end) flushes a range of kernel pages
33  *  - flush_tlb_pgtables(mm, start, end) flushes a range of page tables
34  *
35  * ..but the i386 has somewhat limited tlb flushing capabilities,
36  * and page-granular flushes are available only on i486 and up.
37  */
38
39 #ifndef CONFIG_SMP
40
41 #define flush_tlb() __flush_tlb()
42 #define flush_tlb_all() __flush_tlb_all()
43 #define local_flush_tlb() __flush_tlb()
44
45 static inline void flush_tlb_mm(struct mm_struct *mm)
46 {
47         if (mm == current->active_mm)
48                 __flush_tlb();
49 }
50
51 static inline void flush_tlb_page(struct vm_area_struct *vma,
52         unsigned long addr)
53 {
54         if (vma->vm_mm == current->active_mm)
55                 __flush_tlb_one(addr);
56 }
57
58 static inline void flush_tlb_range(struct vm_area_struct *vma,
59         unsigned long start, unsigned long end)
60 {
61         if (vma->vm_mm == current->active_mm)
62                 __flush_tlb();
63 }
64
65 #else
66
67 #include <asm/smp.h>
68
69 #define local_flush_tlb() \
70         __flush_tlb()
71
72 extern void flush_tlb_all(void);
73 extern void flush_tlb_current_task(void);
74 extern void flush_tlb_mm(struct mm_struct *);
75 extern void flush_tlb_page(struct vm_area_struct *, unsigned long);
76
77 #define flush_tlb()     flush_tlb_current_task()
78
79 static inline void flush_tlb_range(struct vm_area_struct * vma, unsigned long start, unsigned long end)
80 {
81         flush_tlb_mm(vma->vm_mm);
82 }
83
84 #define TLBSTATE_OK     1
85 #define TLBSTATE_LAZY   2
86
87 struct tlb_state
88 {
89         struct mm_struct *active_mm;
90         int state;
91         char __cacheline_padding[L1_CACHE_BYTES-8];
92 };
93 DECLARE_PER_CPU(struct tlb_state, cpu_tlbstate);
94
95
96 #endif
97
98 #define flush_tlb_kernel_range(start, end) flush_tlb_all()
99
100 static inline void flush_tlb_pgtables(struct mm_struct *mm,
101                                       unsigned long start, unsigned long end)
102 {
103         /* i386 does not keep any page table caches in TLB */
104 }
105
106 #endif /* _I386_TLBFLUSH_H */