Skip to content

Commit

Permalink
StandaloneMmPkg/MemLib: remove unnecessary check
Browse files Browse the repository at this point in the history
Remove unnecessary check in API MmIsBufferOutsideMmValid of
StandaloneMmMemLib.

The API is used to check if a input buffer is outside MMRAM and
inside a valid non-MMRAM range. Previously, the API only checks
if the input buffer is
 overlapped with MMRAM range. In the last
commit, we add logic to check if the input buffer is inside valid
non-MMRAM 
ranges reported by the resource HOB. Since the resource
HOB only covers valid non-MMRAM ranges, we doesn't need to check
if the input buffer is inside the MMRAM anymore.

Signed-off-by: Dun Tan <[email protected]>
  • Loading branch information
td36 authored and mergify[bot] committed Nov 5, 2024
1 parent da8fd23 commit 836942f
Show file tree
Hide file tree
Showing 5 changed files with 1 addition and 162 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,34 +32,6 @@ MmMemLibCalculateMaximumSupportAddress (
DEBUG ((DEBUG_INFO, "mMmMemLibInternalMaximumSupportAddress = 0x%lx\n", mMmMemLibInternalMaximumSupportAddress));
}

/**
Initialize cached Mmram Ranges from HOB.
@retval EFI_UNSUPPORTED The routine is unable to extract MMRAM information.
@retval EFI_SUCCESS MmRanges are populated successfully.
**/
EFI_STATUS
MmMemLibInternalPopulateMmramRanges (
VOID
)
{
// Not implemented for AARCH64.
return EFI_SUCCESS;
}

/**
Deinitialize cached Mmram Ranges.
**/
VOID
MmMemLibInternalFreeMmramRanges (
VOID
)
{
// Not implemented for AARCH64.
}

/**
Initialize valid non-Mmram Ranges from Resource HOB.
Expand Down
41 changes: 1 addition & 40 deletions StandaloneMmPkg/Library/StandaloneMmMemLib/StandaloneMmMemLib.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,6 @@

#include "StandaloneMmMemLibInternal.h"

EFI_MMRAM_DESCRIPTOR *mMmMemLibInternalMmramRanges;
UINTN mMmMemLibInternalMmramCount;

//
// Maximum support address used to check input buffer
//
Expand All @@ -39,8 +36,6 @@ MmIsBufferOutsideMmValid (
IN UINT64 Length
)
{
UINTN Index;

//
// Check override.
// NOTE: (B:0->L:4G) is invalid for IA32, but (B:1->L:4G-1)/(B:4G-1->L:1) is valid.
Expand All @@ -62,28 +57,6 @@ MmIsBufferOutsideMmValid (
return FALSE;
}

for (Index = 0; Index < mMmMemLibInternalMmramCount; Index++) {
if (((Buffer >= mMmMemLibInternalMmramRanges[Index].CpuStart) &&
(Buffer < mMmMemLibInternalMmramRanges[Index].CpuStart + mMmMemLibInternalMmramRanges[Index].PhysicalSize)) ||
((mMmMemLibInternalMmramRanges[Index].CpuStart >= Buffer) &&
(mMmMemLibInternalMmramRanges[Index].CpuStart < Buffer + Length)))
{
DEBUG ((
DEBUG_ERROR,
"MmIsBufferOutsideMmValid: Overlap: Buffer (0x%lx) - Length (0x%lx), ",
Buffer,
Length
));
DEBUG ((
DEBUG_ERROR,
"CpuStart (0x%lx) - PhysicalSize (0x%lx)\n",
mMmMemLibInternalMmramRanges[Index].CpuStart,
mMmMemLibInternalMmramRanges[Index].PhysicalSize
));
return FALSE;
}
}

return MmMemLibIsValidNonMmramRange (Buffer, Length);
}

Expand Down Expand Up @@ -254,8 +227,6 @@ MemLibConstructor (
IN EFI_MM_SYSTEM_TABLE *MmSystemTable
)
{
EFI_STATUS Status;

//
// Calculate and save maximum support address
//
Expand All @@ -266,12 +237,7 @@ MemLibConstructor (
//
MmMemLibInitializeValidNonMmramRanges ();

//
// Initialize cached Mmram Ranges from HOB.
//
Status = MmMemLibInternalPopulateMmramRanges ();

return Status;
return EFI_SUCCESS;
}

/**
Expand All @@ -290,11 +256,6 @@ MemLibDestructor (
IN EFI_MM_SYSTEM_TABLE *MmSystemTable
)
{
//
// Deinitialize cached Mmram Ranges.
//
MmMemLibInternalFreeMmramRanges ();

//
// Deinitialize cached non-Mmram Ranges.
//
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,3 @@
DebugLib
HobLib
MemoryAllocationLib

[Guids]
gEfiMmPeiMmramMemoryReserveGuid ## SOMETIMES_CONSUMES ## HOB
gEfiSmmSmramMemoryGuid ## SOMETIMES_CONSUMES ## HOB
Original file line number Diff line number Diff line change
Expand Up @@ -24,27 +24,6 @@ MmMemLibCalculateMaximumSupportAddress (
VOID
);

/**
Initialize cached Mmram Ranges from HOB.
@retval EFI_UNSUPPORTED The routine is unable to extract MMRAM information.
@retval EFI_SUCCESS MmRanges are populated successfully.
**/
EFI_STATUS
MmMemLibInternalPopulateMmramRanges (
VOID
);

