[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1ceb9abc-7a11-eaa1-b286-11647211e2fc@shipmail.org>
Date: Thu, 5 Sep 2019 18:29:25 +0200
From: Thomas Hellström (VMware)
<thomas_os@...pmail.org>
To: Dave Hansen <dave.hansen@...el.com>, linux-kernel@...r.kernel.org,
x86@...nel.org, pv-drivers@...are.com
Cc: Thomas Hellstrom <thellstrom@...are.com>,
Dave Hansen <dave.hansen@...ux.intel.com>,
Andy Lutomirski <luto@...nel.org>,
Peter Zijlstra <peterz@...radead.org>,
Thomas Gleixner <tglx@...utronix.de>,
Ingo Molnar <mingo@...hat.com>, Borislav Petkov <bp@...en8.de>,
"H. Peter Anvin" <hpa@...or.com>,
Christoph Hellwig <hch@...radead.org>,
Christian König <christian.koenig@....com>,
Marek Szyprowski <m.szyprowski@...sung.com>,
Tom Lendacky <thomas.lendacky@....com>,
"Shutemov, Kirill" <kirill.shutemov@...el.com>
Subject: Re: [RFC PATCH 1/2] x86: Don't let pgprot_modify() change the page
encryption bit
On 9/5/19 5:59 PM, Dave Hansen wrote:
> On 9/5/19 8:21 AM, Thomas Hellström (VMware) wrote:
>>>> #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 preservebits = pgprot_val(oldprot) &
>>>> + (_PAGE_CHG_MASK | sme_me_mask);
>>>> + pgprotval_t addbits = pgprot_val(newprot) & ~sme_me_mask;
>>>> return __pgprot(preservebits | addbits);
>>>> }
>>> _PAGE_CHG_MASK is claiming similar functionality about preserving bits
>>> when changing PTEs:
> ...
>>>> #define _PAGE_CHG_MASK (PTE_PFN_MASK | _PAGE_PCD | _PAGE_PWT
>>>> | \
>>>> _PAGE_SPECIAL | _PAGE_ACCESSED |
>>>> _PAGE_DIRTY | \
>>>> _PAGE_SOFT_DIRTY | _PAGE_DEVMAP)
>>> This makes me wonder if we should be including sme_me_mask in
>>> _PAGE_CHG_MASK (logically).
>> I was thinking the same. But what confuses me is that addbits isn't
>> masked with ~_PAGE_CHG_MASK, which is needed for sme_me_mask, since the
>> problem otherwise is typically that the encryption bit is incorrectly
>> set in addbits. I wonder whether it's an optimization or intentional.
> I think there's a built-in assumption that 'newprot' won't have any of
> the _PAGE_CHG_MASK bits set. That makes sense because there are no
> protection bits in the mask. But, the code certainly doesn't enforce that.
>
> Are you seeing 'sme_me_mask' bits set in 'newprot'?
Yes. AFAIK it's only one bit, and typically always set.
/Thomas
Powered by blists - more mailing lists