LCOV - code coverage report
Current view: top level - arch/x86/include/asm - pgtable-invert.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 7 8 87.5 %
Date: 2022-04-01 14:35:51 Functions: 0 0 -
Branches: 70 202 34.7 %

           Branch data     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                 :   37215722 : static inline bool __pte_needs_invert(u64 val)
      17                 :            : {
      18   [ +  +  +  -  :   36815952 :         return val && !(val & _PAGE_PRESENT);
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  -  -  
          -  -  -  -  -  
          -  -  -  +  -  
          +  -  +  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  +  -  +  -  
          +  -  +  -  +  
             -  +  -  +  
                      - ]
      19                 :            : }
      20                 :            : 
      21                 :            : /* Get a mask to xor with the page table entry to get the correct pfn. */
      22                 :   36674914 : static inline u64 protnone_mask(u64 val)
      23                 :            : {
      24   [ +  +  +  -  :   72474753 :         return __pte_needs_invert(val) ?  ~0ull : 0;
          +  +  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
          +  -  +  -  +  
             -  +  -  +  
                      - ]
      25                 :            : }
      26                 :            : 
      27                 :     270404 : 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   [ +  -  -  + ]:     540808 :         if (__pte_needs_invert(oldval) != __pte_needs_invert(val))
      35                 :          0 :                 val = (val & ~mask) | (~val & mask);
      36                 :     270404 :         return val;
      37                 :            : }
      38                 :            : 
      39                 :            : #endif /* __ASSEMBLY__ */
      40                 :            : 
      41                 :            : #endif

Generated by: LCOV version 1.14