diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/NonMmramMapDxeSmm.c b/UefiCpuPkg/PiSmmCpuDxeSmm/NonMmramMapDxeSmm.c index d188b11a96..4f6f040bc8 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/NonMmramMapDxeSmm.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/NonMmramMapDxeSmm.c @@ -423,6 +423,43 @@ SetUefiMemMapAttributes ( PERF_FUNCTION_END (); } +/** + Get SmmProfileData. + + @param[in, out] Size Return Size of SmmProfileData. + + @return Address of SmmProfileData + +**/ +EFI_PHYSICAL_ADDRESS +GetSmmProfileData ( + IN OUT UINT64 *Size + ) +{ + EFI_STATUS Status; + EFI_PHYSICAL_ADDRESS Base; + + ASSERT (Size != NULL); + + if (mBtsSupported) { + *Size = PcdGet32 (PcdCpuSmmProfileSize) + mMsrDsAreaSize; + } else { + *Size = PcdGet32 (PcdCpuSmmProfileSize); + } + + Base = 0xFFFFFFFF; + Status = gBS->AllocatePages ( + AllocateMaxAddress, + EfiReservedMemoryType, + (UINTN)EFI_SIZE_TO_PAGES (*Size), + &Base + ); + ASSERT_EFI_ERROR (Status); + ZeroMem ((VOID *)(UINTN)Base, (UINTN)*Size); + + return Base; +} + /** Return if the Address is forbidden as SMM communication buffer. diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuCommon.h b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuCommon.h index cc1fceb837..da59b07460 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuCommon.h +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuCommon.h @@ -267,6 +267,9 @@ extern UINTN mSmmShadowStackSize; /// extern UINT8 mSmmSaveStateRegisterLma; +extern BOOLEAN mBtsSupported; +extern UINTN mMsrDsAreaSize; + #define PAGE_TABLE_POOL_ALIGNMENT BASE_128KB #define PAGE_TABLE_POOL_UNIT_SIZE BASE_128KB #define PAGE_TABLE_POOL_UNIT_PAGES EFI_SIZE_TO_PAGES (PAGE_TABLE_POOL_UNIT_SIZE) @@ -910,6 +913,19 @@ SetUefiMemMapAttributes ( VOID ); +/** + Get SmmProfileData. + + @param[in, out] Size Return Size of SmmProfileData. + + @return Address of SmmProfileData + +**/ +EFI_PHYSICAL_ADDRESS +GetSmmProfileData ( + IN OUT UINT64 *Size + ); + /** Return if the Address is forbidden as SMM communication buffer. diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c index 19f3ba7000..e775b7d7ef 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c @@ -795,12 +795,11 @@ InitSmmProfileInternal ( VOID ) { - EFI_STATUS Status; - EFI_PHYSICAL_ADDRESS Base; - VOID *Registration; - UINTN Index; - UINTN MsrDsAreaSizePerCpu; - UINTN TotalSize; + EFI_STATUS Status; + VOID *Registration; + UINTN Index; + UINTN MsrDsAreaSizePerCpu; + UINT64 SmmProfileSize; mPFEntryCount = (UINTN *)AllocateZeroPool (sizeof (UINTN) * mMaxNumberOfCpus); ASSERT (mPFEntryCount != NULL); @@ -813,29 +812,15 @@ InitSmmProfileInternal ( ); ASSERT (mLastPFEntryPointer != NULL); - // - // Allocate memory for SmmProfile below 4GB. - // The base address - // - mSmmProfileSize = PcdGet32 (PcdCpuSmmProfileSize); + mSmmProfileSize = FixedPcdGet32 (PcdCpuSmmProfileSize); ASSERT ((mSmmProfileSize & 0xFFF) == 0); - if (mBtsSupported) { - TotalSize = mSmmProfileSize + mMsrDsAreaSize; - } else { - TotalSize = mSmmProfileSize; - } - - Base = 0xFFFFFFFF; - Status = gBS->AllocatePages ( - AllocateMaxAddress, - EfiReservedMemoryType, - EFI_SIZE_TO_PAGES (TotalSize), - &Base - ); - ASSERT_EFI_ERROR (Status); - ZeroMem ((VOID *)(UINTN)Base, TotalSize); - mSmmProfileBase = (SMM_PROFILE_HEADER *)(UINTN)Base; + // + // Get Smm Profile Base + // + mSmmProfileBase = (SMM_PROFILE_HEADER *)(UINTN)GetSmmProfileData (&SmmProfileSize); + DEBUG ((DEBUG_ERROR, "SmmProfileBase = 0x%016x.\n", (UINTN)mSmmProfileBase)); + DEBUG ((DEBUG_ERROR, "SmmProfileSize = 0x%016x.\n", (UINTN)SmmProfileSize)); // // Initialize SMM profile data header. @@ -858,7 +843,7 @@ InitSmmProfileInternal ( mMsrPEBSRecord = (PEBS_RECORD **)AllocateZeroPool (sizeof (PEBS_RECORD *) * mMaxNumberOfCpus); ASSERT (mMsrPEBSRecord != NULL); - mMsrDsAreaBase = (MSR_DS_AREA_STRUCT *)((UINTN)Base + mSmmProfileSize); + mMsrDsAreaBase = (MSR_DS_AREA_STRUCT *)((UINTN)mSmmProfileBase + mSmmProfileSize); MsrDsAreaSizePerCpu = mMsrDsAreaSize / mMaxNumberOfCpus; mBTSRecordNumber = (MsrDsAreaSizePerCpu - sizeof (PEBS_RECORD) * PEBS_RECORD_NUMBER - sizeof (MSR_DS_AREA_STRUCT)) / sizeof (BRANCH_TRACE_RECORD); for (Index = 0; Index < mMaxNumberOfCpus; Index++) { @@ -891,7 +876,7 @@ InitSmmProfileInternal ( // Update SMM profile entry. // mProtectionMemRange[1].Range.Base = (EFI_PHYSICAL_ADDRESS)(UINTN)mSmmProfileBase; - mProtectionMemRange[1].Range.Top = (EFI_PHYSICAL_ADDRESS)(UINTN)mSmmProfileBase + TotalSize; + mProtectionMemRange[1].Range.Top = (EFI_PHYSICAL_ADDRESS)(UINTN)mSmmProfileBase + SmmProfileSize; // // Allocate memory reserved for creating 4KB pages.