Hi Kirill, A flyby comment below. "Kirill A. Shutemov" <kirill.shutemov@xxxxxxxxxxxxxxx> writes: > MKTME claims several upper bits of the physical address in a page table > entry to encode KeyID. It effectively shrinks number of bits for > physical address. We should exclude KeyID bits from physical addresses. > > For instance, if CPU enumerates 52 physical address bits and number of > bits claimed for KeyID is 6, bits 51:46 must not be threated as part > physical address. > > This patch adjusts __PHYSICAL_MASK during MKTME enumeration. > > Signed-off-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> > --- > arch/x86/kernel/cpu/intel.c | 24 ++++++++++++++++++++++++ > 1 file changed, 24 insertions(+) > > diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c > index c770689490b5..35436bbadd0b 100644 > --- a/arch/x86/kernel/cpu/intel.c > +++ b/arch/x86/kernel/cpu/intel.c > @@ -580,6 +580,30 @@ static void detect_tme(struct cpuinfo_x86 *c) > mktme_status = MKTME_ENABLED; > } > > +#ifdef CONFIG_X86_INTEL_MKTME > + if (mktme_status == MKTME_ENABLED && nr_keyids) { > + /* > + * Mask out bits claimed from KeyID from physical address mask. > + * > + * For instance, if a CPU enumerates 52 physical address bits > + * and number of bits claimed for KeyID is 6, bits 51:46 of > + * physical address is unusable. > + */ > + phys_addr_t keyid_mask; > + > + keyid_mask = 1ULL << c->x86_phys_bits; > + keyid_mask -= 1ULL << (c->x86_phys_bits - keyid_bits); > + physical_mask &= ~keyid_mask; You could use GENMASK_ULL() to construct the keyid_mask instead of rolling your own here. Thanks, Punit > + } else { > + /* > + * Reset __PHYSICAL_MASK. > + * Maybe needed if there's inconsistent configuation > + * between CPUs. > + */ > + physical_mask = (1ULL << __PHYSICAL_MASK_SHIFT) - 1; > + } > +#endif > + > /* > * Exclude KeyID bits from physical address bits. > *