Messages in this thread | | | Subject | Re: [PATCH v2 1/2] x86: Don't let pgprot_modify() change the page encryption bit | From | Thomas Hellström (VMware) <> | Date | Wed, 11 Sep 2019 15:37:13 +0200 |
| |
On 9/11/19 3:27 PM, Lendacky, Thomas wrote: > On 9/11/19 7:40 AM, Thomas Hellström (VMware) wrote: >> From: Thomas Hellstrom <thellstrom@vmware.com> >> >> When SEV or SME is enabled and active, vm_get_page_prot() typically >> returns with the encryption bit set. This means that users of >> pgprot_modify(, vm_get_page_prot()) (mprotect_fixup, do_mmap) end up with >> a value of vma->vm_pg_prot that is not consistent with the intended >> protection of the PTEs. This is also important for fault handlers that >> rely on the VMA vm_page_prot to set the page protection. Fix this by >> not allowing pgprot_modify() to change the encryption bit, similar to >> how it's done for PAT bits. >> >> Cc: Dave Hansen <dave.hansen@linux.intel.com> >> Cc: Andy Lutomirski <luto@kernel.org> >> Cc: Peter Zijlstra <peterz@infradead.org> >> Cc: Thomas Gleixner <tglx@linutronix.de> >> Cc: Ingo Molnar <mingo@redhat.com> >> Cc: Borislav Petkov <bp@alien8.de> >> Cc: "H. Peter Anvin" <hpa@zytor.com> >> Cc: Christoph Hellwig <hch@infradead.org> >> Cc: Christian König <christian.koenig@amd.com> >> Cc: Marek Szyprowski <m.szyprowski@samsung.com> >> Cc: Tom Lendacky <thomas.lendacky@amd.com> >> Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> >> --- >> arch/x86/include/asm/pgtable.h | 7 +++++-- >> arch/x86/include/asm/pgtable_types.h | 2 +- >> 2 files changed, 6 insertions(+), 3 deletions(-) >> >> diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h >> index 0bc530c4eb13..1e6bb4c25334 100644 >> --- a/arch/x86/include/asm/pgtable.h >> +++ b/arch/x86/include/asm/pgtable.h >> @@ -624,12 +624,15 @@ static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot) >> return __pmd(val); >> } >> >> -/* mprotect needs to preserve PAT bits when updating vm_page_prot */ >> +/* >> + * mprotect needs to preserve PAT and encryption bits when updating >> + * vm_page_prot >> + */ >> #define pgprot_modify pgprot_modify >> static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot) >> { >> pgprotval_t preservebits = pgprot_val(oldprot) & _PAGE_CHG_MASK; >> - pgprotval_t addbits = pgprot_val(newprot); >> + pgprotval_t addbits = pgprot_val(newprot) & ~_PAGE_CHG_MASK; >> return __pgprot(preservebits | addbits); >> } >> >> diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h >> index b5e49e6bac63..e13084b3d6cb 100644 >> --- a/arch/x86/include/asm/pgtable_types.h >> +++ b/arch/x86/include/asm/pgtable_types.h >> @@ -123,7 +123,7 @@ >> */ >> #define _PAGE_CHG_MASK (PTE_PFN_MASK | _PAGE_PCD | _PAGE_PWT | \ >> _PAGE_SPECIAL | _PAGE_ACCESSED | _PAGE_DIRTY | \ >> - _PAGE_SOFT_DIRTY | _PAGE_DEVMAP) >> + _PAGE_SOFT_DIRTY | _PAGE_DEVMAP | sme_me_mask) > There is a _PAGE_ENC definition that you could use to make this more > consistent with the current definition.
Ah yes.
I'll wait a bit to see if there are more concerns and include this in the next version.
Thanks,
Thomas
> > Thanks, > Tom > >> #define _HPAGE_CHG_MASK (_PAGE_CHG_MASK | _PAGE_PSE) >> >> /* >>
| |