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);
308 pgste_t pgste;
313 pgste = ptep_xchg_start(mm, addr, ptep);
314 nodat = !!(pgste_val(pgste) & _PGSTE_GPS_NODAT);
316 old = ptep_xchg_commit(mm, addr, ptep, pgste, old, new);
325 pgste_t pgste;
331 pgste = ptep_xchg_start(mm, addr, ptep);
332 nodat = !!(pgste_val(pgste) & _PGSTE_GPS_NODAT);
335 pgste = pgste_update_all(old, pgste, mm);
336 pgste_set(ptep, pgste);
344 pgste_t pgste;
350 pgste = pgste_get(ptep);
351 pgste_set_key(ptep, pgste, pte, mm);
352 pgste = pgste_set_pte(ptep, pgste, pte);
353 pgste_set_unlock(ptep, pgste);
579 pgste_t pgste;
583 pgste = pgste_get_lock(ptep);
584 pgste_val(pgste) &= ~_PGSTE_GPS_ZERO;
585 pgste_set_key(ptep, pgste, entry, mm);
586 pgste = pgste_set_pte(ptep, pgste, entry);
587 pgste_set_unlock(ptep, pgste);
593 pgste_t pgste;
596 pgste = pgste_get_lock(ptep);
597 pgste_val(pgste) |= PGSTE_IN_BIT;
598 pgste_set_unlock(ptep, pgste);
608 * @bit: pgste bit to set (e.g. for notification)
617 pgste_t pgste;
620 pgste = pgste_get_lock(ptep);
627 pgste_set_unlock(ptep, pgste);
630 /* Change access rights and set pgste bit */
631 nodat = !!(pgste_val(pgste) & _PGSTE_GPS_NODAT);
634 pgste = pgste_update_all(entry, pgste, mm);
642 pgste_val(pgste) |= bit;
643 pgste = pgste_set_pte(ptep, pgste, entry);
644 pgste_set_unlock(ptep, pgste);
666 /* don't touch the storage key - it belongs to parent pgste */
677 pgste_t pgste;
680 pgste = pgste_get_lock(ptep);
682 nodat = !!(pgste_val(pgste) & _PGSTE_GPS_NODAT);
684 /* don't touch the storage key - it belongs to parent pgste */
685 pgste = pgste_set_pte(ptep, pgste, __pte(_PAGE_INVALID));
686 pgste_set_unlock(ptep, pgste);
705 pgste_t pgste;
710 pgste = pgste_get_lock(ptep);
711 pgstev = pgste_val(pgste);
720 pgste_val(pgste) &= ~(_PGSTE_GPS_USAGE_MASK | _PGSTE_GPS_NODAT);
721 pgste_set_unlock(ptep, pgste);
728 pgste_t pgste;
732 pgste = pgste_get_lock(ptep);
733 pgste_val(pgste) &= ~(PGSTE_ACC_BITS | PGSTE_FP_BIT);
734 pgste_val(pgste) |= PGSTE_GR_BIT | PGSTE_GC_BIT;
738 pgste_set_unlock(ptep, pgste);
748 pgste_t pgste;
753 pgste = pgste_get_lock(ptep);
754 dirty = !!(pgste_val(pgste) & PGSTE_UC_BIT);
755 pgste_val(pgste) &= ~PGSTE_UC_BIT;
758 pgste = pgste_pte_notify(mm, addr, ptep, pgste);
759 nodat = !!(pgste_val(pgste) & _PGSTE_GPS_NODAT);
767 pgste_set_unlock(ptep, pgste);
823 /* Merge host changed & referenced into pgste */
851 /* we can drop the pgste lock between getting and setting the key */
934 pgste_t pgste;
963 pgste = pgste_get_lock(ptep);
964 *key = (pgste_val(pgste) & (PGSTE_ACC_BITS | PGSTE_FP_BIT)) >> 56;
969 *key |= (pgste_val(pgste) & (PGSTE_GR_BIT | PGSTE_GC_BIT)) >> 48;
970 pgste_set_unlock(ptep, pgste);
994 pgste_t pgste;
1008 pgste = pgste_get_lock(ptep);
1009 pgstev = pgste_val(pgste);
1077 pgste_val(pgste) = pgstev;
1078 pgste_set_unlock(ptep, pgste);