/**
Deinitialize cached Mmram Ranges.
**/
VOID
MmMemLibInternalFreeMmramRanges (
VOID
);

/**
Initialize valid non-Mmram Ranges from Resource HOB.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@
#include <Library/MemoryAllocationLib.h>
#include <Library/HobLib.h>

#include <Guid/MmramMemoryReserve.h>

typedef struct {
EFI_PHYSICAL_ADDRESS Base;
UINT64 Length;
Expand All @@ -32,8 +30,6 @@ UINTN mValidNonMmramCount;
// Maximum support address used to check input buffer
//
extern EFI_PHYSICAL_ADDRESS mMmMemLibInternalMaximumSupportAddress;
extern EFI_MMRAM_DESCRIPTOR *mMmMemLibInternalMmramRanges;
extern UINTN mMmMemLibInternalMmramCount;

/**
Calculate and save the maximum support address.
Expand Down Expand Up @@ -79,71 +75,6 @@ MmMemLibCalculateMaximumSupportAddress (
DEBUG ((DEBUG_INFO, "mMmMemLibInternalMaximumSupportAddress = 0x%lx\n", mMmMemLibInternalMaximumSupportAddress));
}

/**
Initialize cached Mmram Ranges from HOB.
@retval EFI_UNSUPPORTED The routine is unable to extract MMRAM information.
@retval EFI_SUCCESS MmRanges are populated successfully.
**/
EFI_STATUS
MmMemLibInternalPopulateMmramRanges (
VOID
)
{
VOID *HobStart;
EFI_HOB_GUID_TYPE *MmramRangesHob;
EFI_MMRAM_HOB_DESCRIPTOR_BLOCK *MmramRangesHobData;
EFI_MMRAM_DESCRIPTOR *MmramDescriptors;

HobStart = GetHobList ();
DEBUG ((DEBUG_INFO, "%a - 0x%x\n", __func__, HobStart));

//
// Search for a Hob containing the MMRAM ranges
//
MmramRangesHob = GetFirstGuidHob (&gEfiSmmSmramMemoryGuid);
if (MmramRangesHob == NULL) {
MmramRangesHob = GetFirstGuidHob (&gEfiMmPeiMmramMemoryReserveGuid);
if (MmramRangesHob == NULL) {
return EFI_UNSUPPORTED;
}
}

MmramRangesHobData = GET_GUID_HOB_DATA (MmramRangesHob);
if ((MmramRangesHobData == NULL) || (MmramRangesHobData->Descriptor == NULL)) {
return EFI_UNSUPPORTED;
}

mMmMemLibInternalMmramCount = MmramRangesHobData->NumberOfMmReservedRegions;
MmramDescriptors = MmramRangesHobData->Descriptor;

mMmMemLibInternalMmramRanges = AllocatePool (mMmMemLibInternalMmramCount * sizeof (EFI_MMRAM_DESCRIPTOR));
if (mMmMemLibInternalMmramRanges) {
CopyMem (
mMmMemLibInternalMmramRanges,
MmramDescriptors,
mMmMemLibInternalMmramCount * sizeof (EFI_MMRAM_DESCRIPTOR)
);
}

return EFI_SUCCESS;
}

/**
Deinitialize cached Mmram Ranges.
**/
VOID
MmMemLibInternalFreeMmramRanges (
VOID
)
{
if (mMmMemLibInternalMmramRanges != NULL) {
FreePool (mMmMemLibInternalMmramRanges);
}
}

/**
Merge the overlapped or continuous ranges in input MemoryRange. This function is to optimize
the process of checking whether a buffer range belongs to the range reported by resource HOB,
Expand Down

0 comments on commit 836942f

Please sign in to comment.