OSDN Git Service

689b66f29fc606285482939bbb574aef5758fa2e
[uclinux-h8/linux.git] / arch / s390 / mm / pgtable.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  *    Copyright IBM Corp. 2007, 2011
4  *    Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
5  */
6
7 #include <linux/sched.h>
8 #include <linux/kernel.h>
9 #include <linux/errno.h>
10 #include <linux/gfp.h>
11 #include <linux/mm.h>
12 #include <linux/swap.h>
13 #include <linux/smp.h>
14 #include <linux/spinlock.h>
15 #include <linux/rcupdate.h>
16 #include <linux/slab.h>
17 #include <linux/swapops.h>
18 #include <linux/sysctl.h>
19 #include <linux/ksm.h>
20 #include <linux/mman.h>
21
22 #include <asm/pgtable.h>
23 #include <asm/pgalloc.h>
24 #include <asm/tlb.h>
25 #include <asm/tlbflush.h>
26 #include <asm/mmu_context.h>
27 #include <asm/page-states.h>
28
29 static inline void ptep_ipte_local(struct mm_struct *mm, unsigned long addr,
30                                    pte_t *ptep, int nodat)
31 {
32         unsigned long opt, asce;
33
34         if (MACHINE_HAS_TLB_GUEST) {
35                 opt = 0;
36                 asce = READ_ONCE(mm->context.gmap_asce);
37                 if (asce == 0UL || nodat)
38                         opt |= IPTE_NODAT;
39                 if (asce != -1UL) {
40                         asce = asce ? : mm->context.asce;
41                         opt |= IPTE_GUEST_ASCE;
42                 }
43                 __ptep_ipte(addr, ptep, opt, asce, IPTE_LOCAL);
44         } else {
45                 __ptep_ipte(addr, ptep, 0, 0, IPTE_LOCAL);
46         }
47 }
48
49 static inline void ptep_ipte_global(struct mm_struct *mm, unsigned long addr,
50                                     pte_t *ptep, int nodat)
51 {
52         unsigned long opt, asce;
53
54         if (MACHINE_HAS_TLB_GUEST) {
55                 opt = 0;
56                 asce = READ_ONCE(mm->context.gmap_asce);
57                 if (asce == 0UL || nodat)
58                         opt |= IPTE_NODAT;
59                 if (asce != -1UL) {
60                         asce = asce ? : mm->context.asce;
61                         opt |= IPTE_GUEST_ASCE;
62                 }
63                 __ptep_ipte(addr, ptep, opt, asce, IPTE_GLOBAL);
64         } else {
65                 __ptep_ipte(addr, ptep, 0, 0, IPTE_GLOBAL);
66         }
67 }
68
69 static inline pte_t ptep_flush_direct(struct mm_struct *mm,
70                                       unsigned long addr, pte_t *ptep,
71                                       int nodat)
72 {
73         pte_t old;
74
75         old = *ptep;
76         if (unlikely(pte_val(old) & _PAGE_INVALID))
77                 return old;
78         atomic_inc(&mm->context.flush_count);
79         if (MACHINE_HAS_TLB_LC &&
80             cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id())))
81                 ptep_ipte_local(mm, addr, ptep, nodat);
82         else
83                 ptep_ipte_global(mm, addr, ptep, nodat);
84         atomic_dec(&mm->context.flush_count);
85         return old;
86 }
87
88 static inline pte_t ptep_flush_lazy(struct mm_struct *mm,
89                                     unsigned long addr, pte_t *ptep,
90                                     int nodat)
91 {
92         pte_t old;
93
94         old = *ptep;
95         if (unlikely(pte_val(old) & _PAGE_INVALID))
96                 return old;
97         atomic_inc(&mm->context.flush_count);
98         if (cpumask_equal(&mm->context.cpu_attach_mask,
99                           cpumask_of(smp_processor_id()))) {
100                 pte_val(*ptep) |= _PAGE_INVALID;
101                 mm->context.flush_mm = 1;
102         } else
103                 ptep_ipte_global(mm, addr, ptep, nodat);
104         atomic_dec(&mm->context.flush_count);
105         return old;
106 }
107
108 static inline pgste_t pgste_get_lock(pte_t *ptep)
109 {
110         unsigned long new = 0;
111 #ifdef CONFIG_PGSTE
112         unsigned long old;
113
114         asm(
115                 "       lg      %0,%2\n"
116                 "0:     lgr     %1,%0\n"
117                 "       nihh    %0,0xff7f\n"    /* clear PCL bit in old */
118                 "       oihh    %1,0x0080\n"    /* set PCL bit in new */
119                 "       csg     %0,%1,%2\n"
120                 "       jl      0b\n"
121                 : "=&d" (old), "=&d" (new), "=Q" (ptep[PTRS_PER_PTE])
122                 : "Q" (ptep[PTRS_PER_PTE]) : "cc", "memory");
123 #endif
124         return __pgste(new);
125 }
126
127 static inline void pgste_set_unlock(pte_t *ptep, pgste_t pgste)
128 {
129 #ifdef CONFIG_PGSTE
130         asm(
131                 "       nihh    %1,0xff7f\n"    /* clear PCL bit */
132                 "       stg     %1,%0\n"
133                 : "=Q" (ptep[PTRS_PER_PTE])
134                 : "d" (pgste_val(pgste)), "Q" (ptep[PTRS_PER_PTE])
135                 : "cc", "memory");
136 #endif
137 }
138
139 static inline pgste_t pgste_get(pte_t *ptep)
140 {
141         unsigned long pgste = 0;
142 #ifdef CONFIG_PGSTE
143         pgste = *(unsigned long *)(ptep + PTRS_PER_PTE);
144 #endif
145         return __pgste(pgste);
146 }
147
148 static inline void pgste_set(pte_t *ptep, pgste_t pgste)
149 {
150 #ifdef CONFIG_PGSTE
151         *(pgste_t *)(ptep + PTRS_PER_PTE) = pgste;
152 #endif
153 }
154
155 static inline pgste_t pgste_update_all(pte_t pte, pgste_t pgste,
156                                        struct mm_struct *mm)
157 {
158 #ifdef CONFIG_PGSTE
159         unsigned long address, bits, skey;
160
161         if (!mm_uses_skeys(mm) || pte_val(pte) & _PAGE_INVALID)
162                 return pgste;
163         address = pte_val(pte) & PAGE_MASK;
164         skey = (unsigned long) page_get_storage_key(address);
165         bits = skey & (_PAGE_CHANGED | _PAGE_REFERENCED);
166         /* Transfer page changed & referenced bit to guest bits in pgste */
167         pgste_val(pgste) |= bits << 48;         /* GR bit & GC bit */
168         /* Copy page access key and fetch protection bit to pgste */
169         pgste_val(pgste) &= ~(PGSTE_ACC_BITS | PGSTE_FP_BIT);
170         pgste_val(pgste) |= (skey & (_PAGE_ACC_BITS | _PAGE_FP_BIT)) << 56;
171 #endif
172         return pgste;
173
174 }
175
176 static inline void pgste_set_key(pte_t *ptep, pgste_t pgste, pte_t entry,
177                                  struct mm_struct *mm)
178 {
179 #ifdef CONFIG_PGSTE
180         unsigned long address;
181         unsigned long nkey;
182
183         if (!mm_uses_skeys(mm) || pte_val(entry) & _PAGE_INVALID)
184                 return;
185         VM_BUG_ON(!(pte_val(*ptep) & _PAGE_INVALID));
186         address = pte_val(entry) & PAGE_MASK;
187         /*
188          * Set page access key and fetch protection bit from pgste.
189          * The guest C/R information is still in the PGSTE, set real
190          * key C/R to 0.
191          */
192         nkey = (pgste_val(pgste) & (PGSTE_ACC_BITS | PGSTE_FP_BIT)) >> 56;
193         nkey |= (pgste_val(pgste) & (PGSTE_GR_BIT | PGSTE_GC_BIT)) >> 48;
194         page_set_storage_key(address, nkey, 0);
195 #endif
196 }
197
198 static inline pgste_t pgste_set_pte(pte_t *ptep, pgste_t pgste, pte_t entry)
199 {
200 #ifdef CONFIG_PGSTE
201         if ((pte_val(entry) & _PAGE_PRESENT) &&
202             (pte_val(entry) & _PAGE_WRITE) &&
203             !(pte_val(entry) & _PAGE_INVALID)) {
204                 if (!MACHINE_HAS_ESOP) {
205                         /*
206                          * Without enhanced suppression-on-protection force
207                          * the dirty bit on for all writable ptes.
208                          */
209                         pte_val(entry) |= _PAGE_DIRTY;
210                         pte_val(entry) &= ~_PAGE_PROTECT;
211                 }
212                 if (!(pte_val(entry) & _PAGE_PROTECT))
213                         /* This pte allows write access, set user-dirty */
214                         pgste_val(pgste) |= PGSTE_UC_BIT;
215         }
216 #endif
217         *ptep = entry;
218         return pgste;
219 }
220
221 static inline pgste_t pgste_pte_notify(struct mm_struct *mm,
222                                        unsigned long addr,
223                                        pte_t *ptep, pgste_t pgste)
224 {
225 #ifdef CONFIG_PGSTE
226         unsigned long bits;
227
228         bits = pgste_val(pgste) & (PGSTE_IN_BIT | PGSTE_VSIE_BIT);
229         if (bits) {
230                 pgste_val(pgste) ^= bits;
231                 ptep_notify(mm, addr, ptep, bits);
232         }
233 #endif
234         return pgste;
235 }
236
237 static inline pgste_t ptep_xchg_start(struct mm_struct *mm,
238                                       unsigned long addr, pte_t *ptep)
239 {
240         pgste_t pgste = __pgste(0);
241
242         if (mm_has_pgste(mm)) {
243                 pgste = pgste_get_lock(ptep);
244                 pgste = pgste_pte_notify(mm, addr, ptep, pgste);
245         }
246         return pgste;
247 }
248
249 static inline pte_t ptep_xchg_commit(struct mm_struct *mm,
250                                     unsigned long addr, pte_t *ptep,
251                                     pgste_t pgste, pte_t old, pte_t new)
252 {
253         if (mm_has_pgste(mm)) {
254                 if (pte_val(old) & _PAGE_INVALID)
255                         pgste_set_key(ptep, pgste, new, mm);
256                 if (pte_val(new) & _PAGE_INVALID) {
257                         pgste = pgste_update_all(old, pgste, mm);
258                         if ((pgste_val(pgste) & _PGSTE_GPS_USAGE_MASK) ==
259                             _PGSTE_GPS_USAGE_UNUSED)
260                                 pte_val(old) |= _PAGE_UNUSED;
261                 }
262                 pgste = pgste_set_pte(ptep, pgste, new);
263                 pgste_set_unlock(ptep, pgste);
264         } else {
265                 *ptep = new;
266         }
267         return old;
268 }
269
270 pte_t ptep_xchg_direct(struct mm_struct *mm, unsigned long addr,
271                        pte_t *ptep, pte_t new)
272 {
273         pgste_t pgste;
274         pte_t old;
275         int nodat;
276
277         preempt_disable();
278         pgste = ptep_xchg_start(mm, addr, ptep);
279         nodat = !!(pgste_val(pgste) & _PGSTE_GPS_NODAT);
280         old = ptep_flush_direct(mm, addr, ptep, nodat);
281         old = ptep_xchg_commit(mm, addr, ptep, pgste, old, new);
282         preempt_enable();
283         return old;
284 }
285 EXPORT_SYMBOL(ptep_xchg_direct);
286
287 pte_t ptep_xchg_lazy(struct mm_struct *mm, unsigned long addr,
288                      pte_t *ptep, pte_t new)
289 {
290         pgste_t pgste;
291         pte_t old;
292         int nodat;
293
294         preempt_disable();
295         pgste = ptep_xchg_start(mm, addr, ptep);
296         nodat = !!(pgste_val(pgste) & _PGSTE_GPS_NODAT);
297         old = ptep_flush_lazy(mm, addr, ptep, nodat);
298         old = ptep_xchg_commit(mm, addr, ptep, pgste, old, new);
299         preempt_enable();
300         return old;
301 }
302 EXPORT_SYMBOL(ptep_xchg_lazy);
303
304 pte_t ptep_modify_prot_start(struct mm_struct *mm, unsigned long addr,
305                              pte_t *ptep)
306 {
307         pgste_t pgste;
308         pte_t old;
309         int nodat;
310
311         preempt_disable();
312         pgste = ptep_xchg_start(mm, addr, ptep);
313         nodat = !!(pgste_val(pgste) & _PGSTE_GPS_NODAT);
314         old = ptep_flush_lazy(mm, addr, ptep, nodat);
315         if (mm_has_pgste(mm)) {
316                 pgste = pgste_update_all(old, pgste, mm);
317                 pgste_set(ptep, pgste);
318         }
319         return old;
320 }
321
322 void ptep_modify_prot_commit(struct mm_struct *mm, unsigned long addr,
323                              pte_t *ptep, pte_t pte)
324 {
325         pgste_t pgste;
326
327         if (!MACHINE_HAS_NX)
328                 pte_val(pte) &= ~_PAGE_NOEXEC;
329         if (mm_has_pgste(mm)) {
330                 pgste = pgste_get(ptep);
331                 pgste_set_key(ptep, pgste, pte, mm);
332                 pgste = pgste_set_pte(ptep, pgste, pte);
333                 pgste_set_unlock(ptep, pgste);
334         } else {
335                 *ptep = pte;
336         }
337         preempt_enable();
338 }
339
340 static inline void pmdp_idte_local(struct mm_struct *mm,
341                                    unsigned long addr, pmd_t *pmdp)
342 {
343         if (MACHINE_HAS_TLB_GUEST)
344                 __pmdp_idte(addr, pmdp, IDTE_NODAT | IDTE_GUEST_ASCE,
345                             mm->context.asce, IDTE_LOCAL);
346         else
347                 __pmdp_idte(addr, pmdp, 0, 0, IDTE_LOCAL);
348         if (mm_has_pgste(mm) && mm->context.allow_gmap_hpage_1m)
349                 gmap_pmdp_idte_local(mm, addr);
350 }
351
352 static inline void pmdp_idte_global(struct mm_struct *mm,
353                                     unsigned long addr, pmd_t *pmdp)
354 {
355         if (MACHINE_HAS_TLB_GUEST) {
356                 __pmdp_idte(addr, pmdp, IDTE_NODAT | IDTE_GUEST_ASCE,
357                             mm->context.asce, IDTE_GLOBAL);
358                 if (mm_has_pgste(mm) && mm->context.allow_gmap_hpage_1m)
359                         gmap_pmdp_idte_global(mm, addr);
360         } else if (MACHINE_HAS_IDTE) {
361                 __pmdp_idte(addr, pmdp, 0, 0, IDTE_GLOBAL);
362                 if (mm_has_pgste(mm) && mm->context.allow_gmap_hpage_1m)
363                         gmap_pmdp_idte_global(mm, addr);
364         } else {
365                 __pmdp_csp(pmdp);
366                 if (mm_has_pgste(mm) && mm->context.allow_gmap_hpage_1m)
367                         gmap_pmdp_csp(mm, addr);
368         }
369 }
370
371 static inline pmd_t pmdp_flush_direct(struct mm_struct *mm,
372                                       unsigned long addr, pmd_t *pmdp)
373 {
374         pmd_t old;
375
376         old = *pmdp;
377         if (pmd_val(old) & _SEGMENT_ENTRY_INVALID)
378                 return old;
379         atomic_inc(&mm->context.flush_count);
380         if (MACHINE_HAS_TLB_LC &&
381             cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id())))
382                 pmdp_idte_local(mm, addr, pmdp);
383         else
384                 pmdp_idte_global(mm, addr, pmdp);
385         atomic_dec(&mm->context.flush_count);
386         return old;
387 }
388
389 static inline pmd_t pmdp_flush_lazy(struct mm_struct *mm,
390                                     unsigned long addr, pmd_t *pmdp)
391 {
392         pmd_t old;
393
394         old = *pmdp;
395         if (pmd_val(old) & _SEGMENT_ENTRY_INVALID)
396                 return old;
397         atomic_inc(&mm->context.flush_count);
398         if (cpumask_equal(&mm->context.cpu_attach_mask,
399                           cpumask_of(smp_processor_id()))) {
400                 pmd_val(*pmdp) |= _SEGMENT_ENTRY_INVALID;
401                 mm->context.flush_mm = 1;
402                 if (mm_has_pgste(mm))
403                         gmap_pmdp_invalidate(mm, addr);
404         } else {
405                 pmdp_idte_global(mm, addr, pmdp);
406         }
407         atomic_dec(&mm->context.flush_count);
408         return old;
409 }
410
411 static pmd_t *pmd_alloc_map(struct mm_struct *mm, unsigned long addr)
412 {
413         pgd_t *pgd;
414         p4d_t *p4d;
415         pud_t *pud;
416         pmd_t *pmd;
417
418         pgd = pgd_offset(mm, addr);
419         p4d = p4d_alloc(mm, pgd, addr);
420         if (!p4d)
421                 return NULL;
422         pud = pud_alloc(mm, p4d, addr);
423         if (!pud)
424                 return NULL;
425         pmd = pmd_alloc(mm, pud, addr);
426         return pmd;
427 }
428
429 pmd_t pmdp_xchg_direct(struct mm_struct *mm, unsigned long addr,
430                        pmd_t *pmdp, pmd_t new)
431 {
432         pmd_t old;
433
434         preempt_disable();
435         old = pmdp_flush_direct(mm, addr, pmdp);
436         *pmdp = new;
437         preempt_enable();
438         return old;
439 }
440 EXPORT_SYMBOL(pmdp_xchg_direct);
441
442 pmd_t pmdp_xchg_lazy(struct mm_struct *mm, unsigned long addr,
443                      pmd_t *pmdp, pmd_t new)
444 {
445         pmd_t old;
446
447         preempt_disable();
448         old = pmdp_flush_lazy(mm, addr, pmdp);
449         *pmdp = new;
450         preempt_enable();
451         return old;
452 }
453 EXPORT_SYMBOL(pmdp_xchg_lazy);
454
455 static inline void pudp_idte_local(struct mm_struct *mm,
456                                    unsigned long addr, pud_t *pudp)
457 {
458         if (MACHINE_HAS_TLB_GUEST)
459                 __pudp_idte(addr, pudp, IDTE_NODAT | IDTE_GUEST_ASCE,
460                             mm->context.asce, IDTE_LOCAL);
461         else
462                 __pudp_idte(addr, pudp, 0, 0, IDTE_LOCAL);
463 }
464
465 static inline void pudp_idte_global(struct mm_struct *mm,
466                                     unsigned long addr, pud_t *pudp)
467 {
468         if (MACHINE_HAS_TLB_GUEST)
469                 __pudp_idte(addr, pudp, IDTE_NODAT | IDTE_GUEST_ASCE,
470                             mm->context.asce, IDTE_GLOBAL);
471         else if (MACHINE_HAS_IDTE)
472                 __pudp_idte(addr, pudp, 0, 0, IDTE_GLOBAL);
473         else
474                 /*
475                  * Invalid bit position is the same for pmd and pud, so we can
476                  * re-use _pmd_csp() here
477                  */
478                 __pmdp_csp((pmd_t *) pudp);
479 }
480
481 static inline pud_t pudp_flush_direct(struct mm_struct *mm,
482                                       unsigned long addr, pud_t *pudp)
483 {
484         pud_t old;
485
486         old = *pudp;
487         if (pud_val(old) & _REGION_ENTRY_INVALID)
488                 return old;
489         atomic_inc(&mm->context.flush_count);
490         if (MACHINE_HAS_TLB_LC &&
491             cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id())))
492                 pudp_idte_local(mm, addr, pudp);
493         else
494                 pudp_idte_global(mm, addr, pudp);
495         atomic_dec(&mm->context.flush_count);
496         return old;
497 }
498
499 pud_t pudp_xchg_direct(struct mm_struct *mm, unsigned long addr,
500                        pud_t *pudp, pud_t new)
501 {
502         pud_t old;
503
504         preempt_disable();
505         old = pudp_flush_direct(mm, addr, pudp);
506         *pudp = new;
507         preempt_enable();
508         return old;
509 }
510 EXPORT_SYMBOL(pudp_xchg_direct);
511
512 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
513 void pgtable_trans_huge_deposit(struct mm_struct *mm, pmd_t *pmdp,
514                                 pgtable_t pgtable)
515 {
516         struct list_head *lh = (struct list_head *) pgtable;
517
518         assert_spin_locked(pmd_lockptr(mm, pmdp));
519
520         /* FIFO */
521         if (!pmd_huge_pte(mm, pmdp))
522                 INIT_LIST_HEAD(lh);
523         else
524                 list_add(lh, (struct list_head *) pmd_huge_pte(mm, pmdp));
525         pmd_huge_pte(mm, pmdp) = pgtable;
526 }
527
528 pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp)
529 {
530         struct list_head *lh;
531         pgtable_t pgtable;
532         pte_t *ptep;
533
534         assert_spin_locked(pmd_lockptr(mm, pmdp));
535
536         /* FIFO */
537         pgtable = pmd_huge_pte(mm, pmdp);
538         lh = (struct list_head *) pgtable;
539         if (list_empty(lh))
540                 pmd_huge_pte(mm, pmdp) = NULL;
541         else {
542                 pmd_huge_pte(mm, pmdp) = (pgtable_t) lh->next;
543                 list_del(lh);
544         }
545         ptep = (pte_t *) pgtable;
546         pte_val(*ptep) = _PAGE_INVALID;
547         ptep++;
548         pte_val(*ptep) = _PAGE_INVALID;
549         return pgtable;
550 }
551 #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
552
553 #ifdef CONFIG_PGSTE
554 void ptep_set_pte_at(struct mm_struct *mm, unsigned long addr,
555                      pte_t *ptep, pte_t entry)
556 {
557         pgste_t pgste;
558
559         /* the mm_has_pgste() check is done in set_pte_at() */
560         preempt_disable();
561         pgste = pgste_get_lock(ptep);
562         pgste_val(pgste) &= ~_PGSTE_GPS_ZERO;
563         pgste_set_key(ptep, pgste, entry, mm);
564         pgste = pgste_set_pte(ptep, pgste, entry);
565         pgste_set_unlock(ptep, pgste);
566         preempt_enable();
567 }
568
569 void ptep_set_notify(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
570 {
571         pgste_t pgste;
572
573         preempt_disable();
574         pgste = pgste_get_lock(ptep);
575         pgste_val(pgste) |= PGSTE_IN_BIT;
576         pgste_set_unlock(ptep, pgste);
577         preempt_enable();
578 }
579
580 /**
581  * ptep_force_prot - change access rights of a locked pte
582  * @mm: pointer to the process mm_struct
583  * @addr: virtual address in the guest address space
584  * @ptep: pointer to the page table entry
585  * @prot: indicates guest access rights: PROT_NONE, PROT_READ or PROT_WRITE
586  * @bit: pgste bit to set (e.g. for notification)
587  *
588  * Returns 0 if the access rights were changed and -EAGAIN if the current
589  * and requested access rights are incompatible.
590  */
591 int ptep_force_prot(struct mm_struct *mm, unsigned long addr,
592                     pte_t *ptep, int prot, unsigned long bit)
593 {
594         pte_t entry;
595         pgste_t pgste;
596         int pte_i, pte_p, nodat;
597
598         pgste = pgste_get_lock(ptep);
599         entry = *ptep;
600         /* Check pte entry after all locks have been acquired */
601         pte_i = pte_val(entry) & _PAGE_INVALID;
602         pte_p = pte_val(entry) & _PAGE_PROTECT;
603         if ((pte_i && (prot != PROT_NONE)) ||
604             (pte_p && (prot & PROT_WRITE))) {
605                 pgste_set_unlock(ptep, pgste);
606                 return -EAGAIN;
607         }
608         /* Change access rights and set pgste bit */
609         nodat = !!(pgste_val(pgste) & _PGSTE_GPS_NODAT);
610         if (prot == PROT_NONE && !pte_i) {
611                 ptep_flush_direct(mm, addr, ptep, nodat);
612                 pgste = pgste_update_all(entry, pgste, mm);
613                 pte_val(entry) |= _PAGE_INVALID;
614         }
615         if (prot == PROT_READ && !pte_p) {
616                 ptep_flush_direct(mm, addr, ptep, nodat);
617                 pte_val(entry) &= ~_PAGE_INVALID;
618                 pte_val(entry) |= _PAGE_PROTECT;
619         }
620         pgste_val(pgste) |= bit;
621         pgste = pgste_set_pte(ptep, pgste, entry);
622         pgste_set_unlock(ptep, pgste);
623         return 0;
624 }
625
626 int ptep_shadow_pte(struct mm_struct *mm, unsigned long saddr,
627                     pte_t *sptep, pte_t *tptep, pte_t pte)
628 {
629         pgste_t spgste, tpgste;
630         pte_t spte, tpte;
631         int rc = -EAGAIN;
632
633         if (!(pte_val(*tptep) & _PAGE_INVALID))
634                 return 0;       /* already shadowed */
635         spgste = pgste_get_lock(sptep);
636         spte = *sptep;
637         if (!(pte_val(spte) & _PAGE_INVALID) &&
638             !((pte_val(spte) & _PAGE_PROTECT) &&
639               !(pte_val(pte) & _PAGE_PROTECT))) {
640                 pgste_val(spgste) |= PGSTE_VSIE_BIT;
641                 tpgste = pgste_get_lock(tptep);
642                 pte_val(tpte) = (pte_val(spte) & PAGE_MASK) |
643                                 (pte_val(pte) & _PAGE_PROTECT);
644                 /* don't touch the storage key - it belongs to parent pgste */
645                 tpgste = pgste_set_pte(tptep, tpgste, tpte);
646                 pgste_set_unlock(tptep, tpgste);
647                 rc = 1;
648         }
649         pgste_set_unlock(sptep, spgste);
650         return rc;
651 }
652
653 void ptep_unshadow_pte(struct mm_struct *mm, unsigned long saddr, pte_t *ptep)
654 {
655         pgste_t pgste;
656         int nodat;
657
658         pgste = pgste_get_lock(ptep);
659         /* notifier is called by the caller */
660         nodat = !!(pgste_val(pgste) & _PGSTE_GPS_NODAT);
661         ptep_flush_direct(mm, saddr, ptep, nodat);
662         /* don't touch the storage key - it belongs to parent pgste */
663         pgste = pgste_set_pte(ptep, pgste, __pte(_PAGE_INVALID));
664         pgste_set_unlock(ptep, pgste);
665 }
666
667 static void ptep_zap_swap_entry(struct mm_struct *mm, swp_entry_t entry)
668 {
669         if (!non_swap_entry(entry))
670                 dec_mm_counter(mm, MM_SWAPENTS);
671         else if (is_migration_entry(entry)) {
672                 struct page *page = migration_entry_to_page(entry);
673
674                 dec_mm_counter(mm, mm_counter(page));
675         }
676         free_swap_and_cache(entry);
677 }
678
679 void ptep_zap_unused(struct mm_struct *mm, unsigned long addr,
680                      pte_t *ptep, int reset)
681 {
682         unsigned long pgstev;
683         pgste_t pgste;
684         pte_t pte;
685
686         /* Zap unused and logically-zero pages */
687         preempt_disable();
688         pgste = pgste_get_lock(ptep);
689         pgstev = pgste_val(pgste);
690         pte = *ptep;
691         if (!reset && pte_swap(pte) &&
692             ((pgstev & _PGSTE_GPS_USAGE_MASK) == _PGSTE_GPS_USAGE_UNUSED ||
693              (pgstev & _PGSTE_GPS_ZERO))) {
694                 ptep_zap_swap_entry(mm, pte_to_swp_entry(pte));
695                 pte_clear(mm, addr, ptep);
696         }
697         if (reset)
698                 pgste_val(pgste) &= ~_PGSTE_GPS_USAGE_MASK;
699         pgste_set_unlock(ptep, pgste);
700         preempt_enable();
701 }
702
703 void ptep_zap_key(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
704 {
705         unsigned long ptev;
706         pgste_t pgste;
707
708         /* Clear storage key ACC and F, but set R/C */
709         preempt_disable();
710         pgste = pgste_get_lock(ptep);
711         pgste_val(pgste) &= ~(PGSTE_ACC_BITS | PGSTE_FP_BIT);
712         pgste_val(pgste) |= PGSTE_GR_BIT | PGSTE_GC_BIT;
713         ptev = pte_val(*ptep);
714         if (!(ptev & _PAGE_INVALID) && (ptev & _PAGE_WRITE))
715                 page_set_storage_key(ptev & PAGE_MASK, PAGE_DEFAULT_KEY, 1);
716         pgste_set_unlock(ptep, pgste);
717         preempt_enable();
718 }
719
720 /*
721  * Test and reset if a guest page is dirty
722  */
723 bool ptep_test_and_clear_uc(struct mm_struct *mm, unsigned long addr,
724                        pte_t *ptep)
725 {
726         pgste_t pgste;
727         pte_t pte;
728         bool dirty;
729         int nodat;
730
731         pgste = pgste_get_lock(ptep);
732         dirty = !!(pgste_val(pgste) & PGSTE_UC_BIT);
733         pgste_val(pgste) &= ~PGSTE_UC_BIT;
734         pte = *ptep;
735         if (dirty && (pte_val(pte) & _PAGE_PRESENT)) {
736                 pgste = pgste_pte_notify(mm, addr, ptep, pgste);
737                 nodat = !!(pgste_val(pgste) & _PGSTE_GPS_NODAT);
738                 ptep_ipte_global(mm, addr, ptep, nodat);
739                 if (MACHINE_HAS_ESOP || !(pte_val(pte) & _PAGE_WRITE))
740                         pte_val(pte) |= _PAGE_PROTECT;
741                 else
742                         pte_val(pte) |= _PAGE_INVALID;
743                 *ptep = pte;
744         }
745         pgste_set_unlock(ptep, pgste);
746         return dirty;
747 }
748 EXPORT_SYMBOL_GPL(ptep_test_and_clear_uc);
749
750 int set_guest_storage_key(struct mm_struct *mm, unsigned long addr,
751                           unsigned char key, bool nq)
752 {
753         unsigned long keyul, paddr;
754         spinlock_t *ptl;
755         pgste_t old, new;
756         pmd_t *pmdp;
757         pte_t *ptep;
758
759         pmdp = pmd_alloc_map(mm, addr);
760         if (unlikely(!pmdp))
761                 return -EFAULT;
762
763         ptl = pmd_lock(mm, pmdp);
764         if (!pmd_present(*pmdp)) {
765                 spin_unlock(ptl);
766                 return -EFAULT;
767         }
768
769         if (pmd_large(*pmdp)) {
770                 paddr = pmd_val(*pmdp) & HPAGE_MASK;
771                 paddr |= addr & ~HPAGE_MASK;
772                 /*
773                  * Huge pmds need quiescing operations, they are
774                  * always mapped.
775                  */
776                 page_set_storage_key(paddr, key, 1);
777                 spin_unlock(ptl);
778                 return 0;
779         }
780         spin_unlock(ptl);
781
782         ptep = pte_alloc_map_lock(mm, pmdp, addr, &ptl);
783         if (unlikely(!ptep))
784                 return -EFAULT;
785
786         new = old = pgste_get_lock(ptep);
787         pgste_val(new) &= ~(PGSTE_GR_BIT | PGSTE_GC_BIT |
788                             PGSTE_ACC_BITS | PGSTE_FP_BIT);
789         keyul = (unsigned long) key;
790         pgste_val(new) |= (keyul & (_PAGE_CHANGED | _PAGE_REFERENCED)) << 48;
791         pgste_val(new) |= (keyul & (_PAGE_ACC_BITS | _PAGE_FP_BIT)) << 56;
792         if (!(pte_val(*ptep) & _PAGE_INVALID)) {
793                 unsigned long bits, skey;
794
795                 paddr = pte_val(*ptep) & PAGE_MASK;
796                 skey = (unsigned long) page_get_storage_key(paddr);
797                 bits = skey & (_PAGE_CHANGED | _PAGE_REFERENCED);
798                 skey = key & (_PAGE_ACC_BITS | _PAGE_FP_BIT);
799                 /* Set storage key ACC and FP */
800                 page_set_storage_key(paddr, skey, !nq);
801                 /* Merge host changed & referenced into pgste  */
802                 pgste_val(new) |= bits << 52;
803         }
804         /* changing the guest storage key is considered a change of the page */
805         if ((pgste_val(new) ^ pgste_val(old)) &
806             (PGSTE_ACC_BITS | PGSTE_FP_BIT | PGSTE_GR_BIT | PGSTE_GC_BIT))
807                 pgste_val(new) |= PGSTE_UC_BIT;
808
809         pgste_set_unlock(ptep, new);
810         pte_unmap_unlock(ptep, ptl);
811         return 0;
812 }
813 EXPORT_SYMBOL(set_guest_storage_key);
814
815 /**
816  * Conditionally set a guest storage key (handling csske).
817  * oldkey will be updated when either mr or mc is set and a pointer is given.
818  *
819  * Returns 0 if a guests storage key update wasn't necessary, 1 if the guest
820  * storage key was updated and -EFAULT on access errors.
821  */
822 int cond_set_guest_storage_key(struct mm_struct *mm, unsigned long addr,
823                                unsigned char key, unsigned char *oldkey,
824                                bool nq, bool mr, bool mc)
825 {
826         unsigned char tmp, mask = _PAGE_ACC_BITS | _PAGE_FP_BIT;
827         int rc;
828
829         /* we can drop the pgste lock between getting and setting the key */
830         if (mr | mc) {
831                 rc = get_guest_storage_key(current->mm, addr, &tmp);
832                 if (rc)
833                         return rc;
834                 if (oldkey)
835                         *oldkey = tmp;
836                 if (!mr)
837                         mask |= _PAGE_REFERENCED;
838                 if (!mc)
839                         mask |= _PAGE_CHANGED;
840                 if (!((tmp ^ key) & mask))
841                         return 0;
842         }
843         rc = set_guest_storage_key(current->mm, addr, key, nq);
844         return rc < 0 ? rc : 1;
845 }
846 EXPORT_SYMBOL(cond_set_guest_storage_key);
847
848 /**
849  * Reset a guest reference bit (rrbe), returning the reference and changed bit.
850  *
851  * Returns < 0 in case of error, otherwise the cc to be reported to the guest.
852  */
853 int reset_guest_reference_bit(struct mm_struct *mm, unsigned long addr)
854 {
855         spinlock_t *ptl;
856         unsigned long paddr;
857         pgste_t old, new;
858         pmd_t *pmdp;
859         pte_t *ptep;
860         int cc = 0;
861
862         pmdp = pmd_alloc_map(mm, addr);
863         if (unlikely(!pmdp))
864                 return -EFAULT;
865
866         ptl = pmd_lock(mm, pmdp);
867         if (!pmd_present(*pmdp)) {
868                 spin_unlock(ptl);
869                 return -EFAULT;
870         }
871
872         if (pmd_large(*pmdp)) {
873                 paddr = pmd_val(*pmdp) & HPAGE_MASK;
874                 paddr |= addr & ~HPAGE_MASK;
875                 cc = page_reset_referenced(paddr);
876                 spin_unlock(ptl);
877                 return cc;
878         }
879         spin_unlock(ptl);
880
881         ptep = pte_alloc_map_lock(mm, pmdp, addr, &ptl);
882         if (unlikely(!ptep))
883                 return -EFAULT;
884
885         new = old = pgste_get_lock(ptep);
886         /* Reset guest reference bit only */
887         pgste_val(new) &= ~PGSTE_GR_BIT;
888
889         if (!(pte_val(*ptep) & _PAGE_INVALID)) {
890                 paddr = pte_val(*ptep) & PAGE_MASK;
891                 cc = page_reset_referenced(paddr);
892                 /* Merge real referenced bit into host-set */
893                 pgste_val(new) |= ((unsigned long) cc << 53) & PGSTE_HR_BIT;
894         }
895         /* Reflect guest's logical view, not physical */
896         cc |= (pgste_val(old) & (PGSTE_GR_BIT | PGSTE_GC_BIT)) >> 49;
897         /* Changing the guest storage key is considered a change of the page */
898         if ((pgste_val(new) ^ pgste_val(old)) & PGSTE_GR_BIT)
899                 pgste_val(new) |= PGSTE_UC_BIT;
900
901         pgste_set_unlock(ptep, new);
902         pte_unmap_unlock(ptep, ptl);
903         return cc;
904 }
905 EXPORT_SYMBOL(reset_guest_reference_bit);
906
907 int get_guest_storage_key(struct mm_struct *mm, unsigned long addr,
908                           unsigned char *key)
909 {
910         unsigned long paddr;
911         spinlock_t *ptl;
912         pgste_t pgste;
913         pmd_t *pmdp;
914         pte_t *ptep;
915
916         pmdp = pmd_alloc_map(mm, addr);
917         if (unlikely(!pmdp))
918                 return -EFAULT;
919
920         ptl = pmd_lock(mm, pmdp);
921         if (!pmd_present(*pmdp)) {
922                 /* Not yet mapped memory has a zero key */
923                 spin_unlock(ptl);
924                 *key = 0;
925                 return 0;
926         }
927
928         if (pmd_large(*pmdp)) {
929                 paddr = pmd_val(*pmdp) & HPAGE_MASK;
930                 paddr |= addr & ~HPAGE_MASK;
931                 *key = page_get_storage_key(paddr);
932                 spin_unlock(ptl);
933                 return 0;
934         }
935         spin_unlock(ptl);
936
937         ptep = pte_alloc_map_lock(mm, pmdp, addr, &ptl);
938         if (unlikely(!ptep))
939                 return -EFAULT;
940
941         pgste = pgste_get_lock(ptep);
942         *key = (pgste_val(pgste) & (PGSTE_ACC_BITS | PGSTE_FP_BIT)) >> 56;
943         paddr = pte_val(*ptep) & PAGE_MASK;
944         if (!(pte_val(*ptep) & _PAGE_INVALID))
945                 *key = page_get_storage_key(paddr);
946         /* Reflect guest's logical view, not physical */
947         *key |= (pgste_val(pgste) & (PGSTE_GR_BIT | PGSTE_GC_BIT)) >> 48;
948         pgste_set_unlock(ptep, pgste);
949         pte_unmap_unlock(ptep, ptl);
950         return 0;
951 }
952 EXPORT_SYMBOL(get_guest_storage_key);
953
954 /**
955  * pgste_perform_essa - perform ESSA actions on the PGSTE.
956  * @mm: the memory context. It must have PGSTEs, no check is performed here!
957  * @hva: the host virtual address of the page whose PGSTE is to be processed
958  * @orc: the specific action to perform, see the ESSA_SET_* macros.
959  * @oldpte: the PTE will be saved there if the pointer is not NULL.
960  * @oldpgste: the old PGSTE will be saved there if the pointer is not NULL.
961  *
962  * Return: 1 if the page is to be added to the CBRL, otherwise 0,
963  *         or < 0 in case of error. -EINVAL is returned for invalid values
964  *         of orc, -EFAULT for invalid addresses.
965  */
966 int pgste_perform_essa(struct mm_struct *mm, unsigned long hva, int orc,
967                         unsigned long *oldpte, unsigned long *oldpgste)
968 {
969         unsigned long pgstev;
970         spinlock_t *ptl;
971         pgste_t pgste;
972         pte_t *ptep;
973         int res = 0;
974
975         WARN_ON_ONCE(orc > ESSA_MAX);
976         if (unlikely(orc > ESSA_MAX))
977                 return -EINVAL;
978         ptep = get_locked_pte(mm, hva, &ptl);
979         if (unlikely(!ptep))
980                 return -EFAULT;
981         pgste = pgste_get_lock(ptep);
982         pgstev = pgste_val(pgste);
983         if (oldpte)
984                 *oldpte = pte_val(*ptep);
985         if (oldpgste)
986                 *oldpgste = pgstev;
987
988         switch (orc) {
989         case ESSA_GET_STATE:
990                 break;
991         case ESSA_SET_STABLE:
992                 pgstev &= ~(_PGSTE_GPS_USAGE_MASK | _PGSTE_GPS_NODAT);
993                 pgstev |= _PGSTE_GPS_USAGE_STABLE;
994                 break;
995         case ESSA_SET_UNUSED:
996                 pgstev &= ~_PGSTE_GPS_USAGE_MASK;
997                 pgstev |= _PGSTE_GPS_USAGE_UNUSED;
998                 if (pte_val(*ptep) & _PAGE_INVALID)
999                         res = 1;
1000                 break;
1001         case ESSA_SET_VOLATILE:
1002                 pgstev &= ~_PGSTE_GPS_USAGE_MASK;
1003                 pgstev |= _PGSTE_GPS_USAGE_VOLATILE;
1004                 if (pte_val(*ptep) & _PAGE_INVALID)
1005                         res = 1;
1006                 break;
1007         case ESSA_SET_POT_VOLATILE:
1008                 pgstev &= ~_PGSTE_GPS_USAGE_MASK;
1009                 if (!(pte_val(*ptep) & _PAGE_INVALID)) {
1010                         pgstev |= _PGSTE_GPS_USAGE_POT_VOLATILE;
1011                         break;
1012                 }
1013                 if (pgstev & _PGSTE_GPS_ZERO) {
1014                         pgstev |= _PGSTE_GPS_USAGE_VOLATILE;
1015                         break;
1016                 }
1017                 if (!(pgstev & PGSTE_GC_BIT)) {
1018                         pgstev |= _PGSTE_GPS_USAGE_VOLATILE;
1019                         res = 1;
1020                         break;
1021                 }
1022                 break;
1023         case ESSA_SET_STABLE_RESIDENT:
1024                 pgstev &= ~_PGSTE_GPS_USAGE_MASK;
1025                 pgstev |= _PGSTE_GPS_USAGE_STABLE;
1026                 /*
1027                  * Since the resident state can go away any time after this
1028                  * call, we will not make this page resident. We can revisit
1029                  * this decision if a guest will ever start using this.
1030                  */
1031                 break;
1032         case ESSA_SET_STABLE_IF_RESIDENT:
1033                 if (!(pte_val(*ptep) & _PAGE_INVALID)) {
1034                         pgstev &= ~_PGSTE_GPS_USAGE_MASK;
1035                         pgstev |= _PGSTE_GPS_USAGE_STABLE;
1036                 }
1037                 break;
1038         case ESSA_SET_STABLE_NODAT:
1039                 pgstev &= ~_PGSTE_GPS_USAGE_MASK;
1040                 pgstev |= _PGSTE_GPS_USAGE_STABLE | _PGSTE_GPS_NODAT;
1041                 break;
1042         default:
1043                 /* we should never get here! */
1044                 break;
1045         }
1046         /* If we are discarding a page, set it to logical zero */
1047         if (res)
1048                 pgstev |= _PGSTE_GPS_ZERO;
1049
1050         pgste_val(pgste) = pgstev;
1051         pgste_set_unlock(ptep, pgste);
1052         pte_unmap_unlock(ptep, ptl);
1053         return res;
1054 }
1055 EXPORT_SYMBOL(pgste_perform_essa);
1056
1057 /**
1058  * set_pgste_bits - set specific PGSTE bits.
1059  * @mm: the memory context. It must have PGSTEs, no check is performed here!
1060  * @hva: the host virtual address of the page whose PGSTE is to be processed
1061  * @bits: a bitmask representing the bits that will be touched
1062  * @value: the values of the bits to be written. Only the bits in the mask
1063  *         will be written.
1064  *
1065  * Return: 0 on success, < 0 in case of error.
1066  */
1067 int set_pgste_bits(struct mm_struct *mm, unsigned long hva,
1068                         unsigned long bits, unsigned long value)
1069 {
1070         spinlock_t *ptl;
1071         pgste_t new;
1072         pte_t *ptep;
1073
1074         ptep = get_locked_pte(mm, hva, &ptl);
1075         if (unlikely(!ptep))
1076                 return -EFAULT;
1077         new = pgste_get_lock(ptep);
1078
1079         pgste_val(new) &= ~bits;
1080         pgste_val(new) |= value & bits;
1081
1082         pgste_set_unlock(ptep, new);
1083         pte_unmap_unlock(ptep, ptl);
1084         return 0;
1085 }
1086 EXPORT_SYMBOL(set_pgste_bits);
1087
1088 /**
1089  * get_pgste - get the current PGSTE for the given address.
1090  * @mm: the memory context. It must have PGSTEs, no check is performed here!
1091  * @hva: the host virtual address of the page whose PGSTE is to be processed
1092  * @pgstep: will be written with the current PGSTE for the given address.
1093  *
1094  * Return: 0 on success, < 0 in case of error.
1095  */
1096 int get_pgste(struct mm_struct *mm, unsigned long hva, unsigned long *pgstep)
1097 {
1098         spinlock_t *ptl;
1099         pte_t *ptep;
1100
1101         ptep = get_locked_pte(mm, hva, &ptl);
1102         if (unlikely(!ptep))
1103                 return -EFAULT;
1104         *pgstep = pgste_val(pgste_get(ptep));
1105         pte_unmap_unlock(ptep, ptl);
1106         return 0;
1107 }
1108 EXPORT_SYMBOL(get_pgste);
1109 #endif