GNU Linux-libre 4.19.286-gnu1
[releases.git] / arch / powerpc / kvm / book3s_64_mmu_radix.c
1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License, version 2, as
4  * published by the Free Software Foundation.
5  *
6  * Copyright 2016 Paul Mackerras, IBM Corp. <paulus@au1.ibm.com>
7  */
8
9 #include <linux/types.h>
10 #include <linux/string.h>
11 #include <linux/kvm.h>
12 #include <linux/kvm_host.h>
13
14 #include <asm/kvm_ppc.h>
15 #include <asm/kvm_book3s.h>
16 #include <asm/page.h>
17 #include <asm/mmu.h>
18 #include <asm/pgtable.h>
19 #include <asm/pgalloc.h>
20 #include <asm/pte-walk.h>
21
22 /*
23  * Supported radix tree geometry.
24  * Like p9, we support either 5 or 9 bits at the first (lowest) level,
25  * for a page size of 64k or 4k.
26  */
27 static int p9_supported_radix_bits[4] = { 5, 9, 9, 13 };
28
29 int kvmppc_mmu_radix_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
30                            struct kvmppc_pte *gpte, bool data, bool iswrite)
31 {
32         struct kvm *kvm = vcpu->kvm;
33         u32 pid;
34         int ret, level, ps;
35         __be64 prte, rpte;
36         unsigned long ptbl;
37         unsigned long root, pte, index;
38         unsigned long rts, bits, offset;
39         unsigned long gpa;
40         unsigned long proc_tbl_size;
41
42         /* Work out effective PID */
43         switch (eaddr >> 62) {
44         case 0:
45                 pid = vcpu->arch.pid;
46                 break;
47         case 3:
48                 pid = 0;
49                 break;
50         default:
51                 return -EINVAL;
52         }
53         proc_tbl_size = 1 << ((kvm->arch.process_table & PRTS_MASK) + 12);
54         if (pid * 16 >= proc_tbl_size)
55                 return -EINVAL;
56
57         /* Read partition table to find root of tree for effective PID */
58         ptbl = (kvm->arch.process_table & PRTB_MASK) + (pid * 16);
59         ret = kvm_read_guest(kvm, ptbl, &prte, sizeof(prte));
60         if (ret)
61                 return ret;
62
63         root = be64_to_cpu(prte);
64         rts = ((root & RTS1_MASK) >> (RTS1_SHIFT - 3)) |
65                 ((root & RTS2_MASK) >> RTS2_SHIFT);
66         bits = root & RPDS_MASK;
67         root = root & RPDB_MASK;
68
69         offset = rts + 31;
70
71         /* current implementations only support 52-bit space */
72         if (offset != 52)
73                 return -EINVAL;
74
75         for (level = 3; level >= 0; --level) {
76                 if (level && bits != p9_supported_radix_bits[level])
77                         return -EINVAL;
78                 if (level == 0 && !(bits == 5 || bits == 9))
79                         return -EINVAL;
80                 offset -= bits;
81                 index = (eaddr >> offset) & ((1UL << bits) - 1);
82                 /* check that low bits of page table base are zero */
83                 if (root & ((1UL << (bits + 3)) - 1))
84                         return -EINVAL;
85                 ret = kvm_read_guest(kvm, root + index * 8,
86                                      &rpte, sizeof(rpte));
87                 if (ret)
88                         return ret;
89                 pte = __be64_to_cpu(rpte);
90                 if (!(pte & _PAGE_PRESENT))
91                         return -ENOENT;
92                 if (pte & _PAGE_PTE)
93                         break;
94                 bits = pte & 0x1f;
95                 root = pte & 0x0fffffffffffff00ul;
96         }
97         /* need a leaf at lowest level; 512GB pages not supported */
98         if (level < 0 || level == 3)
99                 return -EINVAL;
100
101         /* offset is now log base 2 of the page size */
102         gpa = pte & 0x01fffffffffff000ul;
103         if (gpa & ((1ul << offset) - 1))
104                 return -EINVAL;
105         gpa += eaddr & ((1ul << offset) - 1);
106         for (ps = MMU_PAGE_4K; ps < MMU_PAGE_COUNT; ++ps)
107                 if (offset == mmu_psize_defs[ps].shift)
108                         break;
109         gpte->page_size = ps;
110
111         gpte->eaddr = eaddr;
112         gpte->raddr = gpa;
113
114         /* Work out permissions */
115         gpte->may_read = !!(pte & _PAGE_READ);
116         gpte->may_write = !!(pte & _PAGE_WRITE);
117         gpte->may_execute = !!(pte & _PAGE_EXEC);
118         if (kvmppc_get_msr(vcpu) & MSR_PR) {
119                 if (pte & _PAGE_PRIVILEGED) {
120                         gpte->may_read = 0;
121                         gpte->may_write = 0;
122                         gpte->may_execute = 0;
123                 }
124         } else {
125                 if (!(pte & _PAGE_PRIVILEGED)) {
126                         /* Check AMR/IAMR to see if strict mode is in force */
127                         if (vcpu->arch.amr & (1ul << 62))
128                                 gpte->may_read = 0;
129                         if (vcpu->arch.amr & (1ul << 63))
130                                 gpte->may_write = 0;
131                         if (vcpu->arch.iamr & (1ul << 62))
132                                 gpte->may_execute = 0;
133                 }
134         }
135
136         return 0;
137 }
138
139 static void kvmppc_radix_tlbie_page(struct kvm *kvm, unsigned long addr,
140                                     unsigned int pshift)
141 {
142         unsigned long psize = PAGE_SIZE;
143
144         if (pshift)
145                 psize = 1UL << pshift;
146
147         addr &= ~(psize - 1);
148         radix__flush_tlb_lpid_page(kvm->arch.lpid, addr, psize);
149 }
150
151 static void kvmppc_radix_flush_pwc(struct kvm *kvm)
152 {
153         radix__flush_pwc_lpid(kvm->arch.lpid);
154 }
155
156 static unsigned long kvmppc_radix_update_pte(struct kvm *kvm, pte_t *ptep,
157                                       unsigned long clr, unsigned long set,
158                                       unsigned long addr, unsigned int shift)
159 {
160         return __radix_pte_update(ptep, clr, set);
161 }
162
163 void kvmppc_radix_set_pte_at(struct kvm *kvm, unsigned long addr,
164                              pte_t *ptep, pte_t pte)
165 {
166         radix__set_pte_at(kvm->mm, addr, ptep, pte, 0);
167 }
168
169 static struct kmem_cache *kvm_pte_cache;
170 static struct kmem_cache *kvm_pmd_cache;
171
172 static pte_t *kvmppc_pte_alloc(void)
173 {
174         pte_t *pte;
175
176         pte = kmem_cache_alloc(kvm_pte_cache, GFP_KERNEL);
177         /* pmd_populate() will only reference _pa(pte). */
178         kmemleak_ignore(pte);
179
180         return pte;
181 }
182
183 static void kvmppc_pte_free(pte_t *ptep)
184 {
185         kmem_cache_free(kvm_pte_cache, ptep);
186 }
187
188 /* Like pmd_huge() and pmd_large(), but works regardless of config options */
189 static inline int pmd_is_leaf(pmd_t pmd)
190 {
191         return !!(pmd_val(pmd) & _PAGE_PTE);
192 }
193
194 static pmd_t *kvmppc_pmd_alloc(void)
195 {
196         pmd_t *pmd;
197
198         pmd = kmem_cache_alloc(kvm_pmd_cache, GFP_KERNEL);
199         /* pud_populate() will only reference _pa(pmd). */
200         kmemleak_ignore(pmd);
201
202         return pmd;
203 }
204
205 static void kvmppc_pmd_free(pmd_t *pmdp)
206 {
207         kmem_cache_free(kvm_pmd_cache, pmdp);
208 }
209
210 static void kvmppc_unmap_pte(struct kvm *kvm, pte_t *pte,
211                              unsigned long gpa, unsigned int shift)
212
213 {
214         unsigned long page_size = 1ul << shift;
215         unsigned long old;
216
217         old = kvmppc_radix_update_pte(kvm, pte, ~0UL, 0, gpa, shift);
218         kvmppc_radix_tlbie_page(kvm, gpa, shift);
219         if (old & _PAGE_DIRTY) {
220                 unsigned long gfn = gpa >> PAGE_SHIFT;
221                 struct kvm_memory_slot *memslot;
222
223                 memslot = gfn_to_memslot(kvm, gfn);
224                 if (memslot && memslot->dirty_bitmap)
225                         kvmppc_update_dirty_map(memslot, gfn, page_size);
226         }
227 }
228
229 /*
230  * kvmppc_free_p?d are used to free existing page tables, and recursively
231  * descend and clear and free children.
232  * Callers are responsible for flushing the PWC.
233  *
234  * When page tables are being unmapped/freed as part of page fault path
235  * (full == false), ptes are not expected. There is code to unmap them
236  * and emit a warning if encountered, but there may already be data
237  * corruption due to the unexpected mappings.
238  */
239 static void kvmppc_unmap_free_pte(struct kvm *kvm, pte_t *pte, bool full)
240 {
241         if (full) {
242                 memset(pte, 0, sizeof(long) << PTE_INDEX_SIZE);
243         } else {
244                 pte_t *p = pte;
245                 unsigned long it;
246
247                 for (it = 0; it < PTRS_PER_PTE; ++it, ++p) {
248                         if (pte_val(*p) == 0)
249                                 continue;
250                         WARN_ON_ONCE(1);
251                         kvmppc_unmap_pte(kvm, p,
252                                          pte_pfn(*p) << PAGE_SHIFT,
253                                          PAGE_SHIFT);
254                 }
255         }
256
257         kvmppc_pte_free(pte);
258 }
259
260 static void kvmppc_unmap_free_pmd(struct kvm *kvm, pmd_t *pmd, bool full)
261 {
262         unsigned long im;
263         pmd_t *p = pmd;
264
265         for (im = 0; im < PTRS_PER_PMD; ++im, ++p) {
266                 if (!pmd_present(*p))
267                         continue;
268                 if (pmd_is_leaf(*p)) {
269                         if (full) {
270                                 pmd_clear(p);
271                         } else {
272                                 WARN_ON_ONCE(1);
273                                 kvmppc_unmap_pte(kvm, (pte_t *)p,
274                                          pte_pfn(*(pte_t *)p) << PAGE_SHIFT,
275                                          PMD_SHIFT);
276                         }
277                 } else {
278                         pte_t *pte;
279
280                         pte = pte_offset_map(p, 0);
281                         kvmppc_unmap_free_pte(kvm, pte, full);
282                         pmd_clear(p);
283                 }
284         }
285         kvmppc_pmd_free(pmd);
286 }
287
288 static void kvmppc_unmap_free_pud(struct kvm *kvm, pud_t *pud)
289 {
290         unsigned long iu;
291         pud_t *p = pud;
292
293         for (iu = 0; iu < PTRS_PER_PUD; ++iu, ++p) {
294                 if (!pud_present(*p))
295                         continue;
296                 if (pud_huge(*p)) {
297                         pud_clear(p);
298                 } else {
299                         pmd_t *pmd;
300
301                         pmd = pmd_offset(p, 0);
302                         kvmppc_unmap_free_pmd(kvm, pmd, true);
303                         pud_clear(p);
304                 }
305         }
306         pud_free(kvm->mm, pud);
307 }
308
309 void kvmppc_free_radix(struct kvm *kvm)
310 {
311         unsigned long ig;
312         pgd_t *pgd;
313
314         if (!kvm->arch.pgtable)
315                 return;
316         pgd = kvm->arch.pgtable;
317         for (ig = 0; ig < PTRS_PER_PGD; ++ig, ++pgd) {
318                 pud_t *pud;
319
320                 if (!pgd_present(*pgd))
321                         continue;
322                 pud = pud_offset(pgd, 0);
323                 kvmppc_unmap_free_pud(kvm, pud);
324                 pgd_clear(pgd);
325         }
326         pgd_free(kvm->mm, kvm->arch.pgtable);
327         kvm->arch.pgtable = NULL;
328 }
329
330 static void kvmppc_unmap_free_pmd_entry_table(struct kvm *kvm, pmd_t *pmd,
331                                               unsigned long gpa)
332 {
333         pte_t *pte = pte_offset_kernel(pmd, 0);
334
335         /*
336          * Clearing the pmd entry then flushing the PWC ensures that the pte
337          * page no longer be cached by the MMU, so can be freed without
338          * flushing the PWC again.
339          */
340         pmd_clear(pmd);
341         kvmppc_radix_flush_pwc(kvm);
342
343         kvmppc_unmap_free_pte(kvm, pte, false);
344 }
345
346 static void kvmppc_unmap_free_pud_entry_table(struct kvm *kvm, pud_t *pud,
347                                         unsigned long gpa)
348 {
349         pmd_t *pmd = pmd_offset(pud, 0);
350
351         /*
352          * Clearing the pud entry then flushing the PWC ensures that the pmd
353          * page and any children pte pages will no longer be cached by the MMU,
354          * so can be freed without flushing the PWC again.
355          */
356         pud_clear(pud);
357         kvmppc_radix_flush_pwc(kvm);
358
359         kvmppc_unmap_free_pmd(kvm, pmd, false);
360 }
361
362 /*
363  * There are a number of bits which may differ between different faults to
364  * the same partition scope entry. RC bits, in the course of cleaning and
365  * aging. And the write bit can change, either the access could have been
366  * upgraded, or a read fault could happen concurrently with a write fault
367  * that sets those bits first.
368  */
369 #define PTE_BITS_MUST_MATCH (~(_PAGE_WRITE | _PAGE_DIRTY | _PAGE_ACCESSED))
370
371 static int kvmppc_create_pte(struct kvm *kvm, pte_t pte, unsigned long gpa,
372                              unsigned int level, unsigned long mmu_seq)
373 {
374         pgd_t *pgd;
375         pud_t *pud, *new_pud = NULL;
376         pmd_t *pmd, *new_pmd = NULL;
377         pte_t *ptep, *new_ptep = NULL;
378         int ret;
379
380         /* Traverse the guest's 2nd-level tree, allocate new levels needed */
381         pgd = kvm->arch.pgtable + pgd_index(gpa);
382         pud = NULL;
383         if (pgd_present(*pgd))
384                 pud = pud_offset(pgd, gpa);
385         else
386                 new_pud = pud_alloc_one(kvm->mm, gpa);
387
388         pmd = NULL;
389         if (pud && pud_present(*pud) && !pud_huge(*pud))
390                 pmd = pmd_offset(pud, gpa);
391         else if (level <= 1)
392                 new_pmd = kvmppc_pmd_alloc();
393
394         if (level == 0 && !(pmd && pmd_present(*pmd) && !pmd_is_leaf(*pmd)))
395                 new_ptep = kvmppc_pte_alloc();
396
397         /* Check if we might have been invalidated; let the guest retry if so */
398         spin_lock(&kvm->mmu_lock);
399         ret = -EAGAIN;
400         if (mmu_notifier_retry(kvm, mmu_seq))
401                 goto out_unlock;
402
403         /* Now traverse again under the lock and change the tree */
404         ret = -ENOMEM;
405         if (pgd_none(*pgd)) {
406                 if (!new_pud)
407                         goto out_unlock;
408                 pgd_populate(kvm->mm, pgd, new_pud);
409                 new_pud = NULL;
410         }
411         pud = pud_offset(pgd, gpa);
412         if (pud_huge(*pud)) {
413                 unsigned long hgpa = gpa & PUD_MASK;
414
415                 /* Check if we raced and someone else has set the same thing */
416                 if (level == 2) {
417                         if (pud_raw(*pud) == pte_raw(pte)) {
418                                 ret = 0;
419                                 goto out_unlock;
420                         }
421                         /* Valid 1GB page here already, add our extra bits */
422                         WARN_ON_ONCE((pud_val(*pud) ^ pte_val(pte)) &
423                                                         PTE_BITS_MUST_MATCH);
424                         kvmppc_radix_update_pte(kvm, (pte_t *)pud,
425                                               0, pte_val(pte), hgpa, PUD_SHIFT);
426                         ret = 0;
427                         goto out_unlock;
428                 }
429                 /*
430                  * If we raced with another CPU which has just put
431                  * a 1GB pte in after we saw a pmd page, try again.
432                  */
433                 if (!new_pmd) {
434                         ret = -EAGAIN;
435                         goto out_unlock;
436                 }
437                 /* Valid 1GB page here already, remove it */
438                 kvmppc_unmap_pte(kvm, (pte_t *)pud, hgpa, PUD_SHIFT);
439         }
440         if (level == 2) {
441                 if (!pud_none(*pud)) {
442                         /*
443                          * There's a page table page here, but we wanted to
444                          * install a large page, so remove and free the page
445                          * table page.
446                          */
447                         kvmppc_unmap_free_pud_entry_table(kvm, pud, gpa);
448                 }
449                 kvmppc_radix_set_pte_at(kvm, gpa, (pte_t *)pud, pte);
450                 ret = 0;
451                 goto out_unlock;
452         }
453         if (pud_none(*pud)) {
454                 if (!new_pmd)
455                         goto out_unlock;
456                 pud_populate(kvm->mm, pud, new_pmd);
457                 new_pmd = NULL;
458         }
459         pmd = pmd_offset(pud, gpa);
460         if (pmd_is_leaf(*pmd)) {
461                 unsigned long lgpa = gpa & PMD_MASK;
462
463                 /* Check if we raced and someone else has set the same thing */
464                 if (level == 1) {
465                         if (pmd_raw(*pmd) == pte_raw(pte)) {
466                                 ret = 0;
467                                 goto out_unlock;
468                         }
469                         /* Valid 2MB page here already, add our extra bits */
470                         WARN_ON_ONCE((pmd_val(*pmd) ^ pte_val(pte)) &
471                                                         PTE_BITS_MUST_MATCH);
472                         kvmppc_radix_update_pte(kvm, pmdp_ptep(pmd),
473                                               0, pte_val(pte), lgpa, PMD_SHIFT);
474                         ret = 0;
475                         goto out_unlock;
476                 }
477
478                 /*
479                  * If we raced with another CPU which has just put
480                  * a 2MB pte in after we saw a pte page, try again.
481                  */
482                 if (!new_ptep) {
483                         ret = -EAGAIN;
484                         goto out_unlock;
485                 }
486                 /* Valid 2MB page here already, remove it */
487                 kvmppc_unmap_pte(kvm, pmdp_ptep(pmd), lgpa, PMD_SHIFT);
488         }
489         if (level == 1) {
490                 if (!pmd_none(*pmd)) {
491                         /*
492                          * There's a page table page here, but we wanted to
493                          * install a large page, so remove and free the page
494                          * table page.
495                          */
496                         kvmppc_unmap_free_pmd_entry_table(kvm, pmd, gpa);
497                 }
498                 kvmppc_radix_set_pte_at(kvm, gpa, pmdp_ptep(pmd), pte);
499                 ret = 0;
500                 goto out_unlock;
501         }
502         if (pmd_none(*pmd)) {
503                 if (!new_ptep)
504                         goto out_unlock;
505                 pmd_populate(kvm->mm, pmd, new_ptep);
506                 new_ptep = NULL;
507         }
508         ptep = pte_offset_kernel(pmd, gpa);
509         if (pte_present(*ptep)) {
510                 /* Check if someone else set the same thing */
511                 if (pte_raw(*ptep) == pte_raw(pte)) {
512                         ret = 0;
513                         goto out_unlock;
514                 }
515                 /* Valid page here already, add our extra bits */
516                 WARN_ON_ONCE((pte_val(*ptep) ^ pte_val(pte)) &
517                                                         PTE_BITS_MUST_MATCH);
518                 kvmppc_radix_update_pte(kvm, ptep, 0, pte_val(pte), gpa, 0);
519                 ret = 0;
520                 goto out_unlock;
521         }
522         kvmppc_radix_set_pte_at(kvm, gpa, ptep, pte);
523         ret = 0;
524
525  out_unlock:
526         spin_unlock(&kvm->mmu_lock);
527         if (new_pud)
528                 pud_free(kvm->mm, new_pud);
529         if (new_pmd)
530                 kvmppc_pmd_free(new_pmd);
531         if (new_ptep)
532                 kvmppc_pte_free(new_ptep);
533         return ret;
534 }
535
536 int kvmppc_book3s_radix_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
537                                    unsigned long ea, unsigned long dsisr)
538 {
539         struct kvm *kvm = vcpu->kvm;
540         unsigned long mmu_seq;
541         unsigned long gpa, gfn, hva;
542         struct kvm_memory_slot *memslot;
543         struct page *page = NULL;
544         long ret;
545         bool writing;
546         bool upgrade_write = false;
547         bool *upgrade_p = &upgrade_write;
548         pte_t pte, *ptep;
549         unsigned long pgflags;
550         unsigned int shift, level;
551
552         /* Check for unusual errors */
553         if (dsisr & DSISR_UNSUPP_MMU) {
554                 pr_err("KVM: Got unsupported MMU fault\n");
555                 return -EFAULT;
556         }
557         if (dsisr & DSISR_BADACCESS) {
558                 /* Reflect to the guest as DSI */
559                 pr_err("KVM: Got radix HV page fault with DSISR=%lx\n", dsisr);
560                 kvmppc_core_queue_data_storage(vcpu, ea, dsisr);
561                 return RESUME_GUEST;
562         }
563
564         /* Translate the logical address and get the page */
565         gpa = vcpu->arch.fault_gpa & ~0xfffUL;
566         gpa &= ~0xF000000000000000ul;
567         gfn = gpa >> PAGE_SHIFT;
568         if (!(dsisr & DSISR_PRTABLE_FAULT))
569                 gpa |= ea & 0xfff;
570         memslot = gfn_to_memslot(kvm, gfn);
571
572         /* No memslot means it's an emulated MMIO region */
573         if (!memslot || (memslot->flags & KVM_MEMSLOT_INVALID)) {
574                 if (dsisr & (DSISR_PRTABLE_FAULT | DSISR_BADACCESS |
575                              DSISR_SET_RC)) {
576                         /*
577                          * Bad address in guest page table tree, or other
578                          * unusual error - reflect it to the guest as DSI.
579                          */
580                         kvmppc_core_queue_data_storage(vcpu, ea, dsisr);
581                         return RESUME_GUEST;
582                 }
583                 return kvmppc_hv_emulate_mmio(run, vcpu, gpa, ea,
584                                               dsisr & DSISR_ISSTORE);
585         }
586
587         writing = (dsisr & DSISR_ISSTORE) != 0;
588         if (memslot->flags & KVM_MEM_READONLY) {
589                 if (writing) {
590                         /* give the guest a DSI */
591                         dsisr = DSISR_ISSTORE | DSISR_PROTFAULT;
592                         kvmppc_core_queue_data_storage(vcpu, ea, dsisr);
593                         return RESUME_GUEST;
594                 }
595                 upgrade_p = NULL;
596         }
597
598         if (dsisr & DSISR_SET_RC) {
599                 /*
600                  * Need to set an R or C bit in the 2nd-level tables;
601                  * since we are just helping out the hardware here,
602                  * it is sufficient to do what the hardware does.
603                  */
604                 pgflags = _PAGE_ACCESSED;
605                 if (writing)
606                         pgflags |= _PAGE_DIRTY;
607                 /*
608                  * We are walking the secondary page table here. We can do this
609                  * without disabling irq.
610                  */
611                 spin_lock(&kvm->mmu_lock);
612                 ptep = __find_linux_pte(kvm->arch.pgtable,
613                                         gpa, NULL, &shift);
614                 if (ptep && pte_present(*ptep) &&
615                     (!writing || pte_write(*ptep))) {
616                         kvmppc_radix_update_pte(kvm, ptep, 0, pgflags,
617                                                 gpa, shift);
618                         dsisr &= ~DSISR_SET_RC;
619                 }
620                 spin_unlock(&kvm->mmu_lock);
621                 if (!(dsisr & (DSISR_BAD_FAULT_64S | DSISR_NOHPTE |
622                                DSISR_PROTFAULT | DSISR_SET_RC)))
623                         return RESUME_GUEST;
624         }
625
626         /* used to check for invalidations in progress */
627         mmu_seq = kvm->mmu_notifier_seq;
628         smp_rmb();
629
630         /*
631          * Do a fast check first, since __gfn_to_pfn_memslot doesn't
632          * do it with !atomic && !async, which is how we call it.
633          * We always ask for write permission since the common case
634          * is that the page is writable.
635          */
636         hva = gfn_to_hva_memslot(memslot, gfn);
637         if (upgrade_p && __get_user_pages_fast(hva, 1, 1, &page) == 1) {
638                 upgrade_write = true;
639         } else {
640                 unsigned long pfn;
641
642                 /* Call KVM generic code to do the slow-path check */
643                 pfn = __gfn_to_pfn_memslot(memslot, gfn, false, NULL,
644                                            writing, upgrade_p);
645                 if (is_error_noslot_pfn(pfn))
646                         return -EFAULT;
647                 page = NULL;
648                 if (pfn_valid(pfn)) {
649                         page = pfn_to_page(pfn);
650                         if (PageReserved(page))
651                                 page = NULL;
652                 }
653         }
654
655         /*
656          * Read the PTE from the process' radix tree and use that
657          * so we get the shift and attribute bits.
658          */
659         local_irq_disable();
660         ptep = __find_linux_pte(vcpu->arch.pgdir, hva, NULL, &shift);
661         /*
662          * If the PTE disappeared temporarily due to a THP
663          * collapse, just return and let the guest try again.
664          */
665         if (!ptep) {
666                 local_irq_enable();
667                 if (page)
668                         put_page(page);
669                 return RESUME_GUEST;
670         }
671         pte = *ptep;
672         local_irq_enable();
673
674         /* Get pte level from shift/size */
675         if (shift == PUD_SHIFT &&
676             (gpa & (PUD_SIZE - PAGE_SIZE)) ==
677             (hva & (PUD_SIZE - PAGE_SIZE))) {
678                 level = 2;
679         } else if (shift == PMD_SHIFT &&
680                    (gpa & (PMD_SIZE - PAGE_SIZE)) ==
681                    (hva & (PMD_SIZE - PAGE_SIZE))) {
682                 level = 1;
683         } else {
684                 level = 0;
685                 if (shift > PAGE_SHIFT) {
686                         /*
687                          * If the pte maps more than one page, bring over
688                          * bits from the virtual address to get the real
689                          * address of the specific single page we want.
690                          */
691                         unsigned long rpnmask = (1ul << shift) - PAGE_SIZE;
692                         pte = __pte(pte_val(pte) | (hva & rpnmask));
693                 }
694         }
695
696         pte = __pte(pte_val(pte) | _PAGE_EXEC | _PAGE_ACCESSED);
697         if (writing || upgrade_write) {
698                 if (pte_val(pte) & _PAGE_WRITE)
699                         pte = __pte(pte_val(pte) | _PAGE_DIRTY);
700         } else {
701                 pte = __pte(pte_val(pte) & ~(_PAGE_WRITE | _PAGE_DIRTY));
702         }
703
704         /* Allocate space in the tree and write the PTE */
705         ret = kvmppc_create_pte(kvm, pte, gpa, level, mmu_seq);
706
707         if (page) {
708                 if (!ret && (pte_val(pte) & _PAGE_WRITE))
709                         set_page_dirty_lock(page);
710                 put_page(page);
711         }
712
713         if (ret == 0 || ret == -EAGAIN)
714                 ret = RESUME_GUEST;
715         return ret;
716 }
717
718 /* Called with kvm->lock held */
719 int kvm_unmap_radix(struct kvm *kvm, struct kvm_memory_slot *memslot,
720                     unsigned long gfn)
721 {
722         pte_t *ptep;
723         unsigned long gpa = gfn << PAGE_SHIFT;
724         unsigned int shift;
725         unsigned long old;
726
727         ptep = __find_linux_pte(kvm->arch.pgtable, gpa, NULL, &shift);
728         if (ptep && pte_present(*ptep)) {
729                 old = kvmppc_radix_update_pte(kvm, ptep, ~0UL, 0,
730                                               gpa, shift);
731                 kvmppc_radix_tlbie_page(kvm, gpa, shift);
732                 if ((old & _PAGE_DIRTY) && memslot->dirty_bitmap) {
733                         unsigned long psize = PAGE_SIZE;
734                         if (shift)
735                                 psize = 1ul << shift;
736                         kvmppc_update_dirty_map(memslot, gfn, psize);
737                 }
738         }
739         return 0;                               
740 }
741
742 /* Called with kvm->lock held */
743 int kvm_age_radix(struct kvm *kvm, struct kvm_memory_slot *memslot,
744                   unsigned long gfn)
745 {
746         pte_t *ptep;
747         unsigned long gpa = gfn << PAGE_SHIFT;
748         unsigned int shift;
749         int ref = 0;
750
751         ptep = __find_linux_pte(kvm->arch.pgtable, gpa, NULL, &shift);
752         if (ptep && pte_present(*ptep) && pte_young(*ptep)) {
753                 kvmppc_radix_update_pte(kvm, ptep, _PAGE_ACCESSED, 0,
754                                         gpa, shift);
755                 /* XXX need to flush tlb here? */
756                 ref = 1;
757         }
758         return ref;
759 }
760
761 /* Called with kvm->lock held */
762 int kvm_test_age_radix(struct kvm *kvm, struct kvm_memory_slot *memslot,
763                        unsigned long gfn)
764 {
765         pte_t *ptep;
766         unsigned long gpa = gfn << PAGE_SHIFT;
767         unsigned int shift;
768         int ref = 0;
769
770         ptep = __find_linux_pte(kvm->arch.pgtable, gpa, NULL, &shift);
771         if (ptep && pte_present(*ptep) && pte_young(*ptep))
772                 ref = 1;
773         return ref;
774 }
775
776 /* Returns the number of PAGE_SIZE pages that are dirty */
777 static int kvm_radix_test_clear_dirty(struct kvm *kvm,
778                                 struct kvm_memory_slot *memslot, int pagenum)
779 {
780         unsigned long gfn = memslot->base_gfn + pagenum;
781         unsigned long gpa = gfn << PAGE_SHIFT;
782         pte_t *ptep;
783         unsigned int shift;
784         int ret = 0;
785
786         ptep = __find_linux_pte(kvm->arch.pgtable, gpa, NULL, &shift);
787         if (ptep && pte_present(*ptep) && pte_dirty(*ptep)) {
788                 ret = 1;
789                 if (shift)
790                         ret = 1 << (shift - PAGE_SHIFT);
791                 kvmppc_radix_update_pte(kvm, ptep, _PAGE_DIRTY, 0,
792                                         gpa, shift);
793                 kvmppc_radix_tlbie_page(kvm, gpa, shift);
794         }
795         return ret;
796 }
797
798 long kvmppc_hv_get_dirty_log_radix(struct kvm *kvm,
799                         struct kvm_memory_slot *memslot, unsigned long *map)
800 {
801         unsigned long i, j;
802         int npages;
803
804         for (i = 0; i < memslot->npages; i = j) {
805                 npages = kvm_radix_test_clear_dirty(kvm, memslot, i);
806
807                 /*
808                  * Note that if npages > 0 then i must be a multiple of npages,
809                  * since huge pages are only used to back the guest at guest
810                  * real addresses that are a multiple of their size.
811                  * Since we have at most one PTE covering any given guest
812                  * real address, if npages > 1 we can skip to i + npages.
813                  */
814                 j = i + 1;
815                 if (npages) {
816                         set_dirty_bits(map, i, npages);
817                         j = i + npages;
818                 }
819         }
820         return 0;
821 }
822
823 static void add_rmmu_ap_encoding(struct kvm_ppc_rmmu_info *info,
824                                  int psize, int *indexp)
825 {
826         if (!mmu_psize_defs[psize].shift)
827                 return;
828         info->ap_encodings[*indexp] = mmu_psize_defs[psize].shift |
829                 (mmu_psize_defs[psize].ap << 29);
830         ++(*indexp);
831 }
832
833 int kvmhv_get_rmmu_info(struct kvm *kvm, struct kvm_ppc_rmmu_info *info)
834 {
835         int i;
836
837         if (!radix_enabled())
838                 return -EINVAL;
839         memset(info, 0, sizeof(*info));
840
841         /* 4k page size */
842         info->geometries[0].page_shift = 12;
843         info->geometries[0].level_bits[0] = 9;
844         for (i = 1; i < 4; ++i)
845                 info->geometries[0].level_bits[i] = p9_supported_radix_bits[i];
846         /* 64k page size */
847         info->geometries[1].page_shift = 16;
848         for (i = 0; i < 4; ++i)
849                 info->geometries[1].level_bits[i] = p9_supported_radix_bits[i];
850
851         i = 0;
852         add_rmmu_ap_encoding(info, MMU_PAGE_4K, &i);
853         add_rmmu_ap_encoding(info, MMU_PAGE_64K, &i);
854         add_rmmu_ap_encoding(info, MMU_PAGE_2M, &i);
855         add_rmmu_ap_encoding(info, MMU_PAGE_1G, &i);
856
857         return 0;
858 }
859
860 int kvmppc_init_vm_radix(struct kvm *kvm)
861 {
862         kvm->arch.pgtable = pgd_alloc(kvm->mm);
863         if (!kvm->arch.pgtable)
864                 return -ENOMEM;
865         return 0;
866 }
867
868 static void pte_ctor(void *addr)
869 {
870         memset(addr, 0, RADIX_PTE_TABLE_SIZE);
871 }
872
873 static void pmd_ctor(void *addr)
874 {
875         memset(addr, 0, RADIX_PMD_TABLE_SIZE);
876 }
877
878 int kvmppc_radix_init(void)
879 {
880         unsigned long size = sizeof(void *) << RADIX_PTE_INDEX_SIZE;
881
882         kvm_pte_cache = kmem_cache_create("kvm-pte", size, size, 0, pte_ctor);
883         if (!kvm_pte_cache)
884                 return -ENOMEM;
885
886         size = sizeof(void *) << RADIX_PMD_INDEX_SIZE;
887
888         kvm_pmd_cache = kmem_cache_create("kvm-pmd", size, size, 0, pmd_ctor);
889         if (!kvm_pmd_cache) {
890                 kmem_cache_destroy(kvm_pte_cache);
891                 return -ENOMEM;
892         }
893
894         return 0;
895 }
896
897 void kvmppc_radix_exit(void)
898 {
899         kmem_cache_destroy(kvm_pte_cache);
900         kmem_cache_destroy(kvm_pmd_cache);
901 }