OUT UINT64 *MtrrValidAddressMask\r
)\r
{\r
- UINT32 MaxExtendedFunction;\r
- CPUID_VIR_PHY_ADDRESS_SIZE_EAX VirPhyAddressSize;\r
+ UINT32 MaxExtendedFunction;\r
+ CPUID_VIR_PHY_ADDRESS_SIZE_EAX VirPhyAddressSize;\r
+ UINT32 MaxFunction;\r
+ CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_ECX ExtendedFeatureFlagsEcx;\r
+ MSR_IA32_TME_ACTIVATE_REGISTER TmeActivate;\r
\r
AsmCpuid (CPUID_EXTENDED_FUNCTION, &MaxExtendedFunction, NULL, NULL, NULL);\r
\r
VirPhyAddressSize.Bits.PhysicalAddressBits = 36;\r
}\r
\r
+ //\r
+ // CPUID enumeration of MAX_PA is unaffected by TME-MK activation and will continue\r
+ // to report the maximum physical address bits available for software to use,\r
+ // irrespective of the number of KeyID bits.\r
+ // So, we need to check if TME is enabled and adjust the PA size accordingly.\r
+ //\r
+ AsmCpuid (CPUID_SIGNATURE, &MaxFunction, NULL, NULL, NULL);\r
+ if (MaxFunction >= CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS) {\r
+ AsmCpuidEx (CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS, 0, NULL, NULL, &ExtendedFeatureFlagsEcx.Uint32, NULL);\r
+ if (ExtendedFeatureFlagsEcx.Bits.TME_EN == 1) {\r
+ TmeActivate.Uint64 = AsmReadMsr64 (MSR_IA32_TME_ACTIVATE);\r
+ if (TmeActivate.Bits.TmeEnable == 1) {\r
+ VirPhyAddressSize.Bits.PhysicalAddressBits -= TmeActivate.Bits.MkTmeKeyidBits;\r
+ }\r
+ }\r
+ }\r
+\r
*MtrrValidBitsMask = LShiftU64 (1, VirPhyAddressSize.Bits.PhysicalAddressBits) - 1;\r
*MtrrValidAddressMask = *MtrrValidBitsMask & 0xfffffffffffff000ULL;\r
}\r