]> asedeno.scripts.mit.edu Git - linux.git/blob - arch/x86/include/asm/tlbflush.h
6397275008db55dc52d0e2e74e1b9235715cbcfb
[linux.git] / arch / x86 / include / asm / tlbflush.h
1 #ifndef _ASM_X86_TLBFLUSH_H
2 #define _ASM_X86_TLBFLUSH_H
3
4 #include <linux/mm.h>
5 #include <linux/sched.h>
6
7 #include <asm/processor.h>
8 #include <asm/cpufeature.h>
9 #include <asm/special_insns.h>
10 #include <asm/smp.h>
11
12 static inline void __invpcid(unsigned long pcid, unsigned long addr,
13                              unsigned long type)
14 {
15         struct { u64 d[2]; } desc = { { pcid, addr } };
16
17         /*
18          * The memory clobber is because the whole point is to invalidate
19          * stale TLB entries and, especially if we're flushing global
20          * mappings, we don't want the compiler to reorder any subsequent
21          * memory accesses before the TLB flush.
22          *
23          * The hex opcode is invpcid (%ecx), %eax in 32-bit mode and
24          * invpcid (%rcx), %rax in long mode.
25          */
26         asm volatile (".byte 0x66, 0x0f, 0x38, 0x82, 0x01"
27                       : : "m" (desc), "a" (type), "c" (&desc) : "memory");
28 }
29
30 #define INVPCID_TYPE_INDIV_ADDR         0
31 #define INVPCID_TYPE_SINGLE_CTXT        1
32 #define INVPCID_TYPE_ALL_INCL_GLOBAL    2
33 #define INVPCID_TYPE_ALL_NON_GLOBAL     3
34
35 /* Flush all mappings for a given pcid and addr, not including globals. */
36 static inline void invpcid_flush_one(unsigned long pcid,
37                                      unsigned long addr)
38 {
39         __invpcid(pcid, addr, INVPCID_TYPE_INDIV_ADDR);
40 }
41
42 /* Flush all mappings for a given PCID, not including globals. */
43 static inline void invpcid_flush_single_context(unsigned long pcid)
44 {
45         __invpcid(pcid, 0, INVPCID_TYPE_SINGLE_CTXT);
46 }
47
48 /* Flush all mappings, including globals, for all PCIDs. */
49 static inline void invpcid_flush_all(void)
50 {
51         __invpcid(0, 0, INVPCID_TYPE_ALL_INCL_GLOBAL);
52 }
53
54 /* Flush all mappings for all PCIDs except globals. */
55 static inline void invpcid_flush_all_nonglobals(void)
56 {
57         __invpcid(0, 0, INVPCID_TYPE_ALL_NON_GLOBAL);
58 }
59
60 static inline u64 inc_mm_tlb_gen(struct mm_struct *mm)
61 {
62         u64 new_tlb_gen;
63
64         /*
65          * Bump the generation count.  This also serves as a full barrier
66          * that synchronizes with switch_mm(): callers are required to order
67          * their read of mm_cpumask after their writes to the paging
68          * structures.
69          */
70         smp_mb__before_atomic();
71         new_tlb_gen = atomic64_inc_return(&mm->context.tlb_gen);
72         smp_mb__after_atomic();
73
74         return new_tlb_gen;
75 }
76
77 #ifdef CONFIG_PARAVIRT
78 #include <asm/paravirt.h>
79 #else
80 #define __flush_tlb() __native_flush_tlb()
81 #define __flush_tlb_global() __native_flush_tlb_global()
82 #define __flush_tlb_single(addr) __native_flush_tlb_single(addr)
83 #endif
84
85 struct tlb_context {
86         u64 ctx_id;
87         u64 tlb_gen;
88 };
89
90 struct tlb_state {
91         /*
92          * cpu_tlbstate.loaded_mm should match CR3 whenever interrupts
93          * are on.  This means that it may not match current->active_mm,
94          * which will contain the previous user mm when we're in lazy TLB
95          * mode even if we've already switched back to swapper_pg_dir.
96          */
97         struct mm_struct *loaded_mm;
98
99         /*
100          * Access to this CR4 shadow and to H/W CR4 is protected by
101          * disabling interrupts when modifying either one.
102          */
103         unsigned long cr4;
104
105         /*
106          * This is a list of all contexts that might exist in the TLB.
107          * Since we don't yet use PCID, there is only one context.
108          *
109          * For each context, ctx_id indicates which mm the TLB's user
110          * entries came from.  As an invariant, the TLB will never
111          * contain entries that are out-of-date as when that mm reached
112          * the tlb_gen in the list.
113          *
114          * To be clear, this means that it's legal for the TLB code to
115          * flush the TLB without updating tlb_gen.  This can happen
116          * (for now, at least) due to paravirt remote flushes.
117          */
118         struct tlb_context ctxs[1];
119 };
120 DECLARE_PER_CPU_SHARED_ALIGNED(struct tlb_state, cpu_tlbstate);
121
122 /* Initialize cr4 shadow for this CPU. */
123 static inline void cr4_init_shadow(void)
124 {
125         this_cpu_write(cpu_tlbstate.cr4, __read_cr4());
126 }
127
128 /* Set in this cpu's CR4. */
129 static inline void cr4_set_bits(unsigned long mask)
130 {
131         unsigned long cr4;
132
133         cr4 = this_cpu_read(cpu_tlbstate.cr4);
134         if ((cr4 | mask) != cr4) {
135                 cr4 |= mask;
136                 this_cpu_write(cpu_tlbstate.cr4, cr4);
137                 __write_cr4(cr4);
138         }
139 }
140
141 /* Clear in this cpu's CR4. */
142 static inline void cr4_clear_bits(unsigned long mask)
143 {
144         unsigned long cr4;
145
146         cr4 = this_cpu_read(cpu_tlbstate.cr4);
147         if ((cr4 & ~mask) != cr4) {
148                 cr4 &= ~mask;
149                 this_cpu_write(cpu_tlbstate.cr4, cr4);
150                 __write_cr4(cr4);
151         }
152 }
153
154 static inline void cr4_toggle_bits(unsigned long mask)
155 {
156         unsigned long cr4;
157
158         cr4 = this_cpu_read(cpu_tlbstate.cr4);
159         cr4 ^= mask;
160         this_cpu_write(cpu_tlbstate.cr4, cr4);
161         __write_cr4(cr4);
162 }
163
164 /* Read the CR4 shadow. */
165 static inline unsigned long cr4_read_shadow(void)
166 {
167         return this_cpu_read(cpu_tlbstate.cr4);
168 }
169
170 /*
171  * Save some of cr4 feature set we're using (e.g.  Pentium 4MB
172  * enable and PPro Global page enable), so that any CPU's that boot
173  * up after us can get the correct flags.  This should only be used
174  * during boot on the boot cpu.
175  */
176 extern unsigned long mmu_cr4_features;
177 extern u32 *trampoline_cr4_features;
178
179 static inline void cr4_set_bits_and_update_boot(unsigned long mask)
180 {
181         mmu_cr4_features |= mask;
182         if (trampoline_cr4_features)
183                 *trampoline_cr4_features = mmu_cr4_features;
184         cr4_set_bits(mask);
185 }
186
187 static inline void __native_flush_tlb(void)
188 {
189         /*
190          * If current->mm == NULL then we borrow a mm which may change during a
191          * task switch and therefore we must not be preempted while we write CR3
192          * back:
193          */
194         preempt_disable();
195         native_write_cr3(__native_read_cr3());
196         preempt_enable();
197 }
198
199 static inline void __native_flush_tlb_global_irq_disabled(void)
200 {
201         unsigned long cr4;
202
203         cr4 = this_cpu_read(cpu_tlbstate.cr4);
204         /* clear PGE */
205         native_write_cr4(cr4 & ~X86_CR4_PGE);
206         /* write old PGE again and flush TLBs */
207         native_write_cr4(cr4);
208 }
209
210 static inline void __native_flush_tlb_global(void)
211 {
212         unsigned long flags;
213
214         if (static_cpu_has(X86_FEATURE_INVPCID)) {
215                 /*
216                  * Using INVPCID is considerably faster than a pair of writes
217                  * to CR4 sandwiched inside an IRQ flag save/restore.
218                  */
219                 invpcid_flush_all();
220                 return;
221         }
222
223         /*
224          * Read-modify-write to CR4 - protect it from preemption and
225          * from interrupts. (Use the raw variant because this code can
226          * be called from deep inside debugging code.)
227          */
228         raw_local_irq_save(flags);
229
230         __native_flush_tlb_global_irq_disabled();
231
232         raw_local_irq_restore(flags);
233 }
234
235 static inline void __native_flush_tlb_single(unsigned long addr)
236 {
237         asm volatile("invlpg (%0)" ::"r" (addr) : "memory");
238 }
239
240 static inline void __flush_tlb_all(void)
241 {
242         if (boot_cpu_has(X86_FEATURE_PGE))
243                 __flush_tlb_global();
244         else
245                 __flush_tlb();
246
247         /*
248          * Note: if we somehow had PCID but not PGE, then this wouldn't work --
249          * we'd end up flushing kernel translations for the current ASID but
250          * we might fail to flush kernel translations for other cached ASIDs.
251          *
252          * To avoid this issue, we force PCID off if PGE is off.
253          */
254 }
255
256 static inline void __flush_tlb_one(unsigned long addr)
257 {
258         count_vm_tlb_event(NR_TLB_LOCAL_FLUSH_ONE);
259         __flush_tlb_single(addr);
260 }
261
262 #define TLB_FLUSH_ALL   -1UL
263
264 /*
265  * TLB flushing:
266  *
267  *  - flush_tlb_all() flushes all processes TLBs
268  *  - flush_tlb_mm(mm) flushes the specified mm context TLB's
269  *  - flush_tlb_page(vma, vmaddr) flushes one page
270  *  - flush_tlb_range(vma, start, end) flushes a range of pages
271  *  - flush_tlb_kernel_range(start, end) flushes a range of kernel pages
272  *  - flush_tlb_others(cpumask, info) flushes TLBs on other cpus
273  *
274  * ..but the i386 has somewhat limited tlb flushing capabilities,
275  * and page-granular flushes are available only on i486 and up.
276  */
277 struct flush_tlb_info {
278         /*
279          * We support several kinds of flushes.
280          *
281          * - Fully flush a single mm.  .mm will be set, .end will be
282          *   TLB_FLUSH_ALL, and .new_tlb_gen will be the tlb_gen to
283          *   which the IPI sender is trying to catch us up.
284          *
285          * - Partially flush a single mm.  .mm will be set, .start and
286          *   .end will indicate the range, and .new_tlb_gen will be set
287          *   such that the changes between generation .new_tlb_gen-1 and
288          *   .new_tlb_gen are entirely contained in the indicated range.
289          *
290          * - Fully flush all mms whose tlb_gens have been updated.  .mm
291          *   will be NULL, .end will be TLB_FLUSH_ALL, and .new_tlb_gen
292          *   will be zero.
293          */
294         struct mm_struct        *mm;
295         unsigned long           start;
296         unsigned long           end;
297         u64                     new_tlb_gen;
298 };
299
300 #define local_flush_tlb() __flush_tlb()
301
302 #define flush_tlb_mm(mm)        flush_tlb_mm_range(mm, 0UL, TLB_FLUSH_ALL, 0UL)
303
304 #define flush_tlb_range(vma, start, end)        \
305                 flush_tlb_mm_range(vma->vm_mm, start, end, vma->vm_flags)
306
307 extern void flush_tlb_all(void);
308 extern void flush_tlb_mm_range(struct mm_struct *mm, unsigned long start,
309                                 unsigned long end, unsigned long vmflag);
310 extern void flush_tlb_kernel_range(unsigned long start, unsigned long end);
311
312 static inline void flush_tlb_page(struct vm_area_struct *vma, unsigned long a)
313 {
314         flush_tlb_mm_range(vma->vm_mm, a, a + PAGE_SIZE, VM_NONE);
315 }
316
317 void native_flush_tlb_others(const struct cpumask *cpumask,
318                              const struct flush_tlb_info *info);
319
320 static inline void arch_tlbbatch_add_mm(struct arch_tlbflush_unmap_batch *batch,
321                                         struct mm_struct *mm)
322 {
323         inc_mm_tlb_gen(mm);
324         cpumask_or(&batch->cpumask, &batch->cpumask, mm_cpumask(mm));
325 }
326
327 extern void arch_tlbbatch_flush(struct arch_tlbflush_unmap_batch *batch);
328
329 #ifndef CONFIG_PARAVIRT
330 #define flush_tlb_others(mask, info)    \
331         native_flush_tlb_others(mask, info)
332 #endif
333
334 #endif /* _ASM_X86_TLBFLUSH_H */