LCOV - code coverage report
Current view: top level - arch/x86/include/asm - pgtable-invert.h (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc3-djwx @ Mon Jul 31 20:08:22 PDT 2023 Lines: 0 2 0.0 %
Date: 2023-07-31 20:08:22 Functions: 0 0 -

          Line data    Source code
       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             :  */
      16             : static inline bool __pte_needs_invert(u64 val)
      17             : {
      18           0 :         return val && !(val & _PAGE_PRESENT);
      19             : }
      20             : 
      21             : /* Get a mask to xor with the page table entry to get the correct pfn. */
      22             : static inline u64 protnone_mask(u64 val)
      23             : {
      24           0 :         return __pte_needs_invert(val) ?  ~0ull : 0;
      25             : }
      26             : 
      27             : static 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

Generated by: LCOV version 1.14