LCOV - code coverage report
Current view: top level - arch/x86/include/asm - pgtable-invert.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 7 8 87.5 %
Date: 2021-04-22 12:43:58 Functions: 1 1 100.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     2333360 : static inline bool __pte_needs_invert(u64 val)
      17             : {
      18     2332443 :         return val && !(val & _PAGE_PRESENT);
      19             : }
      20             : 
      21             : /* Get a mask to xor with the page table entry to get the correct pfn. */
      22     2304099 : static inline u64 protnone_mask(u64 val)
      23             : {
      24     4608198 :         return __pte_needs_invert(val) ?  ~0ull : 0;
      25             : }
      26             : 
      27       14563 : 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       43689 :         if (__pte_needs_invert(oldval) != __pte_needs_invert(val))
      35           0 :                 val = (val & ~mask) | (~val & mask);
      36       14563 :         return val;
      37             : }
      38             : 
      39             : #endif /* __ASSEMBLY__ */
      40             : 
      41             : #endif

Generated by: LCOV version 1.14