cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

pgtable-invert.h (1091B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _ASM_PGTABLE_INVERT_H
      3#define _ASM_PGTABLE_INVERT_H 1
      4
      5#ifndef __ASSEMBLY__
      6
      7/*
      8 * A clear pte value is special, and doesn't get inverted.
      9 *
     10 * Note that even users that only pass a pgprot_t (rather
     11 * than a full pte) won't trigger the special zero case,
     12 * because even PAGE_NONE has _PAGE_PROTNONE | _PAGE_ACCESSED
     13 * set. So the all zero case really is limited to just the
     14 * cleared page table entry case.
     15 */
     16static inline bool __pte_needs_invert(u64 val)
     17{
     18	return val && !(val & _PAGE_PRESENT);
     19}
     20
     21/* Get a mask to xor with the page table entry to get the correct pfn. */
     22static inline u64 protnone_mask(u64 val)
     23{
     24	return __pte_needs_invert(val) ?  ~0ull : 0;
     25}
     26
     27static inline u64 flip_protnone_guard(u64 oldval, u64 val, u64 mask)
     28{
     29	/*
     30	 * When a PTE transitions from NONE to !NONE or vice-versa
     31	 * invert the PFN part to stop speculation.
     32	 * pte_pfn undoes this when needed.
     33	 */
     34	if (__pte_needs_invert(oldval) != __pte_needs_invert(val))
     35		val = (val & ~mask) | (~val & mask);
     36	return val;
     37}
     38
     39#endif /* __ASSEMBLY__ */
     40
     41#endif