Lines Matching refs:pgste
145 static inline void pgste_set_unlock(pte_t *ptep, pgste_t pgste)
152 : "d" (pgste_val(pgste)), "Q" (ptep[PTRS_PER_PTE])
159 unsigned long pgste = 0;
161 pgste = *(unsigned long *)(ptep + PTRS_PER_PTE);
163 return __pgste(pgste);
166 static inline void pgste_set(pte_t *ptep, pgste_t pgste)
169 *(pgste_t *)(ptep + PTRS_PER_PTE) = pgste;
173 static inline pgste_t pgste_update_all(pte_t pte, pgste_t pgste,
180 return pgste;
184 /* Transfer page changed & referenced bit to guest bits in pgste */
185 pgste_val(pgste) |= bits << 48; /* GR bit & GC bit */
186 /* Copy page access key and fetch protection bit to pgste */
187 pgste_val(pgste) &= ~(PGSTE_ACC_BITS | PGSTE_FP_BIT);
188 pgste_val(pgste) |= (skey & (_PAGE_ACC_BITS | _PAGE_FP_BIT)) << 56;
190 return pgste;
194 static inline void pgste_set_key(pte_t *ptep, pgste_t pgste, pte_t entry,
206 * Set page access key and fetch protection bit from pgste.
210 nkey = (pgste_val(pgste) & (PGSTE_ACC_BITS | PGSTE_FP_BIT)) >> 56;
211 nkey |= (pgste_val(pgste) & (PGSTE_GR_BIT | PGSTE_GC_BIT)) >> 48;
216 static inline pgste_t pgste_set_pte(pte_t *ptep, pgste_t pgste, pte_t entry)
232 pgste_val(pgste) |= PGSTE_UC_BIT;
236 return pgste;
241 pte_t *ptep, pgste_t pgste)
246 bits = pgste_val(pgste) & (PGSTE_IN_BIT | PGSTE_VSIE_BIT);
248 pgste_val(pgste) ^= bits;
252 return pgste;
258 pgste_t pgste = __pgste(0);
261 pgste = pgste_get_lock(ptep);
262 pgste = pgste_pte_notify(mm, addr, ptep, pgste);
264 return pgste;
269 pgste_t pgste, pte_t old, pte_t new)
273 pgste_set_key(ptep, pgste, new, mm);
275 pgste = pgste_update_all(old, pgste, mm);
276 if ((pgste_val(pgste) & _PGSTE_GPS_USAGE_MASK) ==
280 pgste = pgste_set_pte(ptep, pgste, new);
281 pgste_set_unlock(ptep, pgste);
291 pgste_t pgste;
296 pgste = ptep_xchg_start(mm, addr, ptep);
297 nodat = !!(pgste_val(pgste) & _PGSTE_GPS_NODAT);
299 old = ptep_xchg_commit(mm, addr, ptep, pgste, old, new);
333 pgste_t pgste;
338 pgste = ptep_xchg_start(mm, addr, ptep);
339 nodat = !!(pgste_val(pgste) & _PGSTE_GPS_NODAT);
341 old = ptep_xchg_commit(mm, addr, ptep, pgste, old, new);
350 pgste_t pgste;
356 pgste = ptep_xchg_start(mm, addr, ptep);
357 nodat = !!(pgste_val(pgste) & _PGSTE_GPS_NODAT);
360 pgste = pgste_update_all(old, pgste, mm);
361 pgste_set(ptep, pgste);
369 pgste_t pgste;
375 pgste = pgste_get(ptep);
376 pgste_set_key(ptep, pgste, pte, mm);
377 pgste = pgste_set_pte(ptep, pgste, pte);
378 pgste_set_unlock(ptep, pgste);
618 pgste_t pgste;
622 pgste = pgste_get_lock(ptep);
623 pgste_val(pgste) &= ~_PGSTE_GPS_ZERO;
624 pgste_set_key(ptep, pgste, entry, mm);
625 pgste = pgste_set_pte(ptep, pgste, entry);
626 pgste_set_unlock(ptep, pgste);
632 pgste_t pgste;
635 pgste = pgste_get_lock(ptep);
636 pgste_val(pgste) |= PGSTE_IN_BIT;
637 pgste_set_unlock(ptep, pgste);
647 * @bit: pgste bit to set (e.g. for notification)
656 pgste_t pgste;
659 pgste = pgste_get_lock(ptep);
666 pgste_set_unlock(ptep, pgste);
669 /* Change access rights and set pgste bit */
670 nodat = !!(pgste_val(pgste) & _PGSTE_GPS_NODAT);
673 pgste = pgste_update_all(entry, pgste, mm);
681 pgste_val(pgste) |= bit;
682 pgste = pgste_set_pte(ptep, pgste, entry);
683 pgste_set_unlock(ptep, pgste);
705 /* don't touch the storage key - it belongs to parent pgste */
716 pgste_t pgste;
719 pgste = pgste_get_lock(ptep);
721 nodat = !!(pgste_val(pgste) & _PGSTE_GPS_NODAT);
723 /* don't touch the storage key - it belongs to parent pgste */
724 pgste = pgste_set_pte(ptep, pgste, __pte(_PAGE_INVALID));
725 pgste_set_unlock(ptep, pgste);
744 pgste_t pgste;
749 pgste = pgste_get_lock(ptep);
750 pgstev = pgste_val(pgste);
759 pgste_val(pgste) &= ~(_PGSTE_GPS_USAGE_MASK | _PGSTE_GPS_NODAT);
760 pgste_set_unlock(ptep, pgste);
767 pgste_t pgste;
771 pgste = pgste_get_lock(ptep);
772 pgste_val(pgste) &= ~(PGSTE_ACC_BITS | PGSTE_FP_BIT);
773 pgste_val(pgste) |= PGSTE_GR_BIT | PGSTE_GC_BIT;
777 pgste_set_unlock(ptep, pgste);
787 pgste_t pgste;
792 pgste = pgste_get_lock(ptep);
793 dirty = !!(pgste_val(pgste) & PGSTE_UC_BIT);
794 pgste_val(pgste) &= ~PGSTE_UC_BIT;
797 pgste = pgste_pte_notify(mm, addr, ptep, pgste);
798 nodat = !!(pgste_val(pgste) & _PGSTE_GPS_NODAT);
806 pgste_set_unlock(ptep, pgste);
870 /* Merge host changed & referenced into pgste */
898 /* we can drop the pgste lock between getting and setting the key */
989 pgste_t pgste;
1026 pgste = pgste_get_lock(ptep);
1027 *key = (pgste_val(pgste) & (PGSTE_ACC_BITS | PGSTE_FP_BIT)) >> 56;
1032 *key |= (pgste_val(pgste) & (PGSTE_GR_BIT | PGSTE_GC_BIT)) >> 48;
1033 pgste_set_unlock(ptep, pgste);
1057 pgste_t pgste;
1071 pgste = pgste_get_lock(ptep);
1072 pgstev = pgste_val(pgste);
1140 pgste_val(pgste) = pgstev;
1141 pgste_set_unlock(ptep, pgste);