1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef __ASM_ARM_MMU_CONTEXT_H
14#define __ASM_ARM_MMU_CONTEXT_H
15
16#include <linux/compiler.h>
17#include <asm/cacheflush.h>
18#include <asm/cachetype.h>
19#include <asm/proc-fns.h>
20#include <asm-generic/mm_hooks.h>
21
22void __check_kvm_seq(struct mm_struct *mm);
23
24#ifdef CONFIG_CPU_HAS_ASID
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40#define ASID_BITS 8
41#define ASID_MASK ((~0) << ASID_BITS)
42#define ASID_FIRST_VERSION (1 << ASID_BITS)
43
44extern unsigned int cpu_last_asid;
45
46void __init_new_context(struct task_struct *tsk, struct mm_struct *mm);
47void __new_context(struct mm_struct *mm);
48
49static inline void check_context(struct mm_struct *mm)
50{
51 if (unlikely((mm->context.id ^ cpu_last_asid) >> ASID_BITS))
52 __new_context(mm);
53
54 if (unlikely(mm->context.kvm_seq != init_mm.context.kvm_seq))
55 __check_kvm_seq(mm);
56}
57
58#define init_new_context(tsk,mm) (__init_new_context(tsk,mm),0)
59
60#else
61
62static inline void check_context(struct mm_struct *mm)
63{
64 if (unlikely(mm->context.kvm_seq != init_mm.context.kvm_seq))
65 __check_kvm_seq(mm);
66}
67
68#define init_new_context(tsk,mm) 0
69
70#endif
71
72#define destroy_context(mm) do { } while(0)
73
74
75
76
77
78
79
80
81
82
83static inline void
84enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
85{
86}
87
88
89
90
91
92
93
94static inline void
95switch_mm(struct mm_struct *prev, struct mm_struct *next,
96 struct task_struct *tsk)
97{
98#ifdef CONFIG_MMU
99 unsigned int cpu = smp_processor_id();
100
101#ifdef CONFIG_SMP
102
103 if (!cpus_empty(next->cpu_vm_mask) && !cpu_isset(cpu, next->cpu_vm_mask))
104 __flush_icache_all();
105#endif
106 if (!cpu_test_and_set(cpu, next->cpu_vm_mask) || prev != next) {
107 check_context(next);
108 cpu_switch_mm(next->pgd, next);
109 if (cache_is_vivt())
110 cpu_clear(cpu, prev->cpu_vm_mask);
111 }
112#endif
113}
114
115#define deactivate_mm(tsk,mm) do { } while (0)
116#define activate_mm(prev,next) switch_mm(prev, next, NULL)
117
118#endif
119