1
2#include <linux/init.h>
3
4#include <linux/mm.h>
5#include <linux/spinlock.h>
6#include <linux/smp.h>
7#include <linux/interrupt.h>
8#include <linux/export.h>
9#include <linux/cpu.h>
10#include <linux/debugfs.h>
11
12#include <asm/tlbflush.h>
13#include <asm/mmu_context.h>
14#include <asm/nospec-branch.h>
15#include <asm/cache.h>
16#include <asm/apic.h>
17
18#include "mm_internal.h"
19
20#ifdef CONFIG_PARAVIRT
21# define STATIC_NOPV
22#else
23# define STATIC_NOPV static
24# define __flush_tlb_local native_flush_tlb_local
25# define __flush_tlb_global native_flush_tlb_global
26# define __flush_tlb_one_user(addr) native_flush_tlb_one_user(addr)
27# define __flush_tlb_others(msk, info) native_flush_tlb_others(msk, info)
28#endif
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48#define LAST_USER_MM_IBPB 0x1UL
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#define CR3_HW_ASID_BITS 12
80
81
82
83
84
85#ifdef CONFIG_PAGE_TABLE_ISOLATION
86# define PTI_CONSUMED_PCID_BITS 1
87#else
88# define PTI_CONSUMED_PCID_BITS 0
89#endif
90
91#define CR3_AVAIL_PCID_BITS (X86_CR3_PCID_BITS - PTI_CONSUMED_PCID_BITS)
92
93
94
95
96
97
98#define MAX_ASID_AVAILABLE ((1 << CR3_AVAIL_PCID_BITS) - 2)
99
100
101
102
103static inline u16 kern_pcid(u16 asid)
104{
105 VM_WARN_ON_ONCE(asid > MAX_ASID_AVAILABLE);
106
107#ifdef CONFIG_PAGE_TABLE_ISOLATION
108
109
110
111
112 BUILD_BUG_ON(TLB_NR_DYN_ASIDS >= (1 << X86_CR3_PTI_PCID_USER_BIT));
113
114
115
116
117
118 VM_WARN_ON_ONCE(asid & (1 << X86_CR3_PTI_PCID_USER_BIT));
119#endif
120
121
122
123
124
125
126
127
128
129
130
131
132
133 return asid + 1;
134}
135
136
137
138
139static inline u16 user_pcid(u16 asid)
140{
141 u16 ret = kern_pcid(asid);
142#ifdef CONFIG_PAGE_TABLE_ISOLATION
143 ret |= 1 << X86_CR3_PTI_PCID_USER_BIT;
144#endif
145 return ret;
146}
147
148static inline unsigned long build_cr3(pgd_t *pgd, u16 asid)
149{
150 if (static_cpu_has(X86_FEATURE_PCID)) {
151 return __sme_pa(pgd) | kern_pcid(asid);
152 } else {
153 VM_WARN_ON_ONCE(asid != 0);
154 return __sme_pa(pgd);
155 }
156}
157
158static inline unsigned long build_cr3_noflush(pgd_t *pgd, u16 asid)
159{
160 VM_WARN_ON_ONCE(asid > MAX_ASID_AVAILABLE);
161
162
163
164
165
166 VM_WARN_ON_ONCE(!boot_cpu_has(X86_FEATURE_PCID));
167 return __sme_pa(pgd) | kern_pcid(asid) | CR3_NOFLUSH;
168}
169
170
171
172
173
174
175
176static void clear_asid_other(void)
177{
178 u16 asid;
179
180
181
182
183
184 if (!static_cpu_has(X86_FEATURE_PTI)) {
185 WARN_ON_ONCE(1);
186 return;
187 }
188
189 for (asid = 0; asid < TLB_NR_DYN_ASIDS; asid++) {
190
191 if (asid == this_cpu_read(cpu_tlbstate.loaded_mm_asid))
192 continue;
193
194
195
196
197 this_cpu_write(cpu_tlbstate.ctxs[asid].ctx_id, 0);
198 }
199 this_cpu_write(cpu_tlbstate.invalidate_other, false);
200}
201
202atomic64_t last_mm_ctx_id = ATOMIC64_INIT(1);
203
204
205static void choose_new_asid(struct mm_struct *next, u64 next_tlb_gen,
206 u16 *new_asid, bool *need_flush)
207{
208 u16 asid;
209
210 if (!static_cpu_has(X86_FEATURE_PCID)) {
211 *new_asid = 0;
212 *need_flush = true;
213 return;
214 }
215
216 if (this_cpu_read(cpu_tlbstate.invalidate_other))
217 clear_asid_other();
218
219 for (asid = 0; asid < TLB_NR_DYN_ASIDS; asid++) {
220 if (this_cpu_read(cpu_tlbstate.ctxs[asid].ctx_id) !=
221 next->context.ctx_id)
222 continue;
223
224 *new_asid = asid;
225 *need_flush = (this_cpu_read(cpu_tlbstate.ctxs[asid].tlb_gen) <
226 next_tlb_gen);
227 return;
228 }
229
230
231
232
233
234 *new_asid = this_cpu_add_return(cpu_tlbstate.next_asid, 1) - 1;
235 if (*new_asid >= TLB_NR_DYN_ASIDS) {
236 *new_asid = 0;
237 this_cpu_write(cpu_tlbstate.next_asid, 1);
238 }
239 *need_flush = true;
240}
241
242
243
244
245
246
247
248static inline void invalidate_user_asid(u16 asid)
249{
250
251 if (!IS_ENABLED(CONFIG_PAGE_TABLE_ISOLATION))
252 return;
253
254
255
256
257
258 if (!cpu_feature_enabled(X86_FEATURE_PCID))
259 return;
260
261 if (!static_cpu_has(X86_FEATURE_PTI))
262 return;
263
264 __set_bit(kern_pcid(asid),
265 (unsigned long *)this_cpu_ptr(&cpu_tlbstate.user_pcid_flush_mask));
266}
267
268static void load_new_mm_cr3(pgd_t *pgdir, u16 new_asid, bool need_flush)
269{
270 unsigned long new_mm_cr3;
271
272 if (need_flush) {
273 invalidate_user_asid(new_asid);
274 new_mm_cr3 = build_cr3(pgdir, new_asid);
275 } else {
276 new_mm_cr3 = build_cr3_noflush(pgdir, new_asid);
277 }
278
279
280
281
282
283
284 write_cr3(new_mm_cr3);
285}
286
287void leave_mm(int cpu)
288{
289 struct mm_struct *loaded_mm = this_cpu_read(cpu_tlbstate.loaded_mm);
290
291
292
293
294
295
296
297
298
299 if (loaded_mm == &init_mm)
300 return;
301
302
303 WARN_ON(!this_cpu_read(cpu_tlbstate.is_lazy));
304
305 switch_mm(NULL, &init_mm, NULL);
306}
307EXPORT_SYMBOL_GPL(leave_mm);
308
309void switch_mm(struct mm_struct *prev, struct mm_struct *next,
310 struct task_struct *tsk)
311{
312 unsigned long flags;
313
314 local_irq_save(flags);
315 switch_mm_irqs_off(prev, next, tsk);
316 local_irq_restore(flags);
317}
318
319static inline unsigned long mm_mangle_tif_spec_ib(struct task_struct *next)
320{
321 unsigned long next_tif = task_thread_info(next)->flags;
322 unsigned long ibpb = (next_tif >> TIF_SPEC_IB) & LAST_USER_MM_IBPB;
323
324 return (unsigned long)next->mm | ibpb;
325}
326
327static void cond_ibpb(struct task_struct *next)
328{
329 if (!next || !next->mm)
330 return;
331
332
333
334
335
336
337
338
339
340
341 if (static_branch_likely(&switch_mm_cond_ibpb)) {
342 unsigned long prev_mm, next_mm;
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375 next_mm = mm_mangle_tif_spec_ib(next);
376 prev_mm = this_cpu_read(cpu_tlbstate.last_user_mm_ibpb);
377
378
379
380
381
382 if (next_mm != prev_mm &&
383 (next_mm | prev_mm) & LAST_USER_MM_IBPB)
384 indirect_branch_prediction_barrier();
385
386 this_cpu_write(cpu_tlbstate.last_user_mm_ibpb, next_mm);
387 }
388
389 if (static_branch_unlikely(&switch_mm_always_ibpb)) {
390
391
392
393
394
395 if (this_cpu_read(cpu_tlbstate.last_user_mm) != next->mm) {
396 indirect_branch_prediction_barrier();
397 this_cpu_write(cpu_tlbstate.last_user_mm, next->mm);
398 }
399 }
400}
401
402#ifdef CONFIG_PERF_EVENTS
403static inline void cr4_update_pce_mm(struct mm_struct *mm)
404{
405 if (static_branch_unlikely(&rdpmc_always_available_key) ||
406 (!static_branch_unlikely(&rdpmc_never_available_key) &&
407 atomic_read(&mm->context.perf_rdpmc_allowed)))
408 cr4_set_bits_irqsoff(X86_CR4_PCE);
409 else
410 cr4_clear_bits_irqsoff(X86_CR4_PCE);
411}
412
413void cr4_update_pce(void *ignored)
414{
415 cr4_update_pce_mm(this_cpu_read(cpu_tlbstate.loaded_mm));
416}
417
418#else
419static inline void cr4_update_pce_mm(struct mm_struct *mm) { }
420#endif
421
422void switch_mm_irqs_off(struct mm_struct *prev, struct mm_struct *next,
423 struct task_struct *tsk)
424{
425 struct mm_struct *real_prev = this_cpu_read(cpu_tlbstate.loaded_mm);
426 u16 prev_asid = this_cpu_read(cpu_tlbstate.loaded_mm_asid);
427 bool was_lazy = this_cpu_read(cpu_tlbstate.is_lazy);
428 unsigned cpu = smp_processor_id();
429 u64 next_tlb_gen;
430 bool need_flush;
431 u16 new_asid;
432
433
434
435
436
437
438
439
440
441
442
443 if (IS_ENABLED(CONFIG_PROVE_LOCKING))
444 WARN_ON_ONCE(!irqs_disabled());
445
446
447
448
449
450
451
452
453
454
455#ifdef CONFIG_DEBUG_VM
456 if (WARN_ON_ONCE(__read_cr3() != build_cr3(real_prev->pgd, prev_asid))) {
457
458
459
460
461
462
463
464
465
466
467
468
469 __flush_tlb_all();
470 }
471#endif
472 this_cpu_write(cpu_tlbstate.is_lazy, false);
473
474
475
476
477
478
479
480
481
482
483
484
485
486 if (real_prev == next) {
487 VM_WARN_ON(this_cpu_read(cpu_tlbstate.ctxs[prev_asid].ctx_id) !=
488 next->context.ctx_id);
489
490
491
492
493
494
495 if (WARN_ON_ONCE(real_prev != &init_mm &&
496 !cpumask_test_cpu(cpu, mm_cpumask(next))))
497 cpumask_set_cpu(cpu, mm_cpumask(next));
498
499
500
501
502
503
504 if (!was_lazy)
505 return;
506
507
508
509
510
511
512
513 smp_mb();
514 next_tlb_gen = atomic64_read(&next->context.tlb_gen);
515 if (this_cpu_read(cpu_tlbstate.ctxs[prev_asid].tlb_gen) ==
516 next_tlb_gen)
517 return;
518
519
520
521
522
523 new_asid = prev_asid;
524 need_flush = true;
525 } else {
526
527
528
529
530
531 cond_ibpb(tsk);
532
533
534
535
536
537
538 if (real_prev != &init_mm) {
539 VM_WARN_ON_ONCE(!cpumask_test_cpu(cpu,
540 mm_cpumask(real_prev)));
541 cpumask_clear_cpu(cpu, mm_cpumask(real_prev));
542 }
543
544
545
546
547 if (next != &init_mm)
548 cpumask_set_cpu(cpu, mm_cpumask(next));
549 next_tlb_gen = atomic64_read(&next->context.tlb_gen);
550
551 choose_new_asid(next, next_tlb_gen, &new_asid, &need_flush);
552
553
554 this_cpu_write(cpu_tlbstate.loaded_mm, LOADED_MM_SWITCHING);
555 barrier();
556 }
557
558 if (need_flush) {
559 this_cpu_write(cpu_tlbstate.ctxs[new_asid].ctx_id, next->context.ctx_id);
560 this_cpu_write(cpu_tlbstate.ctxs[new_asid].tlb_gen, next_tlb_gen);
561 load_new_mm_cr3(next->pgd, new_asid, true);
562
563 trace_tlb_flush(TLB_FLUSH_ON_TASK_SWITCH, TLB_FLUSH_ALL);
564 } else {
565
566 load_new_mm_cr3(next->pgd, new_asid, false);
567
568 trace_tlb_flush(TLB_FLUSH_ON_TASK_SWITCH, 0);
569 }
570
571
572 barrier();
573
574 this_cpu_write(cpu_tlbstate.loaded_mm, next);
575 this_cpu_write(cpu_tlbstate.loaded_mm_asid, new_asid);
576
577 if (next != real_prev) {
578 cr4_update_pce_mm(next);
579 switch_ldt(real_prev, next);
580 }
581}
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
597{
598 if (this_cpu_read(cpu_tlbstate.loaded_mm) == &init_mm)
599 return;
600
601 this_cpu_write(cpu_tlbstate.is_lazy, true);
602}
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617void initialize_tlbstate_and_flush(void)
618{
619 int i;
620 struct mm_struct *mm = this_cpu_read(cpu_tlbstate.loaded_mm);
621 u64 tlb_gen = atomic64_read(&init_mm.context.tlb_gen);
622 unsigned long cr3 = __read_cr3();
623
624
625 WARN_ON((cr3 & CR3_ADDR_MASK) != __pa(mm->pgd));
626
627
628
629
630
631
632 WARN_ON(boot_cpu_has(X86_FEATURE_PCID) &&
633 !(cr4_read_shadow() & X86_CR4_PCIDE));
634
635
636 write_cr3(build_cr3(mm->pgd, 0));
637
638
639 this_cpu_write(cpu_tlbstate.last_user_mm_ibpb, LAST_USER_MM_IBPB);
640 this_cpu_write(cpu_tlbstate.loaded_mm_asid, 0);
641 this_cpu_write(cpu_tlbstate.next_asid, 1);
642 this_cpu_write(cpu_tlbstate.ctxs[0].ctx_id, mm->context.ctx_id);
643 this_cpu_write(cpu_tlbstate.ctxs[0].tlb_gen, tlb_gen);
644
645 for (i = 1; i < TLB_NR_DYN_ASIDS; i++)
646 this_cpu_write(cpu_tlbstate.ctxs[i].ctx_id, 0);
647}
648
649
650
651
652
653
654
655
656static void flush_tlb_func_common(const struct flush_tlb_info *f,
657 bool local, enum tlb_flush_reason reason)
658{
659
660
661
662
663
664
665
666
667
668 struct mm_struct *loaded_mm = this_cpu_read(cpu_tlbstate.loaded_mm);
669 u32 loaded_mm_asid = this_cpu_read(cpu_tlbstate.loaded_mm_asid);
670 u64 mm_tlb_gen = atomic64_read(&loaded_mm->context.tlb_gen);
671 u64 local_tlb_gen = this_cpu_read(cpu_tlbstate.ctxs[loaded_mm_asid].tlb_gen);
672
673
674 VM_WARN_ON(!irqs_disabled());
675
676 if (unlikely(loaded_mm == &init_mm))
677 return;
678
679 VM_WARN_ON(this_cpu_read(cpu_tlbstate.ctxs[loaded_mm_asid].ctx_id) !=
680 loaded_mm->context.ctx_id);
681
682 if (this_cpu_read(cpu_tlbstate.is_lazy)) {
683
684
685
686
687
688
689
690
691
692 switch_mm_irqs_off(NULL, &init_mm, NULL);
693 return;
694 }
695
696 if (unlikely(local_tlb_gen == mm_tlb_gen)) {
697
698
699
700
701
702
703 trace_tlb_flush(reason, 0);
704 return;
705 }
706
707 WARN_ON_ONCE(local_tlb_gen > mm_tlb_gen);
708 WARN_ON_ONCE(f->new_tlb_gen > mm_tlb_gen);
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747 if (f->end != TLB_FLUSH_ALL &&
748 f->new_tlb_gen == local_tlb_gen + 1 &&
749 f->new_tlb_gen == mm_tlb_gen) {
750
751 unsigned long nr_invalidate = (f->end - f->start) >> f->stride_shift;
752 unsigned long addr = f->start;
753
754 while (addr < f->end) {
755 flush_tlb_one_user(addr);
756 addr += 1UL << f->stride_shift;
757 }
758 if (local)
759 count_vm_tlb_events(NR_TLB_LOCAL_FLUSH_ONE, nr_invalidate);
760 trace_tlb_flush(reason, nr_invalidate);
761 } else {
762
763 flush_tlb_local();
764 if (local)
765 count_vm_tlb_event(NR_TLB_LOCAL_FLUSH_ALL);
766 trace_tlb_flush(reason, TLB_FLUSH_ALL);
767 }
768
769
770 this_cpu_write(cpu_tlbstate.ctxs[loaded_mm_asid].tlb_gen, mm_tlb_gen);
771}
772
773static void flush_tlb_func_local(const void *info, enum tlb_flush_reason reason)
774{
775 const struct flush_tlb_info *f = info;
776
777 flush_tlb_func_common(f, true, reason);
778}
779
780static void flush_tlb_func_remote(void *info)
781{
782 const struct flush_tlb_info *f = info;
783
784 inc_irq_stat(irq_tlb_count);
785
786 if (f->mm && f->mm != this_cpu_read(cpu_tlbstate.loaded_mm))
787 return;
788
789 count_vm_tlb_event(NR_TLB_REMOTE_FLUSH_RECEIVED);
790 flush_tlb_func_common(f, false, TLB_REMOTE_SHOOTDOWN);
791}
792
793static bool tlb_is_not_lazy(int cpu, void *data)
794{
795 return !per_cpu(cpu_tlbstate.is_lazy, cpu);
796}
797
798STATIC_NOPV void native_flush_tlb_others(const struct cpumask *cpumask,
799 const struct flush_tlb_info *info)
800{
801 count_vm_tlb_event(NR_TLB_REMOTE_FLUSH);
802 if (info->end == TLB_FLUSH_ALL)
803 trace_tlb_flush(TLB_REMOTE_SEND_IPI, TLB_FLUSH_ALL);
804 else
805 trace_tlb_flush(TLB_REMOTE_SEND_IPI,
806 (info->end - info->start) >> PAGE_SHIFT);
807
808
809
810
811
812
813
814
815
816
817
818 if (info->freed_tables)
819 smp_call_function_many(cpumask, flush_tlb_func_remote,
820 (void *)info, 1);
821 else
822 on_each_cpu_cond_mask(tlb_is_not_lazy, flush_tlb_func_remote,
823 (void *)info, 1, cpumask);
824}
825
826void flush_tlb_others(const struct cpumask *cpumask,
827 const struct flush_tlb_info *info)
828{
829 __flush_tlb_others(cpumask, info);
830}
831
832
833
834
835
836
837
838
839
840
841
842unsigned long tlb_single_page_flush_ceiling __read_mostly = 33;
843
844static DEFINE_PER_CPU_SHARED_ALIGNED(struct flush_tlb_info, flush_tlb_info);
845
846#ifdef CONFIG_DEBUG_VM
847static DEFINE_PER_CPU(unsigned int, flush_tlb_info_idx);
848#endif
849
850static inline struct flush_tlb_info *get_flush_tlb_info(struct mm_struct *mm,
851 unsigned long start, unsigned long end,
852 unsigned int stride_shift, bool freed_tables,
853 u64 new_tlb_gen)
854{
855 struct flush_tlb_info *info = this_cpu_ptr(&flush_tlb_info);
856
857#ifdef CONFIG_DEBUG_VM
858
859
860
861
862
863 BUG_ON(this_cpu_inc_return(flush_tlb_info_idx) != 1);
864#endif
865
866 info->start = start;
867 info->end = end;
868 info->mm = mm;
869 info->stride_shift = stride_shift;
870 info->freed_tables = freed_tables;
871 info->new_tlb_gen = new_tlb_gen;
872
873 return info;
874}
875
876static inline void put_flush_tlb_info(void)
877{
878#ifdef CONFIG_DEBUG_VM
879
880 barrier();
881 this_cpu_dec(flush_tlb_info_idx);
882#endif
883}
884
885void flush_tlb_mm_range(struct mm_struct *mm, unsigned long start,
886 unsigned long end, unsigned int stride_shift,
887 bool freed_tables)
888{
889 struct flush_tlb_info *info;
890 u64 new_tlb_gen;
891 int cpu;
892
893 cpu = get_cpu();
894
895
896 if ((end == TLB_FLUSH_ALL) ||
897 ((end - start) >> stride_shift) > tlb_single_page_flush_ceiling) {
898 start = 0;
899 end = TLB_FLUSH_ALL;
900 }
901
902
903 new_tlb_gen = inc_mm_tlb_gen(mm);
904
905 info = get_flush_tlb_info(mm, start, end, stride_shift, freed_tables,
906 new_tlb_gen);
907
908 if (mm == this_cpu_read(cpu_tlbstate.loaded_mm)) {
909 lockdep_assert_irqs_enabled();
910 local_irq_disable();
911 flush_tlb_func_local(info, TLB_LOCAL_MM_SHOOTDOWN);
912 local_irq_enable();
913 }
914
915 if (cpumask_any_but(mm_cpumask(mm), cpu) < nr_cpu_ids)
916 flush_tlb_others(mm_cpumask(mm), info);
917
918 put_flush_tlb_info();
919 put_cpu();
920}
921
922
923static void do_flush_tlb_all(void *info)
924{
925 count_vm_tlb_event(NR_TLB_REMOTE_FLUSH_RECEIVED);
926 __flush_tlb_all();
927}
928
929void flush_tlb_all(void)
930{
931 count_vm_tlb_event(NR_TLB_REMOTE_FLUSH);
932 on_each_cpu(do_flush_tlb_all, NULL, 1);
933}
934
935static void do_kernel_range_flush(void *info)
936{
937 struct flush_tlb_info *f = info;
938 unsigned long addr;
939
940
941 for (addr = f->start; addr < f->end; addr += PAGE_SIZE)
942 flush_tlb_one_kernel(addr);
943}
944
945void flush_tlb_kernel_range(unsigned long start, unsigned long end)
946{
947
948 if (end == TLB_FLUSH_ALL ||
949 (end - start) > tlb_single_page_flush_ceiling << PAGE_SHIFT) {
950 on_each_cpu(do_flush_tlb_all, NULL, 1);
951 } else {
952 struct flush_tlb_info *info;
953
954 preempt_disable();
955 info = get_flush_tlb_info(NULL, start, end, 0, false, 0);
956
957 on_each_cpu(do_kernel_range_flush, info, 1);
958
959 put_flush_tlb_info();
960 preempt_enable();
961 }
962}
963
964
965
966
967
968
969
970
971unsigned long __get_current_cr3_fast(void)
972{
973 unsigned long cr3 = build_cr3(this_cpu_read(cpu_tlbstate.loaded_mm)->pgd,
974 this_cpu_read(cpu_tlbstate.loaded_mm_asid));
975
976
977 VM_WARN_ON(in_nmi() || preemptible());
978
979 VM_BUG_ON(cr3 != __read_cr3());
980 return cr3;
981}
982EXPORT_SYMBOL_GPL(__get_current_cr3_fast);
983
984
985
986
987void flush_tlb_one_kernel(unsigned long addr)
988{
989 count_vm_tlb_event(NR_TLB_LOCAL_FLUSH_ONE);
990
991
992
993
994
995
996
997
998
999
1000
1001
1002 flush_tlb_one_user(addr);
1003
1004 if (!static_cpu_has(X86_FEATURE_PTI))
1005 return;
1006
1007
1008
1009
1010
1011
1012
1013 this_cpu_write(cpu_tlbstate.invalidate_other, true);
1014}
1015
1016
1017
1018
1019STATIC_NOPV void native_flush_tlb_one_user(unsigned long addr)
1020{
1021 u32 loaded_mm_asid = this_cpu_read(cpu_tlbstate.loaded_mm_asid);
1022
1023 asm volatile("invlpg (%0)" ::"r" (addr) : "memory");
1024
1025 if (!static_cpu_has(X86_FEATURE_PTI))
1026 return;
1027
1028
1029
1030
1031
1032 if (!this_cpu_has(X86_FEATURE_INVPCID_SINGLE))
1033 invalidate_user_asid(loaded_mm_asid);
1034 else
1035 invpcid_flush_one(user_pcid(loaded_mm_asid), addr);
1036}
1037
1038void flush_tlb_one_user(unsigned long addr)
1039{
1040 __flush_tlb_one_user(addr);
1041}
1042
1043
1044
1045
1046STATIC_NOPV void native_flush_tlb_global(void)
1047{
1048 unsigned long cr4, flags;
1049
1050 if (static_cpu_has(X86_FEATURE_INVPCID)) {
1051
1052
1053
1054
1055
1056
1057 invpcid_flush_all();
1058 return;
1059 }
1060
1061
1062
1063
1064
1065
1066 raw_local_irq_save(flags);
1067
1068 cr4 = this_cpu_read(cpu_tlbstate.cr4);
1069
1070 native_write_cr4(cr4 ^ X86_CR4_PGE);
1071
1072 native_write_cr4(cr4);
1073
1074 raw_local_irq_restore(flags);
1075}
1076
1077
1078
1079
1080STATIC_NOPV void native_flush_tlb_local(void)
1081{
1082
1083
1084
1085
1086
1087 WARN_ON_ONCE(preemptible());
1088
1089 invalidate_user_asid(this_cpu_read(cpu_tlbstate.loaded_mm_asid));
1090
1091
1092 native_write_cr3(__native_read_cr3());
1093}
1094
1095void flush_tlb_local(void)
1096{
1097 __flush_tlb_local();
1098}
1099
1100
1101
1102
1103void __flush_tlb_all(void)
1104{
1105
1106
1107
1108
1109 VM_WARN_ON_ONCE(preemptible());
1110
1111 if (boot_cpu_has(X86_FEATURE_PGE)) {
1112 __flush_tlb_global();
1113 } else {
1114
1115
1116
1117 flush_tlb_local();
1118 }
1119}
1120EXPORT_SYMBOL_GPL(__flush_tlb_all);
1121
1122
1123
1124
1125
1126
1127
1128static const struct flush_tlb_info full_flush_tlb_info = {
1129 .mm = NULL,
1130 .start = 0,
1131 .end = TLB_FLUSH_ALL,
1132};
1133
1134void arch_tlbbatch_flush(struct arch_tlbflush_unmap_batch *batch)
1135{
1136 int cpu = get_cpu();
1137
1138 if (cpumask_test_cpu(cpu, &batch->cpumask)) {
1139 lockdep_assert_irqs_enabled();
1140 local_irq_disable();
1141 flush_tlb_func_local(&full_flush_tlb_info, TLB_LOCAL_SHOOTDOWN);
1142 local_irq_enable();
1143 }
1144
1145 if (cpumask_any_but(&batch->cpumask, cpu) < nr_cpu_ids)
1146 flush_tlb_others(&batch->cpumask, &full_flush_tlb_info);
1147
1148 cpumask_clear(&batch->cpumask);
1149
1150 put_cpu();
1151}
1152
1153
1154
1155
1156
1157
1158
1159
1160bool nmi_uaccess_okay(void)
1161{
1162 struct mm_struct *loaded_mm = this_cpu_read(cpu_tlbstate.loaded_mm);
1163 struct mm_struct *current_mm = current->mm;
1164
1165 VM_WARN_ON_ONCE(!loaded_mm);
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177 if (loaded_mm != current_mm)
1178 return false;
1179
1180 VM_WARN_ON_ONCE(current_mm->pgd != __va(read_cr3_pa()));
1181
1182 return true;
1183}
1184
1185static ssize_t tlbflush_read_file(struct file *file, char __user *user_buf,
1186 size_t count, loff_t *ppos)
1187{
1188 char buf[32];
1189 unsigned int len;
1190
1191 len = sprintf(buf, "%ld\n", tlb_single_page_flush_ceiling);
1192 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1193}
1194
1195static ssize_t tlbflush_write_file(struct file *file,
1196 const char __user *user_buf, size_t count, loff_t *ppos)
1197{
1198 char buf[32];
1199 ssize_t len;
1200 int ceiling;
1201
1202 len = min(count, sizeof(buf) - 1);
1203 if (copy_from_user(buf, user_buf, len))
1204 return -EFAULT;
1205
1206 buf[len] = '\0';
1207 if (kstrtoint(buf, 0, &ceiling))
1208 return -EINVAL;
1209
1210 if (ceiling < 0)
1211 return -EINVAL;
1212
1213 tlb_single_page_flush_ceiling = ceiling;
1214 return count;
1215}
1216
1217static const struct file_operations fops_tlbflush = {
1218 .read = tlbflush_read_file,
1219 .write = tlbflush_write_file,
1220 .llseek = default_llseek,
1221};
1222
1223static int __init create_tlb_single_page_flush_ceiling(void)
1224{
1225 debugfs_create_file("tlb_single_page_flush_ceiling", S_IRUSR | S_IWUSR,
1226 arch_debugfs_dir, NULL, &fops_tlbflush);
1227 return 0;
1228}
1229late_initcall(create_tlb_single_page_flush_ceiling);
1230