| From foo@baz Tue Aug 14 16:14:56 CEST 2018 |
| From: Andi Kleen <ak@linux.intel.com> |
| Date: Tue, 7 Aug 2018 15:09:37 -0700 |
| Subject: x86/speculation/l1tf: Make pmd/pud_mknotpresent() invert |
| |
| From: Andi Kleen <ak@linux.intel.com> |
| |
| commit 0768f91530ff46683e0b372df14fd79fe8d156e5 upstream |
| |
| Some cases in THP like: |
| - MADV_FREE |
| - mprotect |
| - split |
| |
| mark the PMD non present for temporarily to prevent races. The window for |
| an L1TF attack in these contexts is very small, but it wants to be fixed |
| for correctness sake. |
| |
| Use the proper low level functions for pmd/pud_mknotpresent() to address |
| this. |
| |
| Signed-off-by: Andi Kleen <ak@linux.intel.com> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/x86/include/asm/pgtable.h | 11 ++++++----- |
| 1 file changed, 6 insertions(+), 5 deletions(-) |
| |
| --- a/arch/x86/include/asm/pgtable.h |
| +++ b/arch/x86/include/asm/pgtable.h |
| @@ -350,11 +350,6 @@ static inline pmd_t pmd_mkwrite(pmd_t pm |
| return pmd_set_flags(pmd, _PAGE_RW); |
| } |
| |
| -static inline pmd_t pmd_mknotpresent(pmd_t pmd) |
| -{ |
| - return pmd_clear_flags(pmd, _PAGE_PRESENT | _PAGE_PROTNONE); |
| -} |
| - |
| #ifdef CONFIG_HAVE_ARCH_SOFT_DIRTY |
| static inline int pte_soft_dirty(pte_t pte) |
| { |
| @@ -418,6 +413,12 @@ static inline pmd_t pfn_pmd(unsigned lon |
| return __pmd(pfn | massage_pgprot(pgprot)); |
| } |
| |
| +static inline pmd_t pmd_mknotpresent(pmd_t pmd) |
| +{ |
| + return pfn_pmd(pmd_pfn(pmd), |
| + __pgprot(pmd_flags(pmd) & ~(_PAGE_PRESENT|_PAGE_PROTNONE))); |
| +} |
| + |
| static inline u64 flip_protnone_guard(u64 oldval, u64 val, u64 mask); |
| |
| static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) |