diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c index 2dd166d39cf0..115d477fd0fe 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c @@ -298,41 +298,35 @@ IsInSmmRanges ( } /** - Check if the memory address will be mapped by 4KB-page. + Check if the SMM profile page fault address above 4GB is in protected range or not. - @param Address The address of Memory. - @param Nx The flag indicates if the memory is execute-disable. + @param[in] Address The address of Memory. + @param[out] Nx The flag indicates if the memory is execute-disable. + + @retval TRUE The input address is in protected range. + @retval FALSE The input address is not in protected range. **/ BOOLEAN -IsAddressValid ( - IN EFI_PHYSICAL_ADDRESS Address, - IN BOOLEAN *Nx +IsSmmProfilePFAddressAbove4GValid ( + IN EFI_PHYSICAL_ADDRESS Address, + OUT BOOLEAN *Nx ) { UINTN Index; - if (FeaturePcdGet (PcdCpuSmmProfileEnable)) { - // - // Check configuration - // - for (Index = 0; Index < mProtectionMemRangeCount; Index++) { - if ((Address >= mProtectionMemRange[Index].Range.Base) && (Address < mProtectionMemRange[Index].Range.Top)) { - *Nx = mProtectionMemRange[Index].Nx; - return mProtectionMemRange[Index].Present; - } - } - - *Nx = TRUE; - return FALSE; - } else { - *Nx = TRUE; - if (IsInSmmRanges (Address)) { - *Nx = FALSE; + // + // Check configuration + // + for (Index = 0; Index < mProtectionMemRangeCount; Index++) { + if ((Address >= mProtectionMemRange[Index].Range.Base) && (Address < mProtectionMemRange[Index].Range.Top)) { + *Nx = mProtectionMemRange[Index].Nx; + return mProtectionMemRange[Index].Present; } - - return TRUE; } + + *Nx = TRUE; + return FALSE; } /** diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfileInternal.h b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfileInternal.h index df6bdae0cce4..42a6effe5284 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfileInternal.h +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfileInternal.h @@ -129,16 +129,19 @@ IsAddressSplit ( ); /** - Check if the memory address will be mapped by 4KB-page. + Check if the SMM profile page fault address above 4GB is in protected range or not. - @param Address The address of Memory. - @param Nx The flag indicates if the memory is execute-disable. + @param[in] Address The address of Memory. + @param[out] Nx The flag indicates if the memory is execute-disable. + + @retval TRUE The input address is in protected range. + @retval FALSE The input address is not in protected range. **/ BOOLEAN -IsAddressValid ( - IN EFI_PHYSICAL_ADDRESS Address, - IN BOOLEAN *Nx +IsSmmProfilePFAddressAbove4GValid ( + IN EFI_PHYSICAL_ADDRESS Address, + OUT BOOLEAN *Nx ); /** diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmProfileArch.c b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmProfileArch.c index 39dd2c802949..a95653ddbf0d 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmProfileArch.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmProfileArch.c @@ -358,7 +358,7 @@ RestorePageTableAbove4G ( // If page entry does not existed in page table at all, create a new entry. // if (!Existed) { - if (IsAddressValid (PFAddress, &Nx)) { + if (IsSmmProfilePFAddressAbove4GValid (PFAddress, &Nx)) { // // If page fault address above 4GB is in protected range but it causes a page fault exception, // Will create a page entry for this page fault address, make page table entry as present/rw and execution-disable. @@ -401,7 +401,7 @@ RestorePageTableAbove4G ( PageTable = (UINT64 *)(UINTN)(PageTable[PTIndex] & ~mAddressEncMask & PHYSICAL_ADDRESS_MASK); for (Index = 0; Index < 512; Index++) { PageTable[Index] = Address | mAddressEncMask | PAGE_ATTRIBUTE_BITS; - if (!IsAddressValid (Address, &Nx)) { + if (!IsSmmProfilePFAddressAbove4GValid (Address, &Nx)) { PageTable[Index] = PageTable[Index] & (INTN)(INT32)(~PAGE_ATTRIBUTE_BITS); } @@ -419,7 +419,7 @@ RestorePageTableAbove4G ( // // Update 2MB page entry. // - if (!IsAddressValid (Address, &Nx)) { + if (!IsSmmProfilePFAddressAbove4GValid (Address, &Nx)) { // // Patch to remove present flag and rw flag. //