diff options
Diffstat (limited to 'include/asm-s390/tlbflush.h')
-rw-r--r-- | include/asm-s390/tlbflush.h | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/include/asm-s390/tlbflush.h b/include/asm-s390/tlbflush.h index a69bd2490d52..70fa5ae58180 100644 --- a/include/asm-s390/tlbflush.h +++ b/include/asm-s390/tlbflush.h | |||
@@ -42,11 +42,11 @@ static inline void __tlb_flush_global(void) | |||
42 | /* | 42 | /* |
43 | * Flush all tlb entries of a page table on all cpus. | 43 | * Flush all tlb entries of a page table on all cpus. |
44 | */ | 44 | */ |
45 | static inline void __tlb_flush_idte(pgd_t *pgd) | 45 | static inline void __tlb_flush_idte(unsigned long asce) |
46 | { | 46 | { |
47 | asm volatile( | 47 | asm volatile( |
48 | " .insn rrf,0xb98e0000,0,%0,%1,0" | 48 | " .insn rrf,0xb98e0000,0,%0,%1,0" |
49 | : : "a" (2048), "a" (__pa(pgd) & PAGE_MASK) : "cc" ); | 49 | : : "a" (2048), "a" (asce) : "cc" ); |
50 | } | 50 | } |
51 | 51 | ||
52 | static inline void __tlb_flush_mm(struct mm_struct * mm) | 52 | static inline void __tlb_flush_mm(struct mm_struct * mm) |
@@ -61,11 +61,11 @@ static inline void __tlb_flush_mm(struct mm_struct * mm) | |||
61 | * only ran on the local cpu. | 61 | * only ran on the local cpu. |
62 | */ | 62 | */ |
63 | if (MACHINE_HAS_IDTE) { | 63 | if (MACHINE_HAS_IDTE) { |
64 | pgd_t *shadow_pgd = get_shadow_table(mm->pgd); | 64 | pgd_t *shadow = get_shadow_table(mm->pgd); |
65 | 65 | ||
66 | if (shadow_pgd) | 66 | if (shadow) |
67 | __tlb_flush_idte(shadow_pgd); | 67 | __tlb_flush_idte((unsigned long) shadow | mm->context); |
68 | __tlb_flush_idte(mm->pgd); | 68 | __tlb_flush_idte((unsigned long) mm->pgd | mm->context); |
69 | return; | 69 | return; |
70 | } | 70 | } |
71 | preempt_disable(); | 71 | preempt_disable(); |
@@ -106,9 +106,23 @@ static inline void __tlb_flush_mm_cond(struct mm_struct * mm) | |||
106 | */ | 106 | */ |
107 | #define flush_tlb() do { } while (0) | 107 | #define flush_tlb() do { } while (0) |
108 | #define flush_tlb_all() do { } while (0) | 108 | #define flush_tlb_all() do { } while (0) |
109 | #define flush_tlb_mm(mm) __tlb_flush_mm_cond(mm) | ||
110 | #define flush_tlb_page(vma, addr) do { } while (0) | 109 | #define flush_tlb_page(vma, addr) do { } while (0) |
111 | #define flush_tlb_range(vma, start, end) __tlb_flush_mm_cond(mm) | 110 | |
112 | #define flush_tlb_kernel_range(start, end) __tlb_flush_mm(&init_mm) | 111 | static inline void flush_tlb_mm(struct mm_struct *mm) |
112 | { | ||
113 | __tlb_flush_mm_cond(mm); | ||
114 | } | ||
115 | |||
116 | static inline void flush_tlb_range(struct vm_area_struct *vma, | ||
117 | unsigned long start, unsigned long end) | ||
118 | { | ||
119 | __tlb_flush_mm_cond(vma->vm_mm); | ||
120 | } | ||
121 | |||
122 | static inline void flush_tlb_kernel_range(unsigned long start, | ||
123 | unsigned long end) | ||
124 | { | ||
125 | __tlb_flush_mm(&init_mm); | ||
126 | } | ||
113 | 127 | ||
114 | #endif /* _S390_TLBFLUSH_H */ | 128 | #endif /* _S390_TLBFLUSH_H */ |