diff options
Diffstat (limited to 'arch/x86/include/asm/pgtable-2level.h')
| -rw-r--r-- | arch/x86/include/asm/pgtable-2level.h | 26 | 
1 files changed, 26 insertions, 0 deletions
| diff --git a/arch/x86/include/asm/pgtable-2level.h b/arch/x86/include/asm/pgtable-2level.h index 685ffe8a0eaf..24c6cf5f16b7 100644 --- a/arch/x86/include/asm/pgtable-2level.h +++ b/arch/x86/include/asm/pgtable-2level.h @@ -19,6 +19,9 @@ static inline void native_set_pte(pte_t *ptep , pte_t pte)  static inline void native_set_pmd(pmd_t *pmdp, pmd_t pmd)  { +#ifdef CONFIG_PAGE_TABLE_ISOLATION +	pmd.pud.p4d.pgd = pti_set_user_pgtbl(&pmdp->pud.p4d.pgd, pmd.pud.p4d.pgd); +#endif  	*pmdp = pmd;  } @@ -58,6 +61,9 @@ static inline pte_t native_ptep_get_and_clear(pte_t *xp)  #ifdef CONFIG_SMP  static inline pmd_t native_pmdp_get_and_clear(pmd_t *xp)  { +#ifdef CONFIG_PAGE_TABLE_ISOLATION +	pti_set_user_pgtbl(&xp->pud.p4d.pgd, __pgd(0)); +#endif  	return __pmd(xchg((pmdval_t *)xp, 0));  }  #else @@ -67,6 +73,9 @@ static inline pmd_t native_pmdp_get_and_clear(pmd_t *xp)  #ifdef CONFIG_SMP  static inline pud_t native_pudp_get_and_clear(pud_t *xp)  { +#ifdef CONFIG_PAGE_TABLE_ISOLATION +	pti_set_user_pgtbl(&xp->p4d.pgd, __pgd(0)); +#endif  	return __pud(xchg((pudval_t *)xp, 0));  }  #else @@ -95,4 +104,21 @@ static inline unsigned long pte_bitop(unsigned long value, unsigned int rightshi  #define __pte_to_swp_entry(pte)		((swp_entry_t) { (pte).pte_low })  #define __swp_entry_to_pte(x)		((pte_t) { .pte = (x).val }) +/* No inverted PFNs on 2 level page tables */ + +static inline u64 protnone_mask(u64 val) +{ +	return 0; +} + +static inline u64 flip_protnone_guard(u64 oldval, u64 val, u64 mask) +{ +	return val; +} + +static inline bool __pte_needs_invert(u64 val) +{ +	return false; +} +  #endif /* _ASM_X86_PGTABLE_2LEVEL_H */ |