]> git.proxmox.com Git - pve-kernel.git/blob - patches/kernel/0030-x86-paravirt-Remove-no-longer-used-paravirt-function.patch
KPTI: add follow-up fixes
[pve-kernel.git] / patches / kernel / 0030-x86-paravirt-Remove-no-longer-used-paravirt-function.patch
1 From bbb647f65a627420f8c3351b34d14490a9878509 Mon Sep 17 00:00:00 2001
2 From: Juergen Gross <jgross@suse.com>
3 Date: Mon, 4 Sep 2017 12:25:27 +0200
4 Subject: [PATCH 030/241] x86/paravirt: Remove no longer used paravirt
5 functions
6 MIME-Version: 1.0
7 Content-Type: text/plain; charset=UTF-8
8 Content-Transfer-Encoding: 8bit
9
10 CVE-2017-5754
11
12 With removal of lguest some of the paravirt functions are no longer
13 needed:
14
15 ->read_cr4()
16 ->store_idt()
17 ->set_pmd_at()
18 ->set_pud_at()
19 ->pte_update()
20
21 Remove them.
22
23 Signed-off-by: Juergen Gross <jgross@suse.com>
24 Cc: Linus Torvalds <torvalds@linux-foundation.org>
25 Cc: Peter Zijlstra <peterz@infradead.org>
26 Cc: Thomas Gleixner <tglx@linutronix.de>
27 Cc: akataria@vmware.com
28 Cc: boris.ostrovsky@oracle.com
29 Cc: chrisw@sous-sol.org
30 Cc: jeremy@goop.org
31 Cc: rusty@rustcorp.com.au
32 Cc: virtualization@lists.linux-foundation.org
33 Cc: xen-devel@lists.xenproject.org
34 Link: http://lkml.kernel.org/r/20170904102527.25409-1-jgross@suse.com
35 Signed-off-by: Ingo Molnar <mingo@kernel.org>
36 (cherry picked from commit 87930019c713873a1c3b9bd55dde46e81f70c8f1)
37 Signed-off-by: Andy Whitcroft <apw@canonical.com>
38 Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
39 (cherry picked from commit edf3ab0080a6e79a300753e66929b0b7499eaec5)
40 Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
41 ---
42 arch/x86/include/asm/desc.h | 3 +--
43 arch/x86/include/asm/paravirt.h | 37 -----------------------------------
44 arch/x86/include/asm/paravirt_types.h | 9 ---------
45 arch/x86/include/asm/pgtable.h | 27 ++++---------------------
46 arch/x86/include/asm/special_insns.h | 10 +++++-----
47 arch/x86/kernel/paravirt.c | 5 -----
48 arch/x86/kvm/vmx.c | 2 +-
49 arch/x86/mm/pgtable.c | 7 +------
50 arch/x86/xen/enlighten_pv.c | 2 --
51 arch/x86/xen/mmu_pv.c | 2 --
52 10 files changed, 12 insertions(+), 92 deletions(-)
53
54 diff --git a/arch/x86/include/asm/desc.h b/arch/x86/include/asm/desc.h
55 index 57e502a4e92f..f995e5a09136 100644
56 --- a/arch/x86/include/asm/desc.h
57 +++ b/arch/x86/include/asm/desc.h
58 @@ -120,7 +120,6 @@ static inline int desc_empty(const void *ptr)
59 #define load_ldt(ldt) asm volatile("lldt %0"::"m" (ldt))
60
61 #define store_gdt(dtr) native_store_gdt(dtr)
62 -#define store_idt(dtr) native_store_idt(dtr)
63 #define store_tr(tr) (tr = native_store_tr())
64
65 #define load_TLS(t, cpu) native_load_tls(t, cpu)
66 @@ -241,7 +240,7 @@ static inline void native_store_gdt(struct desc_ptr *dtr)
67 asm volatile("sgdt %0":"=m" (*dtr));
68 }
69
70 -static inline void native_store_idt(struct desc_ptr *dtr)
71 +static inline void store_idt(struct desc_ptr *dtr)
72 {
73 asm volatile("sidt %0":"=m" (*dtr));
74 }
75 diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
76 index c25dd22f7c70..12deec722cf0 100644
77 --- a/arch/x86/include/asm/paravirt.h
78 +++ b/arch/x86/include/asm/paravirt.h
79 @@ -71,11 +71,6 @@ static inline void write_cr3(unsigned long x)
80 PVOP_VCALL1(pv_mmu_ops.write_cr3, x);
81 }
82
83 -static inline unsigned long __read_cr4(void)
84 -{
85 - return PVOP_CALL0(unsigned long, pv_cpu_ops.read_cr4);
86 -}
87 -
88 static inline void __write_cr4(unsigned long x)
89 {
90 PVOP_VCALL1(pv_cpu_ops.write_cr4, x);
91 @@ -228,10 +223,6 @@ static inline void set_ldt(const void *addr, unsigned entries)
92 {
93 PVOP_VCALL2(pv_cpu_ops.set_ldt, addr, entries);
94 }
95 -static inline void store_idt(struct desc_ptr *dtr)
96 -{
97 - PVOP_VCALL1(pv_cpu_ops.store_idt, dtr);
98 -}
99 static inline unsigned long paravirt_store_tr(void)
100 {
101 return PVOP_CALL0(unsigned long, pv_cpu_ops.store_tr);
102 @@ -365,12 +356,6 @@ static inline void paravirt_release_p4d(unsigned long pfn)
103 PVOP_VCALL1(pv_mmu_ops.release_p4d, pfn);
104 }
105
106 -static inline void pte_update(struct mm_struct *mm, unsigned long addr,
107 - pte_t *ptep)
108 -{
109 - PVOP_VCALL3(pv_mmu_ops.pte_update, mm, addr, ptep);
110 -}
111 -
112 static inline pte_t __pte(pteval_t val)
113 {
114 pteval_t ret;
115 @@ -472,28 +457,6 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
116 PVOP_VCALL4(pv_mmu_ops.set_pte_at, mm, addr, ptep, pte.pte);
117 }
118
119 -static inline void set_pmd_at(struct mm_struct *mm, unsigned long addr,
120 - pmd_t *pmdp, pmd_t pmd)
121 -{
122 - if (sizeof(pmdval_t) > sizeof(long))
123 - /* 5 arg words */
124 - pv_mmu_ops.set_pmd_at(mm, addr, pmdp, pmd);
125 - else
126 - PVOP_VCALL4(pv_mmu_ops.set_pmd_at, mm, addr, pmdp,
127 - native_pmd_val(pmd));
128 -}
129 -
130 -static inline void set_pud_at(struct mm_struct *mm, unsigned long addr,
131 - pud_t *pudp, pud_t pud)
132 -{
133 - if (sizeof(pudval_t) > sizeof(long))
134 - /* 5 arg words */
135 - pv_mmu_ops.set_pud_at(mm, addr, pudp, pud);
136 - else
137 - PVOP_VCALL4(pv_mmu_ops.set_pud_at, mm, addr, pudp,
138 - native_pud_val(pud));
139 -}
140 -
141 static inline void set_pmd(pmd_t *pmdp, pmd_t pmd)
142 {
143 pmdval_t val = native_pmd_val(pmd);
144 diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
145 index 6b64fc6367f2..42873edd9f9d 100644
146 --- a/arch/x86/include/asm/paravirt_types.h
147 +++ b/arch/x86/include/asm/paravirt_types.h
148 @@ -107,7 +107,6 @@ struct pv_cpu_ops {
149 unsigned long (*read_cr0)(void);
150 void (*write_cr0)(unsigned long);
151
152 - unsigned long (*read_cr4)(void);
153 void (*write_cr4)(unsigned long);
154
155 #ifdef CONFIG_X86_64
156 @@ -119,8 +118,6 @@ struct pv_cpu_ops {
157 void (*load_tr_desc)(void);
158 void (*load_gdt)(const struct desc_ptr *);
159 void (*load_idt)(const struct desc_ptr *);
160 - /* store_gdt has been removed. */
161 - void (*store_idt)(struct desc_ptr *);
162 void (*set_ldt)(const void *desc, unsigned entries);
163 unsigned long (*store_tr)(void);
164 void (*load_tls)(struct thread_struct *t, unsigned int cpu);
165 @@ -245,12 +242,6 @@ struct pv_mmu_ops {
166 void (*set_pte_at)(struct mm_struct *mm, unsigned long addr,
167 pte_t *ptep, pte_t pteval);
168 void (*set_pmd)(pmd_t *pmdp, pmd_t pmdval);
169 - void (*set_pmd_at)(struct mm_struct *mm, unsigned long addr,
170 - pmd_t *pmdp, pmd_t pmdval);
171 - void (*set_pud_at)(struct mm_struct *mm, unsigned long addr,
172 - pud_t *pudp, pud_t pudval);
173 - void (*pte_update)(struct mm_struct *mm, unsigned long addr,
174 - pte_t *ptep);
175
176 pte_t (*ptep_modify_prot_start)(struct mm_struct *mm, unsigned long addr,
177 pte_t *ptep);
178 diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
179 index 77037b6f1caa..bb8e9ea7deb4 100644
180 --- a/arch/x86/include/asm/pgtable.h
181 +++ b/arch/x86/include/asm/pgtable.h
182 @@ -43,8 +43,6 @@ extern struct mm_struct *pgd_page_get_mm(struct page *page);
183 #else /* !CONFIG_PARAVIRT */
184 #define set_pte(ptep, pte) native_set_pte(ptep, pte)
185 #define set_pte_at(mm, addr, ptep, pte) native_set_pte_at(mm, addr, ptep, pte)
186 -#define set_pmd_at(mm, addr, pmdp, pmd) native_set_pmd_at(mm, addr, pmdp, pmd)
187 -#define set_pud_at(mm, addr, pudp, pud) native_set_pud_at(mm, addr, pudp, pud)
188
189 #define set_pte_atomic(ptep, pte) \
190 native_set_pte_atomic(ptep, pte)
191 @@ -75,8 +73,6 @@ extern struct mm_struct *pgd_page_get_mm(struct page *page);
192 #define pte_clear(mm, addr, ptep) native_pte_clear(mm, addr, ptep)
193 #define pmd_clear(pmd) native_pmd_clear(pmd)
194
195 -#define pte_update(mm, addr, ptep) do { } while (0)
196 -
197 #define pgd_val(x) native_pgd_val(x)
198 #define __pgd(x) native_make_pgd(x)
199
200 @@ -965,31 +961,18 @@ static inline void native_set_pte_at(struct mm_struct *mm, unsigned long addr,
201 native_set_pte(ptep, pte);
202 }
203
204 -static inline void native_set_pmd_at(struct mm_struct *mm, unsigned long addr,
205 - pmd_t *pmdp , pmd_t pmd)
206 +static inline void set_pmd_at(struct mm_struct *mm, unsigned long addr,
207 + pmd_t *pmdp, pmd_t pmd)
208 {
209 native_set_pmd(pmdp, pmd);
210 }
211
212 -static inline void native_set_pud_at(struct mm_struct *mm, unsigned long addr,
213 - pud_t *pudp, pud_t pud)
214 +static inline void set_pud_at(struct mm_struct *mm, unsigned long addr,
215 + pud_t *pudp, pud_t pud)
216 {
217 native_set_pud(pudp, pud);
218 }
219
220 -#ifndef CONFIG_PARAVIRT
221 -/*
222 - * Rules for using pte_update - it must be called after any PTE update which
223 - * has not been done using the set_pte / clear_pte interfaces. It is used by
224 - * shadow mode hypervisors to resynchronize the shadow page tables. Kernel PTE
225 - * updates should either be sets, clears, or set_pte_atomic for P->P
226 - * transitions, which means this hook should only be called for user PTEs.
227 - * This hook implies a P->P protection or access change has taken place, which
228 - * requires a subsequent TLB flush.
229 - */
230 -#define pte_update(mm, addr, ptep) do { } while (0)
231 -#endif
232 -
233 /*
234 * We only update the dirty/accessed state if we set
235 * the dirty bit by hand in the kernel, since the hardware
236 @@ -1017,7 +1000,6 @@ static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
237 pte_t *ptep)
238 {
239 pte_t pte = native_ptep_get_and_clear(ptep);
240 - pte_update(mm, addr, ptep);
241 return pte;
242 }
243
244 @@ -1044,7 +1026,6 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm,
245 unsigned long addr, pte_t *ptep)
246 {
247 clear_bit(_PAGE_BIT_RW, (unsigned long *)&ptep->pte);
248 - pte_update(mm, addr, ptep);
249 }
250
251 #define flush_tlb_fix_spurious_fault(vma, address) do { } while (0)
252 diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h
253 index 9efaabf5b54b..a24dfcf79f4a 100644
254 --- a/arch/x86/include/asm/special_insns.h
255 +++ b/arch/x86/include/asm/special_insns.h
256 @@ -135,6 +135,11 @@ static inline void native_wbinvd(void)
257
258 extern asmlinkage void native_load_gs_index(unsigned);
259
260 +static inline unsigned long __read_cr4(void)
261 +{
262 + return native_read_cr4();
263 +}
264 +
265 #ifdef CONFIG_PARAVIRT
266 #include <asm/paravirt.h>
267 #else
268 @@ -173,11 +178,6 @@ static inline void write_cr3(unsigned long x)
269 native_write_cr3(x);
270 }
271
272 -static inline unsigned long __read_cr4(void)
273 -{
274 - return native_read_cr4();
275 -}
276 -
277 static inline void __write_cr4(unsigned long x)
278 {
279 native_write_cr4(x);
280 diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c
281 index a14df9eecfed..19a3e8f961c7 100644
282 --- a/arch/x86/kernel/paravirt.c
283 +++ b/arch/x86/kernel/paravirt.c
284 @@ -327,7 +327,6 @@ __visible struct pv_cpu_ops pv_cpu_ops = {
285 .set_debugreg = native_set_debugreg,
286 .read_cr0 = native_read_cr0,
287 .write_cr0 = native_write_cr0,
288 - .read_cr4 = native_read_cr4,
289 .write_cr4 = native_write_cr4,
290 #ifdef CONFIG_X86_64
291 .read_cr8 = native_read_cr8,
292 @@ -343,7 +342,6 @@ __visible struct pv_cpu_ops pv_cpu_ops = {
293 .set_ldt = native_set_ldt,
294 .load_gdt = native_load_gdt,
295 .load_idt = native_load_idt,
296 - .store_idt = native_store_idt,
297 .store_tr = native_store_tr,
298 .load_tls = native_load_tls,
299 #ifdef CONFIG_X86_64
300 @@ -411,8 +409,6 @@ struct pv_mmu_ops pv_mmu_ops __ro_after_init = {
301 .set_pte = native_set_pte,
302 .set_pte_at = native_set_pte_at,
303 .set_pmd = native_set_pmd,
304 - .set_pmd_at = native_set_pmd_at,
305 - .pte_update = paravirt_nop,
306
307 .ptep_modify_prot_start = __ptep_modify_prot_start,
308 .ptep_modify_prot_commit = __ptep_modify_prot_commit,
309 @@ -424,7 +420,6 @@ struct pv_mmu_ops pv_mmu_ops __ro_after_init = {
310 .pmd_clear = native_pmd_clear,
311 #endif
312 .set_pud = native_set_pud,
313 - .set_pud_at = native_set_pud_at,
314
315 .pmd_val = PTE_IDENT,
316 .make_pmd = PTE_IDENT,
317 diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
318 index 7b447d126d17..dd4996a96c71 100644
319 --- a/arch/x86/kvm/vmx.c
320 +++ b/arch/x86/kvm/vmx.c
321 @@ -5174,7 +5174,7 @@ static void vmx_set_constant_host_state(struct vcpu_vmx *vmx)
322 vmcs_write16(HOST_SS_SELECTOR, __KERNEL_DS); /* 22.2.4 */
323 vmcs_write16(HOST_TR_SELECTOR, GDT_ENTRY_TSS*8); /* 22.2.4 */
324
325 - native_store_idt(&dt);
326 + store_idt(&dt);
327 vmcs_writel(HOST_IDTR_BASE, dt.address); /* 22.2.4 */
328 vmx->host_idt_base = dt.address;
329
330 diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c
331 index 508a708eb9a6..942391b5b639 100644
332 --- a/arch/x86/mm/pgtable.c
333 +++ b/arch/x86/mm/pgtable.c
334 @@ -426,10 +426,8 @@ int ptep_set_access_flags(struct vm_area_struct *vma,
335 {
336 int changed = !pte_same(*ptep, entry);
337
338 - if (changed && dirty) {
339 + if (changed && dirty)
340 *ptep = entry;
341 - pte_update(vma->vm_mm, address, ptep);
342 - }
343
344 return changed;
345 }
346 @@ -486,9 +484,6 @@ int ptep_test_and_clear_young(struct vm_area_struct *vma,
347 ret = test_and_clear_bit(_PAGE_BIT_ACCESSED,
348 (unsigned long *) &ptep->pte);
349
350 - if (ret)
351 - pte_update(vma->vm_mm, addr, ptep);
352 -
353 return ret;
354 }
355
356 diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c
357 index ae2a2e2d6362..69b9deff7e5c 100644
358 --- a/arch/x86/xen/enlighten_pv.c
359 +++ b/arch/x86/xen/enlighten_pv.c
360 @@ -1038,7 +1038,6 @@ static const struct pv_cpu_ops xen_cpu_ops __initconst = {
361 .read_cr0 = xen_read_cr0,
362 .write_cr0 = xen_write_cr0,
363
364 - .read_cr4 = native_read_cr4,
365 .write_cr4 = xen_write_cr4,
366
367 #ifdef CONFIG_X86_64
368 @@ -1073,7 +1072,6 @@ static const struct pv_cpu_ops xen_cpu_ops __initconst = {
369 .alloc_ldt = xen_alloc_ldt,
370 .free_ldt = xen_free_ldt,
371
372 - .store_idt = native_store_idt,
373 .store_tr = xen_store_tr,
374
375 .write_ldt_entry = xen_write_ldt_entry,
376 diff --git a/arch/x86/xen/mmu_pv.c b/arch/x86/xen/mmu_pv.c
377 index cab28cf2cffb..5f61b7e2e6b2 100644
378 --- a/arch/x86/xen/mmu_pv.c
379 +++ b/arch/x86/xen/mmu_pv.c
380 @@ -2430,8 +2430,6 @@ static const struct pv_mmu_ops xen_mmu_ops __initconst = {
381 .flush_tlb_single = xen_flush_tlb_single,
382 .flush_tlb_others = xen_flush_tlb_others,
383
384 - .pte_update = paravirt_nop,
385 -
386 .pgd_alloc = xen_pgd_alloc,
387 .pgd_free = xen_pgd_free,
388
389 --
390 2.14.2
391