Re: [PATCHv2 22/29] x86/tdx: Make pages shared in ioremap()

From: Tom Lendacky
Date: Tue Feb 15 2022 - 09:51:43 EST


On 2/14/22 16:09, Kirill A. Shutemov wrote:
On Mon, Feb 07, 2022 at 06:28:04PM +0100, Borislav Petkov wrote:
On Mon, Feb 07, 2022 at 08:57:39AM -0800, Dave Hansen wrote:
We can surely *do* this with cc_something() helpers. It's just not as
easy as making cc_set/cc_clear().

Sure, that's easy: cc_pgprot_{enc,dec}() or so.

So, I've ended up with this in <asm/pgtable.h>

/*
* Macros to add or remove encryption attribute
*/
#ifdef CONFIG_ARCH_HAS_CC_PLATFORM
pgprotval_t cc_enc(pgprotval_t protval);
pgprotval_t cc_dec(pgprotval_t protval);
#define pgprot_encrypted(prot) __pgprot(cc_enc(pgprot_val(prot)))
#define pgprot_decrypted(prot) __pgprot(cc_dec(pgprot_val(prot)))
#else
#define pgprot_encrypted(prot) (prot)
#define pgprot_decrypted(prot) (prot)
#endif

A couple of things. I think cc_pgprot_enc() and cc_pgprot_dec() would be more descriptive/better names to use here.

Also, can they be defined in include/linux/cc_platform.h (with two versions based on CONFIG_ARCH_HAS_CC_PLATFORM) and have that included here? Or is there some header file include issues when trying to include it? That would clean this block up into just two lines.

Thanks,
Tom


And cc_platform.c:

pgprotval_t cc_enc(pgprotval_t protval)
{
if (sme_me_mask)
return __sme_set(protval);
else if (cpu_feature_enabled(X86_FEATURE_TDX_GUEST))
return protval & ~tdx_shared_mask();
else
return protval;
}

pgprotval_t cc_dec(pgprotval_t protval)
{
if (sme_me_mask)
return __sme_clr(protval);
else if (cpu_feature_enabled(X86_FEATURE_TDX_GUEST))
return protval | tdx_shared_mask();
else
return protval;
}
EXPORT_SYMBOL_GPL(cc_dec);