StandaloneMmPkg: Apply uncrustify changes
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the StandaloneMmPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
This commit is contained in:
committed by
mergify[bot]
parent
c1e126b119
commit
91415a36ae
@@ -47,8 +47,8 @@ GrowDepexStack (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
BOOLEAN *NewStack;
|
BOOLEAN *NewStack;
|
||||||
UINTN Size;
|
UINTN Size;
|
||||||
|
|
||||||
Size = DEPEX_STACK_SIZE_INCREMENT;
|
Size = DEPEX_STACK_SIZE_INCREMENT;
|
||||||
if (mDepexEvaluationStack != NULL) {
|
if (mDepexEvaluationStack != NULL) {
|
||||||
@@ -167,7 +167,7 @@ PopBool (
|
|||||||
**/
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
MmIsSchedulable (
|
MmIsSchedulable (
|
||||||
IN EFI_MM_DRIVER_ENTRY *DriverEntry
|
IN EFI_MM_DRIVER_ENTRY *DriverEntry
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@@ -177,7 +177,7 @@ MmIsSchedulable (
|
|||||||
EFI_GUID DriverGuid;
|
EFI_GUID DriverGuid;
|
||||||
VOID *Interface;
|
VOID *Interface;
|
||||||
|
|
||||||
Operator = FALSE;
|
Operator = FALSE;
|
||||||
Operator2 = FALSE;
|
Operator2 = FALSE;
|
||||||
|
|
||||||
if (DriverEntry->After || DriverEntry->Before) {
|
if (DriverEntry->After || DriverEntry->Before) {
|
||||||
@@ -206,7 +206,6 @@ MmIsSchedulable (
|
|||||||
//
|
//
|
||||||
mDepexEvaluationStackPointer = mDepexEvaluationStack;
|
mDepexEvaluationStackPointer = mDepexEvaluationStack;
|
||||||
|
|
||||||
|
|
||||||
Iterator = DriverEntry->Depex;
|
Iterator = DriverEntry->Depex;
|
||||||
|
|
||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
@@ -223,148 +222,155 @@ MmIsSchedulable (
|
|||||||
// Look at the opcode of the dependency expression instruction.
|
// Look at the opcode of the dependency expression instruction.
|
||||||
//
|
//
|
||||||
switch (*Iterator) {
|
switch (*Iterator) {
|
||||||
case EFI_DEP_BEFORE:
|
case EFI_DEP_BEFORE:
|
||||||
case EFI_DEP_AFTER:
|
case EFI_DEP_AFTER:
|
||||||
//
|
|
||||||
// For a well-formed Dependency Expression, the code should never get here.
|
|
||||||
// The BEFORE and AFTER are processed prior to this routine's invocation.
|
|
||||||
// If the code flow arrives at this point, there was a BEFORE or AFTER
|
|
||||||
// that were not the first opcodes.
|
|
||||||
//
|
|
||||||
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected BEFORE or AFTER opcode)\n"));
|
|
||||||
ASSERT (FALSE);
|
|
||||||
|
|
||||||
case EFI_DEP_PUSH:
|
|
||||||
//
|
|
||||||
// Push operator is followed by a GUID. Test to see if the GUID protocol
|
|
||||||
// is installed and push the boolean result on the stack.
|
|
||||||
//
|
|
||||||
CopyMem (&DriverGuid, Iterator + 1, sizeof (EFI_GUID));
|
|
||||||
|
|
||||||
Status = MmLocateProtocol (&DriverGuid, NULL, &Interface);
|
|
||||||
if (EFI_ERROR (Status) && (mEfiSystemTable != NULL)) {
|
|
||||||
//
|
//
|
||||||
// For MM Driver, it may depend on uefi protocols
|
// For a well-formed Dependency Expression, the code should never get here.
|
||||||
|
// The BEFORE and AFTER are processed prior to this routine's invocation.
|
||||||
|
// If the code flow arrives at this point, there was a BEFORE or AFTER
|
||||||
|
// that were not the first opcodes.
|
||||||
//
|
//
|
||||||
Status = mEfiSystemTable->BootServices->LocateProtocol (&DriverGuid, NULL, &Interface);
|
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected BEFORE or AFTER opcode)\n"));
|
||||||
}
|
ASSERT (FALSE);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
case EFI_DEP_PUSH:
|
||||||
DEBUG ((DEBUG_DISPATCH, " PUSH GUID(%g) = FALSE\n", &DriverGuid));
|
//
|
||||||
Status = PushBool (FALSE);
|
// Push operator is followed by a GUID. Test to see if the GUID protocol
|
||||||
} else {
|
// is installed and push the boolean result on the stack.
|
||||||
DEBUG ((DEBUG_DISPATCH, " PUSH GUID(%g) = TRUE\n", &DriverGuid));
|
//
|
||||||
*Iterator = EFI_DEP_REPLACE_TRUE;
|
CopyMem (&DriverGuid, Iterator + 1, sizeof (EFI_GUID));
|
||||||
|
|
||||||
|
Status = MmLocateProtocol (&DriverGuid, NULL, &Interface);
|
||||||
|
if (EFI_ERROR (Status) && (mEfiSystemTable != NULL)) {
|
||||||
|
//
|
||||||
|
// For MM Driver, it may depend on uefi protocols
|
||||||
|
//
|
||||||
|
Status = mEfiSystemTable->BootServices->LocateProtocol (&DriverGuid, NULL, &Interface);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_DISPATCH, " PUSH GUID(%g) = FALSE\n", &DriverGuid));
|
||||||
|
Status = PushBool (FALSE);
|
||||||
|
} else {
|
||||||
|
DEBUG ((DEBUG_DISPATCH, " PUSH GUID(%g) = TRUE\n", &DriverGuid));
|
||||||
|
*Iterator = EFI_DEP_REPLACE_TRUE;
|
||||||
|
Status = PushBool (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Iterator += sizeof (EFI_GUID);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_DEP_AND:
|
||||||
|
DEBUG ((DEBUG_DISPATCH, " AND\n"));
|
||||||
|
Status = PopBool (&Operator);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = PopBool (&Operator2);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = PushBool ((BOOLEAN)(Operator && Operator2));
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_DEP_OR:
|
||||||
|
DEBUG ((DEBUG_DISPATCH, " OR\n"));
|
||||||
|
Status = PopBool (&Operator);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = PopBool (&Operator2);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = PushBool ((BOOLEAN)(Operator || Operator2));
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_DEP_NOT:
|
||||||
|
DEBUG ((DEBUG_DISPATCH, " NOT\n"));
|
||||||
|
Status = PopBool (&Operator);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = PushBool ((BOOLEAN)(!Operator));
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_DEP_TRUE:
|
||||||
|
DEBUG ((DEBUG_DISPATCH, " TRUE\n"));
|
||||||
Status = PushBool (TRUE);
|
Status = PushBool (TRUE);
|
||||||
}
|
if (EFI_ERROR (Status)) {
|
||||||
if (EFI_ERROR (Status)) {
|
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
||||||
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
return FALSE;
|
||||||
return FALSE;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Iterator += sizeof (EFI_GUID);
|
break;
|
||||||
break;
|
|
||||||
|
|
||||||
case EFI_DEP_AND:
|
case EFI_DEP_FALSE:
|
||||||
DEBUG ((DEBUG_DISPATCH, " AND\n"));
|
DEBUG ((DEBUG_DISPATCH, " FALSE\n"));
|
||||||
Status = PopBool (&Operator);
|
Status = PushBool (FALSE);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = PopBool (&Operator2);
|
break;
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = PushBool ((BOOLEAN)(Operator && Operator2));
|
case EFI_DEP_END:
|
||||||
if (EFI_ERROR (Status)) {
|
DEBUG ((DEBUG_DISPATCH, " END\n"));
|
||||||
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
Status = PopBool (&Operator);
|
||||||
return FALSE;
|
if (EFI_ERROR (Status)) {
|
||||||
}
|
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
||||||
break;
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
case EFI_DEP_OR:
|
DEBUG ((DEBUG_DISPATCH, " RESULT = %a\n", Operator ? "TRUE" : "FALSE"));
|
||||||
DEBUG ((DEBUG_DISPATCH, " OR\n"));
|
return Operator;
|
||||||
Status = PopBool (&Operator);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = PopBool (&Operator2);
|
case EFI_DEP_REPLACE_TRUE:
|
||||||
if (EFI_ERROR (Status)) {
|
CopyMem (&DriverGuid, Iterator + 1, sizeof (EFI_GUID));
|
||||||
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
DEBUG ((DEBUG_DISPATCH, " PUSH GUID(%g) = TRUE\n", &DriverGuid));
|
||||||
return FALSE;
|
Status = PushBool (TRUE);
|
||||||
}
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
Status = PushBool ((BOOLEAN)(Operator || Operator2));
|
Iterator += sizeof (EFI_GUID);
|
||||||
if (EFI_ERROR (Status)) {
|
break;
|
||||||
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EFI_DEP_NOT:
|
default:
|
||||||
DEBUG ((DEBUG_DISPATCH, " NOT\n"));
|
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unknown opcode)\n"));
|
||||||
Status = PopBool (&Operator);
|
goto Done;
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
Status = PushBool ((BOOLEAN)(!Operator));
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EFI_DEP_TRUE:
|
|
||||||
DEBUG ((DEBUG_DISPATCH, " TRUE\n"));
|
|
||||||
Status = PushBool (TRUE);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EFI_DEP_FALSE:
|
|
||||||
DEBUG ((DEBUG_DISPATCH, " FALSE\n"));
|
|
||||||
Status = PushBool (FALSE);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EFI_DEP_END:
|
|
||||||
DEBUG ((DEBUG_DISPATCH, " END\n"));
|
|
||||||
Status = PopBool (&Operator);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
DEBUG ((DEBUG_DISPATCH, " RESULT = %a\n", Operator ? "TRUE" : "FALSE"));
|
|
||||||
return Operator;
|
|
||||||
|
|
||||||
case EFI_DEP_REPLACE_TRUE:
|
|
||||||
CopyMem (&DriverGuid, Iterator + 1, sizeof (EFI_GUID));
|
|
||||||
DEBUG ((DEBUG_DISPATCH, " PUSH GUID(%g) = TRUE\n", &DriverGuid));
|
|
||||||
Status = PushBool (TRUE);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unexpected error)\n"));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
Iterator += sizeof (EFI_GUID);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DEBUG ((DEBUG_DISPATCH, " RESULT = FALSE (Unknown opcode)\n"));
|
|
||||||
goto Done;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@@ -44,9 +44,9 @@
|
|||||||
#define KNOWN_FWVOL_SIGNATURE SIGNATURE_32('k','n','o','w')
|
#define KNOWN_FWVOL_SIGNATURE SIGNATURE_32('k','n','o','w')
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Signature;
|
UINTN Signature;
|
||||||
LIST_ENTRY Link; // mFwVolList
|
LIST_ENTRY Link; // mFwVolList
|
||||||
EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
|
EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
|
||||||
} KNOWN_FWVOL;
|
} KNOWN_FWVOL;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -71,7 +71,7 @@ MmCoreFfsFindMmDriver (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
MmInsertOnScheduledQueueWhileProcessingBeforeAndAfter (
|
MmInsertOnScheduledQueueWhileProcessingBeforeAndAfter (
|
||||||
IN EFI_MM_DRIVER_ENTRY *InsertedDriverEntry
|
IN EFI_MM_DRIVER_ENTRY *InsertedDriverEntry
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -107,7 +107,7 @@ BOOLEAN gRequestDispatch = FALSE;
|
|||||||
// memory range usage. It is a bit mapped array in which every bit indicates the correspoding
|
// memory range usage. It is a bit mapped array in which every bit indicates the correspoding
|
||||||
// memory page available or not.
|
// memory page available or not.
|
||||||
//
|
//
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED UINT64 *mMmCodeMemoryRangeUsageBitMap=NULL;
|
GLOBAL_REMOVE_IF_UNREFERENCED UINT64 *mMmCodeMemoryRangeUsageBitMap = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
To check memory usage bit map array to figure out if the memory range in which the image will be loaded
|
To check memory usage bit map array to figure out if the memory range in which the image will be loaded
|
||||||
@@ -123,23 +123,23 @@ GLOBAL_REMOVE_IF_UNREFERENCED UINT64 *mMmCodeMemoryRangeUsageB
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
CheckAndMarkFixLoadingMemoryUsageBitMap (
|
CheckAndMarkFixLoadingMemoryUsageBitMap (
|
||||||
IN EFI_PHYSICAL_ADDRESS ImageBase,
|
IN EFI_PHYSICAL_ADDRESS ImageBase,
|
||||||
IN UINTN ImageSize
|
IN UINTN ImageSize
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINT32 MmCodePageNumber;
|
UINT32 MmCodePageNumber;
|
||||||
UINT64 MmCodeSize;
|
UINT64 MmCodeSize;
|
||||||
EFI_PHYSICAL_ADDRESS MmCodeBase;
|
EFI_PHYSICAL_ADDRESS MmCodeBase;
|
||||||
UINTN BaseOffsetPageNumber;
|
UINTN BaseOffsetPageNumber;
|
||||||
UINTN TopOffsetPageNumber;
|
UINTN TopOffsetPageNumber;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Build tool will calculate the smm code size and then patch the PcdLoadFixAddressMmCodePageNumber
|
// Build tool will calculate the smm code size and then patch the PcdLoadFixAddressMmCodePageNumber
|
||||||
//
|
//
|
||||||
MmCodePageNumber = 0;
|
MmCodePageNumber = 0;
|
||||||
MmCodeSize = EFI_PAGES_TO_SIZE (MmCodePageNumber);
|
MmCodeSize = EFI_PAGES_TO_SIZE (MmCodePageNumber);
|
||||||
MmCodeBase = gLoadModuleAtFixAddressMmramBase;
|
MmCodeBase = gLoadModuleAtFixAddressMmramBase;
|
||||||
|
|
||||||
//
|
//
|
||||||
// If the memory usage bit map is not initialized, do it. Every bit in the array
|
// If the memory usage bit map is not initialized, do it. Every bit in the array
|
||||||
@@ -159,7 +159,7 @@ CheckAndMarkFixLoadingMemoryUsageBitMap (
|
|||||||
//
|
//
|
||||||
// see if the memory range for loading the image is in the MM code range.
|
// see if the memory range for loading the image is in the MM code range.
|
||||||
//
|
//
|
||||||
if (MmCodeBase + MmCodeSize < ImageBase + ImageSize || MmCodeBase > ImageBase) {
|
if ((MmCodeBase + MmCodeSize < ImageBase + ImageSize) || (MmCodeBase > ImageBase)) {
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,7 +168,7 @@ CheckAndMarkFixLoadingMemoryUsageBitMap (
|
|||||||
//
|
//
|
||||||
BaseOffsetPageNumber = (UINTN)EFI_SIZE_TO_PAGES ((UINT32)(ImageBase - MmCodeBase));
|
BaseOffsetPageNumber = (UINTN)EFI_SIZE_TO_PAGES ((UINT32)(ImageBase - MmCodeBase));
|
||||||
TopOffsetPageNumber = (UINTN)EFI_SIZE_TO_PAGES ((UINT32)(ImageBase + ImageSize - MmCodeBase));
|
TopOffsetPageNumber = (UINTN)EFI_SIZE_TO_PAGES ((UINT32)(ImageBase + ImageSize - MmCodeBase));
|
||||||
for (Index = BaseOffsetPageNumber; Index < TopOffsetPageNumber; Index ++) {
|
for (Index = BaseOffsetPageNumber; Index < TopOffsetPageNumber; Index++) {
|
||||||
if ((mMmCodeMemoryRangeUsageBitMap[Index / 64] & LShiftU64 (1, (Index % 64))) != 0) {
|
if ((mMmCodeMemoryRangeUsageBitMap[Index / 64] & LShiftU64 (1, (Index % 64))) != 0) {
|
||||||
//
|
//
|
||||||
// This page is already used.
|
// This page is already used.
|
||||||
@@ -180,10 +180,11 @@ CheckAndMarkFixLoadingMemoryUsageBitMap (
|
|||||||
//
|
//
|
||||||
// Being here means the memory range is available. So mark the bits for the memory range
|
// Being here means the memory range is available. So mark the bits for the memory range
|
||||||
//
|
//
|
||||||
for (Index = BaseOffsetPageNumber; Index < TopOffsetPageNumber; Index ++) {
|
for (Index = BaseOffsetPageNumber; Index < TopOffsetPageNumber; Index++) {
|
||||||
mMmCodeMemoryRangeUsageBitMap[Index / 64] |= LShiftU64 (1, (Index % 64));
|
mMmCodeMemoryRangeUsageBitMap[Index / 64] |= LShiftU64 (1, (Index % 64));
|
||||||
}
|
}
|
||||||
return EFI_SUCCESS;
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -197,29 +198,29 @@ CheckAndMarkFixLoadingMemoryUsageBitMap (
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetPeCoffImageFixLoadingAssignedAddress(
|
GetPeCoffImageFixLoadingAssignedAddress (
|
||||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN SectionHeaderOffset;
|
UINTN SectionHeaderOffset;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_IMAGE_SECTION_HEADER SectionHeader;
|
EFI_IMAGE_SECTION_HEADER SectionHeader;
|
||||||
EFI_IMAGE_OPTIONAL_HEADER_UNION *ImgHdr;
|
EFI_IMAGE_OPTIONAL_HEADER_UNION *ImgHdr;
|
||||||
EFI_PHYSICAL_ADDRESS FixLoadingAddress;
|
EFI_PHYSICAL_ADDRESS FixLoadingAddress;
|
||||||
UINT16 Index;
|
UINT16 Index;
|
||||||
UINTN Size;
|
UINTN Size;
|
||||||
UINT16 NumberOfSections;
|
UINT16 NumberOfSections;
|
||||||
UINT64 ValueInSectionHeader;
|
UINT64 ValueInSectionHeader;
|
||||||
|
|
||||||
FixLoadingAddress = 0;
|
FixLoadingAddress = 0;
|
||||||
Status = EFI_NOT_FOUND;
|
Status = EFI_NOT_FOUND;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get PeHeader pointer
|
// Get PeHeader pointer
|
||||||
//
|
//
|
||||||
ImgHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)((CHAR8* )ImageContext->Handle + ImageContext->PeCoffHeaderOffset);
|
ImgHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)((CHAR8 *)ImageContext->Handle + ImageContext->PeCoffHeaderOffset);
|
||||||
SectionHeaderOffset = ImageContext->PeCoffHeaderOffset + sizeof (UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) +
|
SectionHeaderOffset = ImageContext->PeCoffHeaderOffset + sizeof (UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) +
|
||||||
ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader;
|
ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader;
|
||||||
NumberOfSections = ImgHdr->Pe32.FileHeader.NumberOfSections;
|
NumberOfSections = ImgHdr->Pe32.FileHeader.NumberOfSections;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -229,7 +230,7 @@ GetPeCoffImageFixLoadingAssignedAddress(
|
|||||||
//
|
//
|
||||||
// Read section header from file
|
// Read section header from file
|
||||||
//
|
//
|
||||||
Size = sizeof (EFI_IMAGE_SECTION_HEADER);
|
Size = sizeof (EFI_IMAGE_SECTION_HEADER);
|
||||||
Status = ImageContext->ImageRead (
|
Status = ImageContext->ImageRead (
|
||||||
ImageContext->Handle,
|
ImageContext->Handle,
|
||||||
SectionHeaderOffset,
|
SectionHeaderOffset,
|
||||||
@@ -250,7 +251,7 @@ GetPeCoffImageFixLoadingAssignedAddress(
|
|||||||
// assigned by tools, the PointerToRelocations & PointerToLineNumbers fields should not be
|
// assigned by tools, the PointerToRelocations & PointerToLineNumbers fields should not be
|
||||||
// Zero, or else, these 2 fields should be set to Zero
|
// Zero, or else, these 2 fields should be set to Zero
|
||||||
//
|
//
|
||||||
ValueInSectionHeader = ReadUnaligned64 ((UINT64*)&SectionHeader.PointerToRelocations);
|
ValueInSectionHeader = ReadUnaligned64 ((UINT64 *)&SectionHeader.PointerToRelocations);
|
||||||
if (ValueInSectionHeader != 0) {
|
if (ValueInSectionHeader != 0) {
|
||||||
//
|
//
|
||||||
// Found first section header that doesn't point to code section in which build tool saves the
|
// Found first section header that doesn't point to code section in which build tool saves the
|
||||||
@@ -261,21 +262,29 @@ GetPeCoffImageFixLoadingAssignedAddress(
|
|||||||
// Check if the memory range is available.
|
// Check if the memory range is available.
|
||||||
//
|
//
|
||||||
Status = CheckAndMarkFixLoadingMemoryUsageBitMap (FixLoadingAddress, (UINTN)(ImageContext->ImageSize + ImageContext->SectionAlignment));
|
Status = CheckAndMarkFixLoadingMemoryUsageBitMap (FixLoadingAddress, (UINTN)(ImageContext->ImageSize + ImageContext->SectionAlignment));
|
||||||
if (!EFI_ERROR(Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
//
|
//
|
||||||
// The assigned address is valid. Return the specified loading address
|
// The assigned address is valid. Return the specified loading address
|
||||||
//
|
//
|
||||||
ImageContext->ImageAddress = FixLoadingAddress;
|
ImageContext->ImageAddress = FixLoadingAddress;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
SectionHeaderOffset += sizeof (EFI_IMAGE_SECTION_HEADER);
|
SectionHeaderOffset += sizeof (EFI_IMAGE_SECTION_HEADER);
|
||||||
}
|
}
|
||||||
DEBUG ((DEBUG_INFO|DEBUG_LOAD, "LOADING MODULE FIXED INFO: Loading module at fixed address %x, Status = %r\n",
|
|
||||||
FixLoadingAddress, Status));
|
DEBUG ((
|
||||||
|
DEBUG_INFO|DEBUG_LOAD,
|
||||||
|
"LOADING MODULE FIXED INFO: Loading module at fixed address %x, Status = %r\n",
|
||||||
|
FixLoadingAddress,
|
||||||
|
Status
|
||||||
|
));
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Loads an EFI image into SMRAM.
|
Loads an EFI image into SMRAM.
|
||||||
|
|
||||||
@@ -290,19 +299,19 @@ MmLoadImage (
|
|||||||
IN OUT EFI_MM_DRIVER_ENTRY *DriverEntry
|
IN OUT EFI_MM_DRIVER_ENTRY *DriverEntry
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN PageCount;
|
UINTN PageCount;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_PHYSICAL_ADDRESS DstBuffer;
|
EFI_PHYSICAL_ADDRESS DstBuffer;
|
||||||
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
|
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO, "MmLoadImage - %g\n", &DriverEntry->FileName));
|
DEBUG ((DEBUG_INFO, "MmLoadImage - %g\n", &DriverEntry->FileName));
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Initialize ImageContext
|
// Initialize ImageContext
|
||||||
//
|
//
|
||||||
ImageContext.Handle = DriverEntry->Pe32Data;
|
ImageContext.Handle = DriverEntry->Pe32Data;
|
||||||
ImageContext.ImageRead = PeCoffLoaderImageReadFromMemory;
|
ImageContext.ImageRead = PeCoffLoaderImageReadFromMemory;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -355,14 +364,14 @@ MmLoadImage (
|
|||||||
//
|
//
|
||||||
// Flush the instruction cache so the image data are written before we execute it
|
// Flush the instruction cache so the image data are written before we execute it
|
||||||
//
|
//
|
||||||
InvalidateInstructionCacheRange ((VOID *)(UINTN) ImageContext.ImageAddress, (UINTN) ImageContext.ImageSize);
|
InvalidateInstructionCacheRange ((VOID *)(UINTN)ImageContext.ImageAddress, (UINTN)ImageContext.ImageSize);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Save Image EntryPoint in DriverEntry
|
// Save Image EntryPoint in DriverEntry
|
||||||
//
|
//
|
||||||
DriverEntry->ImageEntryPoint = ImageContext.EntryPoint;
|
DriverEntry->ImageEntryPoint = ImageContext.EntryPoint;
|
||||||
DriverEntry->ImageBuffer = DstBuffer;
|
DriverEntry->ImageBuffer = DstBuffer;
|
||||||
DriverEntry->NumberOfPage = PageCount;
|
DriverEntry->NumberOfPage = PageCount;
|
||||||
|
|
||||||
if (mEfiSystemTable != NULL) {
|
if (mEfiSystemTable != NULL) {
|
||||||
Status = mEfiSystemTable->BootServices->AllocatePool (
|
Status = mEfiSystemTable->BootServices->AllocatePool (
|
||||||
@@ -380,11 +389,11 @@ MmLoadImage (
|
|||||||
// Fill in the remaining fields of the Loaded Image Protocol instance.
|
// Fill in the remaining fields of the Loaded Image Protocol instance.
|
||||||
// Note: ImageBase is an SMRAM address that can not be accessed outside of SMRAM if SMRAM window is closed.
|
// Note: ImageBase is an SMRAM address that can not be accessed outside of SMRAM if SMRAM window is closed.
|
||||||
//
|
//
|
||||||
DriverEntry->LoadedImage->Revision = EFI_LOADED_IMAGE_PROTOCOL_REVISION;
|
DriverEntry->LoadedImage->Revision = EFI_LOADED_IMAGE_PROTOCOL_REVISION;
|
||||||
DriverEntry->LoadedImage->ParentHandle = NULL;
|
DriverEntry->LoadedImage->ParentHandle = NULL;
|
||||||
DriverEntry->LoadedImage->SystemTable = mEfiSystemTable;
|
DriverEntry->LoadedImage->SystemTable = mEfiSystemTable;
|
||||||
DriverEntry->LoadedImage->DeviceHandle = NULL;
|
DriverEntry->LoadedImage->DeviceHandle = NULL;
|
||||||
DriverEntry->LoadedImage->FilePath = NULL;
|
DriverEntry->LoadedImage->FilePath = NULL;
|
||||||
|
|
||||||
DriverEntry->LoadedImage->ImageBase = (VOID *)(UINTN)DriverEntry->ImageBuffer;
|
DriverEntry->LoadedImage->ImageBase = (VOID *)(UINTN)DriverEntry->ImageBuffer;
|
||||||
DriverEntry->LoadedImage->ImageSize = ImageContext.ImageSize;
|
DriverEntry->LoadedImage->ImageSize = ImageContext.ImageSize;
|
||||||
@@ -395,12 +404,12 @@ MmLoadImage (
|
|||||||
// Create a new image handle in the UEFI handle database for the MM Driver
|
// Create a new image handle in the UEFI handle database for the MM Driver
|
||||||
//
|
//
|
||||||
DriverEntry->ImageHandle = NULL;
|
DriverEntry->ImageHandle = NULL;
|
||||||
Status = mEfiSystemTable->BootServices->InstallMultipleProtocolInterfaces (
|
Status = mEfiSystemTable->BootServices->InstallMultipleProtocolInterfaces (
|
||||||
&DriverEntry->ImageHandle,
|
&DriverEntry->ImageHandle,
|
||||||
&gEfiLoadedImageProtocolGuid,
|
&gEfiLoadedImageProtocolGuid,
|
||||||
DriverEntry->LoadedImage,
|
DriverEntry->LoadedImage,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -408,14 +417,16 @@ MmLoadImage (
|
|||||||
//
|
//
|
||||||
DEBUG_CODE_BEGIN ();
|
DEBUG_CODE_BEGIN ();
|
||||||
|
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
UINTN StartIndex;
|
UINTN StartIndex;
|
||||||
CHAR8 EfiFileName[256];
|
CHAR8 EfiFileName[256];
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO | DEBUG_LOAD,
|
DEBUG ((
|
||||||
"Loading MM driver at 0x%11p EntryPoint=0x%11p ",
|
DEBUG_INFO | DEBUG_LOAD,
|
||||||
(VOID *)(UINTN) ImageContext.ImageAddress,
|
"Loading MM driver at 0x%11p EntryPoint=0x%11p ",
|
||||||
FUNCTION_ENTRY_POINT (ImageContext.EntryPoint)));
|
(VOID *)(UINTN)ImageContext.ImageAddress,
|
||||||
|
FUNCTION_ENTRY_POINT (ImageContext.EntryPoint)
|
||||||
|
));
|
||||||
|
|
||||||
//
|
//
|
||||||
// Print Module Name by Pdb file path.
|
// Print Module Name by Pdb file path.
|
||||||
@@ -439,6 +450,7 @@ MmLoadImage (
|
|||||||
if (EfiFileName[Index] == 0) {
|
if (EfiFileName[Index] == 0) {
|
||||||
EfiFileName[Index] = '.';
|
EfiFileName[Index] = '.';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EfiFileName[Index] == '.') {
|
if (EfiFileName[Index] == '.') {
|
||||||
EfiFileName[Index + 1] = 'e';
|
EfiFileName[Index + 1] = 'e';
|
||||||
EfiFileName[Index + 2] = 'f';
|
EfiFileName[Index + 2] = 'f';
|
||||||
@@ -451,8 +463,10 @@ MmLoadImage (
|
|||||||
if (Index == sizeof (EfiFileName) - 4) {
|
if (Index == sizeof (EfiFileName) - 4) {
|
||||||
EfiFileName[Index] = 0;
|
EfiFileName[Index] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO | DEBUG_LOAD, "%a", EfiFileName));
|
DEBUG ((DEBUG_INFO | DEBUG_LOAD, "%a", EfiFileName));
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO | DEBUG_LOAD, "\n"));
|
DEBUG ((DEBUG_INFO | DEBUG_LOAD, "\n"));
|
||||||
|
|
||||||
DEBUG_CODE_END ();
|
DEBUG_CODE_END ();
|
||||||
@@ -477,7 +491,7 @@ MmPreProcessDepex (
|
|||||||
{
|
{
|
||||||
UINT8 *Iterator;
|
UINT8 *Iterator;
|
||||||
|
|
||||||
Iterator = DriverEntry->Depex;
|
Iterator = DriverEntry->Depex;
|
||||||
DriverEntry->Dependent = TRUE;
|
DriverEntry->Dependent = TRUE;
|
||||||
|
|
||||||
if (*Iterator == EFI_DEP_BEFORE) {
|
if (*Iterator == EFI_DEP_BEFORE) {
|
||||||
@@ -510,7 +524,7 @@ MmGetDepexSectionAndPreProccess (
|
|||||||
IN EFI_MM_DRIVER_ENTRY *DriverEntry
|
IN EFI_MM_DRIVER_ENTRY *DriverEntry
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Data already read
|
// Data already read
|
||||||
@@ -520,6 +534,7 @@ MmGetDepexSectionAndPreProccess (
|
|||||||
} else {
|
} else {
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
if (Status == EFI_PROTOCOL_ERROR) {
|
if (Status == EFI_PROTOCOL_ERROR) {
|
||||||
//
|
//
|
||||||
@@ -530,8 +545,8 @@ MmGetDepexSectionAndPreProccess (
|
|||||||
//
|
//
|
||||||
// If no Depex assume depend on all architectural protocols
|
// If no Depex assume depend on all architectural protocols
|
||||||
//
|
//
|
||||||
DriverEntry->Depex = NULL;
|
DriverEntry->Depex = NULL;
|
||||||
DriverEntry->Dependent = TRUE;
|
DriverEntry->Dependent = TRUE;
|
||||||
DriverEntry->DepexProtocolError = FALSE;
|
DriverEntry->DepexProtocolError = FALSE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -567,10 +582,10 @@ MmDispatcher (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
LIST_ENTRY *Link;
|
LIST_ENTRY *Link;
|
||||||
EFI_MM_DRIVER_ENTRY *DriverEntry;
|
EFI_MM_DRIVER_ENTRY *DriverEntry;
|
||||||
BOOLEAN ReadyToRun;
|
BOOLEAN ReadyToRun;
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO, "MmDispatcher\n"));
|
DEBUG ((DEBUG_INFO, "MmDispatcher\n"));
|
||||||
|
|
||||||
@@ -619,8 +634,8 @@ MmDispatcher (
|
|||||||
// The MM Driver could not be loaded, and do not attempt to load or start it again.
|
// The MM Driver could not be loaded, and do not attempt to load or start it again.
|
||||||
// Take driver from Scheduled to Initialized.
|
// Take driver from Scheduled to Initialized.
|
||||||
//
|
//
|
||||||
DriverEntry->Initialized = TRUE;
|
DriverEntry->Initialized = TRUE;
|
||||||
DriverEntry->Scheduled = FALSE;
|
DriverEntry->Scheduled = FALSE;
|
||||||
RemoveEntryList (&DriverEntry->ScheduledLink);
|
RemoveEntryList (&DriverEntry->ScheduledLink);
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -630,8 +645,8 @@ MmDispatcher (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DriverEntry->Scheduled = FALSE;
|
DriverEntry->Scheduled = FALSE;
|
||||||
DriverEntry->Initialized = TRUE;
|
DriverEntry->Initialized = TRUE;
|
||||||
RemoveEntryList (&DriverEntry->ScheduledLink);
|
RemoveEntryList (&DriverEntry->ScheduledLink);
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -639,17 +654,18 @@ MmDispatcher (
|
|||||||
//
|
//
|
||||||
if (mEfiSystemTable == NULL) {
|
if (mEfiSystemTable == NULL) {
|
||||||
DEBUG ((DEBUG_INFO, "StartImage - 0x%x (Standalone Mode)\n", DriverEntry->ImageEntryPoint));
|
DEBUG ((DEBUG_INFO, "StartImage - 0x%x (Standalone Mode)\n", DriverEntry->ImageEntryPoint));
|
||||||
Status = ((MM_IMAGE_ENTRY_POINT)(UINTN)DriverEntry->ImageEntryPoint) (DriverEntry->ImageHandle, &gMmCoreMmst);
|
Status = ((MM_IMAGE_ENTRY_POINT)(UINTN)DriverEntry->ImageEntryPoint)(DriverEntry->ImageHandle, &gMmCoreMmst);
|
||||||
} else {
|
} else {
|
||||||
DEBUG ((DEBUG_INFO, "StartImage - 0x%x (Tradition Mode)\n", DriverEntry->ImageEntryPoint));
|
DEBUG ((DEBUG_INFO, "StartImage - 0x%x (Tradition Mode)\n", DriverEntry->ImageEntryPoint));
|
||||||
Status = ((EFI_IMAGE_ENTRY_POINT)(UINTN)DriverEntry->ImageEntryPoint) (
|
Status = ((EFI_IMAGE_ENTRY_POINT)(UINTN)DriverEntry->ImageEntryPoint)(
|
||||||
DriverEntry->ImageHandle,
|
DriverEntry->ImageHandle,
|
||||||
mEfiSystemTable
|
mEfiSystemTable
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (EFI_ERROR(Status)) {
|
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_INFO, "StartImage Status - %r\n", Status));
|
DEBUG ((DEBUG_INFO, "StartImage Status - %r\n", Status));
|
||||||
MmFreePages(DriverEntry->ImageBuffer, DriverEntry->NumberOfPage);
|
MmFreePages (DriverEntry->ImageBuffer, DriverEntry->NumberOfPage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -714,18 +730,18 @@ MmDispatcher (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
MmInsertOnScheduledQueueWhileProcessingBeforeAndAfter (
|
MmInsertOnScheduledQueueWhileProcessingBeforeAndAfter (
|
||||||
IN EFI_MM_DRIVER_ENTRY *InsertedDriverEntry
|
IN EFI_MM_DRIVER_ENTRY *InsertedDriverEntry
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
LIST_ENTRY *Link;
|
LIST_ENTRY *Link;
|
||||||
EFI_MM_DRIVER_ENTRY *DriverEntry;
|
EFI_MM_DRIVER_ENTRY *DriverEntry;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Process Before Dependency
|
// Process Before Dependency
|
||||||
//
|
//
|
||||||
for (Link = mDiscoveredList.ForwardLink; Link != &mDiscoveredList; Link = Link->ForwardLink) {
|
for (Link = mDiscoveredList.ForwardLink; Link != &mDiscoveredList; Link = Link->ForwardLink) {
|
||||||
DriverEntry = CR(Link, EFI_MM_DRIVER_ENTRY, Link, EFI_MM_DRIVER_ENTRY_SIGNATURE);
|
DriverEntry = CR (Link, EFI_MM_DRIVER_ENTRY, Link, EFI_MM_DRIVER_ENTRY_SIGNATURE);
|
||||||
if (DriverEntry->Before && DriverEntry->Dependent && DriverEntry != InsertedDriverEntry) {
|
if (DriverEntry->Before && DriverEntry->Dependent && (DriverEntry != InsertedDriverEntry)) {
|
||||||
DEBUG ((DEBUG_DISPATCH, "Evaluate MM DEPEX for FFS(%g)\n", &DriverEntry->FileName));
|
DEBUG ((DEBUG_DISPATCH, "Evaluate MM DEPEX for FFS(%g)\n", &DriverEntry->FileName));
|
||||||
DEBUG ((DEBUG_DISPATCH, " BEFORE FFS(%g) = ", &DriverEntry->BeforeAfterGuid));
|
DEBUG ((DEBUG_DISPATCH, " BEFORE FFS(%g) = ", &DriverEntry->BeforeAfterGuid));
|
||||||
if (CompareGuid (&InsertedDriverEntry->FileName, &DriverEntry->BeforeAfterGuid)) {
|
if (CompareGuid (&InsertedDriverEntry->FileName, &DriverEntry->BeforeAfterGuid)) {
|
||||||
@@ -748,13 +764,12 @@ MmInsertOnScheduledQueueWhileProcessingBeforeAndAfter (
|
|||||||
InsertedDriverEntry->Scheduled = TRUE;
|
InsertedDriverEntry->Scheduled = TRUE;
|
||||||
InsertTailList (&mScheduledQueue, &InsertedDriverEntry->ScheduledLink);
|
InsertTailList (&mScheduledQueue, &InsertedDriverEntry->ScheduledLink);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Process After Dependency
|
// Process After Dependency
|
||||||
//
|
//
|
||||||
for (Link = mDiscoveredList.ForwardLink; Link != &mDiscoveredList; Link = Link->ForwardLink) {
|
for (Link = mDiscoveredList.ForwardLink; Link != &mDiscoveredList; Link = Link->ForwardLink) {
|
||||||
DriverEntry = CR(Link, EFI_MM_DRIVER_ENTRY, Link, EFI_MM_DRIVER_ENTRY_SIGNATURE);
|
DriverEntry = CR (Link, EFI_MM_DRIVER_ENTRY, Link, EFI_MM_DRIVER_ENTRY_SIGNATURE);
|
||||||
if (DriverEntry->After && DriverEntry->Dependent && DriverEntry != InsertedDriverEntry) {
|
if (DriverEntry->After && DriverEntry->Dependent && (DriverEntry != InsertedDriverEntry)) {
|
||||||
DEBUG ((DEBUG_DISPATCH, "Evaluate MM DEPEX for FFS(%g)\n", &DriverEntry->FileName));
|
DEBUG ((DEBUG_DISPATCH, "Evaluate MM DEPEX for FFS(%g)\n", &DriverEntry->FileName));
|
||||||
DEBUG ((DEBUG_DISPATCH, " AFTER FFS(%g) = ", &DriverEntry->BeforeAfterGuid));
|
DEBUG ((DEBUG_DISPATCH, " AFTER FFS(%g) = ", &DriverEntry->BeforeAfterGuid));
|
||||||
if (CompareGuid (&InsertedDriverEntry->FileName, &DriverEntry->BeforeAfterGuid)) {
|
if (CompareGuid (&InsertedDriverEntry->FileName, &DriverEntry->BeforeAfterGuid)) {
|
||||||
@@ -784,20 +799,22 @@ MmInsertOnScheduledQueueWhileProcessingBeforeAndAfter (
|
|||||||
**/
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
FvHasBeenProcessed (
|
FvHasBeenProcessed (
|
||||||
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader
|
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
LIST_ENTRY *Link;
|
LIST_ENTRY *Link;
|
||||||
KNOWN_FWVOL *KnownFwVol;
|
KNOWN_FWVOL *KnownFwVol;
|
||||||
|
|
||||||
for (Link = mFwVolList.ForwardLink;
|
for (Link = mFwVolList.ForwardLink;
|
||||||
Link != &mFwVolList;
|
Link != &mFwVolList;
|
||||||
Link = Link->ForwardLink) {
|
Link = Link->ForwardLink)
|
||||||
|
{
|
||||||
KnownFwVol = CR (Link, KNOWN_FWVOL, Link, KNOWN_FWVOL_SIGNATURE);
|
KnownFwVol = CR (Link, KNOWN_FWVOL, Link, KNOWN_FWVOL_SIGNATURE);
|
||||||
if (KnownFwVol->FwVolHeader == FwVolHeader) {
|
if (KnownFwVol->FwVolHeader == FwVolHeader) {
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -812,17 +829,17 @@ FvHasBeenProcessed (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
FvIsBeingProcessed (
|
FvIsBeingProcessed (
|
||||||
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader
|
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
KNOWN_FWVOL *KnownFwVol;
|
KNOWN_FWVOL *KnownFwVol;
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO, "FvIsBeingProcessed - 0x%08x\n", FwVolHeader));
|
DEBUG ((DEBUG_INFO, "FvIsBeingProcessed - 0x%08x\n", FwVolHeader));
|
||||||
|
|
||||||
KnownFwVol = AllocatePool (sizeof (KNOWN_FWVOL));
|
KnownFwVol = AllocatePool (sizeof (KNOWN_FWVOL));
|
||||||
ASSERT (KnownFwVol != NULL);
|
ASSERT (KnownFwVol != NULL);
|
||||||
|
|
||||||
KnownFwVol->Signature = KNOWN_FWVOL_SIGNATURE;
|
KnownFwVol->Signature = KNOWN_FWVOL_SIGNATURE;
|
||||||
KnownFwVol->FwVolHeader = FwVolHeader;
|
KnownFwVol->FwVolHeader = FwVolHeader;
|
||||||
InsertTailList (&mFwVolList, &KnownFwVol->Link);
|
InsertTailList (&mFwVolList, &KnownFwVol->Link);
|
||||||
}
|
}
|
||||||
@@ -845,12 +862,12 @@ FvIsBeingProcessed (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
MmAddToDriverList (
|
MmAddToDriverList (
|
||||||
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader,
|
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader,
|
||||||
IN VOID *Pe32Data,
|
IN VOID *Pe32Data,
|
||||||
IN UINTN Pe32DataSize,
|
IN UINTN Pe32DataSize,
|
||||||
IN VOID *Depex,
|
IN VOID *Depex,
|
||||||
IN UINTN DepexSize,
|
IN UINTN DepexSize,
|
||||||
IN EFI_GUID *DriverName
|
IN EFI_GUID *DriverName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_MM_DRIVER_ENTRY *DriverEntry;
|
EFI_MM_DRIVER_ENTRY *DriverEntry;
|
||||||
@@ -864,13 +881,13 @@ MmAddToDriverList (
|
|||||||
DriverEntry = AllocateZeroPool (sizeof (EFI_MM_DRIVER_ENTRY));
|
DriverEntry = AllocateZeroPool (sizeof (EFI_MM_DRIVER_ENTRY));
|
||||||
ASSERT (DriverEntry != NULL);
|
ASSERT (DriverEntry != NULL);
|
||||||
|
|
||||||
DriverEntry->Signature = EFI_MM_DRIVER_ENTRY_SIGNATURE;
|
DriverEntry->Signature = EFI_MM_DRIVER_ENTRY_SIGNATURE;
|
||||||
CopyGuid (&DriverEntry->FileName, DriverName);
|
CopyGuid (&DriverEntry->FileName, DriverName);
|
||||||
DriverEntry->FwVolHeader = FwVolHeader;
|
DriverEntry->FwVolHeader = FwVolHeader;
|
||||||
DriverEntry->Pe32Data = Pe32Data;
|
DriverEntry->Pe32Data = Pe32Data;
|
||||||
DriverEntry->Pe32DataSize = Pe32DataSize;
|
DriverEntry->Pe32DataSize = Pe32DataSize;
|
||||||
DriverEntry->Depex = Depex;
|
DriverEntry->Depex = Depex;
|
||||||
DriverEntry->DepexSize = DepexSize;
|
DriverEntry->DepexSize = DepexSize;
|
||||||
|
|
||||||
MmGetDepexSectionAndPreProccess (DriverEntry);
|
MmGetDepexSectionAndPreProccess (DriverEntry);
|
||||||
|
|
||||||
@@ -890,10 +907,10 @@ MmDisplayDiscoveredNotDispatched (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
LIST_ENTRY *Link;
|
LIST_ENTRY *Link;
|
||||||
EFI_MM_DRIVER_ENTRY *DriverEntry;
|
EFI_MM_DRIVER_ENTRY *DriverEntry;
|
||||||
|
|
||||||
for (Link = mDiscoveredList.ForwardLink;Link !=&mDiscoveredList; Link = Link->ForwardLink) {
|
for (Link = mDiscoveredList.ForwardLink; Link != &mDiscoveredList; Link = Link->ForwardLink) {
|
||||||
DriverEntry = CR (Link, EFI_MM_DRIVER_ENTRY, Link, EFI_MM_DRIVER_ENTRY_SIGNATURE);
|
DriverEntry = CR (Link, EFI_MM_DRIVER_ENTRY, Link, EFI_MM_DRIVER_ENTRY_SIGNATURE);
|
||||||
if (DriverEntry->Dependent) {
|
if (DriverEntry->Dependent) {
|
||||||
DEBUG ((DEBUG_LOAD, "MM Driver %g was discovered but not loaded!!\n", &DriverEntry->FileName));
|
DEBUG ((DEBUG_LOAD, "MM Driver %g was discovered but not loaded!!\n", &DriverEntry->FileName));
|
||||||
|
@@ -14,9 +14,9 @@
|
|||||||
//
|
//
|
||||||
// List of file types supported by dispatcher
|
// List of file types supported by dispatcher
|
||||||
//
|
//
|
||||||
EFI_FV_FILETYPE mMmFileTypes[] = {
|
EFI_FV_FILETYPE mMmFileTypes[] = {
|
||||||
EFI_FV_FILETYPE_MM,
|
EFI_FV_FILETYPE_MM,
|
||||||
0xE, //EFI_FV_FILETYPE_MM_STANDALONE,
|
0xE, // EFI_FV_FILETYPE_MM_STANDALONE,
|
||||||
//
|
//
|
||||||
// Note: DXE core will process the FV image file, so skip it in MM core
|
// Note: DXE core will process the FV image file, so skip it in MM core
|
||||||
// EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE
|
// EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE
|
||||||
@@ -25,22 +25,22 @@ EFI_FV_FILETYPE mMmFileTypes[] = {
|
|||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
MmAddToDriverList (
|
MmAddToDriverList (
|
||||||
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader,
|
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader,
|
||||||
IN VOID *Pe32Data,
|
IN VOID *Pe32Data,
|
||||||
IN UINTN Pe32DataSize,
|
IN UINTN Pe32DataSize,
|
||||||
IN VOID *Depex,
|
IN VOID *Depex,
|
||||||
IN UINTN DepexSize,
|
IN UINTN DepexSize,
|
||||||
IN EFI_GUID *DriverName
|
IN EFI_GUID *DriverName
|
||||||
);
|
);
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
FvHasBeenProcessed (
|
FvHasBeenProcessed (
|
||||||
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader
|
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader
|
||||||
);
|
);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
FvIsBeingProcessed (
|
FvIsBeingProcessed (
|
||||||
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader
|
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -62,25 +62,25 @@ MmCoreFfsFindMmDriver (
|
|||||||
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader
|
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_STATUS DepexStatus;
|
EFI_STATUS DepexStatus;
|
||||||
EFI_FFS_FILE_HEADER *FileHeader;
|
EFI_FFS_FILE_HEADER *FileHeader;
|
||||||
EFI_FV_FILETYPE FileType;
|
EFI_FV_FILETYPE FileType;
|
||||||
VOID *Pe32Data;
|
VOID *Pe32Data;
|
||||||
UINTN Pe32DataSize;
|
UINTN Pe32DataSize;
|
||||||
VOID *Depex;
|
VOID *Depex;
|
||||||
UINTN DepexSize;
|
UINTN DepexSize;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
EFI_COMMON_SECTION_HEADER *Section;
|
EFI_COMMON_SECTION_HEADER *Section;
|
||||||
VOID *SectionData;
|
VOID *SectionData;
|
||||||
UINTN SectionDataSize;
|
UINTN SectionDataSize;
|
||||||
UINT32 DstBufferSize;
|
UINT32 DstBufferSize;
|
||||||
VOID *ScratchBuffer;
|
VOID *ScratchBuffer;
|
||||||
UINT32 ScratchBufferSize;
|
UINT32 ScratchBufferSize;
|
||||||
VOID *DstBuffer;
|
VOID *DstBuffer;
|
||||||
UINT16 SectionAttribute;
|
UINT16 SectionAttribute;
|
||||||
UINT32 AuthenticationStatus;
|
UINT32 AuthenticationStatus;
|
||||||
EFI_FIRMWARE_VOLUME_HEADER *InnerFvHeader;
|
EFI_FIRMWARE_VOLUME_HEADER *InnerFvHeader;
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO, "MmCoreFfsFindMmDriver - 0x%x\n", FwVolHeader));
|
DEBUG ((DEBUG_INFO, "MmCoreFfsFindMmDriver - 0x%x\n", FwVolHeader));
|
||||||
|
|
||||||
@@ -95,19 +95,32 @@ MmCoreFfsFindMmDriver (
|
|||||||
//
|
//
|
||||||
FileHeader = NULL;
|
FileHeader = NULL;
|
||||||
do {
|
do {
|
||||||
Status = FfsFindNextFile (EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE,
|
Status = FfsFindNextFile (
|
||||||
FwVolHeader, &FileHeader);
|
EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE,
|
||||||
|
FwVolHeader,
|
||||||
|
&FileHeader
|
||||||
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Status = FfsFindSectionData (EFI_SECTION_GUID_DEFINED, FileHeader,
|
|
||||||
&SectionData, &SectionDataSize);
|
Status = FfsFindSectionData (
|
||||||
|
EFI_SECTION_GUID_DEFINED,
|
||||||
|
FileHeader,
|
||||||
|
&SectionData,
|
||||||
|
&SectionDataSize
|
||||||
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Section = (EFI_COMMON_SECTION_HEADER *)(FileHeader + 1);
|
Section = (EFI_COMMON_SECTION_HEADER *)(FileHeader + 1);
|
||||||
Status = ExtractGuidedSectionGetInfo (Section, &DstBufferSize,
|
Status = ExtractGuidedSectionGetInfo (
|
||||||
&ScratchBufferSize, &SectionAttribute);
|
Section,
|
||||||
|
&DstBufferSize,
|
||||||
|
&ScratchBufferSize,
|
||||||
|
&SectionAttribute
|
||||||
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -131,25 +144,35 @@ MmCoreFfsFindMmDriver (
|
|||||||
//
|
//
|
||||||
// Call decompress function
|
// Call decompress function
|
||||||
//
|
//
|
||||||
Status = ExtractGuidedSectionDecode (Section, &DstBuffer, ScratchBuffer,
|
Status = ExtractGuidedSectionDecode (
|
||||||
&AuthenticationStatus);
|
Section,
|
||||||
|
&DstBuffer,
|
||||||
|
ScratchBuffer,
|
||||||
|
&AuthenticationStatus
|
||||||
|
);
|
||||||
FreePages (ScratchBuffer, EFI_SIZE_TO_PAGES (ScratchBufferSize));
|
FreePages (ScratchBuffer, EFI_SIZE_TO_PAGES (ScratchBufferSize));
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto FreeDstBuffer;
|
goto FreeDstBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO,
|
DEBUG ((
|
||||||
|
DEBUG_INFO,
|
||||||
"Processing compressed firmware volume (AuthenticationStatus == %x)\n",
|
"Processing compressed firmware volume (AuthenticationStatus == %x)\n",
|
||||||
AuthenticationStatus));
|
AuthenticationStatus
|
||||||
|
));
|
||||||
|
|
||||||
Status = FindFfsSectionInSections (DstBuffer, DstBufferSize,
|
Status = FindFfsSectionInSections (
|
||||||
EFI_SECTION_FIRMWARE_VOLUME_IMAGE, &Section);
|
DstBuffer,
|
||||||
|
DstBufferSize,
|
||||||
|
EFI_SECTION_FIRMWARE_VOLUME_IMAGE,
|
||||||
|
&Section
|
||||||
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto FreeDstBuffer;
|
goto FreeDstBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
InnerFvHeader = (VOID *)(Section + 1);
|
InnerFvHeader = (VOID *)(Section + 1);
|
||||||
Status = MmCoreFfsFindMmDriver (InnerFvHeader);
|
Status = MmCoreFfsFindMmDriver (InnerFvHeader);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto FreeDstBuffer;
|
goto FreeDstBuffer;
|
||||||
}
|
}
|
||||||
@@ -157,7 +180,7 @@ MmCoreFfsFindMmDriver (
|
|||||||
|
|
||||||
for (Index = 0; Index < sizeof (mMmFileTypes) / sizeof (mMmFileTypes[0]); Index++) {
|
for (Index = 0; Index < sizeof (mMmFileTypes) / sizeof (mMmFileTypes[0]); Index++) {
|
||||||
DEBUG ((DEBUG_INFO, "Check MmFileTypes - 0x%x\n", mMmFileTypes[Index]));
|
DEBUG ((DEBUG_INFO, "Check MmFileTypes - 0x%x\n", mMmFileTypes[Index]));
|
||||||
FileType = mMmFileTypes[Index];
|
FileType = mMmFileTypes[Index];
|
||||||
FileHeader = NULL;
|
FileHeader = NULL;
|
||||||
do {
|
do {
|
||||||
Status = FfsFindNextFile (FileType, FwVolHeader, &FileHeader);
|
Status = FfsFindNextFile (FileType, FwVolHeader, &FileHeader);
|
||||||
|
@@ -13,8 +13,8 @@
|
|||||||
// mProtocolDatabase - A list of all protocols in the system. (simple list for now)
|
// mProtocolDatabase - A list of all protocols in the system. (simple list for now)
|
||||||
// gHandleList - A list of all the handles in the system
|
// gHandleList - A list of all the handles in the system
|
||||||
//
|
//
|
||||||
LIST_ENTRY mProtocolDatabase = INITIALIZE_LIST_HEAD_VARIABLE (mProtocolDatabase);
|
LIST_ENTRY mProtocolDatabase = INITIALIZE_LIST_HEAD_VARIABLE (mProtocolDatabase);
|
||||||
LIST_ENTRY gHandleList = INITIALIZE_LIST_HEAD_VARIABLE (gHandleList);
|
LIST_ENTRY gHandleList = INITIALIZE_LIST_HEAD_VARIABLE (gHandleList);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Check whether a handle is a valid EFI_HANDLE
|
Check whether a handle is a valid EFI_HANDLE
|
||||||
@@ -36,9 +36,11 @@ MmValidateHandle (
|
|||||||
if (Handle == NULL) {
|
if (Handle == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Handle->Signature != EFI_HANDLE_SIGNATURE) {
|
if (Handle->Signature != EFI_HANDLE_SIGNATURE) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,13 +55,13 @@ MmValidateHandle (
|
|||||||
**/
|
**/
|
||||||
PROTOCOL_ENTRY *
|
PROTOCOL_ENTRY *
|
||||||
MmFindProtocolEntry (
|
MmFindProtocolEntry (
|
||||||
IN EFI_GUID *Protocol,
|
IN EFI_GUID *Protocol,
|
||||||
IN BOOLEAN Create
|
IN BOOLEAN Create
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
LIST_ENTRY *Link;
|
LIST_ENTRY *Link;
|
||||||
PROTOCOL_ENTRY *Item;
|
PROTOCOL_ENTRY *Item;
|
||||||
PROTOCOL_ENTRY *ProtEntry;
|
PROTOCOL_ENTRY *ProtEntry;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Search the database for the matching GUID
|
// Search the database for the matching GUID
|
||||||
@@ -68,8 +70,8 @@ MmFindProtocolEntry (
|
|||||||
ProtEntry = NULL;
|
ProtEntry = NULL;
|
||||||
for (Link = mProtocolDatabase.ForwardLink;
|
for (Link = mProtocolDatabase.ForwardLink;
|
||||||
Link != &mProtocolDatabase;
|
Link != &mProtocolDatabase;
|
||||||
Link = Link->ForwardLink) {
|
Link = Link->ForwardLink)
|
||||||
|
{
|
||||||
Item = CR (Link, PROTOCOL_ENTRY, AllEntries, PROTOCOL_ENTRY_SIGNATURE);
|
Item = CR (Link, PROTOCOL_ENTRY, AllEntries, PROTOCOL_ENTRY_SIGNATURE);
|
||||||
if (CompareGuid (&Item->ProtocolID, Protocol)) {
|
if (CompareGuid (&Item->ProtocolID, Protocol)) {
|
||||||
//
|
//
|
||||||
@@ -85,7 +87,7 @@ MmFindProtocolEntry (
|
|||||||
// allocate a new entry
|
// allocate a new entry
|
||||||
//
|
//
|
||||||
if ((ProtEntry == NULL) && Create) {
|
if ((ProtEntry == NULL) && Create) {
|
||||||
ProtEntry = AllocatePool (sizeof(PROTOCOL_ENTRY));
|
ProtEntry = AllocatePool (sizeof (PROTOCOL_ENTRY));
|
||||||
if (ProtEntry != NULL) {
|
if (ProtEntry != NULL) {
|
||||||
//
|
//
|
||||||
// Initialize new protocol entry structure
|
// Initialize new protocol entry structure
|
||||||
@@ -101,6 +103,7 @@ MmFindProtocolEntry (
|
|||||||
InsertTailList (&mProtocolDatabase, &ProtEntry->AllEntries);
|
InsertTailList (&mProtocolDatabase, &ProtEntry->AllEntries);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ProtEntry;
|
return ProtEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,17 +140,19 @@ MmFindProtocolInterface (
|
|||||||
//
|
//
|
||||||
// Look at each protocol interface for any matches
|
// Look at each protocol interface for any matches
|
||||||
//
|
//
|
||||||
for (Link = Handle->Protocols.ForwardLink; Link != &Handle->Protocols; Link=Link->ForwardLink) {
|
for (Link = Handle->Protocols.ForwardLink; Link != &Handle->Protocols; Link = Link->ForwardLink) {
|
||||||
//
|
//
|
||||||
// If this protocol interface matches, remove it
|
// If this protocol interface matches, remove it
|
||||||
//
|
//
|
||||||
Prot = CR (Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);
|
Prot = CR (Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);
|
||||||
if (Prot->Interface == Interface && Prot->Protocol == ProtEntry) {
|
if ((Prot->Interface == Interface) && (Prot->Protocol == ProtEntry)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Prot = NULL;
|
Prot = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Prot;
|
return Prot;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,7 +224,7 @@ MmInstallProtocolInterfaceNotify (
|
|||||||
// returns EFI_INVALID_PARAMETER if InterfaceType is invalid.
|
// returns EFI_INVALID_PARAMETER if InterfaceType is invalid.
|
||||||
// Also added check for invalid UserHandle and Protocol pointers.
|
// Also added check for invalid UserHandle and Protocol pointers.
|
||||||
//
|
//
|
||||||
if (UserHandle == NULL || Protocol == NULL) {
|
if ((UserHandle == NULL) || (Protocol == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,7 +238,7 @@ MmInstallProtocolInterfaceNotify (
|
|||||||
DEBUG ((DEBUG_LOAD | DEBUG_INFO, "MmInstallProtocolInterface: %g %p\n", Protocol, Interface));
|
DEBUG ((DEBUG_LOAD | DEBUG_INFO, "MmInstallProtocolInterface: %g %p\n", Protocol, Interface));
|
||||||
|
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
Prot = NULL;
|
Prot = NULL;
|
||||||
Handle = NULL;
|
Handle = NULL;
|
||||||
|
|
||||||
if (*UserHandle != NULL) {
|
if (*UserHandle != NULL) {
|
||||||
@@ -298,8 +303,8 @@ MmInstallProtocolInterfaceNotify (
|
|||||||
// Initialize the protocol interface structure
|
// Initialize the protocol interface structure
|
||||||
//
|
//
|
||||||
Prot->Signature = PROTOCOL_INTERFACE_SIGNATURE;
|
Prot->Signature = PROTOCOL_INTERFACE_SIGNATURE;
|
||||||
Prot->Handle = Handle;
|
Prot->Handle = Handle;
|
||||||
Prot->Protocol = ProtEntry;
|
Prot->Protocol = ProtEntry;
|
||||||
Prot->Interface = Interface;
|
Prot->Interface = Interface;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -320,6 +325,7 @@ MmInstallProtocolInterfaceNotify (
|
|||||||
if (Notify) {
|
if (Notify) {
|
||||||
MmNotifyProtocol (Prot);
|
MmNotifyProtocol (Prot);
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
Done:
|
Done:
|
||||||
@@ -336,6 +342,7 @@ Done:
|
|||||||
FreePool (Prot);
|
FreePool (Prot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -416,6 +423,7 @@ MmUninstallProtocolInterface (
|
|||||||
RemoveEntryList (&Handle->AllHandles);
|
RemoveEntryList (&Handle->AllHandles);
|
||||||
FreePool (Handle);
|
FreePool (Handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -451,12 +459,13 @@ MmGetProtocolInterface (
|
|||||||
// Look at each protocol interface for a match
|
// Look at each protocol interface for a match
|
||||||
//
|
//
|
||||||
for (Link = Handle->Protocols.ForwardLink; Link != &Handle->Protocols; Link = Link->ForwardLink) {
|
for (Link = Handle->Protocols.ForwardLink; Link != &Handle->Protocols; Link = Link->ForwardLink) {
|
||||||
Prot = CR (Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);
|
Prot = CR (Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);
|
||||||
ProtEntry = Prot->Protocol;
|
ProtEntry = Prot->Protocol;
|
||||||
if (CompareGuid (&ProtEntry->ProtocolID, Protocol)) {
|
if (CompareGuid (&ProtEntry->ProtocolID, Protocol)) {
|
||||||
return Prot;
|
return Prot;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
#include "StandaloneMmCore.h"
|
#include "StandaloneMmCore.h"
|
||||||
|
|
||||||
#define CONFIG_TABLE_SIZE_INCREASED 0x10
|
#define CONFIG_TABLE_SIZE_INCREASED 0x10
|
||||||
|
|
||||||
UINTN mMmSystemTableAllocateSize = 0;
|
UINTN mMmSystemTableAllocateSize = 0;
|
||||||
|
|
||||||
@@ -33,10 +33,10 @@ UINTN mMmSystemTableAllocateSize = 0;
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmInstallConfigurationTable (
|
MmInstallConfigurationTable (
|
||||||
IN CONST EFI_MM_SYSTEM_TABLE *SystemTable,
|
IN CONST EFI_MM_SYSTEM_TABLE *SystemTable,
|
||||||
IN CONST EFI_GUID *Guid,
|
IN CONST EFI_GUID *Guid,
|
||||||
IN VOID *Table,
|
IN VOID *Table,
|
||||||
IN UINTN TableSize
|
IN UINTN TableSize
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
@@ -87,7 +87,6 @@ MmInstallConfigurationTable (
|
|||||||
&(ConfigurationTable[Index + 1]),
|
&(ConfigurationTable[Index + 1]),
|
||||||
(gMmCoreMmst.NumberOfTableEntries - Index) * sizeof (EFI_CONFIGURATION_TABLE)
|
(gMmCoreMmst.NumberOfTableEntries - Index) * sizeof (EFI_CONFIGURATION_TABLE)
|
||||||
);
|
);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
// No matching GUIDs were found, so this is an add operation.
|
// No matching GUIDs were found, so this is an add operation.
|
||||||
@@ -107,7 +106,7 @@ MmInstallConfigurationTable (
|
|||||||
// Allocate a table with one additional entry.
|
// Allocate a table with one additional entry.
|
||||||
//
|
//
|
||||||
mMmSystemTableAllocateSize += (CONFIG_TABLE_SIZE_INCREASED * sizeof (EFI_CONFIGURATION_TABLE));
|
mMmSystemTableAllocateSize += (CONFIG_TABLE_SIZE_INCREASED * sizeof (EFI_CONFIGURATION_TABLE));
|
||||||
ConfigurationTable = AllocatePool (mMmSystemTableAllocateSize);
|
ConfigurationTable = AllocatePool (mMmSystemTableAllocateSize);
|
||||||
if (ConfigurationTable == NULL) {
|
if (ConfigurationTable == NULL) {
|
||||||
//
|
//
|
||||||
// If a new table could not be allocated, then return an error.
|
// If a new table could not be allocated, then return an error.
|
||||||
|
@@ -12,24 +12,24 @@
|
|||||||
//
|
//
|
||||||
// ProtocolRequest - Last LocateHandle request ID
|
// ProtocolRequest - Last LocateHandle request ID
|
||||||
//
|
//
|
||||||
UINTN mEfiLocateHandleRequest = 0;
|
UINTN mEfiLocateHandleRequest = 0;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Internal prototypes
|
// Internal prototypes
|
||||||
//
|
//
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EFI_GUID *Protocol;
|
EFI_GUID *Protocol;
|
||||||
VOID *SearchKey;
|
VOID *SearchKey;
|
||||||
LIST_ENTRY *Position;
|
LIST_ENTRY *Position;
|
||||||
PROTOCOL_ENTRY *ProtEntry;
|
PROTOCOL_ENTRY *ProtEntry;
|
||||||
} LOCATE_POSITION;
|
} LOCATE_POSITION;
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
IHANDLE *
|
IHANDLE *
|
||||||
(* CORE_GET_NEXT) (
|
(*CORE_GET_NEXT) (
|
||||||
IN OUT LOCATE_POSITION *Position,
|
IN OUT LOCATE_POSITION *Position,
|
||||||
OUT VOID **Interface
|
OUT VOID **Interface
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -49,7 +49,7 @@ MmGetNextLocateAllHandles (
|
|||||||
OUT VOID **Interface
|
OUT VOID **Interface
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
IHANDLE *Handle;
|
IHANDLE *Handle;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Next handle
|
// Next handle
|
||||||
@@ -59,11 +59,12 @@ MmGetNextLocateAllHandles (
|
|||||||
//
|
//
|
||||||
// If not at the end of the list, get the handle
|
// If not at the end of the list, get the handle
|
||||||
//
|
//
|
||||||
Handle = NULL;
|
Handle = NULL;
|
||||||
*Interface = NULL;
|
*Interface = NULL;
|
||||||
if (Position->Position != &gHandleList) {
|
if (Position->Position != &gHandleList) {
|
||||||
Handle = CR (Position->Position, IHANDLE, AllHandles, EFI_HANDLE_SIGNATURE);
|
Handle = CR (Position->Position, IHANDLE, AllHandles, EFI_HANDLE_SIGNATURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Handle;
|
return Handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,8 +91,8 @@ MmGetNextLocateByRegisterNotify (
|
|||||||
PROTOCOL_INTERFACE *Prot;
|
PROTOCOL_INTERFACE *Prot;
|
||||||
LIST_ENTRY *Link;
|
LIST_ENTRY *Link;
|
||||||
|
|
||||||
Handle = NULL;
|
Handle = NULL;
|
||||||
*Interface = NULL;
|
*Interface = NULL;
|
||||||
ProtNotify = Position->SearchKey;
|
ProtNotify = Position->SearchKey;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -106,11 +107,12 @@ MmGetNextLocateByRegisterNotify (
|
|||||||
//
|
//
|
||||||
Link = ProtNotify->Position->ForwardLink;
|
Link = ProtNotify->Position->ForwardLink;
|
||||||
if (Link != &ProtNotify->Protocol->Protocols) {
|
if (Link != &ProtNotify->Protocol->Protocols) {
|
||||||
Prot = CR (Link, PROTOCOL_INTERFACE, ByProtocol, PROTOCOL_INTERFACE_SIGNATURE);
|
Prot = CR (Link, PROTOCOL_INTERFACE, ByProtocol, PROTOCOL_INTERFACE_SIGNATURE);
|
||||||
Handle = Prot->Handle;
|
Handle = Prot->Handle;
|
||||||
*Interface = Prot->Interface;
|
*Interface = Prot->Interface;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Handle;
|
return Handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,13 +137,13 @@ MmGetNextLocateByProtocol (
|
|||||||
LIST_ENTRY *Link;
|
LIST_ENTRY *Link;
|
||||||
PROTOCOL_INTERFACE *Prot;
|
PROTOCOL_INTERFACE *Prot;
|
||||||
|
|
||||||
Handle = NULL;
|
Handle = NULL;
|
||||||
*Interface = NULL;
|
*Interface = NULL;
|
||||||
for (; ;) {
|
for ( ; ;) {
|
||||||
//
|
//
|
||||||
// Next entry
|
// Next entry
|
||||||
//
|
//
|
||||||
Link = Position->Position->ForwardLink;
|
Link = Position->Position->ForwardLink;
|
||||||
Position->Position = Link;
|
Position->Position = Link;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -155,8 +157,8 @@ MmGetNextLocateByProtocol (
|
|||||||
//
|
//
|
||||||
// Get the handle
|
// Get the handle
|
||||||
//
|
//
|
||||||
Prot = CR (Link, PROTOCOL_INTERFACE, ByProtocol, PROTOCOL_INTERFACE_SIGNATURE);
|
Prot = CR (Link, PROTOCOL_INTERFACE, ByProtocol, PROTOCOL_INTERFACE_SIGNATURE);
|
||||||
Handle = Prot->Handle;
|
Handle = Prot->Handle;
|
||||||
*Interface = Prot->Interface;
|
*Interface = Prot->Interface;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -168,6 +170,7 @@ MmGetNextLocateByProtocol (
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Handle;
|
return Handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,17 +198,17 @@ MmLocateProtocol (
|
|||||||
OUT VOID **Interface
|
OUT VOID **Interface
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
LOCATE_POSITION Position;
|
LOCATE_POSITION Position;
|
||||||
PROTOCOL_NOTIFY *ProtNotify;
|
PROTOCOL_NOTIFY *ProtNotify;
|
||||||
IHANDLE *Handle;
|
IHANDLE *Handle;
|
||||||
|
|
||||||
if ((Interface == NULL) || (Protocol == NULL)) {
|
if ((Interface == NULL) || (Protocol == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
*Interface = NULL;
|
*Interface = NULL;
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Set initial position
|
// Set initial position
|
||||||
@@ -224,6 +227,7 @@ MmLocateProtocol (
|
|||||||
if (Position.ProtEntry == NULL) {
|
if (Position.ProtEntry == NULL) {
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
Position.Position = &Position.ProtEntry->Protocols;
|
Position.Position = &Position.ProtEntry->Protocols;
|
||||||
|
|
||||||
Handle = MmGetNextLocateByProtocol (&Position, Interface);
|
Handle = MmGetNextLocateByProtocol (&Position, Interface);
|
||||||
@@ -238,7 +242,7 @@ MmLocateProtocol (
|
|||||||
// If this is a search by register notify and a handle was
|
// If this is a search by register notify and a handle was
|
||||||
// returned, update the register notification position
|
// returned, update the register notification position
|
||||||
//
|
//
|
||||||
ProtNotify = Registration;
|
ProtNotify = Registration;
|
||||||
ProtNotify->Position = ProtNotify->Position->ForwardLink;
|
ProtNotify->Position = ProtNotify->Position->ForwardLink;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -299,48 +303,51 @@ MmLocateHandle (
|
|||||||
Position.SearchKey = SearchKey;
|
Position.SearchKey = SearchKey;
|
||||||
Position.Position = &gHandleList;
|
Position.Position = &gHandleList;
|
||||||
|
|
||||||
ResultSize = 0;
|
ResultSize = 0;
|
||||||
ResultBuffer = (IHANDLE **) Buffer;
|
ResultBuffer = (IHANDLE **)Buffer;
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get the search function based on type
|
// Get the search function based on type
|
||||||
//
|
//
|
||||||
switch (SearchType) {
|
switch (SearchType) {
|
||||||
case AllHandles:
|
case AllHandles:
|
||||||
GetNext = MmGetNextLocateAllHandles;
|
GetNext = MmGetNextLocateAllHandles;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ByRegisterNotify:
|
case ByRegisterNotify:
|
||||||
GetNext = MmGetNextLocateByRegisterNotify;
|
GetNext = MmGetNextLocateByRegisterNotify;
|
||||||
//
|
//
|
||||||
// Must have SearchKey for locate ByRegisterNotify
|
// Must have SearchKey for locate ByRegisterNotify
|
||||||
//
|
//
|
||||||
if (SearchKey == NULL) {
|
if (SearchKey == NULL) {
|
||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
case ByProtocol:
|
break;
|
||||||
GetNext = MmGetNextLocateByProtocol;
|
|
||||||
if (Protocol == NULL) {
|
case ByProtocol:
|
||||||
|
GetNext = MmGetNextLocateByProtocol;
|
||||||
|
if (Protocol == NULL) {
|
||||||
|
Status = EFI_INVALID_PARAMETER;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Look up the protocol entry and set the head pointer
|
||||||
|
//
|
||||||
|
Position.ProtEntry = MmFindProtocolEntry (Protocol, FALSE);
|
||||||
|
if (Position.ProtEntry == NULL) {
|
||||||
|
Status = EFI_NOT_FOUND;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Position.Position = &Position.ProtEntry->Protocols;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
//
|
|
||||||
// Look up the protocol entry and set the head pointer
|
|
||||||
//
|
|
||||||
Position.ProtEntry = MmFindProtocolEntry (Protocol, FALSE);
|
|
||||||
if (Position.ProtEntry == NULL) {
|
|
||||||
Status = EFI_NOT_FOUND;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Position.Position = &Position.ProtEntry->Protocols;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
Status = EFI_INVALID_PARAMETER;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@@ -351,7 +358,7 @@ MmLocateHandle (
|
|||||||
// Enumerate out the matching handles
|
// Enumerate out the matching handles
|
||||||
//
|
//
|
||||||
mEfiLocateHandleRequest += 1;
|
mEfiLocateHandleRequest += 1;
|
||||||
for (; ;) {
|
for ( ; ;) {
|
||||||
//
|
//
|
||||||
// Get the next handle. If no more handles, stop
|
// Get the next handle. If no more handles, stop
|
||||||
//
|
//
|
||||||
@@ -366,8 +373,8 @@ MmLocateHandle (
|
|||||||
//
|
//
|
||||||
ResultSize += sizeof (Handle);
|
ResultSize += sizeof (Handle);
|
||||||
if (ResultSize <= *BufferSize) {
|
if (ResultSize <= *BufferSize) {
|
||||||
*ResultBuffer = Handle;
|
*ResultBuffer = Handle;
|
||||||
ResultBuffer += 1;
|
ResultBuffer += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -388,13 +395,13 @@ MmLocateHandle (
|
|||||||
|
|
||||||
*BufferSize = ResultSize;
|
*BufferSize = ResultSize;
|
||||||
|
|
||||||
if (SearchType == ByRegisterNotify && !EFI_ERROR (Status)) {
|
if ((SearchType == ByRegisterNotify) && !EFI_ERROR (Status)) {
|
||||||
ASSERT (SearchKey != NULL);
|
ASSERT (SearchKey != NULL);
|
||||||
//
|
//
|
||||||
// If this is a search by register notify and a handle was
|
// If this is a search by register notify and a handle was
|
||||||
// returned, update the register notification position
|
// returned, update the register notification position
|
||||||
//
|
//
|
||||||
ProtNotify = SearchKey;
|
ProtNotify = SearchKey;
|
||||||
ProtNotify->Position = ProtNotify->Position->ForwardLink;
|
ProtNotify->Position = ProtNotify->Position->ForwardLink;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -445,26 +452,27 @@ MmLocateHandleBuffer (
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferSize = 0;
|
BufferSize = 0;
|
||||||
*NumberHandles = 0;
|
*NumberHandles = 0;
|
||||||
*Buffer = NULL;
|
*Buffer = NULL;
|
||||||
Status = MmLocateHandle (
|
Status = MmLocateHandle (
|
||||||
SearchType,
|
SearchType,
|
||||||
Protocol,
|
Protocol,
|
||||||
SearchKey,
|
SearchKey,
|
||||||
&BufferSize,
|
&BufferSize,
|
||||||
*Buffer
|
*Buffer
|
||||||
);
|
);
|
||||||
//
|
//
|
||||||
// LocateHandleBuffer() returns incorrect status code if SearchType is
|
// LocateHandleBuffer() returns incorrect status code if SearchType is
|
||||||
// invalid.
|
// invalid.
|
||||||
//
|
//
|
||||||
// Add code to correctly handle expected errors from MmLocateHandle().
|
// Add code to correctly handle expected errors from MmLocateHandle().
|
||||||
//
|
//
|
||||||
if (EFI_ERROR (Status) && Status != EFI_BUFFER_TOO_SMALL) {
|
if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {
|
||||||
if (Status != EFI_INVALID_PARAMETER) {
|
if (Status != EFI_INVALID_PARAMETER) {
|
||||||
Status = EFI_NOT_FOUND;
|
Status = EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -481,7 +489,7 @@ MmLocateHandleBuffer (
|
|||||||
*Buffer
|
*Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
*NumberHandles = BufferSize / sizeof(EFI_HANDLE);
|
*NumberHandles = BufferSize / sizeof (EFI_HANDLE);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
*NumberHandles = 0;
|
*NumberHandles = 0;
|
||||||
}
|
}
|
||||||
|
@@ -20,11 +20,11 @@
|
|||||||
#define MMI_ENTRY_SIGNATURE SIGNATURE_32('m','m','i','e')
|
#define MMI_ENTRY_SIGNATURE SIGNATURE_32('m','m','i','e')
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Signature;
|
UINTN Signature;
|
||||||
LIST_ENTRY AllEntries; // All entries
|
LIST_ENTRY AllEntries; // All entries
|
||||||
|
|
||||||
EFI_GUID HandlerType; // Type of interrupt
|
EFI_GUID HandlerType; // Type of interrupt
|
||||||
LIST_ENTRY MmiHandlers; // All handlers
|
LIST_ENTRY MmiHandlers; // All handlers
|
||||||
} MMI_ENTRY;
|
} MMI_ENTRY;
|
||||||
|
|
||||||
#define MMI_HANDLER_SIGNATURE SIGNATURE_32('m','m','i','h')
|
#define MMI_HANDLER_SIGNATURE SIGNATURE_32('m','m','i','h')
|
||||||
@@ -65,8 +65,8 @@ MmCoreFindMmiEntry (
|
|||||||
MmiEntry = NULL;
|
MmiEntry = NULL;
|
||||||
for (Link = mMmiEntryList.ForwardLink;
|
for (Link = mMmiEntryList.ForwardLink;
|
||||||
Link != &mMmiEntryList;
|
Link != &mMmiEntryList;
|
||||||
Link = Link->ForwardLink) {
|
Link = Link->ForwardLink)
|
||||||
|
{
|
||||||
Item = CR (Link, MMI_ENTRY, AllEntries, MMI_ENTRY_SIGNATURE);
|
Item = CR (Link, MMI_ENTRY, AllEntries, MMI_ENTRY_SIGNATURE);
|
||||||
if (CompareGuid (&Item->HandlerType, HandlerType)) {
|
if (CompareGuid (&Item->HandlerType, HandlerType)) {
|
||||||
//
|
//
|
||||||
@@ -97,6 +97,7 @@ MmCoreFindMmiEntry (
|
|||||||
InsertTailList (&mMmiEntryList, &MmiEntry->AllEntries);
|
InsertTailList (&mMmiEntryList, &MmiEntry->AllEntries);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return MmiEntry;
|
return MmiEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,7 +131,7 @@ MmiManage (
|
|||||||
BOOLEAN SuccessReturn;
|
BOOLEAN SuccessReturn;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Status = EFI_NOT_FOUND;
|
Status = EFI_NOT_FOUND;
|
||||||
SuccessReturn = FALSE;
|
SuccessReturn = FALSE;
|
||||||
if (HandlerType == NULL) {
|
if (HandlerType == NULL) {
|
||||||
//
|
//
|
||||||
@@ -142,7 +143,7 @@ MmiManage (
|
|||||||
//
|
//
|
||||||
// Non-root MMI handler
|
// Non-root MMI handler
|
||||||
//
|
//
|
||||||
MmiEntry = MmCoreFindMmiEntry ((EFI_GUID *) HandlerType, FALSE);
|
MmiEntry = MmCoreFindMmiEntry ((EFI_GUID *)HandlerType, FALSE);
|
||||||
if (MmiEntry == NULL) {
|
if (MmiEntry == NULL) {
|
||||||
//
|
//
|
||||||
// There is no handler registered for this interrupt source
|
// There is no handler registered for this interrupt source
|
||||||
@@ -157,56 +158,58 @@ MmiManage (
|
|||||||
MmiHandler = CR (Link, MMI_HANDLER, Link, MMI_HANDLER_SIGNATURE);
|
MmiHandler = CR (Link, MMI_HANDLER, Link, MMI_HANDLER_SIGNATURE);
|
||||||
|
|
||||||
Status = MmiHandler->Handler (
|
Status = MmiHandler->Handler (
|
||||||
(EFI_HANDLE) MmiHandler,
|
(EFI_HANDLE)MmiHandler,
|
||||||
Context,
|
Context,
|
||||||
CommBuffer,
|
CommBuffer,
|
||||||
CommBufferSize
|
CommBufferSize
|
||||||
);
|
);
|
||||||
|
|
||||||
switch (Status) {
|
switch (Status) {
|
||||||
case EFI_INTERRUPT_PENDING:
|
case EFI_INTERRUPT_PENDING:
|
||||||
//
|
//
|
||||||
// If a handler returns EFI_INTERRUPT_PENDING and HandlerType is not NULL then
|
// If a handler returns EFI_INTERRUPT_PENDING and HandlerType is not NULL then
|
||||||
// no additional handlers will be processed and EFI_INTERRUPT_PENDING will be returned.
|
// no additional handlers will be processed and EFI_INTERRUPT_PENDING will be returned.
|
||||||
//
|
//
|
||||||
if (HandlerType != NULL) {
|
if (HandlerType != NULL) {
|
||||||
return EFI_INTERRUPT_PENDING;
|
return EFI_INTERRUPT_PENDING;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
case EFI_SUCCESS:
|
break;
|
||||||
//
|
|
||||||
// If at least one of the handlers returns EFI_SUCCESS then the function will return
|
|
||||||
// EFI_SUCCESS. If a handler returns EFI_SUCCESS and HandlerType is not NULL then no
|
|
||||||
// additional handlers will be processed.
|
|
||||||
//
|
|
||||||
if (HandlerType != NULL) {
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
SuccessReturn = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EFI_WARN_INTERRUPT_SOURCE_QUIESCED:
|
case EFI_SUCCESS:
|
||||||
//
|
//
|
||||||
// If at least one of the handlers returns EFI_WARN_INTERRUPT_SOURCE_QUIESCED
|
// If at least one of the handlers returns EFI_SUCCESS then the function will return
|
||||||
// then the function will return EFI_SUCCESS.
|
// EFI_SUCCESS. If a handler returns EFI_SUCCESS and HandlerType is not NULL then no
|
||||||
//
|
// additional handlers will be processed.
|
||||||
SuccessReturn = TRUE;
|
//
|
||||||
break;
|
if (HandlerType != NULL) {
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
case EFI_WARN_INTERRUPT_SOURCE_PENDING:
|
SuccessReturn = TRUE;
|
||||||
//
|
break;
|
||||||
// If all the handlers returned EFI_WARN_INTERRUPT_SOURCE_PENDING
|
|
||||||
// then EFI_WARN_INTERRUPT_SOURCE_PENDING will be returned.
|
|
||||||
//
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
case EFI_WARN_INTERRUPT_SOURCE_QUIESCED:
|
||||||
//
|
//
|
||||||
// Unexpected status code returned.
|
// If at least one of the handlers returns EFI_WARN_INTERRUPT_SOURCE_QUIESCED
|
||||||
//
|
// then the function will return EFI_SUCCESS.
|
||||||
ASSERT (FALSE);
|
//
|
||||||
break;
|
SuccessReturn = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EFI_WARN_INTERRUPT_SOURCE_PENDING:
|
||||||
|
//
|
||||||
|
// If all the handlers returned EFI_WARN_INTERRUPT_SOURCE_PENDING
|
||||||
|
// then EFI_WARN_INTERRUPT_SOURCE_PENDING will be returned.
|
||||||
|
//
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
//
|
||||||
|
// Unexpected status code returned.
|
||||||
|
//
|
||||||
|
ASSERT (FALSE);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -231,16 +234,16 @@ MmiManage (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmiHandlerRegister (
|
MmiHandlerRegister (
|
||||||
IN EFI_MM_HANDLER_ENTRY_POINT Handler,
|
IN EFI_MM_HANDLER_ENTRY_POINT Handler,
|
||||||
IN CONST EFI_GUID *HandlerType OPTIONAL,
|
IN CONST EFI_GUID *HandlerType OPTIONAL,
|
||||||
OUT EFI_HANDLE *DispatchHandle
|
OUT EFI_HANDLE *DispatchHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
MMI_HANDLER *MmiHandler;
|
MMI_HANDLER *MmiHandler;
|
||||||
MMI_ENTRY *MmiEntry;
|
MMI_ENTRY *MmiEntry;
|
||||||
LIST_ENTRY *List;
|
LIST_ENTRY *List;
|
||||||
|
|
||||||
if (Handler == NULL || DispatchHandle == NULL) {
|
if ((Handler == NULL) || (DispatchHandle == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -250,19 +253,19 @@ MmiHandlerRegister (
|
|||||||
}
|
}
|
||||||
|
|
||||||
MmiHandler->Signature = MMI_HANDLER_SIGNATURE;
|
MmiHandler->Signature = MMI_HANDLER_SIGNATURE;
|
||||||
MmiHandler->Handler = Handler;
|
MmiHandler->Handler = Handler;
|
||||||
|
|
||||||
if (HandlerType == NULL) {
|
if (HandlerType == NULL) {
|
||||||
//
|
//
|
||||||
// This is root MMI handler
|
// This is root MMI handler
|
||||||
//
|
//
|
||||||
MmiEntry = NULL;
|
MmiEntry = NULL;
|
||||||
List = &mRootMmiHandlerList;
|
List = &mRootMmiHandlerList;
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
// None root MMI handler
|
// None root MMI handler
|
||||||
//
|
//
|
||||||
MmiEntry = MmCoreFindMmiEntry ((EFI_GUID *) HandlerType, TRUE);
|
MmiEntry = MmCoreFindMmiEntry ((EFI_GUID *)HandlerType, TRUE);
|
||||||
if (MmiEntry == NULL) {
|
if (MmiEntry == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
@@ -273,7 +276,7 @@ MmiHandlerRegister (
|
|||||||
MmiHandler->MmiEntry = MmiEntry;
|
MmiHandler->MmiEntry = MmiEntry;
|
||||||
InsertTailList (List, &MmiHandler->Link);
|
InsertTailList (List, &MmiHandler->Link);
|
||||||
|
|
||||||
*DispatchHandle = (EFI_HANDLE) MmiHandler;
|
*DispatchHandle = (EFI_HANDLE)MmiHandler;
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -296,7 +299,7 @@ MmiHandlerUnRegister (
|
|||||||
MMI_HANDLER *MmiHandler;
|
MMI_HANDLER *MmiHandler;
|
||||||
MMI_ENTRY *MmiEntry;
|
MMI_ENTRY *MmiEntry;
|
||||||
|
|
||||||
MmiHandler = (MMI_HANDLER *) DispatchHandle;
|
MmiHandler = (MMI_HANDLER *)DispatchHandle;
|
||||||
|
|
||||||
if (MmiHandler == NULL) {
|
if (MmiHandler == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
|
@@ -25,7 +25,7 @@ MmNotifyProtocol (
|
|||||||
LIST_ENTRY *Link;
|
LIST_ENTRY *Link;
|
||||||
|
|
||||||
ProtEntry = Prot->Protocol;
|
ProtEntry = Prot->Protocol;
|
||||||
for (Link=ProtEntry->Notify.ForwardLink; Link != &ProtEntry->Notify; Link=Link->ForwardLink) {
|
for (Link = ProtEntry->Notify.ForwardLink; Link != &ProtEntry->Notify; Link = Link->ForwardLink) {
|
||||||
ProtNotify = CR (Link, PROTOCOL_NOTIFY, Link, PROTOCOL_NOTIFY_SIGNATURE);
|
ProtNotify = CR (Link, PROTOCOL_NOTIFY, Link, PROTOCOL_NOTIFY_SIGNATURE);
|
||||||
ProtNotify->Function (&ProtEntry->ProtocolID, Prot->Interface, Prot->Handle);
|
ProtNotify->Function (&ProtEntry->ProtocolID, Prot->Interface, Prot->Handle);
|
||||||
}
|
}
|
||||||
@@ -55,7 +55,6 @@ MmRemoveInterfaceFromProtocol (
|
|||||||
|
|
||||||
Prot = MmFindProtocolInterface (Handle, Protocol, Interface);
|
Prot = MmFindProtocolInterface (Handle, Protocol, Interface);
|
||||||
if (Prot != NULL) {
|
if (Prot != NULL) {
|
||||||
|
|
||||||
ProtEntry = Prot->Protocol;
|
ProtEntry = Prot->Protocol;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -96,9 +95,9 @@ MmRemoveInterfaceFromProtocol (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmRegisterProtocolNotify (
|
MmRegisterProtocolNotify (
|
||||||
IN CONST EFI_GUID *Protocol,
|
IN CONST EFI_GUID *Protocol,
|
||||||
IN EFI_MM_NOTIFY_FN Function,
|
IN EFI_MM_NOTIFY_FN Function,
|
||||||
OUT VOID **Registration
|
OUT VOID **Registration
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
PROTOCOL_ENTRY *ProtEntry;
|
PROTOCOL_ENTRY *ProtEntry;
|
||||||
@@ -106,7 +105,7 @@ MmRegisterProtocolNotify (
|
|||||||
LIST_ENTRY *Link;
|
LIST_ENTRY *Link;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
if (Protocol == NULL || Registration == NULL) {
|
if ((Protocol == NULL) || (Registration == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,12 +113,13 @@ MmRegisterProtocolNotify (
|
|||||||
//
|
//
|
||||||
// Get the protocol entry per Protocol
|
// Get the protocol entry per Protocol
|
||||||
//
|
//
|
||||||
ProtEntry = MmFindProtocolEntry ((EFI_GUID *) Protocol, FALSE);
|
ProtEntry = MmFindProtocolEntry ((EFI_GUID *)Protocol, FALSE);
|
||||||
if (ProtEntry != NULL) {
|
if (ProtEntry != NULL) {
|
||||||
ProtNotify = (PROTOCOL_NOTIFY * )*Registration;
|
ProtNotify = (PROTOCOL_NOTIFY *)*Registration;
|
||||||
for (Link = ProtEntry->Notify.ForwardLink;
|
for (Link = ProtEntry->Notify.ForwardLink;
|
||||||
Link != &ProtEntry->Notify;
|
Link != &ProtEntry->Notify;
|
||||||
Link = Link->ForwardLink) {
|
Link = Link->ForwardLink)
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// Compare the notification record
|
// Compare the notification record
|
||||||
//
|
//
|
||||||
@@ -134,6 +134,7 @@ MmRegisterProtocolNotify (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// If the registration is not found
|
// If the registration is not found
|
||||||
//
|
//
|
||||||
@@ -145,19 +146,19 @@ MmRegisterProtocolNotify (
|
|||||||
//
|
//
|
||||||
// Get the protocol entry to add the notification too
|
// Get the protocol entry to add the notification too
|
||||||
//
|
//
|
||||||
ProtEntry = MmFindProtocolEntry ((EFI_GUID *) Protocol, TRUE);
|
ProtEntry = MmFindProtocolEntry ((EFI_GUID *)Protocol, TRUE);
|
||||||
if (ProtEntry != NULL) {
|
if (ProtEntry != NULL) {
|
||||||
//
|
//
|
||||||
// Find whether notification already exist
|
// Find whether notification already exist
|
||||||
//
|
//
|
||||||
for (Link = ProtEntry->Notify.ForwardLink;
|
for (Link = ProtEntry->Notify.ForwardLink;
|
||||||
Link != &ProtEntry->Notify;
|
Link != &ProtEntry->Notify;
|
||||||
Link = Link->ForwardLink) {
|
Link = Link->ForwardLink)
|
||||||
|
{
|
||||||
ProtNotify = CR (Link, PROTOCOL_NOTIFY, Link, PROTOCOL_NOTIFY_SIGNATURE);
|
ProtNotify = CR (Link, PROTOCOL_NOTIFY, Link, PROTOCOL_NOTIFY_SIGNATURE);
|
||||||
if (CompareGuid (&ProtNotify->Protocol->ProtocolID, Protocol) &&
|
if (CompareGuid (&ProtNotify->Protocol->ProtocolID, Protocol) &&
|
||||||
(ProtNotify->Function == Function)) {
|
(ProtNotify->Function == Function))
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// Notification already exist
|
// Notification already exist
|
||||||
//
|
//
|
||||||
@@ -173,8 +174,8 @@ MmRegisterProtocolNotify (
|
|||||||
ProtNotify = AllocatePool (sizeof (PROTOCOL_NOTIFY));
|
ProtNotify = AllocatePool (sizeof (PROTOCOL_NOTIFY));
|
||||||
if (ProtNotify != NULL) {
|
if (ProtNotify != NULL) {
|
||||||
ProtNotify->Signature = PROTOCOL_NOTIFY_SIGNATURE;
|
ProtNotify->Signature = PROTOCOL_NOTIFY_SIGNATURE;
|
||||||
ProtNotify->Protocol = ProtEntry;
|
ProtNotify->Protocol = ProtEntry;
|
||||||
ProtNotify->Function = Function;
|
ProtNotify->Function = Function;
|
||||||
//
|
//
|
||||||
// Start at the ending
|
// Start at the ending
|
||||||
//
|
//
|
||||||
@@ -191,7 +192,8 @@ MmRegisterProtocolNotify (
|
|||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
if (ProtNotify != NULL) {
|
if (ProtNotify != NULL) {
|
||||||
*Registration = ProtNotify;
|
*Registration = ProtNotify;
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
LIST_ENTRY mMmMemoryMap = INITIALIZE_LIST_HEAD_VARIABLE (mMmMemoryMap);
|
LIST_ENTRY mMmMemoryMap = INITIALIZE_LIST_HEAD_VARIABLE (mMmMemoryMap);
|
||||||
|
|
||||||
UINTN mMapKey;
|
UINTN mMapKey;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Internal Function. Allocate n pages from given free page node.
|
Internal Function. Allocate n pages from given free page node.
|
||||||
@@ -43,10 +43,11 @@ InternalAllocPagesOnOneNode (
|
|||||||
if (Top > Pages->NumberOfPages) {
|
if (Top > Pages->NumberOfPages) {
|
||||||
Top = Pages->NumberOfPages;
|
Top = Pages->NumberOfPages;
|
||||||
}
|
}
|
||||||
|
|
||||||
Bottom = Top - NumberOfPages;
|
Bottom = Top - NumberOfPages;
|
||||||
|
|
||||||
if (Top < Pages->NumberOfPages) {
|
if (Top < Pages->NumberOfPages) {
|
||||||
Node = (FREE_PAGE_LIST*)((UINTN)Pages + EFI_PAGES_TO_SIZE (Top));
|
Node = (FREE_PAGE_LIST *)((UINTN)Pages + EFI_PAGES_TO_SIZE (Top));
|
||||||
Node->NumberOfPages = Pages->NumberOfPages - Top;
|
Node->NumberOfPages = Pages->NumberOfPages - Top;
|
||||||
InsertHeadList (&Pages->Link, &Node->Link);
|
InsertHeadList (&Pages->Link, &Node->Link);
|
||||||
}
|
}
|
||||||
@@ -82,11 +83,13 @@ InternalAllocMaxAddress (
|
|||||||
|
|
||||||
for (Node = FreePageList->BackLink; Node != FreePageList; Node = Node->BackLink) {
|
for (Node = FreePageList->BackLink; Node != FreePageList; Node = Node->BackLink) {
|
||||||
Pages = BASE_CR (Node, FREE_PAGE_LIST, Link);
|
Pages = BASE_CR (Node, FREE_PAGE_LIST, Link);
|
||||||
if (Pages->NumberOfPages >= NumberOfPages &&
|
if ((Pages->NumberOfPages >= NumberOfPages) &&
|
||||||
(UINTN)Pages + EFI_PAGES_TO_SIZE (NumberOfPages) - 1 <= MaxAddress) {
|
((UINTN)Pages + EFI_PAGES_TO_SIZE (NumberOfPages) - 1 <= MaxAddress))
|
||||||
|
{
|
||||||
return InternalAllocPagesOnOneNode (Pages, NumberOfPages, MaxAddress);
|
return InternalAllocPagesOnOneNode (Pages, NumberOfPages, MaxAddress);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (UINTN)(-1);
|
return (UINTN)(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,15 +119,17 @@ InternalAllocAddress (
|
|||||||
}
|
}
|
||||||
|
|
||||||
EndAddress = Address + EFI_PAGES_TO_SIZE (NumberOfPages);
|
EndAddress = Address + EFI_PAGES_TO_SIZE (NumberOfPages);
|
||||||
for (Node = FreePageList->BackLink; Node!= FreePageList; Node = Node->BackLink) {
|
for (Node = FreePageList->BackLink; Node != FreePageList; Node = Node->BackLink) {
|
||||||
Pages = BASE_CR (Node, FREE_PAGE_LIST, Link);
|
Pages = BASE_CR (Node, FREE_PAGE_LIST, Link);
|
||||||
if ((UINTN)Pages <= Address) {
|
if ((UINTN)Pages <= Address) {
|
||||||
if ((UINTN)Pages + EFI_PAGES_TO_SIZE (Pages->NumberOfPages) < EndAddress) {
|
if ((UINTN)Pages + EFI_PAGES_TO_SIZE (Pages->NumberOfPages) < EndAddress) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return InternalAllocPagesOnOneNode (Pages, NumberOfPages, EndAddress);
|
return InternalAllocPagesOnOneNode (Pages, NumberOfPages, EndAddress);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ~Address;
|
return ~Address;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,8 +160,9 @@ MmInternalAllocatePages (
|
|||||||
{
|
{
|
||||||
UINTN RequestedAddress;
|
UINTN RequestedAddress;
|
||||||
|
|
||||||
if (MemoryType != EfiRuntimeServicesCode &&
|
if ((MemoryType != EfiRuntimeServicesCode) &&
|
||||||
MemoryType != EfiRuntimeServicesData) {
|
(MemoryType != EfiRuntimeServicesData))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,6 +186,7 @@ MmInternalAllocatePages (
|
|||||||
if (*Memory == (UINTN)-1) {
|
if (*Memory == (UINTN)-1) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case AllocateAddress:
|
case AllocateAddress:
|
||||||
*Memory = InternalAllocAddress (
|
*Memory = InternalAllocAddress (
|
||||||
@@ -190,10 +197,12 @@ MmInternalAllocatePages (
|
|||||||
if (*Memory != RequestedAddress) {
|
if (*Memory != RequestedAddress) {
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -245,13 +254,15 @@ InternalMergeNodes (
|
|||||||
|
|
||||||
Next = BASE_CR (First->Link.ForwardLink, FREE_PAGE_LIST, Link);
|
Next = BASE_CR (First->Link.ForwardLink, FREE_PAGE_LIST, Link);
|
||||||
ASSERT (
|
ASSERT (
|
||||||
TRUNCATE_TO_PAGES ((UINTN)Next - (UINTN)First) >= First->NumberOfPages);
|
TRUNCATE_TO_PAGES ((UINTN)Next - (UINTN)First) >= First->NumberOfPages
|
||||||
|
);
|
||||||
|
|
||||||
if (TRUNCATE_TO_PAGES ((UINTN)Next - (UINTN)First) == First->NumberOfPages) {
|
if (TRUNCATE_TO_PAGES ((UINTN)Next - (UINTN)First) == First->NumberOfPages) {
|
||||||
First->NumberOfPages += Next->NumberOfPages;
|
First->NumberOfPages += Next->NumberOfPages;
|
||||||
RemoveEntryList (&Next->Link);
|
RemoveEntryList (&Next->Link);
|
||||||
Next = First;
|
Next = First;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Next;
|
return Next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -281,17 +292,19 @@ MmInternalFreePages (
|
|||||||
}
|
}
|
||||||
|
|
||||||
Pages = NULL;
|
Pages = NULL;
|
||||||
Node = mMmMemoryMap.ForwardLink;
|
Node = mMmMemoryMap.ForwardLink;
|
||||||
while (Node != &mMmMemoryMap) {
|
while (Node != &mMmMemoryMap) {
|
||||||
Pages = BASE_CR (Node, FREE_PAGE_LIST, Link);
|
Pages = BASE_CR (Node, FREE_PAGE_LIST, Link);
|
||||||
if (Memory < (UINTN)Pages) {
|
if (Memory < (UINTN)Pages) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Node = Node->ForwardLink;
|
Node = Node->ForwardLink;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Node != &mMmMemoryMap &&
|
if ((Node != &mMmMemoryMap) &&
|
||||||
Memory + EFI_PAGES_TO_SIZE (NumberOfPages) > (UINTN)Pages) {
|
(Memory + EFI_PAGES_TO_SIZE (NumberOfPages) > (UINTN)Pages))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -302,7 +315,7 @@ MmInternalFreePages (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Pages = (FREE_PAGE_LIST*)(UINTN)Memory;
|
Pages = (FREE_PAGE_LIST *)(UINTN)Memory;
|
||||||
Pages->NumberOfPages = NumberOfPages;
|
Pages->NumberOfPages = NumberOfPages;
|
||||||
InsertTailList (Node, &Pages->Link);
|
InsertTailList (Node, &Pages->Link);
|
||||||
|
|
||||||
@@ -373,6 +386,6 @@ MmAddMemoryRegion (
|
|||||||
// Align range on an EFI_PAGE_SIZE boundary
|
// Align range on an EFI_PAGE_SIZE boundary
|
||||||
//
|
//
|
||||||
AlignedMemBase = (UINTN)(MemBase + EFI_PAGE_MASK) & ~EFI_PAGE_MASK;
|
AlignedMemBase = (UINTN)(MemBase + EFI_PAGE_MASK) & ~EFI_PAGE_MASK;
|
||||||
MemLength -= AlignedMemBase - MemBase;
|
MemLength -= AlignedMemBase - MemBase;
|
||||||
MmFreePages (AlignedMemBase, TRUNCATE_TO_PAGES ((UINTN)MemLength));
|
MmFreePages (AlignedMemBase, TRUNCATE_TO_PAGES ((UINTN)MemLength));
|
||||||
}
|
}
|
||||||
|
@@ -14,7 +14,7 @@ LIST_ENTRY mMmPoolLists[MAX_POOL_INDEX];
|
|||||||
// To cache the MMRAM base since when Loading modules At fixed address feature is enabled,
|
// To cache the MMRAM base since when Loading modules At fixed address feature is enabled,
|
||||||
// all module is assigned an offset relative the MMRAM base in build time.
|
// all module is assigned an offset relative the MMRAM base in build time.
|
||||||
//
|
//
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_PHYSICAL_ADDRESS gLoadModuleAtFixAddressMmramBase = 0;
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_PHYSICAL_ADDRESS gLoadModuleAtFixAddressMmramBase = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Called to initialize the memory service.
|
Called to initialize the memory service.
|
||||||
@@ -29,7 +29,7 @@ MmInitializeMemoryServices (
|
|||||||
IN EFI_MMRAM_DESCRIPTOR *MmramRanges
|
IN EFI_MMRAM_DESCRIPTOR *MmramRanges
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Initialize Pool list
|
// Initialize Pool list
|
||||||
@@ -38,7 +38,6 @@ MmInitializeMemoryServices (
|
|||||||
InitializeListHead (&mMmPoolLists[--Index]);
|
InitializeListHead (&mMmPoolLists[--Index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Initialize free MMRAM regions
|
// Initialize free MMRAM regions
|
||||||
//
|
//
|
||||||
@@ -49,8 +48,14 @@ MmInitializeMemoryServices (
|
|||||||
if (MmramRanges[Index].CpuStart < BASE_1MB) {
|
if (MmramRanges[Index].CpuStart < BASE_1MB) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
DEBUG ((DEBUG_INFO, "MmAddMemoryRegion %d : 0x%016lx - 0x%016lx\n",
|
|
||||||
Index, MmramRanges[Index].CpuStart, MmramRanges[Index].PhysicalSize));
|
DEBUG ((
|
||||||
|
DEBUG_INFO,
|
||||||
|
"MmAddMemoryRegion %d : 0x%016lx - 0x%016lx\n",
|
||||||
|
Index,
|
||||||
|
MmramRanges[Index].CpuStart,
|
||||||
|
MmramRanges[Index].PhysicalSize
|
||||||
|
));
|
||||||
MmAddMemoryRegion (
|
MmAddMemoryRegion (
|
||||||
MmramRanges[Index].CpuStart,
|
MmramRanges[Index].CpuStart,
|
||||||
MmramRanges[Index].PhysicalSize,
|
MmramRanges[Index].PhysicalSize,
|
||||||
@@ -58,7 +63,6 @@ MmInitializeMemoryServices (
|
|||||||
MmramRanges[Index].RegionState
|
MmramRanges[Index].RegionState
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -83,7 +87,7 @@ InternalAllocPoolByIndex (
|
|||||||
|
|
||||||
ASSERT (PoolIndex <= MAX_POOL_INDEX);
|
ASSERT (PoolIndex <= MAX_POOL_INDEX);
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
Hdr = NULL;
|
Hdr = NULL;
|
||||||
if (PoolIndex == MAX_POOL_INDEX) {
|
if (PoolIndex == MAX_POOL_INDEX) {
|
||||||
Status = MmInternalAllocatePages (
|
Status = MmInternalAllocatePages (
|
||||||
AllocateAnyPages,
|
AllocateAnyPages,
|
||||||
@@ -94,22 +98,23 @@ InternalAllocPoolByIndex (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
Hdr = (FREE_POOL_HEADER *) (UINTN) Address;
|
|
||||||
|
Hdr = (FREE_POOL_HEADER *)(UINTN)Address;
|
||||||
} else if (!IsListEmpty (&mMmPoolLists[PoolIndex])) {
|
} else if (!IsListEmpty (&mMmPoolLists[PoolIndex])) {
|
||||||
Hdr = BASE_CR (GetFirstNode (&mMmPoolLists[PoolIndex]), FREE_POOL_HEADER, Link);
|
Hdr = BASE_CR (GetFirstNode (&mMmPoolLists[PoolIndex]), FREE_POOL_HEADER, Link);
|
||||||
RemoveEntryList (&Hdr->Link);
|
RemoveEntryList (&Hdr->Link);
|
||||||
} else {
|
} else {
|
||||||
Status = InternalAllocPoolByIndex (PoolIndex + 1, &Hdr);
|
Status = InternalAllocPoolByIndex (PoolIndex + 1, &Hdr);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
Hdr->Header.Size >>= 1;
|
Hdr->Header.Size >>= 1;
|
||||||
Hdr->Header.Available = TRUE;
|
Hdr->Header.Available = TRUE;
|
||||||
InsertHeadList (&mMmPoolLists[PoolIndex], &Hdr->Link);
|
InsertHeadList (&mMmPoolLists[PoolIndex], &Hdr->Link);
|
||||||
Hdr = (FREE_POOL_HEADER*)((UINT8*)Hdr + Hdr->Header.Size);
|
Hdr = (FREE_POOL_HEADER *)((UINT8 *)Hdr + Hdr->Header.Size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
Hdr->Header.Size = MIN_POOL_SIZE << PoolIndex;
|
Hdr->Header.Size = MIN_POOL_SIZE << PoolIndex;
|
||||||
Hdr->Header.Available = FALSE;
|
Hdr->Header.Available = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,7 +141,7 @@ InternalFreePoolByIndex (
|
|||||||
ASSERT (((UINTN)FreePoolHdr & (FreePoolHdr->Header.Size - 1)) == 0);
|
ASSERT (((UINTN)FreePoolHdr & (FreePoolHdr->Header.Size - 1)) == 0);
|
||||||
ASSERT (FreePoolHdr->Header.Size >= MIN_POOL_SIZE);
|
ASSERT (FreePoolHdr->Header.Size >= MIN_POOL_SIZE);
|
||||||
|
|
||||||
PoolIndex = (UINTN) (HighBitSet32 ((UINT32)FreePoolHdr->Header.Size) - MIN_POOL_SHIFT);
|
PoolIndex = (UINTN)(HighBitSet32 ((UINT32)FreePoolHdr->Header.Size) - MIN_POOL_SHIFT);
|
||||||
FreePoolHdr->Header.Available = TRUE;
|
FreePoolHdr->Header.Available = TRUE;
|
||||||
ASSERT (PoolIndex < MAX_POOL_INDEX);
|
ASSERT (PoolIndex < MAX_POOL_INDEX);
|
||||||
InsertHeadList (&mMmPoolLists[PoolIndex], &FreePoolHdr->Link);
|
InsertHeadList (&mMmPoolLists[PoolIndex], &FreePoolHdr->Link);
|
||||||
@@ -170,28 +175,29 @@ MmInternalAllocatePool (
|
|||||||
EFI_PHYSICAL_ADDRESS Address;
|
EFI_PHYSICAL_ADDRESS Address;
|
||||||
UINTN PoolIndex;
|
UINTN PoolIndex;
|
||||||
|
|
||||||
if (PoolType != EfiRuntimeServicesCode &&
|
if ((PoolType != EfiRuntimeServicesCode) &&
|
||||||
PoolType != EfiRuntimeServicesData) {
|
(PoolType != EfiRuntimeServicesData))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Size += sizeof (*PoolHdr);
|
Size += sizeof (*PoolHdr);
|
||||||
if (Size > MAX_POOL_SIZE) {
|
if (Size > MAX_POOL_SIZE) {
|
||||||
Size = EFI_SIZE_TO_PAGES (Size);
|
Size = EFI_SIZE_TO_PAGES (Size);
|
||||||
Status = MmInternalAllocatePages (AllocateAnyPages, PoolType, Size, &Address);
|
Status = MmInternalAllocatePages (AllocateAnyPages, PoolType, Size, &Address);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
PoolHdr = (POOL_HEADER*)(UINTN)Address;
|
PoolHdr = (POOL_HEADER *)(UINTN)Address;
|
||||||
PoolHdr->Size = EFI_PAGES_TO_SIZE (Size);
|
PoolHdr->Size = EFI_PAGES_TO_SIZE (Size);
|
||||||
PoolHdr->Available = FALSE;
|
PoolHdr->Available = FALSE;
|
||||||
*Buffer = PoolHdr + 1;
|
*Buffer = PoolHdr + 1;
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Size = (Size + MIN_POOL_SIZE - 1) >> MIN_POOL_SHIFT;
|
Size = (Size + MIN_POOL_SIZE - 1) >> MIN_POOL_SHIFT;
|
||||||
PoolIndex = (UINTN) HighBitSet32 ((UINT32)Size);
|
PoolIndex = (UINTN)HighBitSet32 ((UINT32)Size);
|
||||||
if ((Size & (Size - 1)) != 0) {
|
if ((Size & (Size - 1)) != 0) {
|
||||||
PoolIndex++;
|
PoolIndex++;
|
||||||
}
|
}
|
||||||
@@ -200,6 +206,7 @@ MmInternalAllocatePool (
|
|||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
*Buffer = &FreePoolHdr->Header + 1;
|
*Buffer = &FreePoolHdr->Header + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -251,7 +258,7 @@ MmInternalFreePool (
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePoolHdr = (FREE_POOL_HEADER*)((POOL_HEADER*)Buffer - 1);
|
FreePoolHdr = (FREE_POOL_HEADER *)((POOL_HEADER *)Buffer - 1);
|
||||||
ASSERT (!FreePoolHdr->Header.Available);
|
ASSERT (!FreePoolHdr->Header.Available);
|
||||||
|
|
||||||
if (FreePoolHdr->Header.Size > MAX_POOL_SIZE) {
|
if (FreePoolHdr->Header.Size > MAX_POOL_SIZE) {
|
||||||
@@ -262,6 +269,7 @@ MmInternalFreePool (
|
|||||||
EFI_SIZE_TO_PAGES (FreePoolHdr->Header.Size)
|
EFI_SIZE_TO_PAGES (FreePoolHdr->Header.Size)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return InternalFreePoolByIndex (FreePoolHdr);
|
return InternalFreePoolByIndex (FreePoolHdr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -22,7 +22,7 @@ MmDispatcher (
|
|||||||
//
|
//
|
||||||
// Globals used to initialize the protocol
|
// Globals used to initialize the protocol
|
||||||
//
|
//
|
||||||
EFI_HANDLE mMmCpuHandle = NULL;
|
EFI_HANDLE mMmCpuHandle = NULL;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Physical pointer to private structure shared between MM IPL and the MM Core
|
// Physical pointer to private structure shared between MM IPL and the MM Core
|
||||||
@@ -33,7 +33,6 @@ MM_CORE_PRIVATE_DATA *gMmCorePrivate;
|
|||||||
// MM Core global variable for MM System Table. Only accessed as a physical structure in MMRAM.
|
// MM Core global variable for MM System Table. Only accessed as a physical structure in MMRAM.
|
||||||
//
|
//
|
||||||
EFI_MM_SYSTEM_TABLE gMmCoreMmst = {
|
EFI_MM_SYSTEM_TABLE gMmCoreMmst = {
|
||||||
|
|
||||||
// The table header for the MMST.
|
// The table header for the MMST.
|
||||||
{
|
{
|
||||||
MM_MMST_SIGNATURE,
|
MM_MMST_SIGNATURE,
|
||||||
@@ -49,12 +48,12 @@ EFI_MM_SYSTEM_TABLE gMmCoreMmst = {
|
|||||||
// I/O Service
|
// I/O Service
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
(EFI_MM_CPU_IO) MmEfiNotAvailableYetArg5, // MmMemRead
|
(EFI_MM_CPU_IO)MmEfiNotAvailableYetArg5, // MmMemRead
|
||||||
(EFI_MM_CPU_IO) MmEfiNotAvailableYetArg5 // MmMemWrite
|
(EFI_MM_CPU_IO)MmEfiNotAvailableYetArg5 // MmMemWrite
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
(EFI_MM_CPU_IO) MmEfiNotAvailableYetArg5, // MmIoRead
|
(EFI_MM_CPU_IO)MmEfiNotAvailableYetArg5, // MmIoRead
|
||||||
(EFI_MM_CPU_IO) MmEfiNotAvailableYetArg5 // MmIoWrite
|
(EFI_MM_CPU_IO)MmEfiNotAvailableYetArg5 // MmIoWrite
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// Runtime memory services
|
// Runtime memory services
|
||||||
@@ -85,16 +84,16 @@ EFI_MM_SYSTEM_TABLE gMmCoreMmst = {
|
|||||||
// Table of MMI Handlers that are registered by the MM Core when it is initialized
|
// Table of MMI Handlers that are registered by the MM Core when it is initialized
|
||||||
//
|
//
|
||||||
MM_CORE_MMI_HANDLERS mMmCoreMmiHandlers[] = {
|
MM_CORE_MMI_HANDLERS mMmCoreMmiHandlers[] = {
|
||||||
{ MmReadyToLockHandler, &gEfiDxeMmReadyToLockProtocolGuid, NULL, TRUE },
|
{ MmReadyToLockHandler, &gEfiDxeMmReadyToLockProtocolGuid, NULL, TRUE },
|
||||||
{ MmEndOfDxeHandler, &gEfiEndOfDxeEventGroupGuid, NULL, FALSE },
|
{ MmEndOfDxeHandler, &gEfiEndOfDxeEventGroupGuid, NULL, FALSE },
|
||||||
{ MmExitBootServiceHandler,&gEfiEventExitBootServicesGuid, NULL, FALSE },
|
{ MmExitBootServiceHandler, &gEfiEventExitBootServicesGuid, NULL, FALSE },
|
||||||
{ MmReadyToBootHandler, &gEfiEventReadyToBootGuid, NULL, FALSE },
|
{ MmReadyToBootHandler, &gEfiEventReadyToBootGuid, NULL, FALSE },
|
||||||
{ NULL, NULL, NULL, FALSE },
|
{ NULL, NULL, NULL, FALSE },
|
||||||
};
|
};
|
||||||
|
|
||||||
EFI_SYSTEM_TABLE *mEfiSystemTable;
|
EFI_SYSTEM_TABLE *mEfiSystemTable;
|
||||||
UINTN mMmramRangeCount;
|
UINTN mMmramRangeCount;
|
||||||
EFI_MMRAM_DESCRIPTOR *mMmramRanges;
|
EFI_MMRAM_DESCRIPTOR *mMmramRanges;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Place holder function until all the MM System Table Service are available.
|
Place holder function until all the MM System Table Service are available.
|
||||||
@@ -113,11 +112,11 @@ EFI_MMRAM_DESCRIPTOR *mMmramRanges;
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmEfiNotAvailableYetArg5 (
|
MmEfiNotAvailableYetArg5 (
|
||||||
UINTN Arg1,
|
UINTN Arg1,
|
||||||
UINTN Arg2,
|
UINTN Arg2,
|
||||||
UINTN Arg3,
|
UINTN Arg3,
|
||||||
UINTN Arg4,
|
UINTN Arg4,
|
||||||
UINTN Arg5
|
UINTN Arg5
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -148,20 +147,21 @@ MmExitBootServiceHandler (
|
|||||||
IN OUT UINTN *CommBufferSize OPTIONAL
|
IN OUT UINTN *CommBufferSize OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HANDLE MmHandle;
|
EFI_HANDLE MmHandle;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
STATIC BOOLEAN mInExitBootServices = FALSE;
|
STATIC BOOLEAN mInExitBootServices = FALSE;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
if (!mInExitBootServices) {
|
if (!mInExitBootServices) {
|
||||||
MmHandle = NULL;
|
MmHandle = NULL;
|
||||||
Status = MmInstallProtocolInterface (
|
Status = MmInstallProtocolInterface (
|
||||||
&MmHandle,
|
&MmHandle,
|
||||||
&gEfiEventExitBootServicesGuid,
|
&gEfiEventExitBootServicesGuid,
|
||||||
EFI_NATIVE_INTERFACE,
|
EFI_NATIVE_INTERFACE,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
mInExitBootServices = TRUE;
|
mInExitBootServices = TRUE;
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@@ -187,20 +187,21 @@ MmReadyToBootHandler (
|
|||||||
IN OUT UINTN *CommBufferSize OPTIONAL
|
IN OUT UINTN *CommBufferSize OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HANDLE MmHandle;
|
EFI_HANDLE MmHandle;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
STATIC BOOLEAN mInReadyToBoot = FALSE;
|
STATIC BOOLEAN mInReadyToBoot = FALSE;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
if (!mInReadyToBoot) {
|
if (!mInReadyToBoot) {
|
||||||
MmHandle = NULL;
|
MmHandle = NULL;
|
||||||
Status = MmInstallProtocolInterface (
|
Status = MmInstallProtocolInterface (
|
||||||
&MmHandle,
|
&MmHandle,
|
||||||
&gEfiEventReadyToBootGuid,
|
&gEfiEventReadyToBootGuid,
|
||||||
EFI_NATIVE_INTERFACE,
|
EFI_NATIVE_INTERFACE,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
mInReadyToBoot = TRUE;
|
mInReadyToBoot = TRUE;
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@@ -249,36 +250,35 @@ MmReadyToLockHandler (
|
|||||||
// Install MM Ready to lock protocol
|
// Install MM Ready to lock protocol
|
||||||
//
|
//
|
||||||
MmHandle = NULL;
|
MmHandle = NULL;
|
||||||
Status = MmInstallProtocolInterface (
|
Status = MmInstallProtocolInterface (
|
||||||
&MmHandle,
|
&MmHandle,
|
||||||
&gEfiMmReadyToLockProtocolGuid,
|
&gEfiMmReadyToLockProtocolGuid,
|
||||||
EFI_NATIVE_INTERFACE,
|
EFI_NATIVE_INTERFACE,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Make sure MM CPU I/O 2 Protocol has been installed into the handle database
|
// Make sure MM CPU I/O 2 Protocol has been installed into the handle database
|
||||||
//
|
//
|
||||||
//Status = MmLocateProtocol (&EFI_MM_CPU_IO_PROTOCOL_GUID, NULL, &Interface);
|
// Status = MmLocateProtocol (&EFI_MM_CPU_IO_PROTOCOL_GUID, NULL, &Interface);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Print a message on a debug build if the MM CPU I/O 2 Protocol is not installed
|
// Print a message on a debug build if the MM CPU I/O 2 Protocol is not installed
|
||||||
//
|
//
|
||||||
//if (EFI_ERROR (Status)) {
|
// if (EFI_ERROR (Status)) {
|
||||||
//DEBUG ((DEBUG_ERROR, "\nSMM: SmmCpuIo Arch Protocol not present!!\n"));
|
// DEBUG ((DEBUG_ERROR, "\nSMM: SmmCpuIo Arch Protocol not present!!\n"));
|
||||||
//}
|
// }
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Assert if the CPU I/O 2 Protocol is not installed
|
// Assert if the CPU I/O 2 Protocol is not installed
|
||||||
//
|
//
|
||||||
//ASSERT_EFI_ERROR (Status);
|
// ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Display any drivers that were not dispatched because dependency expression
|
// Display any drivers that were not dispatched because dependency expression
|
||||||
// evaluated to false if this is a debug build
|
// evaluated to false if this is a debug build
|
||||||
//
|
//
|
||||||
//MmDisplayDiscoveredNotDispatched ();
|
// MmDisplayDiscoveredNotDispatched ();
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@@ -314,17 +314,15 @@ MmEndOfDxeHandler (
|
|||||||
// Install MM EndOfDxe protocol
|
// Install MM EndOfDxe protocol
|
||||||
//
|
//
|
||||||
MmHandle = NULL;
|
MmHandle = NULL;
|
||||||
Status = MmInstallProtocolInterface (
|
Status = MmInstallProtocolInterface (
|
||||||
&MmHandle,
|
&MmHandle,
|
||||||
&gEfiMmEndOfDxeProtocolGuid,
|
&gEfiMmEndOfDxeProtocolGuid,
|
||||||
EFI_NATIVE_INTERFACE,
|
EFI_NATIVE_INTERFACE,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The main entry point to MM Foundation.
|
The main entry point to MM Foundation.
|
||||||
|
|
||||||
@@ -338,9 +336,9 @@ VOID
|
|||||||
EFIAPI
|
EFIAPI
|
||||||
MmEntryPoint (
|
MmEntryPoint (
|
||||||
IN CONST EFI_MM_ENTRY_CONTEXT *MmEntryContext
|
IN CONST EFI_MM_ENTRY_CONTEXT *MmEntryContext
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_MM_COMMUNICATE_HEADER *CommunicateHeader;
|
EFI_MM_COMMUNICATE_HEADER *CommunicateHeader;
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO, "MmEntryPoint ...\n"));
|
DEBUG ((DEBUG_INFO, "MmEntryPoint ...\n"));
|
||||||
@@ -353,7 +351,7 @@ MmEntryPoint (
|
|||||||
//
|
//
|
||||||
// Call platform hook before Mm Dispatch
|
// Call platform hook before Mm Dispatch
|
||||||
//
|
//
|
||||||
//PlatformHookBeforeMmDispatch ();
|
// PlatformHookBeforeMmDispatch ();
|
||||||
|
|
||||||
//
|
//
|
||||||
// If a legacy boot has occurred, then make sure gMmCorePrivate is not accessed
|
// If a legacy boot has occurred, then make sure gMmCorePrivate is not accessed
|
||||||
@@ -377,23 +375,23 @@ MmEntryPoint (
|
|||||||
// If CommunicationBuffer is not in valid address scope, return EFI_INVALID_PARAMETER
|
// If CommunicationBuffer is not in valid address scope, return EFI_INVALID_PARAMETER
|
||||||
//
|
//
|
||||||
gMmCorePrivate->CommunicationBuffer = 0;
|
gMmCorePrivate->CommunicationBuffer = 0;
|
||||||
gMmCorePrivate->ReturnStatus = EFI_INVALID_PARAMETER;
|
gMmCorePrivate->ReturnStatus = EFI_INVALID_PARAMETER;
|
||||||
} else {
|
} else {
|
||||||
CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)(UINTN)gMmCorePrivate->CommunicationBuffer;
|
CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)(UINTN)gMmCorePrivate->CommunicationBuffer;
|
||||||
gMmCorePrivate->BufferSize -= OFFSET_OF (EFI_MM_COMMUNICATE_HEADER, Data);
|
gMmCorePrivate->BufferSize -= OFFSET_OF (EFI_MM_COMMUNICATE_HEADER, Data);
|
||||||
Status = MmiManage (
|
Status = MmiManage (
|
||||||
&CommunicateHeader->HeaderGuid,
|
&CommunicateHeader->HeaderGuid,
|
||||||
NULL,
|
NULL,
|
||||||
CommunicateHeader->Data,
|
CommunicateHeader->Data,
|
||||||
(UINTN *)&gMmCorePrivate->BufferSize
|
(UINTN *)&gMmCorePrivate->BufferSize
|
||||||
);
|
);
|
||||||
//
|
//
|
||||||
// Update CommunicationBuffer, BufferSize and ReturnStatus
|
// Update CommunicationBuffer, BufferSize and ReturnStatus
|
||||||
// Communicate service finished, reset the pointer to CommBuffer to NULL
|
// Communicate service finished, reset the pointer to CommBuffer to NULL
|
||||||
//
|
//
|
||||||
gMmCorePrivate->BufferSize += OFFSET_OF (EFI_MM_COMMUNICATE_HEADER, Data);
|
gMmCorePrivate->BufferSize += OFFSET_OF (EFI_MM_COMMUNICATE_HEADER, Data);
|
||||||
gMmCorePrivate->CommunicationBuffer = 0;
|
gMmCorePrivate->CommunicationBuffer = 0;
|
||||||
gMmCorePrivate->ReturnStatus = (Status == EFI_SUCCESS) ? EFI_SUCCESS : EFI_NOT_FOUND;
|
gMmCorePrivate->ReturnStatus = (Status == EFI_SUCCESS) ? EFI_SUCCESS : EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -426,12 +424,12 @@ MmEntryPoint (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmConfigurationMmNotify (
|
MmConfigurationMmNotify (
|
||||||
IN CONST EFI_GUID *Protocol,
|
IN CONST EFI_GUID *Protocol,
|
||||||
IN VOID *Interface,
|
IN VOID *Interface,
|
||||||
IN EFI_HANDLE Handle
|
IN EFI_HANDLE Handle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_MM_CONFIGURATION_PROTOCOL *MmConfiguration;
|
EFI_MM_CONFIGURATION_PROTOCOL *MmConfiguration;
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO, "MmConfigurationMmNotify(%g) - %x\n", Protocol, Interface));
|
DEBUG ((DEBUG_INFO, "MmConfigurationMmNotify(%g) - %x\n", Protocol, Interface));
|
||||||
@@ -465,17 +463,18 @@ MmConfigurationMmNotify (
|
|||||||
**/
|
**/
|
||||||
UINTN
|
UINTN
|
||||||
GetHobListSize (
|
GetHobListSize (
|
||||||
IN VOID *HobStart
|
IN VOID *HobStart
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_PEI_HOB_POINTERS Hob;
|
EFI_PEI_HOB_POINTERS Hob;
|
||||||
|
|
||||||
ASSERT (HobStart != NULL);
|
ASSERT (HobStart != NULL);
|
||||||
|
|
||||||
Hob.Raw = (UINT8 *) HobStart;
|
Hob.Raw = (UINT8 *)HobStart;
|
||||||
while (!END_OF_HOB_LIST (Hob)) {
|
while (!END_OF_HOB_LIST (Hob)) {
|
||||||
Hob.Raw = GET_NEXT_HOB (Hob);
|
Hob.Raw = GET_NEXT_HOB (Hob);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Need plus END_OF_HOB_LIST
|
// Need plus END_OF_HOB_LIST
|
||||||
//
|
//
|
||||||
@@ -529,23 +528,24 @@ StandaloneMmMain (
|
|||||||
// Allocate and zero memory for a MM_CORE_PRIVATE_DATA table and then
|
// Allocate and zero memory for a MM_CORE_PRIVATE_DATA table and then
|
||||||
// initialise it
|
// initialise it
|
||||||
//
|
//
|
||||||
gMmCorePrivate = (MM_CORE_PRIVATE_DATA *) AllocateRuntimePages(EFI_SIZE_TO_PAGES(sizeof (MM_CORE_PRIVATE_DATA)));
|
gMmCorePrivate = (MM_CORE_PRIVATE_DATA *)AllocateRuntimePages (EFI_SIZE_TO_PAGES (sizeof (MM_CORE_PRIVATE_DATA)));
|
||||||
SetMem ((VOID *)(UINTN)gMmCorePrivate, sizeof (MM_CORE_PRIVATE_DATA), 0);
|
SetMem ((VOID *)(UINTN)gMmCorePrivate, sizeof (MM_CORE_PRIVATE_DATA), 0);
|
||||||
gMmCorePrivate->Signature = MM_CORE_PRIVATE_DATA_SIGNATURE;
|
gMmCorePrivate->Signature = MM_CORE_PRIVATE_DATA_SIGNATURE;
|
||||||
gMmCorePrivate->MmEntryPointRegistered = FALSE;
|
gMmCorePrivate->MmEntryPointRegistered = FALSE;
|
||||||
gMmCorePrivate->InMm = FALSE;
|
gMmCorePrivate->InMm = FALSE;
|
||||||
gMmCorePrivate->ReturnStatus = EFI_SUCCESS;
|
gMmCorePrivate->ReturnStatus = EFI_SUCCESS;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Extract the MMRAM ranges from the MMRAM descriptor HOB
|
// Extract the MMRAM ranges from the MMRAM descriptor HOB
|
||||||
//
|
//
|
||||||
MmramRangesHob = GetNextGuidHob (&gEfiMmPeiMmramMemoryReserveGuid, HobStart);
|
MmramRangesHob = GetNextGuidHob (&gEfiMmPeiMmramMemoryReserveGuid, HobStart);
|
||||||
if (MmramRangesHob == NULL)
|
if (MmramRangesHob == NULL) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
MmramRangesHobData = GET_GUID_HOB_DATA (MmramRangesHob);
|
MmramRangesHobData = GET_GUID_HOB_DATA (MmramRangesHob);
|
||||||
ASSERT (MmramRangesHobData != NULL);
|
ASSERT (MmramRangesHobData != NULL);
|
||||||
MmramRanges = MmramRangesHobData->Descriptor;
|
MmramRanges = MmramRangesHobData->Descriptor;
|
||||||
MmramRangeCount = (UINTN)MmramRangesHobData->NumberOfMmReservedRegions;
|
MmramRangeCount = (UINTN)MmramRangesHobData->NumberOfMmReservedRegions;
|
||||||
ASSERT (MmramRanges);
|
ASSERT (MmramRanges);
|
||||||
ASSERT (MmramRangeCount);
|
ASSERT (MmramRangeCount);
|
||||||
@@ -555,7 +555,7 @@ StandaloneMmMain (
|
|||||||
// code relies on them being present there
|
// code relies on them being present there
|
||||||
//
|
//
|
||||||
gMmCorePrivate->MmramRangeCount = (UINT64)MmramRangeCount;
|
gMmCorePrivate->MmramRangeCount = (UINT64)MmramRangeCount;
|
||||||
gMmCorePrivate->MmramRanges =
|
gMmCorePrivate->MmramRanges =
|
||||||
(EFI_PHYSICAL_ADDRESS)(UINTN)AllocatePool (MmramRangeCount * sizeof (EFI_MMRAM_DESCRIPTOR));
|
(EFI_PHYSICAL_ADDRESS)(UINTN)AllocatePool (MmramRangeCount * sizeof (EFI_MMRAM_DESCRIPTOR));
|
||||||
ASSERT (gMmCorePrivate->MmramRanges != 0);
|
ASSERT (gMmCorePrivate->MmramRanges != 0);
|
||||||
CopyMem (
|
CopyMem (
|
||||||
@@ -565,7 +565,7 @@ StandaloneMmMain (
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
DataInHob = GET_GUID_HOB_DATA (GuidHob);
|
DataInHob = GET_GUID_HOB_DATA (GuidHob);
|
||||||
gMmCorePrivate = (MM_CORE_PRIVATE_DATA *)(UINTN)DataInHob->Address;
|
gMmCorePrivate = (MM_CORE_PRIVATE_DATA *)(UINTN)DataInHob->Address;
|
||||||
MmramRanges = (EFI_MMRAM_DESCRIPTOR *)(UINTN)gMmCorePrivate->MmramRanges;
|
MmramRanges = (EFI_MMRAM_DESCRIPTOR *)(UINTN)gMmCorePrivate->MmramRanges;
|
||||||
MmramRangeCount = (UINTN)gMmCorePrivate->MmramRangeCount;
|
MmramRangeCount = (UINTN)gMmCorePrivate->MmramRangeCount;
|
||||||
}
|
}
|
||||||
@@ -575,9 +575,13 @@ StandaloneMmMain (
|
|||||||
//
|
//
|
||||||
DEBUG ((DEBUG_INFO, "MmramRangeCount - 0x%x\n", MmramRangeCount));
|
DEBUG ((DEBUG_INFO, "MmramRangeCount - 0x%x\n", MmramRangeCount));
|
||||||
for (Index = 0; Index < MmramRangeCount; Index++) {
|
for (Index = 0; Index < MmramRangeCount; Index++) {
|
||||||
DEBUG ((DEBUG_INFO, "MmramRanges[%d]: 0x%016lx - 0x%lx\n", Index,
|
DEBUG ((
|
||||||
MmramRanges[Index].CpuStart,
|
DEBUG_INFO,
|
||||||
MmramRanges[Index].PhysicalSize));
|
"MmramRanges[%d]: 0x%016lx - 0x%lx\n",
|
||||||
|
Index,
|
||||||
|
MmramRanges[Index].CpuStart,
|
||||||
|
MmramRanges[Index].PhysicalSize
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -600,7 +604,7 @@ StandaloneMmMain (
|
|||||||
gMmCorePrivate->StandaloneBfvAddress = BfvHob->BaseAddress;
|
gMmCorePrivate->StandaloneBfvAddress = BfvHob->BaseAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
gMmCorePrivate->Mmst = (EFI_PHYSICAL_ADDRESS)(UINTN)&gMmCoreMmst;
|
gMmCorePrivate->Mmst = (EFI_PHYSICAL_ADDRESS)(UINTN)&gMmCoreMmst;
|
||||||
gMmCorePrivate->MmEntryPoint = (EFI_PHYSICAL_ADDRESS)(UINTN)MmEntryPoint;
|
gMmCorePrivate->MmEntryPoint = (EFI_PHYSICAL_ADDRESS)(UINTN)MmEntryPoint;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@@ -59,64 +59,64 @@ typedef struct {
|
|||||||
//
|
//
|
||||||
// Structure for recording the state of an MM Driver
|
// Structure for recording the state of an MM Driver
|
||||||
//
|
//
|
||||||
#define EFI_MM_DRIVER_ENTRY_SIGNATURE SIGNATURE_32('s', 'd','r','v')
|
#define EFI_MM_DRIVER_ENTRY_SIGNATURE SIGNATURE_32('s', 'd','r','v')
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Signature;
|
UINTN Signature;
|
||||||
LIST_ENTRY Link; // mDriverList
|
LIST_ENTRY Link; // mDriverList
|
||||||
|
|
||||||
LIST_ENTRY ScheduledLink; // mScheduledQueue
|
LIST_ENTRY ScheduledLink; // mScheduledQueue
|
||||||
|
|
||||||
EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
|
EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
|
||||||
EFI_GUID FileName;
|
EFI_GUID FileName;
|
||||||
VOID *Pe32Data;
|
VOID *Pe32Data;
|
||||||
UINTN Pe32DataSize;
|
UINTN Pe32DataSize;
|
||||||
|
|
||||||
VOID *Depex;
|
VOID *Depex;
|
||||||
UINTN DepexSize;
|
UINTN DepexSize;
|
||||||
|
|
||||||
BOOLEAN Before;
|
BOOLEAN Before;
|
||||||
BOOLEAN After;
|
BOOLEAN After;
|
||||||
EFI_GUID BeforeAfterGuid;
|
EFI_GUID BeforeAfterGuid;
|
||||||
|
|
||||||
BOOLEAN Dependent;
|
BOOLEAN Dependent;
|
||||||
BOOLEAN Scheduled;
|
BOOLEAN Scheduled;
|
||||||
BOOLEAN Initialized;
|
BOOLEAN Initialized;
|
||||||
BOOLEAN DepexProtocolError;
|
BOOLEAN DepexProtocolError;
|
||||||
|
|
||||||
EFI_HANDLE ImageHandle;
|
EFI_HANDLE ImageHandle;
|
||||||
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
|
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
|
||||||
//
|
//
|
||||||
// Image EntryPoint in MMRAM
|
// Image EntryPoint in MMRAM
|
||||||
//
|
//
|
||||||
PHYSICAL_ADDRESS ImageEntryPoint;
|
PHYSICAL_ADDRESS ImageEntryPoint;
|
||||||
//
|
//
|
||||||
// Image Buffer in MMRAM
|
// Image Buffer in MMRAM
|
||||||
//
|
//
|
||||||
PHYSICAL_ADDRESS ImageBuffer;
|
PHYSICAL_ADDRESS ImageBuffer;
|
||||||
//
|
//
|
||||||
// Image Page Number
|
// Image Page Number
|
||||||
//
|
//
|
||||||
UINTN NumberOfPage;
|
UINTN NumberOfPage;
|
||||||
} EFI_MM_DRIVER_ENTRY;
|
} EFI_MM_DRIVER_ENTRY;
|
||||||
|
|
||||||
#define EFI_HANDLE_SIGNATURE SIGNATURE_32('h','n','d','l')
|
#define EFI_HANDLE_SIGNATURE SIGNATURE_32('h','n','d','l')
|
||||||
|
|
||||||
///
|
///
|
||||||
/// IHANDLE - contains a list of protocol handles
|
/// IHANDLE - contains a list of protocol handles
|
||||||
///
|
///
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Signature;
|
UINTN Signature;
|
||||||
/// All handles list of IHANDLE
|
/// All handles list of IHANDLE
|
||||||
LIST_ENTRY AllHandles;
|
LIST_ENTRY AllHandles;
|
||||||
/// List of PROTOCOL_INTERFACE's for this handle
|
/// List of PROTOCOL_INTERFACE's for this handle
|
||||||
LIST_ENTRY Protocols;
|
LIST_ENTRY Protocols;
|
||||||
UINTN LocateRequest;
|
UINTN LocateRequest;
|
||||||
} IHANDLE;
|
} IHANDLE;
|
||||||
|
|
||||||
#define ASSERT_IS_HANDLE(a) ASSERT((a)->Signature == EFI_HANDLE_SIGNATURE)
|
#define ASSERT_IS_HANDLE(a) ASSERT((a)->Signature == EFI_HANDLE_SIGNATURE)
|
||||||
|
|
||||||
#define PROTOCOL_ENTRY_SIGNATURE SIGNATURE_32('p','r','t','e')
|
#define PROTOCOL_ENTRY_SIGNATURE SIGNATURE_32('p','r','t','e')
|
||||||
|
|
||||||
///
|
///
|
||||||
/// PROTOCOL_ENTRY - each different protocol has 1 entry in the protocol
|
/// PROTOCOL_ENTRY - each different protocol has 1 entry in the protocol
|
||||||
@@ -124,15 +124,15 @@ typedef struct {
|
|||||||
/// with a list of registered notifies.
|
/// with a list of registered notifies.
|
||||||
///
|
///
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Signature;
|
UINTN Signature;
|
||||||
/// Link Entry inserted to mProtocolDatabase
|
/// Link Entry inserted to mProtocolDatabase
|
||||||
LIST_ENTRY AllEntries;
|
LIST_ENTRY AllEntries;
|
||||||
/// ID of the protocol
|
/// ID of the protocol
|
||||||
EFI_GUID ProtocolID;
|
EFI_GUID ProtocolID;
|
||||||
/// All protocol interfaces
|
/// All protocol interfaces
|
||||||
LIST_ENTRY Protocols;
|
LIST_ENTRY Protocols;
|
||||||
/// Registered notification handlers
|
/// Registered notification handlers
|
||||||
LIST_ENTRY Notify;
|
LIST_ENTRY Notify;
|
||||||
} PROTOCOL_ENTRY;
|
} PROTOCOL_ENTRY;
|
||||||
|
|
||||||
#define PROTOCOL_INTERFACE_SIGNATURE SIGNATURE_32('p','i','f','c')
|
#define PROTOCOL_INTERFACE_SIGNATURE SIGNATURE_32('p','i','f','c')
|
||||||
@@ -142,20 +142,20 @@ typedef struct {
|
|||||||
/// with a protocol interface structure
|
/// with a protocol interface structure
|
||||||
///
|
///
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Signature;
|
UINTN Signature;
|
||||||
/// Link on IHANDLE.Protocols
|
/// Link on IHANDLE.Protocols
|
||||||
LIST_ENTRY Link;
|
LIST_ENTRY Link;
|
||||||
/// Back pointer
|
/// Back pointer
|
||||||
IHANDLE *Handle;
|
IHANDLE *Handle;
|
||||||
/// Link on PROTOCOL_ENTRY.Protocols
|
/// Link on PROTOCOL_ENTRY.Protocols
|
||||||
LIST_ENTRY ByProtocol;
|
LIST_ENTRY ByProtocol;
|
||||||
/// The protocol ID
|
/// The protocol ID
|
||||||
PROTOCOL_ENTRY *Protocol;
|
PROTOCOL_ENTRY *Protocol;
|
||||||
/// The interface value
|
/// The interface value
|
||||||
VOID *Interface;
|
VOID *Interface;
|
||||||
} PROTOCOL_INTERFACE;
|
} PROTOCOL_INTERFACE;
|
||||||
|
|
||||||
#define PROTOCOL_NOTIFY_SIGNATURE SIGNATURE_32('p','r','t','n')
|
#define PROTOCOL_NOTIFY_SIGNATURE SIGNATURE_32('p','r','t','n')
|
||||||
|
|
||||||
///
|
///
|
||||||
/// PROTOCOL_NOTIFY - used for each register notification for a protocol
|
/// PROTOCOL_NOTIFY - used for each register notification for a protocol
|
||||||
@@ -166,7 +166,7 @@ typedef struct {
|
|||||||
/// All notifications for this protocol
|
/// All notifications for this protocol
|
||||||
LIST_ENTRY Link;
|
LIST_ENTRY Link;
|
||||||
/// Notification function
|
/// Notification function
|
||||||
EFI_MM_NOTIFY_FN Function;
|
EFI_MM_NOTIFY_FN Function;
|
||||||
/// Last position notified
|
/// Last position notified
|
||||||
LIST_ENTRY *Position;
|
LIST_ENTRY *Position;
|
||||||
} PROTOCOL_NOTIFY;
|
} PROTOCOL_NOTIFY;
|
||||||
@@ -213,9 +213,9 @@ EFI_STATUS
|
|||||||
EFIAPI
|
EFIAPI
|
||||||
MmInstallConfigurationTable (
|
MmInstallConfigurationTable (
|
||||||
IN CONST EFI_MM_SYSTEM_TABLE *SystemTable,
|
IN CONST EFI_MM_SYSTEM_TABLE *SystemTable,
|
||||||
IN CONST EFI_GUID *Guid,
|
IN CONST EFI_GUID *Guid,
|
||||||
IN VOID *Table,
|
IN VOID *Table,
|
||||||
IN UINTN TableSize
|
IN UINTN TableSize
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -235,10 +235,10 @@ MmInstallConfigurationTable (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmInstallProtocolInterface (
|
MmInstallProtocolInterface (
|
||||||
IN OUT EFI_HANDLE *UserHandle,
|
IN OUT EFI_HANDLE *UserHandle,
|
||||||
IN EFI_GUID *Protocol,
|
IN EFI_GUID *Protocol,
|
||||||
IN EFI_INTERFACE_TYPE InterfaceType,
|
IN EFI_INTERFACE_TYPE InterfaceType,
|
||||||
IN VOID *Interface
|
IN VOID *Interface
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -260,10 +260,10 @@ MmInstallProtocolInterface (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmAllocatePages (
|
MmAllocatePages (
|
||||||
IN EFI_ALLOCATE_TYPE Type,
|
IN EFI_ALLOCATE_TYPE Type,
|
||||||
IN EFI_MEMORY_TYPE MemoryType,
|
IN EFI_MEMORY_TYPE MemoryType,
|
||||||
IN UINTN NumberOfPages,
|
IN UINTN NumberOfPages,
|
||||||
OUT EFI_PHYSICAL_ADDRESS *Memory
|
OUT EFI_PHYSICAL_ADDRESS *Memory
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -285,10 +285,10 @@ MmAllocatePages (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmInternalAllocatePages (
|
MmInternalAllocatePages (
|
||||||
IN EFI_ALLOCATE_TYPE Type,
|
IN EFI_ALLOCATE_TYPE Type,
|
||||||
IN EFI_MEMORY_TYPE MemoryType,
|
IN EFI_MEMORY_TYPE MemoryType,
|
||||||
IN UINTN NumberOfPages,
|
IN UINTN NumberOfPages,
|
||||||
OUT EFI_PHYSICAL_ADDRESS *Memory
|
OUT EFI_PHYSICAL_ADDRESS *Memory
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -305,8 +305,8 @@ MmInternalAllocatePages (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmFreePages (
|
MmFreePages (
|
||||||
IN EFI_PHYSICAL_ADDRESS Memory,
|
IN EFI_PHYSICAL_ADDRESS Memory,
|
||||||
IN UINTN NumberOfPages
|
IN UINTN NumberOfPages
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -323,8 +323,8 @@ MmFreePages (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmInternalFreePages (
|
MmInternalFreePages (
|
||||||
IN EFI_PHYSICAL_ADDRESS Memory,
|
IN EFI_PHYSICAL_ADDRESS Memory,
|
||||||
IN UINTN NumberOfPages
|
IN UINTN NumberOfPages
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -343,9 +343,9 @@ MmInternalFreePages (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmAllocatePool (
|
MmAllocatePool (
|
||||||
IN EFI_MEMORY_TYPE PoolType,
|
IN EFI_MEMORY_TYPE PoolType,
|
||||||
IN UINTN Size,
|
IN UINTN Size,
|
||||||
OUT VOID **Buffer
|
OUT VOID **Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -364,9 +364,9 @@ MmAllocatePool (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmInternalAllocatePool (
|
MmInternalAllocatePool (
|
||||||
IN EFI_MEMORY_TYPE PoolType,
|
IN EFI_MEMORY_TYPE PoolType,
|
||||||
IN UINTN Size,
|
IN UINTN Size,
|
||||||
OUT VOID **Buffer
|
OUT VOID **Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -381,7 +381,7 @@ MmInternalAllocatePool (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmFreePool (
|
MmFreePool (
|
||||||
IN VOID *Buffer
|
IN VOID *Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -396,7 +396,7 @@ MmFreePool (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmInternalFreePool (
|
MmInternalFreePool (
|
||||||
IN VOID *Buffer
|
IN VOID *Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -418,11 +418,11 @@ MmInternalFreePool (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
MmInstallProtocolInterfaceNotify (
|
MmInstallProtocolInterfaceNotify (
|
||||||
IN OUT EFI_HANDLE *UserHandle,
|
IN OUT EFI_HANDLE *UserHandle,
|
||||||
IN EFI_GUID *Protocol,
|
IN EFI_GUID *Protocol,
|
||||||
IN EFI_INTERFACE_TYPE InterfaceType,
|
IN EFI_INTERFACE_TYPE InterfaceType,
|
||||||
IN VOID *Interface,
|
IN VOID *Interface,
|
||||||
IN BOOLEAN Notify
|
IN BOOLEAN Notify
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -441,9 +441,9 @@ MmInstallProtocolInterfaceNotify (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmUninstallProtocolInterface (
|
MmUninstallProtocolInterface (
|
||||||
IN EFI_HANDLE UserHandle,
|
IN EFI_HANDLE UserHandle,
|
||||||
IN EFI_GUID *Protocol,
|
IN EFI_GUID *Protocol,
|
||||||
IN VOID *Interface
|
IN VOID *Interface
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -460,9 +460,9 @@ MmUninstallProtocolInterface (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmHandleProtocol (
|
MmHandleProtocol (
|
||||||
IN EFI_HANDLE UserHandle,
|
IN EFI_HANDLE UserHandle,
|
||||||
IN EFI_GUID *Protocol,
|
IN EFI_GUID *Protocol,
|
||||||
OUT VOID **Interface
|
OUT VOID **Interface
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -481,9 +481,9 @@ MmHandleProtocol (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmRegisterProtocolNotify (
|
MmRegisterProtocolNotify (
|
||||||
IN CONST EFI_GUID *Protocol,
|
IN CONST EFI_GUID *Protocol,
|
||||||
IN EFI_MM_NOTIFY_FN Function,
|
IN EFI_MM_NOTIFY_FN Function,
|
||||||
OUT VOID **Registration
|
OUT VOID **Registration
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -507,11 +507,11 @@ MmRegisterProtocolNotify (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmLocateHandle (
|
MmLocateHandle (
|
||||||
IN EFI_LOCATE_SEARCH_TYPE SearchType,
|
IN EFI_LOCATE_SEARCH_TYPE SearchType,
|
||||||
IN EFI_GUID *Protocol OPTIONAL,
|
IN EFI_GUID *Protocol OPTIONAL,
|
||||||
IN VOID *SearchKey OPTIONAL,
|
IN VOID *SearchKey OPTIONAL,
|
||||||
IN OUT UINTN *BufferSize,
|
IN OUT UINTN *BufferSize,
|
||||||
OUT EFI_HANDLE *Buffer
|
OUT EFI_HANDLE *Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -555,10 +555,10 @@ MmLocateProtocol (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmiManage (
|
MmiManage (
|
||||||
IN CONST EFI_GUID *HandlerType,
|
IN CONST EFI_GUID *HandlerType,
|
||||||
IN CONST VOID *Context OPTIONAL,
|
IN CONST VOID *Context OPTIONAL,
|
||||||
IN OUT VOID *CommBuffer OPTIONAL,
|
IN OUT VOID *CommBuffer OPTIONAL,
|
||||||
IN OUT UINTN *CommBufferSize OPTIONAL
|
IN OUT UINTN *CommBufferSize OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -575,9 +575,9 @@ MmiManage (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmiHandlerRegister (
|
MmiHandlerRegister (
|
||||||
IN EFI_MM_HANDLER_ENTRY_POINT Handler,
|
IN EFI_MM_HANDLER_ENTRY_POINT Handler,
|
||||||
IN CONST EFI_GUID *HandlerType OPTIONAL,
|
IN CONST EFI_GUID *HandlerType OPTIONAL,
|
||||||
OUT EFI_HANDLE *DispatchHandle
|
OUT EFI_HANDLE *DispatchHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -592,7 +592,7 @@ MmiHandlerRegister (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmiHandlerUnRegister (
|
MmiHandlerUnRegister (
|
||||||
IN EFI_HANDLE DispatchHandle
|
IN EFI_HANDLE DispatchHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -611,10 +611,10 @@ MmiHandlerUnRegister (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmDriverDispatchHandler (
|
MmDriverDispatchHandler (
|
||||||
IN EFI_HANDLE DispatchHandle,
|
IN EFI_HANDLE DispatchHandle,
|
||||||
IN CONST VOID *Context OPTIONAL,
|
IN CONST VOID *Context OPTIONAL,
|
||||||
IN OUT VOID *CommBuffer OPTIONAL,
|
IN OUT VOID *CommBuffer OPTIONAL,
|
||||||
IN OUT UINTN *CommBufferSize OPTIONAL
|
IN OUT UINTN *CommBufferSize OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -633,10 +633,10 @@ MmDriverDispatchHandler (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmExitBootServiceHandler (
|
MmExitBootServiceHandler (
|
||||||
IN EFI_HANDLE DispatchHandle,
|
IN EFI_HANDLE DispatchHandle,
|
||||||
IN CONST VOID *Context OPTIONAL,
|
IN CONST VOID *Context OPTIONAL,
|
||||||
IN OUT VOID *CommBuffer OPTIONAL,
|
IN OUT VOID *CommBuffer OPTIONAL,
|
||||||
IN OUT UINTN *CommBufferSize OPTIONAL
|
IN OUT UINTN *CommBufferSize OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -655,10 +655,10 @@ MmExitBootServiceHandler (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmReadyToBootHandler (
|
MmReadyToBootHandler (
|
||||||
IN EFI_HANDLE DispatchHandle,
|
IN EFI_HANDLE DispatchHandle,
|
||||||
IN CONST VOID *Context OPTIONAL,
|
IN CONST VOID *Context OPTIONAL,
|
||||||
IN OUT VOID *CommBuffer OPTIONAL,
|
IN OUT VOID *CommBuffer OPTIONAL,
|
||||||
IN OUT UINTN *CommBufferSize OPTIONAL
|
IN OUT UINTN *CommBufferSize OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -677,10 +677,10 @@ MmReadyToBootHandler (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmReadyToLockHandler (
|
MmReadyToLockHandler (
|
||||||
IN EFI_HANDLE DispatchHandle,
|
IN EFI_HANDLE DispatchHandle,
|
||||||
IN CONST VOID *Context OPTIONAL,
|
IN CONST VOID *Context OPTIONAL,
|
||||||
IN OUT VOID *CommBuffer OPTIONAL,
|
IN OUT VOID *CommBuffer OPTIONAL,
|
||||||
IN OUT UINTN *CommBufferSize OPTIONAL
|
IN OUT UINTN *CommBufferSize OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -699,10 +699,10 @@ MmReadyToLockHandler (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmEndOfDxeHandler (
|
MmEndOfDxeHandler (
|
||||||
IN EFI_HANDLE DispatchHandle,
|
IN EFI_HANDLE DispatchHandle,
|
||||||
IN CONST VOID *Context OPTIONAL,
|
IN CONST VOID *Context OPTIONAL,
|
||||||
IN OUT VOID *CommBuffer OPTIONAL,
|
IN OUT VOID *CommBuffer OPTIONAL,
|
||||||
IN OUT UINTN *CommBufferSize OPTIONAL
|
IN OUT UINTN *CommBufferSize OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -720,15 +720,15 @@ MmEndOfDxeHandler (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MmEfiNotAvailableYetArg5 (
|
MmEfiNotAvailableYetArg5 (
|
||||||
UINTN Arg1,
|
UINTN Arg1,
|
||||||
UINTN Arg2,
|
UINTN Arg2,
|
||||||
UINTN Arg3,
|
UINTN Arg3,
|
||||||
UINTN Arg4,
|
UINTN Arg4,
|
||||||
UINTN Arg5
|
UINTN Arg5
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
//Functions used during debug builds
|
// Functions used during debug builds
|
||||||
//
|
//
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -752,10 +752,10 @@ MmDisplayDiscoveredNotDispatched (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
MmAddMemoryRegion (
|
MmAddMemoryRegion (
|
||||||
IN EFI_PHYSICAL_ADDRESS MemBase,
|
IN EFI_PHYSICAL_ADDRESS MemBase,
|
||||||
IN UINT64 MemLength,
|
IN UINT64 MemLength,
|
||||||
IN EFI_MEMORY_TYPE Type,
|
IN EFI_MEMORY_TYPE Type,
|
||||||
IN UINT64 Attributes
|
IN UINT64 Attributes
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -769,8 +769,8 @@ MmAddMemoryRegion (
|
|||||||
**/
|
**/
|
||||||
PROTOCOL_ENTRY *
|
PROTOCOL_ENTRY *
|
||||||
MmFindProtocolEntry (
|
MmFindProtocolEntry (
|
||||||
IN EFI_GUID *Protocol,
|
IN EFI_GUID *Protocol,
|
||||||
IN BOOLEAN Create
|
IN BOOLEAN Create
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -781,7 +781,7 @@ MmFindProtocolEntry (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
MmNotifyProtocol (
|
MmNotifyProtocol (
|
||||||
IN PROTOCOL_INTERFACE *Prot
|
IN PROTOCOL_INTERFACE *Prot
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -798,9 +798,9 @@ MmNotifyProtocol (
|
|||||||
**/
|
**/
|
||||||
PROTOCOL_INTERFACE *
|
PROTOCOL_INTERFACE *
|
||||||
MmFindProtocolInterface (
|
MmFindProtocolInterface (
|
||||||
IN IHANDLE *Handle,
|
IN IHANDLE *Handle,
|
||||||
IN EFI_GUID *Protocol,
|
IN EFI_GUID *Protocol,
|
||||||
IN VOID *Interface
|
IN VOID *Interface
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -815,9 +815,9 @@ MmFindProtocolInterface (
|
|||||||
**/
|
**/
|
||||||
PROTOCOL_INTERFACE *
|
PROTOCOL_INTERFACE *
|
||||||
MmRemoveInterfaceFromProtocol (
|
MmRemoveInterfaceFromProtocol (
|
||||||
IN IHANDLE *Handle,
|
IN IHANDLE *Handle,
|
||||||
IN EFI_GUID *Protocol,
|
IN EFI_GUID *Protocol,
|
||||||
IN VOID *Interface
|
IN VOID *Interface
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -834,7 +834,7 @@ MmRemoveInterfaceFromProtocol (
|
|||||||
**/
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
MmIsSchedulable (
|
MmIsSchedulable (
|
||||||
IN EFI_MM_DRIVER_ENTRY *DriverEntry
|
IN EFI_MM_DRIVER_ENTRY *DriverEntry
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -846,8 +846,8 @@ DumpMmramInfo (
|
|||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
extern UINTN mMmramRangeCount;
|
extern UINTN mMmramRangeCount;
|
||||||
extern EFI_MMRAM_DESCRIPTOR *mMmramRanges;
|
extern EFI_MMRAM_DESCRIPTOR *mMmramRanges;
|
||||||
extern EFI_SYSTEM_TABLE *mEfiSystemTable;
|
extern EFI_SYSTEM_TABLE *mEfiSystemTable;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -18,8 +18,8 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
LIST_ENTRY Link;
|
LIST_ENTRY Link;
|
||||||
UINTN NumberOfPages;
|
UINTN NumberOfPages;
|
||||||
} FREE_PAGE_LIST;
|
} FREE_PAGE_LIST;
|
||||||
|
|
||||||
extern LIST_ENTRY mMmMemoryMap;
|
extern LIST_ENTRY mMmMemoryMap;
|
||||||
@@ -46,13 +46,13 @@ extern LIST_ENTRY mMmMemoryMap;
|
|||||||
#define MAX_POOL_INDEX (MAX_POOL_SHIFT - MIN_POOL_SHIFT + 1)
|
#define MAX_POOL_INDEX (MAX_POOL_SHIFT - MIN_POOL_SHIFT + 1)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN Size;
|
UINTN Size;
|
||||||
BOOLEAN Available;
|
BOOLEAN Available;
|
||||||
} POOL_HEADER;
|
} POOL_HEADER;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
POOL_HEADER Header;
|
POOL_HEADER Header;
|
||||||
LIST_ENTRY Link;
|
LIST_ENTRY Link;
|
||||||
} FREE_POOL_HEADER;
|
} FREE_POOL_HEADER;
|
||||||
|
|
||||||
extern LIST_ENTRY mMmPoolLists[MAX_POOL_INDEX];
|
extern LIST_ENTRY mMmPoolLists[MAX_POOL_INDEX];
|
||||||
|
@@ -11,7 +11,6 @@
|
|||||||
#include <Base.h>
|
#include <Base.h>
|
||||||
#include <Pi/PiMmCis.h>
|
#include <Pi/PiMmCis.h>
|
||||||
|
|
||||||
|
|
||||||
#include <Library/ArmSvcLib.h>
|
#include <Library/ArmSvcLib.h>
|
||||||
#include <Library/ArmLib.h>
|
#include <Library/ArmLib.h>
|
||||||
#include <Library/BaseMemoryLib.h>
|
#include <Library/BaseMemoryLib.h>
|
||||||
@@ -32,7 +31,7 @@ EFI_STATUS
|
|||||||
EFIAPI
|
EFIAPI
|
||||||
MmFoundationEntryRegister (
|
MmFoundationEntryRegister (
|
||||||
IN CONST EFI_MM_CONFIGURATION_PROTOCOL *This,
|
IN CONST EFI_MM_CONFIGURATION_PROTOCOL *This,
|
||||||
IN EFI_MM_ENTRY_POINT MmEntryPoint
|
IN EFI_MM_ENTRY_POINT MmEntryPoint
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -46,19 +45,19 @@ MmFoundationEntryRegister (
|
|||||||
// number of CPUs in the system are made known through the
|
// number of CPUs in the system are made known through the
|
||||||
// MP_INFORMATION_HOB_DATA.
|
// MP_INFORMATION_HOB_DATA.
|
||||||
//
|
//
|
||||||
EFI_MM_COMMUNICATE_HEADER **PerCpuGuidedEventContext = NULL;
|
EFI_MM_COMMUNICATE_HEADER **PerCpuGuidedEventContext = NULL;
|
||||||
|
|
||||||
// Descriptor with whereabouts of memory used for communication with the normal world
|
// Descriptor with whereabouts of memory used for communication with the normal world
|
||||||
EFI_MMRAM_DESCRIPTOR mNsCommBuffer;
|
EFI_MMRAM_DESCRIPTOR mNsCommBuffer;
|
||||||
|
|
||||||
MP_INFORMATION_HOB_DATA *mMpInformationHobData;
|
MP_INFORMATION_HOB_DATA *mMpInformationHobData;
|
||||||
|
|
||||||
EFI_MM_CONFIGURATION_PROTOCOL mMmConfig = {
|
EFI_MM_CONFIGURATION_PROTOCOL mMmConfig = {
|
||||||
0,
|
0,
|
||||||
MmFoundationEntryRegister
|
MmFoundationEntryRegister
|
||||||
};
|
};
|
||||||
|
|
||||||
STATIC EFI_MM_ENTRY_POINT mMmEntryPoint = NULL;
|
STATIC EFI_MM_ENTRY_POINT mMmEntryPoint = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The PI Standalone MM entry point for the TF-A CPU driver.
|
The PI Standalone MM entry point for the TF-A CPU driver.
|
||||||
@@ -75,15 +74,15 @@ STATIC EFI_MM_ENTRY_POINT mMmEntryPoint = NULL;
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
PiMmStandaloneArmTfCpuDriverEntry (
|
PiMmStandaloneArmTfCpuDriverEntry (
|
||||||
IN UINTN EventId,
|
IN UINTN EventId,
|
||||||
IN UINTN CpuNumber,
|
IN UINTN CpuNumber,
|
||||||
IN UINTN NsCommBufferAddr
|
IN UINTN NsCommBufferAddr
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_MM_COMMUNICATE_HEADER *GuidedEventContext;
|
EFI_MM_COMMUNICATE_HEADER *GuidedEventContext;
|
||||||
EFI_MM_ENTRY_CONTEXT MmEntryPointContext;
|
EFI_MM_ENTRY_CONTEXT MmEntryPointContext;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN NsCommBufferSize;
|
UINTN NsCommBufferSize;
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO, "Received event - 0x%x on cpu %d\n", EventId, CpuNumber));
|
DEBUG ((DEBUG_INFO, "Received event - 0x%x on cpu %d\n", EventId, CpuNumber));
|
||||||
|
|
||||||
@@ -94,7 +93,8 @@ PiMmStandaloneArmTfCpuDriverEntry (
|
|||||||
// between synchronous and asynchronous events.
|
// between synchronous and asynchronous events.
|
||||||
//
|
//
|
||||||
if ((ARM_SMC_ID_MM_COMMUNICATE != EventId) &&
|
if ((ARM_SMC_ID_MM_COMMUNICATE != EventId) &&
|
||||||
(ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ != EventId)) {
|
(ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ != EventId))
|
||||||
|
{
|
||||||
DEBUG ((DEBUG_INFO, "UnRecognized Event - 0x%x\n", EventId));
|
DEBUG ((DEBUG_INFO, "UnRecognized Event - 0x%x\n", EventId));
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
@@ -109,17 +109,19 @@ PiMmStandaloneArmTfCpuDriverEntry (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((NsCommBufferAddr + sizeof (EFI_MM_COMMUNICATE_HEADER)) >=
|
if ((NsCommBufferAddr + sizeof (EFI_MM_COMMUNICATE_HEADER)) >=
|
||||||
(mNsCommBuffer.PhysicalStart + mNsCommBuffer.PhysicalSize)) {
|
(mNsCommBuffer.PhysicalStart + mNsCommBuffer.PhysicalSize))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find out the size of the buffer passed
|
// Find out the size of the buffer passed
|
||||||
NsCommBufferSize = ((EFI_MM_COMMUNICATE_HEADER *) NsCommBufferAddr)->MessageLength +
|
NsCommBufferSize = ((EFI_MM_COMMUNICATE_HEADER *)NsCommBufferAddr)->MessageLength +
|
||||||
sizeof (EFI_MM_COMMUNICATE_HEADER);
|
sizeof (EFI_MM_COMMUNICATE_HEADER);
|
||||||
|
|
||||||
// perform bounds check.
|
// perform bounds check.
|
||||||
if (NsCommBufferAddr + NsCommBufferSize >=
|
if (NsCommBufferAddr + NsCommBufferSize >=
|
||||||
mNsCommBuffer.PhysicalStart + mNsCommBuffer.PhysicalSize) {
|
mNsCommBuffer.PhysicalStart + mNsCommBuffer.PhysicalSize)
|
||||||
|
{
|
||||||
return EFI_ACCESS_DENIED;
|
return EFI_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,7 +131,7 @@ PiMmStandaloneArmTfCpuDriverEntry (
|
|||||||
Status = mMmst->MmAllocatePool (
|
Status = mMmst->MmAllocatePool (
|
||||||
EfiRuntimeServicesData,
|
EfiRuntimeServicesData,
|
||||||
NsCommBufferSize,
|
NsCommBufferSize,
|
||||||
(VOID **) &GuidedEventContext
|
(VOID **)&GuidedEventContext
|
||||||
);
|
);
|
||||||
|
|
||||||
if (Status != EFI_SUCCESS) {
|
if (Status != EFI_SUCCESS) {
|
||||||
@@ -139,7 +141,7 @@ PiMmStandaloneArmTfCpuDriverEntry (
|
|||||||
|
|
||||||
// X1 contains the VA of the normal world memory accessible from
|
// X1 contains the VA of the normal world memory accessible from
|
||||||
// S-EL0
|
// S-EL0
|
||||||
CopyMem (GuidedEventContext, (CONST VOID *) NsCommBufferAddr, NsCommBufferSize);
|
CopyMem (GuidedEventContext, (CONST VOID *)NsCommBufferAddr, NsCommBufferSize);
|
||||||
|
|
||||||
// Stash the pointer to the allocated Event Context for this CPU
|
// Stash the pointer to the allocated Event Context for this CPU
|
||||||
PerCpuGuidedEventContext[CpuNumber] = GuidedEventContext;
|
PerCpuGuidedEventContext[CpuNumber] = GuidedEventContext;
|
||||||
@@ -147,13 +149,13 @@ PiMmStandaloneArmTfCpuDriverEntry (
|
|||||||
ZeroMem (&MmEntryPointContext, sizeof (EFI_MM_ENTRY_CONTEXT));
|
ZeroMem (&MmEntryPointContext, sizeof (EFI_MM_ENTRY_CONTEXT));
|
||||||
|
|
||||||
MmEntryPointContext.CurrentlyExecutingCpu = CpuNumber;
|
MmEntryPointContext.CurrentlyExecutingCpu = CpuNumber;
|
||||||
MmEntryPointContext.NumberOfCpus = mMpInformationHobData->NumberOfProcessors;
|
MmEntryPointContext.NumberOfCpus = mMpInformationHobData->NumberOfProcessors;
|
||||||
|
|
||||||
// Populate the MM system table with MP and state information
|
// Populate the MM system table with MP and state information
|
||||||
mMmst->CurrentlyExecutingCpu = CpuNumber;
|
mMmst->CurrentlyExecutingCpu = CpuNumber;
|
||||||
mMmst->NumberOfCpus = mMpInformationHobData->NumberOfProcessors;
|
mMmst->NumberOfCpus = mMpInformationHobData->NumberOfProcessors;
|
||||||
mMmst->CpuSaveStateSize = 0;
|
mMmst->CpuSaveStateSize = 0;
|
||||||
mMmst->CpuSaveState = NULL;
|
mMmst->CpuSaveState = NULL;
|
||||||
|
|
||||||
if (mMmEntryPoint == NULL) {
|
if (mMmEntryPoint == NULL) {
|
||||||
DEBUG ((DEBUG_INFO, "Mm Entry point Not Found\n"));
|
DEBUG ((DEBUG_INFO, "Mm Entry point Not Found\n"));
|
||||||
@@ -164,12 +166,13 @@ PiMmStandaloneArmTfCpuDriverEntry (
|
|||||||
|
|
||||||
// Free the memory allocation done earlier and reset the per-cpu context
|
// Free the memory allocation done earlier and reset the per-cpu context
|
||||||
ASSERT (GuidedEventContext);
|
ASSERT (GuidedEventContext);
|
||||||
CopyMem ((VOID *)NsCommBufferAddr, (CONST VOID *) GuidedEventContext, NsCommBufferSize);
|
CopyMem ((VOID *)NsCommBufferAddr, (CONST VOID *)GuidedEventContext, NsCommBufferSize);
|
||||||
|
|
||||||
Status = mMmst->MmFreePool ((VOID *) GuidedEventContext);
|
Status = mMmst->MmFreePool ((VOID *)GuidedEventContext);
|
||||||
if (Status != EFI_SUCCESS) {
|
if (Status != EFI_SUCCESS) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
PerCpuGuidedEventContext[CpuNumber] = NULL;
|
PerCpuGuidedEventContext[CpuNumber] = NULL;
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
@@ -187,7 +190,7 @@ EFI_STATUS
|
|||||||
EFIAPI
|
EFIAPI
|
||||||
MmFoundationEntryRegister (
|
MmFoundationEntryRegister (
|
||||||
IN CONST EFI_MM_CONFIGURATION_PROTOCOL *This,
|
IN CONST EFI_MM_CONFIGURATION_PROTOCOL *This,
|
||||||
IN EFI_MM_ENTRY_POINT MmEntryPoint
|
IN EFI_MM_ENTRY_POINT MmEntryPoint
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// store the entry point in a global
|
// store the entry point in a global
|
||||||
@@ -214,14 +217,14 @@ MmFoundationEntryRegister (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PiMmCpuTpFwRootMmiHandler (
|
PiMmCpuTpFwRootMmiHandler (
|
||||||
IN EFI_HANDLE DispatchHandle,
|
IN EFI_HANDLE DispatchHandle,
|
||||||
IN CONST VOID *Context OPTIONAL,
|
IN CONST VOID *Context OPTIONAL,
|
||||||
IN OUT VOID *CommBuffer OPTIONAL,
|
IN OUT VOID *CommBuffer OPTIONAL,
|
||||||
IN OUT UINTN *CommBufferSize OPTIONAL
|
IN OUT UINTN *CommBufferSize OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN CpuNumber;
|
UINTN CpuNumber;
|
||||||
|
|
||||||
ASSERT (Context == NULL);
|
ASSERT (Context == NULL);
|
||||||
ASSERT (CommBuffer == NULL);
|
ASSERT (CommBuffer == NULL);
|
||||||
@@ -232,9 +235,12 @@ PiMmCpuTpFwRootMmiHandler (
|
|||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO, "CommBuffer - 0x%x, CommBufferSize - 0x%x\n",
|
DEBUG ((
|
||||||
PerCpuGuidedEventContext[CpuNumber],
|
DEBUG_INFO,
|
||||||
PerCpuGuidedEventContext[CpuNumber]->MessageLength));
|
"CommBuffer - 0x%x, CommBufferSize - 0x%x\n",
|
||||||
|
PerCpuGuidedEventContext[CpuNumber],
|
||||||
|
PerCpuGuidedEventContext[CpuNumber]->MessageLength
|
||||||
|
));
|
||||||
|
|
||||||
Status = mMmst->MmiManage (
|
Status = mMmst->MmiManage (
|
||||||
&PerCpuGuidedEventContext[CpuNumber]->HeaderGuid,
|
&PerCpuGuidedEventContext[CpuNumber]->HeaderGuid,
|
||||||
|
@@ -22,27 +22,26 @@
|
|||||||
#include <Guid/ZeroGuid.h>
|
#include <Guid/ZeroGuid.h>
|
||||||
#include <Guid/MmramMemoryReserve.h>
|
#include <Guid/MmramMemoryReserve.h>
|
||||||
|
|
||||||
|
|
||||||
#include "StandaloneMmCpu.h"
|
#include "StandaloneMmCpu.h"
|
||||||
|
|
||||||
// GUID to identify HOB with whereabouts of communication buffer with Normal
|
// GUID to identify HOB with whereabouts of communication buffer with Normal
|
||||||
// World
|
// World
|
||||||
extern EFI_GUID gEfiStandaloneMmNonSecureBufferGuid;
|
extern EFI_GUID gEfiStandaloneMmNonSecureBufferGuid;
|
||||||
|
|
||||||
// GUID to identify HOB where the entry point of this CPU driver will be
|
// GUID to identify HOB where the entry point of this CPU driver will be
|
||||||
// populated to allow the entry point driver to invoke it upon receipt of an
|
// populated to allow the entry point driver to invoke it upon receipt of an
|
||||||
// event
|
// event
|
||||||
extern EFI_GUID gEfiArmTfCpuDriverEpDescriptorGuid;
|
extern EFI_GUID gEfiArmTfCpuDriverEpDescriptorGuid;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Private copy of the MM system table for future use
|
// Private copy of the MM system table for future use
|
||||||
//
|
//
|
||||||
EFI_MM_SYSTEM_TABLE *mMmst = NULL;
|
EFI_MM_SYSTEM_TABLE *mMmst = NULL;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Globals used to initialize the protocol
|
// Globals used to initialize the protocol
|
||||||
//
|
//
|
||||||
STATIC EFI_HANDLE mMmCpuHandle = NULL;
|
STATIC EFI_HANDLE mMmCpuHandle = NULL;
|
||||||
|
|
||||||
/** Returns the HOB data for the matching HOB GUID.
|
/** Returns the HOB data for the matching HOB GUID.
|
||||||
|
|
||||||
@@ -56,12 +55,12 @@ STATIC EFI_HANDLE mMmCpuHandle = NULL;
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetGuidedHobData (
|
GetGuidedHobData (
|
||||||
IN VOID *HobList,
|
IN VOID *HobList,
|
||||||
IN CONST EFI_GUID *HobGuid,
|
IN CONST EFI_GUID *HobGuid,
|
||||||
OUT VOID **HobData
|
OUT VOID **HobData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_GUID_TYPE *Hob;
|
EFI_HOB_GUID_TYPE *Hob;
|
||||||
|
|
||||||
if ((HobList == NULL) || (HobGuid == NULL) || (HobData == NULL)) {
|
if ((HobList == NULL) || (HobGuid == NULL) || (HobData == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@@ -93,20 +92,20 @@ GetGuidedHobData (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
StandaloneMmCpuInitialize (
|
StandaloneMmCpuInitialize (
|
||||||
IN EFI_HANDLE ImageHandle, // not actual imagehandle
|
IN EFI_HANDLE ImageHandle, // not actual imagehandle
|
||||||
IN EFI_MM_SYSTEM_TABLE *SystemTable // not actual systemtable
|
IN EFI_MM_SYSTEM_TABLE *SystemTable // not actual systemtable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ARM_TF_CPU_DRIVER_EP_DESCRIPTOR *CpuDriverEntryPointDesc;
|
ARM_TF_CPU_DRIVER_EP_DESCRIPTOR *CpuDriverEntryPointDesc;
|
||||||
EFI_CONFIGURATION_TABLE *ConfigurationTable;
|
EFI_CONFIGURATION_TABLE *ConfigurationTable;
|
||||||
MP_INFORMATION_HOB_DATA *MpInformationHobData;
|
MP_INFORMATION_HOB_DATA *MpInformationHobData;
|
||||||
EFI_MMRAM_DESCRIPTOR *NsCommBufMmramRange;
|
EFI_MMRAM_DESCRIPTOR *NsCommBufMmramRange;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_HANDLE DispatchHandle;
|
EFI_HANDLE DispatchHandle;
|
||||||
UINT32 MpInfoSize;
|
UINT32 MpInfoSize;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
UINTN ArraySize;
|
UINTN ArraySize;
|
||||||
VOID *HobStart;
|
VOID *HobStart;
|
||||||
|
|
||||||
ASSERT (SystemTable != NULL);
|
ASSERT (SystemTable != NULL);
|
||||||
mMmst = SystemTable;
|
mMmst = SystemTable;
|
||||||
@@ -155,7 +154,7 @@ StandaloneMmCpuInitialize (
|
|||||||
Status = GetGuidedHobData (
|
Status = GetGuidedHobData (
|
||||||
HobStart,
|
HobStart,
|
||||||
&gEfiArmTfCpuDriverEpDescriptorGuid,
|
&gEfiArmTfCpuDriverEpDescriptorGuid,
|
||||||
(VOID **) &CpuDriverEntryPointDesc
|
(VOID **)&CpuDriverEntryPointDesc
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_INFO, "ArmTfCpuDriverEpDesc HOB data extraction failed - 0x%x\n", Status));
|
DEBUG ((DEBUG_INFO, "ArmTfCpuDriverEpDesc HOB data extraction failed - 0x%x\n", Status));
|
||||||
@@ -163,9 +162,12 @@ StandaloneMmCpuInitialize (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Share the entry point of the CPU driver
|
// Share the entry point of the CPU driver
|
||||||
DEBUG ((DEBUG_INFO, "Sharing Cpu Driver EP *0x%lx = 0x%lx\n",
|
DEBUG ((
|
||||||
(UINTN) CpuDriverEntryPointDesc->ArmTfCpuDriverEpPtr,
|
DEBUG_INFO,
|
||||||
(UINTN) PiMmStandaloneArmTfCpuDriverEntry));
|
"Sharing Cpu Driver EP *0x%lx = 0x%lx\n",
|
||||||
|
(UINTN)CpuDriverEntryPointDesc->ArmTfCpuDriverEpPtr,
|
||||||
|
(UINTN)PiMmStandaloneArmTfCpuDriverEntry
|
||||||
|
));
|
||||||
*(CpuDriverEntryPointDesc->ArmTfCpuDriverEpPtr) = PiMmStandaloneArmTfCpuDriverEntry;
|
*(CpuDriverEntryPointDesc->ArmTfCpuDriverEpPtr) = PiMmStandaloneArmTfCpuDriverEntry;
|
||||||
|
|
||||||
// Find the descriptor that contains the whereabouts of the buffer for
|
// Find the descriptor that contains the whereabouts of the buffer for
|
||||||
@@ -173,17 +175,17 @@ StandaloneMmCpuInitialize (
|
|||||||
Status = GetGuidedHobData (
|
Status = GetGuidedHobData (
|
||||||
HobStart,
|
HobStart,
|
||||||
&gEfiStandaloneMmNonSecureBufferGuid,
|
&gEfiStandaloneMmNonSecureBufferGuid,
|
||||||
(VOID **) &NsCommBufMmramRange
|
(VOID **)&NsCommBufMmramRange
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_INFO, "NsCommBufMmramRange HOB data extraction failed - 0x%x\n", Status));
|
DEBUG ((DEBUG_INFO, "NsCommBufMmramRange HOB data extraction failed - 0x%x\n", Status));
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO, "mNsCommBuffer.PhysicalStart - 0x%lx\n", (UINTN) NsCommBufMmramRange->PhysicalStart));
|
DEBUG ((DEBUG_INFO, "mNsCommBuffer.PhysicalStart - 0x%lx\n", (UINTN)NsCommBufMmramRange->PhysicalStart));
|
||||||
DEBUG ((DEBUG_INFO, "mNsCommBuffer.PhysicalSize - 0x%lx\n", (UINTN) NsCommBufMmramRange->PhysicalSize));
|
DEBUG ((DEBUG_INFO, "mNsCommBuffer.PhysicalSize - 0x%lx\n", (UINTN)NsCommBufMmramRange->PhysicalSize));
|
||||||
|
|
||||||
CopyMem (&mNsCommBuffer, NsCommBufMmramRange, sizeof(EFI_MMRAM_DESCRIPTOR));
|
CopyMem (&mNsCommBuffer, NsCommBufMmramRange, sizeof (EFI_MMRAM_DESCRIPTOR));
|
||||||
DEBUG ((DEBUG_INFO, "mNsCommBuffer: 0x%016lx - 0x%lx\n", mNsCommBuffer.CpuStart, mNsCommBuffer.PhysicalSize));
|
DEBUG ((DEBUG_INFO, "mNsCommBuffer: 0x%016lx - 0x%lx\n", mNsCommBuffer.CpuStart, mNsCommBuffer.PhysicalSize));
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -192,7 +194,7 @@ StandaloneMmCpuInitialize (
|
|||||||
Status = GetGuidedHobData (
|
Status = GetGuidedHobData (
|
||||||
HobStart,
|
HobStart,
|
||||||
&gMpInformationHobGuid,
|
&gMpInformationHobGuid,
|
||||||
(VOID **) &MpInformationHobData
|
(VOID **)&MpInformationHobData
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_INFO, "MpInformationHob extraction failed - 0x%x\n", Status));
|
DEBUG ((DEBUG_INFO, "MpInformationHob extraction failed - 0x%x\n", Status));
|
||||||
@@ -206,11 +208,11 @@ StandaloneMmCpuInitialize (
|
|||||||
//
|
//
|
||||||
MpInfoSize = sizeof (MP_INFORMATION_HOB_DATA) +
|
MpInfoSize = sizeof (MP_INFORMATION_HOB_DATA) +
|
||||||
(sizeof (EFI_PROCESSOR_INFORMATION) *
|
(sizeof (EFI_PROCESSOR_INFORMATION) *
|
||||||
MpInformationHobData->NumberOfProcessors);
|
MpInformationHobData->NumberOfProcessors);
|
||||||
Status = mMmst->MmAllocatePool (
|
Status = mMmst->MmAllocatePool (
|
||||||
EfiRuntimeServicesData,
|
EfiRuntimeServicesData,
|
||||||
MpInfoSize,
|
MpInfoSize,
|
||||||
(VOID **) &mMpInformationHobData
|
(VOID **)&mMpInformationHobData
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_INFO, "mMpInformationHobData mem alloc failed - 0x%x\n", Status));
|
DEBUG ((DEBUG_INFO, "mMpInformationHobData mem alloc failed - 0x%x\n", Status));
|
||||||
@@ -220,15 +222,21 @@ StandaloneMmCpuInitialize (
|
|||||||
CopyMem (mMpInformationHobData, MpInformationHobData, MpInfoSize);
|
CopyMem (mMpInformationHobData, MpInformationHobData, MpInfoSize);
|
||||||
|
|
||||||
// Print MP information
|
// Print MP information
|
||||||
DEBUG ((DEBUG_INFO, "mMpInformationHobData: 0x%016lx - 0x%lx\n",
|
DEBUG ((
|
||||||
mMpInformationHobData->NumberOfProcessors,
|
DEBUG_INFO,
|
||||||
mMpInformationHobData->NumberOfEnabledProcessors));
|
"mMpInformationHobData: 0x%016lx - 0x%lx\n",
|
||||||
|
mMpInformationHobData->NumberOfProcessors,
|
||||||
|
mMpInformationHobData->NumberOfEnabledProcessors
|
||||||
|
));
|
||||||
for (Index = 0; Index < mMpInformationHobData->NumberOfProcessors; Index++) {
|
for (Index = 0; Index < mMpInformationHobData->NumberOfProcessors; Index++) {
|
||||||
DEBUG ((DEBUG_INFO, "mMpInformationHobData[0x%lx]: %d, %d, %d\n",
|
DEBUG ((
|
||||||
mMpInformationHobData->ProcessorInfoBuffer[Index].ProcessorId,
|
DEBUG_INFO,
|
||||||
mMpInformationHobData->ProcessorInfoBuffer[Index].Location.Package,
|
"mMpInformationHobData[0x%lx]: %d, %d, %d\n",
|
||||||
mMpInformationHobData->ProcessorInfoBuffer[Index].Location.Core,
|
mMpInformationHobData->ProcessorInfoBuffer[Index].ProcessorId,
|
||||||
mMpInformationHobData->ProcessorInfoBuffer[Index].Location.Thread));
|
mMpInformationHobData->ProcessorInfoBuffer[Index].Location.Package,
|
||||||
|
mMpInformationHobData->ProcessorInfoBuffer[Index].Location.Core,
|
||||||
|
mMpInformationHobData->ProcessorInfoBuffer[Index].Location.Thread
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -240,11 +248,12 @@ StandaloneMmCpuInitialize (
|
|||||||
Status = mMmst->MmAllocatePool (
|
Status = mMmst->MmAllocatePool (
|
||||||
EfiRuntimeServicesData,
|
EfiRuntimeServicesData,
|
||||||
ArraySize,
|
ArraySize,
|
||||||
(VOID **) &PerCpuGuidedEventContext
|
(VOID **)&PerCpuGuidedEventContext
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_INFO, "PerCpuGuidedEventContext mem alloc failed - 0x%x\n", Status));
|
DEBUG ((DEBUG_INFO, "PerCpuGuidedEventContext mem alloc failed - 0x%x\n", Status));
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
@@ -18,20 +18,20 @@
|
|||||||
//
|
//
|
||||||
// CPU driver initialization specific declarations
|
// CPU driver initialization specific declarations
|
||||||
//
|
//
|
||||||
extern EFI_MM_SYSTEM_TABLE *mMmst;
|
extern EFI_MM_SYSTEM_TABLE *mMmst;
|
||||||
|
|
||||||
//
|
//
|
||||||
// CPU State Save protocol specific declarations
|
// CPU State Save protocol specific declarations
|
||||||
//
|
//
|
||||||
extern EFI_MM_CPU_PROTOCOL mMmCpuState;
|
extern EFI_MM_CPU_PROTOCOL mMmCpuState;
|
||||||
|
|
||||||
//
|
//
|
||||||
// MM event handling specific declarations
|
// MM event handling specific declarations
|
||||||
//
|
//
|
||||||
extern EFI_MM_COMMUNICATE_HEADER **PerCpuGuidedEventContext;
|
extern EFI_MM_COMMUNICATE_HEADER **PerCpuGuidedEventContext;
|
||||||
extern EFI_MMRAM_DESCRIPTOR mNsCommBuffer;
|
extern EFI_MMRAM_DESCRIPTOR mNsCommBuffer;
|
||||||
extern MP_INFORMATION_HOB_DATA *mMpInformationHobData;
|
extern MP_INFORMATION_HOB_DATA *mMpInformationHobData;
|
||||||
extern EFI_MM_CONFIGURATION_PROTOCOL mMmConfig;
|
extern EFI_MM_CONFIGURATION_PROTOCOL mMmConfig;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The PI Standalone MM entry point for the TF-A CPU driver.
|
The PI Standalone MM entry point for the TF-A CPU driver.
|
||||||
@@ -48,9 +48,9 @@ extern EFI_MM_CONFIGURATION_PROTOCOL mMmConfig;
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
PiMmStandaloneArmTfCpuDriverEntry (
|
PiMmStandaloneArmTfCpuDriverEntry (
|
||||||
IN UINTN EventId,
|
IN UINTN EventId,
|
||||||
IN UINTN CpuNumber,
|
IN UINTN CpuNumber,
|
||||||
IN UINTN NsCommBufferAddr
|
IN UINTN NsCommBufferAddr
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -72,10 +72,10 @@ PiMmStandaloneArmTfCpuDriverEntry (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PiMmCpuTpFwRootMmiHandler (
|
PiMmCpuTpFwRootMmiHandler (
|
||||||
IN EFI_HANDLE DispatchHandle,
|
IN EFI_HANDLE DispatchHandle,
|
||||||
IN CONST VOID *Context OPTIONAL,
|
IN CONST VOID *Context OPTIONAL,
|
||||||
IN OUT VOID *CommBuffer OPTIONAL,
|
IN OUT VOID *CommBuffer OPTIONAL,
|
||||||
IN OUT UINTN *CommBufferSize OPTIONAL
|
IN OUT UINTN *CommBufferSize OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -13,16 +13,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#define MM_CORE_DATA_HOB_GUID \
|
#define MM_CORE_DATA_HOB_GUID \
|
||||||
{ 0xa160bf99, 0x2aa4, 0x4d7d, { 0x99, 0x93, 0x89, 0x9c, 0xb1, 0x2d, 0xf3, 0x76 }}
|
{ 0xa160bf99, 0x2aa4, 0x4d7d, { 0x99, 0x93, 0x89, 0x9c, 0xb1, 0x2d, 0xf3, 0x76 }}
|
||||||
|
|
||||||
extern EFI_GUID gMmCoreDataHobGuid;
|
extern EFI_GUID gMmCoreDataHobGuid;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
//
|
//
|
||||||
// Address pointer to MM_CORE_PRIVATE_DATA
|
// Address pointer to MM_CORE_PRIVATE_DATA
|
||||||
//
|
//
|
||||||
EFI_PHYSICAL_ADDRESS Address;
|
EFI_PHYSICAL_ADDRESS Address;
|
||||||
} MM_CORE_DATA_HOB_DATA;
|
} MM_CORE_DATA_HOB_DATA;
|
||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Define values for the communications buffer used when gEfiEventDxeDispatchGuid is
|
/// Define values for the communications buffer used when gEfiEventDxeDispatchGuid is
|
||||||
/// event signaled. This event is signaled by the DXE Core each time the DXE Core
|
/// event signaled. This event is signaled by the DXE Core each time the DXE Core
|
||||||
@@ -55,19 +54,19 @@ typedef struct {
|
|||||||
/// thos structure.
|
/// thos structure.
|
||||||
///
|
///
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT64 Signature;
|
UINT64 Signature;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// The number of MMRAM ranges passed from the MM IPL to the MM Core. The MM
|
/// The number of MMRAM ranges passed from the MM IPL to the MM Core. The MM
|
||||||
/// Core uses these ranges of MMRAM to initialize the MM Core memory manager.
|
/// Core uses these ranges of MMRAM to initialize the MM Core memory manager.
|
||||||
///
|
///
|
||||||
UINT64 MmramRangeCount;
|
UINT64 MmramRangeCount;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// A table of MMRAM ranges passed from the MM IPL to the MM Core. The MM
|
/// A table of MMRAM ranges passed from the MM IPL to the MM Core. The MM
|
||||||
/// Core uses these ranges of MMRAM to initialize the MM Core memory manager.
|
/// Core uses these ranges of MMRAM to initialize the MM Core memory manager.
|
||||||
///
|
///
|
||||||
EFI_PHYSICAL_ADDRESS MmramRanges;
|
EFI_PHYSICAL_ADDRESS MmramRanges;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// The MM Foundation Entry Point. The MM Core fills in this field when the
|
/// The MM Foundation Entry Point. The MM Core fills in this field when the
|
||||||
@@ -78,50 +77,50 @@ typedef struct {
|
|||||||
/// the MM Foundation Entry Point as soon as the MM Configuration Protocol is
|
/// the MM Foundation Entry Point as soon as the MM Configuration Protocol is
|
||||||
/// available.
|
/// available.
|
||||||
///
|
///
|
||||||
EFI_PHYSICAL_ADDRESS MmEntryPoint;
|
EFI_PHYSICAL_ADDRESS MmEntryPoint;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Boolean flag set to TRUE while an MMI is being processed by the MM Core.
|
/// Boolean flag set to TRUE while an MMI is being processed by the MM Core.
|
||||||
///
|
///
|
||||||
BOOLEAN MmEntryPointRegistered;
|
BOOLEAN MmEntryPointRegistered;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Boolean flag set to TRUE while an MMI is being processed by the MM Core.
|
/// Boolean flag set to TRUE while an MMI is being processed by the MM Core.
|
||||||
///
|
///
|
||||||
BOOLEAN InMm;
|
BOOLEAN InMm;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// This field is set by the MM Core then the MM Core is initialized. This field is
|
/// This field is set by the MM Core then the MM Core is initialized. This field is
|
||||||
/// used by the MM Base 2 Protocol and MM Communication Protocol implementations in
|
/// used by the MM Base 2 Protocol and MM Communication Protocol implementations in
|
||||||
/// the MM IPL.
|
/// the MM IPL.
|
||||||
///
|
///
|
||||||
EFI_PHYSICAL_ADDRESS Mmst;
|
EFI_PHYSICAL_ADDRESS Mmst;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// This field is used by the MM Communication Protocol to pass a buffer into
|
/// This field is used by the MM Communication Protocol to pass a buffer into
|
||||||
/// a software MMI handler and for the software MMI handler to pass a buffer back to
|
/// a software MMI handler and for the software MMI handler to pass a buffer back to
|
||||||
/// the caller of the MM Communication Protocol.
|
/// the caller of the MM Communication Protocol.
|
||||||
///
|
///
|
||||||
EFI_PHYSICAL_ADDRESS CommunicationBuffer;
|
EFI_PHYSICAL_ADDRESS CommunicationBuffer;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// This field is used by the MM Communication Protocol to pass the size of a buffer,
|
/// This field is used by the MM Communication Protocol to pass the size of a buffer,
|
||||||
/// in bytes, into a software MMI handler and for the software MMI handler to pass the
|
/// in bytes, into a software MMI handler and for the software MMI handler to pass the
|
||||||
/// size, in bytes, of a buffer back to the caller of the MM Communication Protocol.
|
/// size, in bytes, of a buffer back to the caller of the MM Communication Protocol.
|
||||||
///
|
///
|
||||||
UINT64 BufferSize;
|
UINT64 BufferSize;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// This field is used by the MM Communication Protocol to pass the return status from
|
/// This field is used by the MM Communication Protocol to pass the return status from
|
||||||
/// a software MMI handler back to the caller of the MM Communication Protocol.
|
/// a software MMI handler back to the caller of the MM Communication Protocol.
|
||||||
///
|
///
|
||||||
UINT64 ReturnStatus;
|
UINT64 ReturnStatus;
|
||||||
|
|
||||||
EFI_PHYSICAL_ADDRESS MmCoreImageBase;
|
EFI_PHYSICAL_ADDRESS MmCoreImageBase;
|
||||||
UINT64 MmCoreImageSize;
|
UINT64 MmCoreImageSize;
|
||||||
EFI_PHYSICAL_ADDRESS MmCoreEntryPoint;
|
EFI_PHYSICAL_ADDRESS MmCoreEntryPoint;
|
||||||
|
|
||||||
EFI_PHYSICAL_ADDRESS StandaloneBfvAddress;
|
EFI_PHYSICAL_ADDRESS StandaloneBfvAddress;
|
||||||
} MM_CORE_PRIVATE_DATA;
|
} MM_CORE_PRIVATE_DATA;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -14,19 +14,19 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#define MM_FV_DISPATCH_GUID \
|
#define MM_FV_DISPATCH_GUID \
|
||||||
{ 0xb65694cc, 0x9e3, 0x4c3b, { 0xb5, 0xcd, 0x5, 0xf4, 0x4d, 0x3c, 0xdb, 0xff }}
|
{ 0xb65694cc, 0x9e3, 0x4c3b, { 0xb5, 0xcd, 0x5, 0xf4, 0x4d, 0x3c, 0xdb, 0xff }}
|
||||||
|
|
||||||
extern EFI_GUID gMmFvDispatchGuid;
|
extern EFI_GUID gMmFvDispatchGuid;
|
||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EFI_PHYSICAL_ADDRESS Address;
|
EFI_PHYSICAL_ADDRESS Address;
|
||||||
UINT64 Size;
|
UINT64 Size;
|
||||||
} EFI_MM_COMMUNICATE_FV_DISPATCH_DATA;
|
} EFI_MM_COMMUNICATE_FV_DISPATCH_DATA;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EFI_GUID HeaderGuid;
|
EFI_GUID HeaderGuid;
|
||||||
UINTN MessageLength;
|
UINTN MessageLength;
|
||||||
EFI_MM_COMMUNICATE_FV_DISPATCH_DATA Data;
|
EFI_MM_COMMUNICATE_FV_DISPATCH_DATA Data;
|
||||||
} EFI_MM_COMMUNICATE_FV_DISPATCH;
|
} EFI_MM_COMMUNICATE_FV_DISPATCH;
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
|
@@ -42,15 +42,14 @@ typedef struct {
|
|||||||
/// In Framework MM CIS 0.91 specification, it defines the field type as UINTN.
|
/// In Framework MM CIS 0.91 specification, it defines the field type as UINTN.
|
||||||
/// However, HOBs are supposed to be CPU neutral, so UINT32 should be used instead.
|
/// However, HOBs are supposed to be CPU neutral, so UINT32 should be used instead.
|
||||||
///
|
///
|
||||||
UINT32 NumberOfMmReservedRegions;
|
UINT32 NumberOfMmReservedRegions;
|
||||||
///
|
///
|
||||||
/// Used throughout this protocol to describe the candidate
|
/// Used throughout this protocol to describe the candidate
|
||||||
/// regions for MMRAM that are supported by this platform.
|
/// regions for MMRAM that are supported by this platform.
|
||||||
///
|
///
|
||||||
EFI_MMRAM_DESCRIPTOR Descriptor[1];
|
EFI_MMRAM_DESCRIPTOR Descriptor[1];
|
||||||
} EFI_MMRAM_HOB_DESCRIPTOR_BLOCK;
|
} EFI_MMRAM_HOB_DESCRIPTOR_BLOCK;
|
||||||
|
|
||||||
extern EFI_GUID gEfiMmPeiSmramMemoryReserveGuid;
|
extern EFI_GUID gEfiMmPeiSmramMemoryReserveGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -24,12 +24,12 @@
|
|||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT64 NumberOfProcessors;
|
UINT64 NumberOfProcessors;
|
||||||
UINT64 NumberOfEnabledProcessors;
|
UINT64 NumberOfEnabledProcessors;
|
||||||
EFI_PROCESSOR_INFORMATION ProcessorInfoBuffer[];
|
EFI_PROCESSOR_INFORMATION ProcessorInfoBuffer[];
|
||||||
} MP_INFORMATION_HOB_DATA;
|
} MP_INFORMATION_HOB_DATA;
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
extern EFI_GUID gMpInformationHobGuid;
|
extern EFI_GUID gMpInformationHobGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -16,52 +16,52 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#define CPU_INFO_FLAG_PRIMARY_CPU 0x00000001
|
#define CPU_INFO_FLAG_PRIMARY_CPU 0x00000001
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT8 Type; /* type of the structure */
|
UINT8 Type; /* type of the structure */
|
||||||
UINT8 Version; /* version of this structure */
|
UINT8 Version; /* version of this structure */
|
||||||
UINT16 Size; /* size of this structure in bytes */
|
UINT16 Size; /* size of this structure in bytes */
|
||||||
UINT32 Attr; /* attributes: unused bits SBZ */
|
UINT32 Attr; /* attributes: unused bits SBZ */
|
||||||
} EFI_PARAM_HEADER;
|
} EFI_PARAM_HEADER;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT64 Mpidr;
|
UINT64 Mpidr;
|
||||||
UINT32 LinearId;
|
UINT32 LinearId;
|
||||||
UINT32 Flags;
|
UINT32 Flags;
|
||||||
} EFI_SECURE_PARTITION_CPU_INFO;
|
} EFI_SECURE_PARTITION_CPU_INFO;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EFI_PARAM_HEADER Header;
|
EFI_PARAM_HEADER Header;
|
||||||
UINT64 SpMemBase;
|
UINT64 SpMemBase;
|
||||||
UINT64 SpMemLimit;
|
UINT64 SpMemLimit;
|
||||||
UINT64 SpImageBase;
|
UINT64 SpImageBase;
|
||||||
UINT64 SpStackBase;
|
UINT64 SpStackBase;
|
||||||
UINT64 SpHeapBase;
|
UINT64 SpHeapBase;
|
||||||
UINT64 SpNsCommBufBase;
|
UINT64 SpNsCommBufBase;
|
||||||
UINT64 SpSharedBufBase;
|
UINT64 SpSharedBufBase;
|
||||||
UINT64 SpImageSize;
|
UINT64 SpImageSize;
|
||||||
UINT64 SpPcpuStackSize;
|
UINT64 SpPcpuStackSize;
|
||||||
UINT64 SpHeapSize;
|
UINT64 SpHeapSize;
|
||||||
UINT64 SpNsCommBufSize;
|
UINT64 SpNsCommBufSize;
|
||||||
UINT64 SpPcpuSharedBufSize;
|
UINT64 SpPcpuSharedBufSize;
|
||||||
UINT32 NumSpMemRegions;
|
UINT32 NumSpMemRegions;
|
||||||
UINT32 NumCpus;
|
UINT32 NumCpus;
|
||||||
EFI_SECURE_PARTITION_CPU_INFO *CpuInfo;
|
EFI_SECURE_PARTITION_CPU_INFO *CpuInfo;
|
||||||
} EFI_SECURE_PARTITION_BOOT_INFO;
|
} EFI_SECURE_PARTITION_BOOT_INFO;
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(*PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT) (
|
(*PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT) (
|
||||||
IN UINTN EventId,
|
IN UINTN EventId,
|
||||||
IN UINTN CpuNumber,
|
IN UINTN CpuNumber,
|
||||||
IN UINTN NsCommBufferAddr
|
IN UINTN NsCommBufferAddr
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT *ArmTfCpuDriverEpPtr;
|
PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT *ArmTfCpuDriverEpPtr;
|
||||||
} ARM_TF_CPU_DRIVER_EP_DESCRIPTOR;
|
} ARM_TF_CPU_DRIVER_EP_DESCRIPTOR;
|
||||||
|
|
||||||
typedef RETURN_STATUS (*REGION_PERMISSION_UPDATE_FUNC) (
|
typedef RETURN_STATUS (*REGION_PERMISSION_UPDATE_FUNC) (
|
||||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||||
IN UINT64 Length
|
IN UINT64 Length
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -82,16 +82,15 @@ typedef RETURN_STATUS (*REGION_PERMISSION_UPDATE_FUNC) (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
UpdateMmFoundationPeCoffPermissions (
|
UpdateMmFoundationPeCoffPermissions (
|
||||||
IN CONST PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
IN CONST PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
||||||
IN EFI_PHYSICAL_ADDRESS ImageBase,
|
IN EFI_PHYSICAL_ADDRESS ImageBase,
|
||||||
IN UINT32 SectionHeaderOffset,
|
IN UINT32 SectionHeaderOffset,
|
||||||
IN CONST UINT16 NumberOfSections,
|
IN CONST UINT16 NumberOfSections,
|
||||||
IN REGION_PERMISSION_UPDATE_FUNC TextUpdater,
|
IN REGION_PERMISSION_UPDATE_FUNC TextUpdater,
|
||||||
IN REGION_PERMISSION_UPDATE_FUNC ReadOnlyUpdater,
|
IN REGION_PERMISSION_UPDATE_FUNC ReadOnlyUpdater,
|
||||||
IN REGION_PERMISSION_UPDATE_FUNC ReadWriteUpdater
|
IN REGION_PERMISSION_UPDATE_FUNC ReadWriteUpdater
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Privileged firmware assigns RO & Executable attributes to all memory occupied
|
Privileged firmware assigns RO & Executable attributes to all memory occupied
|
||||||
by the Boot Firmware Volume. This function locates the section information of
|
by the Boot Firmware Volume. This function locates the section information of
|
||||||
@@ -108,14 +107,13 @@ UpdateMmFoundationPeCoffPermissions (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetStandaloneMmCorePeCoffSections (
|
GetStandaloneMmCorePeCoffSections (
|
||||||
IN VOID *TeData,
|
IN VOID *TeData,
|
||||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
||||||
OUT EFI_PHYSICAL_ADDRESS *ImageBase,
|
OUT EFI_PHYSICAL_ADDRESS *ImageBase,
|
||||||
IN OUT UINT32 *SectionHeaderOffset,
|
IN OUT UINT32 *SectionHeaderOffset,
|
||||||
IN OUT UINT16 *NumberOfSections
|
IN OUT UINT16 *NumberOfSections
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Privileged firmware assigns RO & Executable attributes to all memory occupied
|
Privileged firmware assigns RO & Executable attributes to all memory occupied
|
||||||
by the Boot Firmware Volume. This function locates the Standalone MM Core
|
by the Boot Firmware Volume. This function locates the Standalone MM Core
|
||||||
@@ -130,12 +128,11 @@ GetStandaloneMmCorePeCoffSections (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
LocateStandaloneMmCorePeCoffData (
|
LocateStandaloneMmCorePeCoffData (
|
||||||
IN EFI_FIRMWARE_VOLUME_HEADER *BfvAddress,
|
IN EFI_FIRMWARE_VOLUME_HEADER *BfvAddress,
|
||||||
IN OUT VOID **TeData,
|
IN OUT VOID **TeData,
|
||||||
IN OUT UINTN *TeDataSize
|
IN OUT UINTN *TeDataSize
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Use the boot information passed by privileged firmware to populate a HOB list
|
Use the boot information passed by privileged firmware to populate a HOB list
|
||||||
suitable for consumption by the MM Core and drivers.
|
suitable for consumption by the MM Core and drivers.
|
||||||
@@ -148,11 +145,10 @@ LocateStandaloneMmCorePeCoffData (
|
|||||||
VOID *
|
VOID *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
CreateHobListFromBootInfo (
|
CreateHobListFromBootInfo (
|
||||||
IN OUT PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT *CpuDriverEntryPoint,
|
IN OUT PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT *CpuDriverEntryPoint,
|
||||||
IN EFI_SECURE_PARTITION_BOOT_INFO *PayloadBootInfo
|
IN EFI_SECURE_PARTITION_BOOT_INFO *PayloadBootInfo
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The entry point of Standalone MM Foundation.
|
The entry point of Standalone MM Foundation.
|
||||||
|
|
||||||
@@ -171,7 +167,6 @@ _ModuleEntryPoint (
|
|||||||
IN UINT64 cookie2
|
IN UINT64 cookie2
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Auto generated function that calls the library constructors for all of the module's dependent libraries.
|
Auto generated function that calls the library constructors for all of the module's dependent libraries.
|
||||||
|
|
||||||
@@ -191,11 +186,10 @@ _ModuleEntryPoint (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ProcessLibraryConstructorList (
|
ProcessLibraryConstructorList (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_MM_SYSTEM_TABLE *MmSystemTable
|
IN EFI_MM_SYSTEM_TABLE *MmSystemTable
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Auto generated function that calls a set of module entry points.
|
Auto generated function that calls a set of module entry points.
|
||||||
|
|
||||||
|
@@ -52,9 +52,9 @@ FfsFindNextFile (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FfsFindSection (
|
FfsFindSection (
|
||||||
IN EFI_SECTION_TYPE SectionType,
|
IN EFI_SECTION_TYPE SectionType,
|
||||||
IN EFI_FFS_FILE_HEADER *FfsFileHeader,
|
IN EFI_FFS_FILE_HEADER *FfsFileHeader,
|
||||||
IN OUT EFI_COMMON_SECTION_HEADER **SectionHeader
|
IN OUT EFI_COMMON_SECTION_HEADER **SectionHeader
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -73,10 +73,10 @@ FfsFindSection (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FindFfsSectionInSections (
|
FindFfsSectionInSections (
|
||||||
IN VOID *Sections,
|
IN VOID *Sections,
|
||||||
IN UINTN SizeOfSections,
|
IN UINTN SizeOfSections,
|
||||||
IN EFI_SECTION_TYPE SectionType,
|
IN EFI_SECTION_TYPE SectionType,
|
||||||
OUT EFI_COMMON_SECTION_HEADER **FoundSection
|
OUT EFI_COMMON_SECTION_HEADER **FoundSection
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -95,10 +95,10 @@ FindFfsSectionInSections (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FfsFindSectionData (
|
FfsFindSectionData (
|
||||||
IN EFI_SECTION_TYPE SectionType,
|
IN EFI_SECTION_TYPE SectionType,
|
||||||
IN EFI_FFS_FILE_HEADER *FfsFileHeader,
|
IN EFI_FFS_FILE_HEADER *FfsFileHeader,
|
||||||
OUT VOID **SectionData,
|
OUT VOID **SectionData,
|
||||||
OUT UINTN *SectionDataSize
|
OUT UINTN *SectionDataSize
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -16,7 +16,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
///
|
///
|
||||||
extern VOID *gHobList;
|
extern VOID *gHobList;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The entry point of PE/COFF Image for the STANDALONE MM Core.
|
The entry point of PE/COFF Image for the STANDALONE MM Core.
|
||||||
|
|
||||||
@@ -35,7 +34,6 @@ _ModuleEntryPoint (
|
|||||||
IN VOID *HobStart
|
IN VOID *HobStart
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Required by the EBC compiler and identical in functionality to _ModuleEntryPoint().
|
Required by the EBC compiler and identical in functionality to _ModuleEntryPoint().
|
||||||
|
|
||||||
@@ -50,7 +48,6 @@ EfiMain (
|
|||||||
IN VOID *HobStart
|
IN VOID *HobStart
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Auto generated function that calls the library constructors for all of the module's dependent libraries.
|
Auto generated function that calls the library constructors for all of the module's dependent libraries.
|
||||||
|
|
||||||
@@ -70,11 +67,10 @@ EfiMain (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ProcessLibraryConstructorList (
|
ProcessLibraryConstructorList (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_MM_SYSTEM_TABLE *MmSystemTable
|
IN EFI_MM_SYSTEM_TABLE *MmSystemTable
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Autogenerated function that calls a set of module entry points.
|
Autogenerated function that calls a set of module entry points.
|
||||||
|
|
||||||
|
@@ -15,14 +15,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI *MM_IMAGE_ENTRY_POINT) (
|
(EFIAPI *MM_IMAGE_ENTRY_POINT)(
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_MM_SYSTEM_TABLE *MmSystemTable
|
IN EFI_MM_SYSTEM_TABLE *MmSystemTable
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI *STANDALONE_MM_FOUNDATION_ENTRY_POINT) (
|
(EFIAPI *STANDALONE_MM_FOUNDATION_ENTRY_POINT)(
|
||||||
IN VOID *HobStart
|
IN VOID *HobStart
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@@ -37,7 +37,7 @@ GetFileState (
|
|||||||
FileState = FfsHeader->State;
|
FileState = FfsHeader->State;
|
||||||
|
|
||||||
if (ErasePolarity != 0) {
|
if (ErasePolarity != 0) {
|
||||||
FileState = (EFI_FFS_FILE_STATE)~FileState;
|
FileState = (EFI_FFS_FILE_STATE) ~FileState;
|
||||||
}
|
}
|
||||||
|
|
||||||
HighestBit = 0x80;
|
HighestBit = 0x80;
|
||||||
@@ -60,31 +60,32 @@ CalculateHeaderChecksum (
|
|||||||
IN EFI_FFS_FILE_HEADER *FileHeader
|
IN EFI_FFS_FILE_HEADER *FileHeader
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINT8 *ptr;
|
UINT8 *ptr;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
UINT8 Sum;
|
UINT8 Sum;
|
||||||
|
|
||||||
Sum = 0;
|
Sum = 0;
|
||||||
ptr = (UINT8 *) FileHeader;
|
ptr = (UINT8 *)FileHeader;
|
||||||
|
|
||||||
for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {
|
for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {
|
||||||
Sum = (UINT8) (Sum + ptr[Index]);
|
Sum = (UINT8)(Sum + ptr[Index]);
|
||||||
Sum = (UINT8) (Sum + ptr[Index + 1]);
|
Sum = (UINT8)(Sum + ptr[Index + 1]);
|
||||||
Sum = (UINT8) (Sum + ptr[Index + 2]);
|
Sum = (UINT8)(Sum + ptr[Index + 2]);
|
||||||
Sum = (UINT8) (Sum + ptr[Index + 3]);
|
Sum = (UINT8)(Sum + ptr[Index + 3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {
|
for ( ; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {
|
||||||
Sum = (UINT8) (Sum + ptr[Index]);
|
Sum = (UINT8)(Sum + ptr[Index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// State field (since this indicates the different state of file).
|
// State field (since this indicates the different state of file).
|
||||||
//
|
//
|
||||||
Sum = (UINT8) (Sum - FileHeader->State);
|
Sum = (UINT8)(Sum - FileHeader->State);
|
||||||
//
|
//
|
||||||
// Checksum field of the file is not part of the header checksum.
|
// Checksum field of the file is not part of the header checksum.
|
||||||
//
|
//
|
||||||
Sum = (UINT8) (Sum - FileHeader->IntegrityCheck.Checksum.File);
|
Sum = (UINT8)(Sum - FileHeader->IntegrityCheck.Checksum.File);
|
||||||
|
|
||||||
return Sum;
|
return Sum;
|
||||||
}
|
}
|
||||||
@@ -112,15 +113,15 @@ FfsFindNextFile (
|
|||||||
IN OUT EFI_FFS_FILE_HEADER **FileHeader
|
IN OUT EFI_FFS_FILE_HEADER **FileHeader
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_FIRMWARE_VOLUME_EXT_HEADER *FvExtHeader;
|
EFI_FIRMWARE_VOLUME_EXT_HEADER *FvExtHeader;
|
||||||
|
|
||||||
EFI_FFS_FILE_HEADER *FfsFileHeader;
|
EFI_FFS_FILE_HEADER *FfsFileHeader;
|
||||||
UINT32 FileLength;
|
UINT32 FileLength;
|
||||||
UINT32 FileOccupiedSize;
|
UINT32 FileOccupiedSize;
|
||||||
UINT32 FileOffset;
|
UINT32 FileOffset;
|
||||||
UINT64 FvLength;
|
UINT64 FvLength;
|
||||||
UINT8 ErasePolarity;
|
UINT8 ErasePolarity;
|
||||||
UINT8 FileState;
|
UINT8 FileState;
|
||||||
|
|
||||||
FvLength = FwVolHeader->FvLength;
|
FvLength = FwVolHeader->FvLength;
|
||||||
if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) {
|
if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) {
|
||||||
@@ -128,41 +129,40 @@ FfsFindNextFile (
|
|||||||
} else {
|
} else {
|
||||||
ErasePolarity = 0;
|
ErasePolarity = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// If FileHeader is not specified (NULL) start with the first file in the
|
// If FileHeader is not specified (NULL) start with the first file in the
|
||||||
// firmware volume. Otherwise, start from the FileHeader.
|
// firmware volume. Otherwise, start from the FileHeader.
|
||||||
//
|
//
|
||||||
if (*FileHeader == NULL) {
|
if (*FileHeader == NULL) {
|
||||||
|
|
||||||
if (FwVolHeader->ExtHeaderOffset != 0) {
|
if (FwVolHeader->ExtHeaderOffset != 0) {
|
||||||
|
|
||||||
FvExtHeader = (EFI_FIRMWARE_VOLUME_EXT_HEADER *)((UINT8 *)FwVolHeader +
|
FvExtHeader = (EFI_FIRMWARE_VOLUME_EXT_HEADER *)((UINT8 *)FwVolHeader +
|
||||||
FwVolHeader->ExtHeaderOffset);
|
FwVolHeader->ExtHeaderOffset);
|
||||||
|
|
||||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FvExtHeader +
|
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FvExtHeader +
|
||||||
FvExtHeader->ExtHeaderSize);
|
FvExtHeader->ExtHeaderSize);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FwVolHeader +
|
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FwVolHeader +
|
||||||
FwVolHeader->HeaderLength);
|
FwVolHeader->HeaderLength);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINTN)FwVolHeader +
|
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINTN)FwVolHeader +
|
||||||
ALIGN_VALUE((UINTN)FfsFileHeader -
|
ALIGN_VALUE (
|
||||||
(UINTN)FwVolHeader, 8));
|
(UINTN)FfsFileHeader -
|
||||||
|
(UINTN)FwVolHeader,
|
||||||
|
8
|
||||||
|
));
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
// Length is 24 bits wide so mask upper 8 bits
|
// Length is 24 bits wide so mask upper 8 bits
|
||||||
// FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
|
// FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
|
||||||
//
|
//
|
||||||
FileLength = FFS_FILE_SIZE(*FileHeader);
|
FileLength = FFS_FILE_SIZE (*FileHeader);
|
||||||
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
|
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
|
||||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) *FileHeader + FileOccupiedSize);
|
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)*FileHeader + FileOccupiedSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
FileOffset = (UINT32) ((UINT8 *) FfsFileHeader - (UINT8 *) FwVolHeader);
|
FileOffset = (UINT32)((UINT8 *)FfsFileHeader - (UINT8 *)FwVolHeader);
|
||||||
|
|
||||||
while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {
|
while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {
|
||||||
//
|
//
|
||||||
@@ -171,42 +171,40 @@ FfsFindNextFile (
|
|||||||
FileState = GetFileState (ErasePolarity, FfsFileHeader);
|
FileState = GetFileState (ErasePolarity, FfsFileHeader);
|
||||||
|
|
||||||
switch (FileState) {
|
switch (FileState) {
|
||||||
|
case EFI_FILE_HEADER_INVALID:
|
||||||
|
FileOffset += sizeof (EFI_FFS_FILE_HEADER);
|
||||||
|
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER));
|
||||||
|
break;
|
||||||
|
|
||||||
case EFI_FILE_HEADER_INVALID:
|
case EFI_FILE_DATA_VALID:
|
||||||
FileOffset += sizeof (EFI_FFS_FILE_HEADER);
|
case EFI_FILE_MARKED_FOR_UPDATE:
|
||||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER));
|
if (CalculateHeaderChecksum (FfsFileHeader) == 0) {
|
||||||
break;
|
FileLength = FFS_FILE_SIZE (FfsFileHeader);
|
||||||
|
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
|
||||||
|
|
||||||
case EFI_FILE_DATA_VALID:
|
if ((SearchType == FfsFileHeader->Type) || (SearchType == EFI_FV_FILETYPE_ALL)) {
|
||||||
case EFI_FILE_MARKED_FOR_UPDATE:
|
*FileHeader = FfsFileHeader;
|
||||||
if (CalculateHeaderChecksum (FfsFileHeader) == 0) {
|
|
||||||
FileLength = FFS_FILE_SIZE(FfsFileHeader);
|
|
||||||
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
|
|
||||||
|
|
||||||
if ((SearchType == FfsFileHeader->Type) || (SearchType == EFI_FV_FILETYPE_ALL)) {
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
*FileHeader = FfsFileHeader;
|
FileOffset += FileOccupiedSize;
|
||||||
|
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize);
|
||||||
return EFI_SUCCESS;
|
} else {
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
FileOffset += FileOccupiedSize;
|
break;
|
||||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);
|
|
||||||
} else {
|
case EFI_FILE_DELETED:
|
||||||
|
FileLength = FFS_FILE_SIZE (FfsFileHeader);
|
||||||
|
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
|
||||||
|
FileOffset += FileOccupiedSize;
|
||||||
|
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EFI_FILE_DELETED:
|
|
||||||
FileLength = FFS_FILE_SIZE(FfsFileHeader);
|
|
||||||
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
|
|
||||||
FileOffset += FileOccupiedSize;
|
|
||||||
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return EFI_NOT_FOUND;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -229,30 +227,31 @@ FfsFindNextFile (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FindFfsSectionInSections (
|
FindFfsSectionInSections (
|
||||||
IN VOID *Sections,
|
IN VOID *Sections,
|
||||||
IN UINTN SizeOfSections,
|
IN UINTN SizeOfSections,
|
||||||
IN EFI_SECTION_TYPE SectionType,
|
IN EFI_SECTION_TYPE SectionType,
|
||||||
OUT EFI_COMMON_SECTION_HEADER **FoundSection
|
OUT EFI_COMMON_SECTION_HEADER **FoundSection
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_PHYSICAL_ADDRESS CurrentAddress;
|
EFI_PHYSICAL_ADDRESS CurrentAddress;
|
||||||
UINT32 Size;
|
UINT32 Size;
|
||||||
EFI_PHYSICAL_ADDRESS EndOfSections;
|
EFI_PHYSICAL_ADDRESS EndOfSections;
|
||||||
EFI_COMMON_SECTION_HEADER *Section;
|
EFI_COMMON_SECTION_HEADER *Section;
|
||||||
EFI_PHYSICAL_ADDRESS EndOfSection;
|
EFI_PHYSICAL_ADDRESS EndOfSection;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Loop through the FFS file sections
|
// Loop through the FFS file sections
|
||||||
//
|
//
|
||||||
EndOfSection = (EFI_PHYSICAL_ADDRESS)(UINTN) Sections;
|
EndOfSection = (EFI_PHYSICAL_ADDRESS)(UINTN)Sections;
|
||||||
EndOfSections = EndOfSection + SizeOfSections;
|
EndOfSections = EndOfSection + SizeOfSections;
|
||||||
for (;;) {
|
for ( ; ;) {
|
||||||
if (EndOfSection == EndOfSections) {
|
if (EndOfSection == EndOfSections) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
CurrentAddress = EndOfSection;
|
CurrentAddress = EndOfSection;
|
||||||
|
|
||||||
Section = (EFI_COMMON_SECTION_HEADER*)(UINTN) CurrentAddress;
|
Section = (EFI_COMMON_SECTION_HEADER *)(UINTN)CurrentAddress;
|
||||||
|
|
||||||
Size = SECTION_SIZE (Section);
|
Size = SECTION_SIZE (Section);
|
||||||
if (Size < sizeof (*Section)) {
|
if (Size < sizeof (*Section)) {
|
||||||
@@ -263,6 +262,7 @@ FindFfsSectionInSections (
|
|||||||
if (EndOfSection > EndOfSections) {
|
if (EndOfSection > EndOfSections) {
|
||||||
return EFI_VOLUME_CORRUPTED;
|
return EFI_VOLUME_CORRUPTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
Size = GET_OCCUPIED_SIZE (Size, 4);
|
Size = GET_OCCUPIED_SIZE (Size, 4);
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -292,22 +292,22 @@ FindFfsSectionInSections (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FfsFindSection (
|
FfsFindSection (
|
||||||
IN EFI_SECTION_TYPE SectionType,
|
IN EFI_SECTION_TYPE SectionType,
|
||||||
IN EFI_FFS_FILE_HEADER *FfsFileHeader,
|
IN EFI_FFS_FILE_HEADER *FfsFileHeader,
|
||||||
IN OUT EFI_COMMON_SECTION_HEADER **SectionHeader
|
IN OUT EFI_COMMON_SECTION_HEADER **SectionHeader
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINT32 FileSize;
|
UINT32 FileSize;
|
||||||
EFI_COMMON_SECTION_HEADER *Section;
|
EFI_COMMON_SECTION_HEADER *Section;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Size is 24 bits wide so mask upper 8 bits.
|
// Size is 24 bits wide so mask upper 8 bits.
|
||||||
// Does not include FfsFileHeader header size
|
// Does not include FfsFileHeader header size
|
||||||
// FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
|
// FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
|
||||||
//
|
//
|
||||||
Section = (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1);
|
Section = (EFI_COMMON_SECTION_HEADER *)(FfsFileHeader + 1);
|
||||||
FileSize = FFS_FILE_SIZE(FfsFileHeader);
|
FileSize = FFS_FILE_SIZE (FfsFileHeader);
|
||||||
FileSize -= sizeof (EFI_FFS_FILE_HEADER);
|
FileSize -= sizeof (EFI_FFS_FILE_HEADER);
|
||||||
|
|
||||||
Status = FindFfsSectionInSections (
|
Status = FindFfsSectionInSections (
|
||||||
@@ -335,44 +335,45 @@ FfsFindSection (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FfsFindSectionData (
|
FfsFindSectionData (
|
||||||
IN EFI_SECTION_TYPE SectionType,
|
IN EFI_SECTION_TYPE SectionType,
|
||||||
IN EFI_FFS_FILE_HEADER *FfsFileHeader,
|
IN EFI_FFS_FILE_HEADER *FfsFileHeader,
|
||||||
IN OUT VOID **SectionData,
|
IN OUT VOID **SectionData,
|
||||||
IN OUT UINTN *SectionDataSize
|
IN OUT UINTN *SectionDataSize
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINT32 FileSize;
|
UINT32 FileSize;
|
||||||
EFI_COMMON_SECTION_HEADER *Section;
|
EFI_COMMON_SECTION_HEADER *Section;
|
||||||
UINT32 SectionLength;
|
UINT32 SectionLength;
|
||||||
UINT32 ParsedLength;
|
UINT32 ParsedLength;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Size is 24 bits wide so mask upper 8 bits.
|
// Size is 24 bits wide so mask upper 8 bits.
|
||||||
// Does not include FfsFileHeader header size
|
// Does not include FfsFileHeader header size
|
||||||
// FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
|
// FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
|
||||||
//
|
//
|
||||||
Section = (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1);
|
Section = (EFI_COMMON_SECTION_HEADER *)(FfsFileHeader + 1);
|
||||||
FileSize = FFS_FILE_SIZE(FfsFileHeader);
|
FileSize = FFS_FILE_SIZE (FfsFileHeader);
|
||||||
FileSize -= sizeof (EFI_FFS_FILE_HEADER);
|
FileSize -= sizeof (EFI_FFS_FILE_HEADER);
|
||||||
|
|
||||||
*SectionData = NULL;
|
*SectionData = NULL;
|
||||||
ParsedLength = 0;
|
ParsedLength = 0;
|
||||||
while (ParsedLength < FileSize) {
|
while (ParsedLength < FileSize) {
|
||||||
if (Section->Type == SectionType) {
|
if (Section->Type == SectionType) {
|
||||||
*SectionData = (VOID *) (Section + 1);
|
*SectionData = (VOID *)(Section + 1);
|
||||||
*SectionDataSize = SECTION_SIZE(Section);
|
*SectionDataSize = SECTION_SIZE (Section);
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Size is 24 bits wide so mask upper 8 bits.
|
// Size is 24 bits wide so mask upper 8 bits.
|
||||||
// SectionLength is adjusted it is 4 byte aligned.
|
// SectionLength is adjusted it is 4 byte aligned.
|
||||||
// Go to the next section
|
// Go to the next section
|
||||||
//
|
//
|
||||||
SectionLength = SECTION_SIZE(Section);
|
SectionLength = SECTION_SIZE (Section);
|
||||||
SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
|
SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
|
||||||
|
|
||||||
ParsedLength += SectionLength;
|
ParsedLength += SectionLength;
|
||||||
Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + SectionLength);
|
Section = (EFI_COMMON_SECTION_HEADER *)((UINT8 *)Section + SectionLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
|
@@ -7,7 +7,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#include <PiMm.h>
|
#include <PiMm.h>
|
||||||
|
|
||||||
#include <PiPei.h>
|
#include <PiPei.h>
|
||||||
@@ -25,7 +24,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include <IndustryStandard/ArmStdSmc.h>
|
#include <IndustryStandard/ArmStdSmc.h>
|
||||||
|
|
||||||
extern EFI_HOB_HANDOFF_INFO_TABLE*
|
extern EFI_HOB_HANDOFF_INFO_TABLE *
|
||||||
HobConstructor (
|
HobConstructor (
|
||||||
IN VOID *EfiMemoryBegin,
|
IN VOID *EfiMemoryBegin,
|
||||||
IN UINTN EfiMemoryLength,
|
IN UINTN EfiMemoryLength,
|
||||||
@@ -35,12 +34,12 @@ HobConstructor (
|
|||||||
|
|
||||||
// GUID to identify HOB with whereabouts of communication buffer with Normal
|
// GUID to identify HOB with whereabouts of communication buffer with Normal
|
||||||
// World
|
// World
|
||||||
extern EFI_GUID gEfiStandaloneMmNonSecureBufferGuid;
|
extern EFI_GUID gEfiStandaloneMmNonSecureBufferGuid;
|
||||||
|
|
||||||
// GUID to identify HOB where the entry point of the CPU driver will be
|
// GUID to identify HOB where the entry point of the CPU driver will be
|
||||||
// populated to allow this entry point driver to invoke it upon receipt of an
|
// populated to allow this entry point driver to invoke it upon receipt of an
|
||||||
// event
|
// event
|
||||||
extern EFI_GUID gEfiArmTfCpuDriverEpDescriptorGuid;
|
extern EFI_GUID gEfiArmTfCpuDriverEpDescriptorGuid;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Use the boot information passed by privileged firmware to populate a HOB list
|
Use the boot information passed by privileged firmware to populate a HOB list
|
||||||
@@ -53,33 +52,33 @@ extern EFI_GUID gEfiArmTfCpuDriverEpDescriptorGuid;
|
|||||||
**/
|
**/
|
||||||
VOID *
|
VOID *
|
||||||
CreateHobListFromBootInfo (
|
CreateHobListFromBootInfo (
|
||||||
IN OUT PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT *CpuDriverEntryPoint,
|
IN OUT PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT *CpuDriverEntryPoint,
|
||||||
IN EFI_SECURE_PARTITION_BOOT_INFO *PayloadBootInfo
|
IN EFI_SECURE_PARTITION_BOOT_INFO *PayloadBootInfo
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_HANDOFF_INFO_TABLE *HobStart;
|
EFI_HOB_HANDOFF_INFO_TABLE *HobStart;
|
||||||
EFI_RESOURCE_ATTRIBUTE_TYPE Attributes;
|
EFI_RESOURCE_ATTRIBUTE_TYPE Attributes;
|
||||||
UINT32 Index;
|
UINT32 Index;
|
||||||
UINT32 BufferSize;
|
UINT32 BufferSize;
|
||||||
UINT32 Flags;
|
UINT32 Flags;
|
||||||
EFI_MMRAM_HOB_DESCRIPTOR_BLOCK *MmramRangesHob;
|
EFI_MMRAM_HOB_DESCRIPTOR_BLOCK *MmramRangesHob;
|
||||||
EFI_MMRAM_DESCRIPTOR *MmramRanges;
|
EFI_MMRAM_DESCRIPTOR *MmramRanges;
|
||||||
EFI_MMRAM_DESCRIPTOR *NsCommBufMmramRange;
|
EFI_MMRAM_DESCRIPTOR *NsCommBufMmramRange;
|
||||||
MP_INFORMATION_HOB_DATA *MpInformationHobData;
|
MP_INFORMATION_HOB_DATA *MpInformationHobData;
|
||||||
EFI_PROCESSOR_INFORMATION *ProcInfoBuffer;
|
EFI_PROCESSOR_INFORMATION *ProcInfoBuffer;
|
||||||
EFI_SECURE_PARTITION_CPU_INFO *CpuInfo;
|
EFI_SECURE_PARTITION_CPU_INFO *CpuInfo;
|
||||||
ARM_TF_CPU_DRIVER_EP_DESCRIPTOR *CpuDriverEntryPointDesc;
|
ARM_TF_CPU_DRIVER_EP_DESCRIPTOR *CpuDriverEntryPointDesc;
|
||||||
|
|
||||||
// Create a hoblist with a PHIT and EOH
|
// Create a hoblist with a PHIT and EOH
|
||||||
HobStart = HobConstructor (
|
HobStart = HobConstructor (
|
||||||
(VOID *) (UINTN) PayloadBootInfo->SpMemBase,
|
(VOID *)(UINTN)PayloadBootInfo->SpMemBase,
|
||||||
(UINTN) PayloadBootInfo->SpMemLimit - PayloadBootInfo->SpMemBase,
|
(UINTN)PayloadBootInfo->SpMemLimit - PayloadBootInfo->SpMemBase,
|
||||||
(VOID *) (UINTN) PayloadBootInfo->SpHeapBase,
|
(VOID *)(UINTN)PayloadBootInfo->SpHeapBase,
|
||||||
(VOID *) (UINTN) (PayloadBootInfo->SpHeapBase + PayloadBootInfo->SpHeapSize)
|
(VOID *)(UINTN)(PayloadBootInfo->SpHeapBase + PayloadBootInfo->SpHeapSize)
|
||||||
);
|
);
|
||||||
|
|
||||||
// Check that the Hoblist starts at the bottom of the Heap
|
// Check that the Hoblist starts at the bottom of the Heap
|
||||||
ASSERT (HobStart == (VOID *) (UINTN) PayloadBootInfo->SpHeapBase);
|
ASSERT (HobStart == (VOID *)(UINTN)PayloadBootInfo->SpHeapBase);
|
||||||
|
|
||||||
// Build a Boot Firmware Volume HOB
|
// Build a Boot Firmware Volume HOB
|
||||||
BuildFvHob (PayloadBootInfo->SpImageBase, PayloadBootInfo->SpImageSize);
|
BuildFvHob (PayloadBootInfo->SpImageBase, PayloadBootInfo->SpImageSize);
|
||||||
@@ -87,24 +86,24 @@ CreateHobListFromBootInfo (
|
|||||||
// Build a resource descriptor Hob that describes the available physical
|
// Build a resource descriptor Hob that describes the available physical
|
||||||
// memory range
|
// memory range
|
||||||
Attributes = (
|
Attributes = (
|
||||||
EFI_RESOURCE_ATTRIBUTE_PRESENT |
|
EFI_RESOURCE_ATTRIBUTE_PRESENT |
|
||||||
EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
|
EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
|
||||||
EFI_RESOURCE_ATTRIBUTE_TESTED |
|
EFI_RESOURCE_ATTRIBUTE_TESTED |
|
||||||
EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
|
EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
|
||||||
EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
|
EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |
|
||||||
EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
|
EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |
|
||||||
EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
|
EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
|
||||||
);
|
);
|
||||||
|
|
||||||
BuildResourceDescriptorHob (
|
BuildResourceDescriptorHob (
|
||||||
EFI_RESOURCE_SYSTEM_MEMORY,
|
EFI_RESOURCE_SYSTEM_MEMORY,
|
||||||
Attributes,
|
Attributes,
|
||||||
(UINTN) PayloadBootInfo->SpMemBase,
|
(UINTN)PayloadBootInfo->SpMemBase,
|
||||||
PayloadBootInfo->SpMemLimit - PayloadBootInfo->SpMemBase
|
PayloadBootInfo->SpMemLimit - PayloadBootInfo->SpMemBase
|
||||||
);
|
);
|
||||||
|
|
||||||
// Find the size of the GUIDed HOB with MP information
|
// Find the size of the GUIDed HOB with MP information
|
||||||
BufferSize = sizeof (MP_INFORMATION_HOB_DATA);
|
BufferSize = sizeof (MP_INFORMATION_HOB_DATA);
|
||||||
BufferSize += sizeof (EFI_PROCESSOR_INFORMATION) * PayloadBootInfo->NumCpus;
|
BufferSize += sizeof (EFI_PROCESSOR_INFORMATION) * PayloadBootInfo->NumCpus;
|
||||||
|
|
||||||
// Create a Guided MP information HOB to enable the ARM TF CPU driver to
|
// Create a Guided MP information HOB to enable the ARM TF CPU driver to
|
||||||
@@ -113,30 +112,31 @@ CreateHobListFromBootInfo (
|
|||||||
|
|
||||||
// Populate the MP information HOB with the topology information passed by
|
// Populate the MP information HOB with the topology information passed by
|
||||||
// privileged firmware
|
// privileged firmware
|
||||||
MpInformationHobData->NumberOfProcessors = PayloadBootInfo->NumCpus;
|
MpInformationHobData->NumberOfProcessors = PayloadBootInfo->NumCpus;
|
||||||
MpInformationHobData->NumberOfEnabledProcessors = PayloadBootInfo->NumCpus;
|
MpInformationHobData->NumberOfEnabledProcessors = PayloadBootInfo->NumCpus;
|
||||||
ProcInfoBuffer = MpInformationHobData->ProcessorInfoBuffer;
|
ProcInfoBuffer = MpInformationHobData->ProcessorInfoBuffer;
|
||||||
CpuInfo = PayloadBootInfo->CpuInfo;
|
CpuInfo = PayloadBootInfo->CpuInfo;
|
||||||
|
|
||||||
for (Index = 0; Index < PayloadBootInfo->NumCpus; Index++) {
|
for (Index = 0; Index < PayloadBootInfo->NumCpus; Index++) {
|
||||||
ProcInfoBuffer[Index].ProcessorId = CpuInfo[Index].Mpidr;
|
ProcInfoBuffer[Index].ProcessorId = CpuInfo[Index].Mpidr;
|
||||||
ProcInfoBuffer[Index].Location.Package = GET_CLUSTER_ID(CpuInfo[Index].Mpidr);
|
ProcInfoBuffer[Index].Location.Package = GET_CLUSTER_ID (CpuInfo[Index].Mpidr);
|
||||||
ProcInfoBuffer[Index].Location.Core = GET_CORE_ID(CpuInfo[Index].Mpidr);
|
ProcInfoBuffer[Index].Location.Core = GET_CORE_ID (CpuInfo[Index].Mpidr);
|
||||||
ProcInfoBuffer[Index].Location.Thread = GET_CORE_ID(CpuInfo[Index].Mpidr);
|
ProcInfoBuffer[Index].Location.Thread = GET_CORE_ID (CpuInfo[Index].Mpidr);
|
||||||
|
|
||||||
Flags = PROCESSOR_ENABLED_BIT | PROCESSOR_HEALTH_STATUS_BIT;
|
Flags = PROCESSOR_ENABLED_BIT | PROCESSOR_HEALTH_STATUS_BIT;
|
||||||
if (CpuInfo[Index].Flags & CPU_INFO_FLAG_PRIMARY_CPU) {
|
if (CpuInfo[Index].Flags & CPU_INFO_FLAG_PRIMARY_CPU) {
|
||||||
Flags |= PROCESSOR_AS_BSP_BIT;
|
Flags |= PROCESSOR_AS_BSP_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProcInfoBuffer[Index].StatusFlag = Flags;
|
ProcInfoBuffer[Index].StatusFlag = Flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a Guided HOB to tell the ARM TF CPU driver the location and length
|
// Create a Guided HOB to tell the ARM TF CPU driver the location and length
|
||||||
// of the communication buffer shared with the Normal world.
|
// of the communication buffer shared with the Normal world.
|
||||||
NsCommBufMmramRange = (EFI_MMRAM_DESCRIPTOR *) BuildGuidHob (
|
NsCommBufMmramRange = (EFI_MMRAM_DESCRIPTOR *)BuildGuidHob (
|
||||||
&gEfiStandaloneMmNonSecureBufferGuid,
|
&gEfiStandaloneMmNonSecureBufferGuid,
|
||||||
sizeof (EFI_MMRAM_DESCRIPTOR)
|
sizeof (EFI_MMRAM_DESCRIPTOR)
|
||||||
);
|
);
|
||||||
NsCommBufMmramRange->PhysicalStart = PayloadBootInfo->SpNsCommBufBase;
|
NsCommBufMmramRange->PhysicalStart = PayloadBootInfo->SpNsCommBufBase;
|
||||||
NsCommBufMmramRange->CpuStart = PayloadBootInfo->SpNsCommBufBase;
|
NsCommBufMmramRange->CpuStart = PayloadBootInfo->SpNsCommBufBase;
|
||||||
NsCommBufMmramRange->PhysicalSize = PayloadBootInfo->SpNsCommBufSize;
|
NsCommBufMmramRange->PhysicalSize = PayloadBootInfo->SpNsCommBufSize;
|
||||||
@@ -144,16 +144,16 @@ CreateHobListFromBootInfo (
|
|||||||
|
|
||||||
// Create a Guided HOB to enable the ARM TF CPU driver to share its entry
|
// Create a Guided HOB to enable the ARM TF CPU driver to share its entry
|
||||||
// point and populate it with the address of the shared buffer
|
// point and populate it with the address of the shared buffer
|
||||||
CpuDriverEntryPointDesc = (ARM_TF_CPU_DRIVER_EP_DESCRIPTOR *) BuildGuidHob (
|
CpuDriverEntryPointDesc = (ARM_TF_CPU_DRIVER_EP_DESCRIPTOR *)BuildGuidHob (
|
||||||
&gEfiArmTfCpuDriverEpDescriptorGuid,
|
&gEfiArmTfCpuDriverEpDescriptorGuid,
|
||||||
sizeof (ARM_TF_CPU_DRIVER_EP_DESCRIPTOR)
|
sizeof (ARM_TF_CPU_DRIVER_EP_DESCRIPTOR)
|
||||||
);
|
);
|
||||||
|
|
||||||
*CpuDriverEntryPoint = NULL;
|
*CpuDriverEntryPoint = NULL;
|
||||||
CpuDriverEntryPointDesc->ArmTfCpuDriverEpPtr = CpuDriverEntryPoint;
|
CpuDriverEntryPointDesc->ArmTfCpuDriverEpPtr = CpuDriverEntryPoint;
|
||||||
|
|
||||||
// Find the size of the GUIDed HOB with SRAM ranges
|
// Find the size of the GUIDed HOB with SRAM ranges
|
||||||
BufferSize = sizeof (EFI_MMRAM_HOB_DESCRIPTOR_BLOCK);
|
BufferSize = sizeof (EFI_MMRAM_HOB_DESCRIPTOR_BLOCK);
|
||||||
BufferSize += PayloadBootInfo->NumSpMemRegions * sizeof (EFI_MMRAM_DESCRIPTOR);
|
BufferSize += PayloadBootInfo->NumSpMemRegions * sizeof (EFI_MMRAM_DESCRIPTOR);
|
||||||
|
|
||||||
// Create a GUIDed HOB with SRAM ranges
|
// Create a GUIDed HOB with SRAM ranges
|
||||||
@@ -190,9 +190,9 @@ CreateHobListFromBootInfo (
|
|||||||
MmramRanges[3].RegionState = EFI_CACHEABLE | EFI_ALLOCATED;
|
MmramRanges[3].RegionState = EFI_CACHEABLE | EFI_ALLOCATED;
|
||||||
|
|
||||||
// Base and size of heap memory shared by all cpus
|
// Base and size of heap memory shared by all cpus
|
||||||
MmramRanges[4].PhysicalStart = (EFI_PHYSICAL_ADDRESS) (UINTN) HobStart;
|
MmramRanges[4].PhysicalStart = (EFI_PHYSICAL_ADDRESS)(UINTN)HobStart;
|
||||||
MmramRanges[4].CpuStart = (EFI_PHYSICAL_ADDRESS) (UINTN) HobStart;
|
MmramRanges[4].CpuStart = (EFI_PHYSICAL_ADDRESS)(UINTN)HobStart;
|
||||||
MmramRanges[4].PhysicalSize = HobStart->EfiFreeMemoryBottom - (EFI_PHYSICAL_ADDRESS) (UINTN) HobStart;
|
MmramRanges[4].PhysicalSize = HobStart->EfiFreeMemoryBottom - (EFI_PHYSICAL_ADDRESS)(UINTN)HobStart;
|
||||||
MmramRanges[4].RegionState = EFI_CACHEABLE | EFI_ALLOCATED;
|
MmramRanges[4].RegionState = EFI_CACHEABLE | EFI_ALLOCATED;
|
||||||
|
|
||||||
// Base and size of heap memory shared by all cpus
|
// Base and size of heap memory shared by all cpus
|
||||||
|
@@ -7,7 +7,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#include <PiMm.h>
|
#include <PiMm.h>
|
||||||
|
|
||||||
#include <PiPei.h>
|
#include <PiPei.h>
|
||||||
@@ -43,21 +42,21 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
UpdateMmFoundationPeCoffPermissions (
|
UpdateMmFoundationPeCoffPermissions (
|
||||||
IN CONST PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
IN CONST PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
||||||
IN EFI_PHYSICAL_ADDRESS ImageBase,
|
IN EFI_PHYSICAL_ADDRESS ImageBase,
|
||||||
IN UINT32 SectionHeaderOffset,
|
IN UINT32 SectionHeaderOffset,
|
||||||
IN CONST UINT16 NumberOfSections,
|
IN CONST UINT16 NumberOfSections,
|
||||||
IN REGION_PERMISSION_UPDATE_FUNC TextUpdater,
|
IN REGION_PERMISSION_UPDATE_FUNC TextUpdater,
|
||||||
IN REGION_PERMISSION_UPDATE_FUNC ReadOnlyUpdater,
|
IN REGION_PERMISSION_UPDATE_FUNC ReadOnlyUpdater,
|
||||||
IN REGION_PERMISSION_UPDATE_FUNC ReadWriteUpdater
|
IN REGION_PERMISSION_UPDATE_FUNC ReadWriteUpdater
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_IMAGE_SECTION_HEADER SectionHeader;
|
EFI_IMAGE_SECTION_HEADER SectionHeader;
|
||||||
RETURN_STATUS Status;
|
RETURN_STATUS Status;
|
||||||
EFI_PHYSICAL_ADDRESS Base;
|
EFI_PHYSICAL_ADDRESS Base;
|
||||||
UINTN Size;
|
UINTN Size;
|
||||||
UINTN ReadSize;
|
UINTN ReadSize;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
ASSERT (ImageContext != NULL);
|
ASSERT (ImageContext != NULL);
|
||||||
|
|
||||||
@@ -68,35 +67,57 @@ UpdateMmFoundationPeCoffPermissions (
|
|||||||
//
|
//
|
||||||
// Read section header from file
|
// Read section header from file
|
||||||
//
|
//
|
||||||
Size = sizeof (EFI_IMAGE_SECTION_HEADER);
|
Size = sizeof (EFI_IMAGE_SECTION_HEADER);
|
||||||
ReadSize = Size;
|
ReadSize = Size;
|
||||||
Status = ImageContext->ImageRead (
|
Status = ImageContext->ImageRead (
|
||||||
ImageContext->Handle,
|
ImageContext->Handle,
|
||||||
SectionHeaderOffset,
|
SectionHeaderOffset,
|
||||||
&Size,
|
&Size,
|
||||||
&SectionHeader
|
&SectionHeader
|
||||||
);
|
);
|
||||||
|
|
||||||
if (RETURN_ERROR (Status) || (Size != ReadSize)) {
|
if (RETURN_ERROR (Status) || (Size != ReadSize)) {
|
||||||
DEBUG ((DEBUG_ERROR,
|
DEBUG ((
|
||||||
"%a: ImageContext->ImageRead () failed (Status = %r)\n",
|
DEBUG_ERROR,
|
||||||
__FUNCTION__, Status));
|
"%a: ImageContext->ImageRead () failed (Status = %r)\n",
|
||||||
|
__FUNCTION__,
|
||||||
|
Status
|
||||||
|
));
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO,
|
DEBUG ((
|
||||||
"%a: Section %d of image at 0x%lx has 0x%x permissions\n",
|
DEBUG_INFO,
|
||||||
__FUNCTION__, Index, ImageContext->ImageAddress, SectionHeader.Characteristics));
|
"%a: Section %d of image at 0x%lx has 0x%x permissions\n",
|
||||||
DEBUG ((DEBUG_INFO,
|
__FUNCTION__,
|
||||||
"%a: Section %d of image at 0x%lx has %a name\n",
|
Index,
|
||||||
__FUNCTION__, Index, ImageContext->ImageAddress, SectionHeader.Name));
|
ImageContext->ImageAddress,
|
||||||
DEBUG ((DEBUG_INFO,
|
SectionHeader.Characteristics
|
||||||
"%a: Section %d of image at 0x%lx has 0x%x address\n",
|
));
|
||||||
__FUNCTION__, Index, ImageContext->ImageAddress,
|
DEBUG ((
|
||||||
ImageContext->ImageAddress + SectionHeader.VirtualAddress));
|
DEBUG_INFO,
|
||||||
DEBUG ((DEBUG_INFO,
|
"%a: Section %d of image at 0x%lx has %a name\n",
|
||||||
"%a: Section %d of image at 0x%lx has 0x%x data\n",
|
__FUNCTION__,
|
||||||
__FUNCTION__, Index, ImageContext->ImageAddress, SectionHeader.PointerToRawData));
|
Index,
|
||||||
|
ImageContext->ImageAddress,
|
||||||
|
SectionHeader.Name
|
||||||
|
));
|
||||||
|
DEBUG ((
|
||||||
|
DEBUG_INFO,
|
||||||
|
"%a: Section %d of image at 0x%lx has 0x%x address\n",
|
||||||
|
__FUNCTION__,
|
||||||
|
Index,
|
||||||
|
ImageContext->ImageAddress,
|
||||||
|
ImageContext->ImageAddress + SectionHeader.VirtualAddress
|
||||||
|
));
|
||||||
|
DEBUG ((
|
||||||
|
DEBUG_INFO,
|
||||||
|
"%a: Section %d of image at 0x%lx has 0x%x data\n",
|
||||||
|
__FUNCTION__,
|
||||||
|
Index,
|
||||||
|
ImageContext->ImageAddress,
|
||||||
|
SectionHeader.PointerToRawData
|
||||||
|
));
|
||||||
|
|
||||||
//
|
//
|
||||||
// If the section is marked as XN then remove the X attribute. Furthermore,
|
// If the section is marked as XN then remove the X attribute. Furthermore,
|
||||||
@@ -109,19 +130,33 @@ UpdateMmFoundationPeCoffPermissions (
|
|||||||
|
|
||||||
if ((SectionHeader.Characteristics & EFI_IMAGE_SCN_MEM_WRITE) != 0) {
|
if ((SectionHeader.Characteristics & EFI_IMAGE_SCN_MEM_WRITE) != 0) {
|
||||||
ReadWriteUpdater (Base, SectionHeader.Misc.VirtualSize);
|
ReadWriteUpdater (Base, SectionHeader.Misc.VirtualSize);
|
||||||
DEBUG ((DEBUG_INFO,
|
DEBUG ((
|
||||||
"%a: Mapping section %d of image at 0x%lx with RW-XN permissions\n",
|
DEBUG_INFO,
|
||||||
__FUNCTION__, Index, ImageContext->ImageAddress));
|
"%a: Mapping section %d of image at 0x%lx with RW-XN permissions\n",
|
||||||
|
__FUNCTION__,
|
||||||
|
Index,
|
||||||
|
ImageContext->ImageAddress
|
||||||
|
));
|
||||||
} else {
|
} else {
|
||||||
DEBUG ((DEBUG_INFO,
|
DEBUG ((
|
||||||
"%a: Mapping section %d of image at 0x%lx with RO-XN permissions\n",
|
DEBUG_INFO,
|
||||||
__FUNCTION__, Index, ImageContext->ImageAddress));
|
"%a: Mapping section %d of image at 0x%lx with RO-XN permissions\n",
|
||||||
|
__FUNCTION__,
|
||||||
|
Index,
|
||||||
|
ImageContext->ImageAddress
|
||||||
|
));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
DEBUG ((DEBUG_INFO,
|
DEBUG ((
|
||||||
"%a: Ignoring section %d of image at 0x%lx with 0x%x permissions\n",
|
DEBUG_INFO,
|
||||||
__FUNCTION__, Index, ImageContext->ImageAddress, SectionHeader.Characteristics));
|
"%a: Ignoring section %d of image at 0x%lx with 0x%x permissions\n",
|
||||||
|
__FUNCTION__,
|
||||||
|
Index,
|
||||||
|
ImageContext->ImageAddress,
|
||||||
|
SectionHeader.Characteristics
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
SectionHeaderOffset += sizeof (EFI_IMAGE_SECTION_HEADER);
|
SectionHeaderOffset += sizeof (EFI_IMAGE_SECTION_HEADER);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,24 +177,27 @@ UpdateMmFoundationPeCoffPermissions (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
LocateStandaloneMmCorePeCoffData (
|
LocateStandaloneMmCorePeCoffData (
|
||||||
IN EFI_FIRMWARE_VOLUME_HEADER *BfvAddress,
|
IN EFI_FIRMWARE_VOLUME_HEADER *BfvAddress,
|
||||||
IN OUT VOID **TeData,
|
IN OUT VOID **TeData,
|
||||||
IN OUT UINTN *TeDataSize
|
IN OUT UINTN *TeDataSize
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_FFS_FILE_HEADER *FileHeader;
|
EFI_FFS_FILE_HEADER *FileHeader;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
FileHeader = NULL;
|
FileHeader = NULL;
|
||||||
Status = FfsFindNextFile (
|
Status = FfsFindNextFile (
|
||||||
EFI_FV_FILETYPE_SECURITY_CORE,
|
EFI_FV_FILETYPE_SECURITY_CORE,
|
||||||
BfvAddress,
|
BfvAddress,
|
||||||
&FileHeader
|
&FileHeader
|
||||||
);
|
);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR, "Unable to locate Standalone MM FFS file - 0x%x\n",
|
DEBUG ((
|
||||||
Status));
|
DEBUG_ERROR,
|
||||||
|
"Unable to locate Standalone MM FFS file - 0x%x\n",
|
||||||
|
Status
|
||||||
|
));
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,8 +205,11 @@ LocateStandaloneMmCorePeCoffData (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
Status = FfsFindSectionData (EFI_SECTION_TE, FileHeader, TeData, TeDataSize);
|
Status = FfsFindSectionData (EFI_SECTION_TE, FileHeader, TeData, TeDataSize);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR, "Unable to locate Standalone MM Section data - %r\n",
|
DEBUG ((
|
||||||
Status));
|
DEBUG_ERROR,
|
||||||
|
"Unable to locate Standalone MM Section data - %r\n",
|
||||||
|
Status
|
||||||
|
));
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -189,17 +230,17 @@ LocateStandaloneMmCorePeCoffData (
|
|||||||
STATIC
|
STATIC
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetPeCoffSectionInformation (
|
GetPeCoffSectionInformation (
|
||||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
||||||
OUT EFI_PHYSICAL_ADDRESS *ImageBase,
|
OUT EFI_PHYSICAL_ADDRESS *ImageBase,
|
||||||
OUT UINT32 *SectionHeaderOffset,
|
OUT UINT32 *SectionHeaderOffset,
|
||||||
OUT UINT16 *NumberOfSections
|
OUT UINT16 *NumberOfSections
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
RETURN_STATUS Status;
|
RETURN_STATUS Status;
|
||||||
EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;
|
EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;
|
||||||
EFI_IMAGE_OPTIONAL_HEADER_UNION HdrData;
|
EFI_IMAGE_OPTIONAL_HEADER_UNION HdrData;
|
||||||
UINTN Size;
|
UINTN Size;
|
||||||
UINTN ReadSize;
|
UINTN ReadSize;
|
||||||
|
|
||||||
ASSERT (ImageContext != NULL);
|
ASSERT (ImageContext != NULL);
|
||||||
ASSERT (SectionHeaderOffset != NULL);
|
ASSERT (SectionHeaderOffset != NULL);
|
||||||
@@ -207,9 +248,12 @@ GetPeCoffSectionInformation (
|
|||||||
|
|
||||||
Status = PeCoffLoaderGetImageInfo (ImageContext);
|
Status = PeCoffLoaderGetImageInfo (ImageContext);
|
||||||
if (RETURN_ERROR (Status)) {
|
if (RETURN_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR,
|
DEBUG ((
|
||||||
"%a: PeCoffLoaderGetImageInfo () failed (Status == %r)\n",
|
DEBUG_ERROR,
|
||||||
__FUNCTION__, Status));
|
"%a: PeCoffLoaderGetImageInfo () failed (Status == %r)\n",
|
||||||
|
__FUNCTION__,
|
||||||
|
Status
|
||||||
|
));
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,11 +263,16 @@ GetPeCoffSectionInformation (
|
|||||||
// granularity at which we can tighten permissions.
|
// granularity at which we can tighten permissions.
|
||||||
//
|
//
|
||||||
if (!ImageContext->IsTeImage) {
|
if (!ImageContext->IsTeImage) {
|
||||||
DEBUG ((DEBUG_WARN,
|
DEBUG ((
|
||||||
"%a: non-TE Image at 0x%lx has SectionAlignment < 4 KB (%lu)\n",
|
DEBUG_WARN,
|
||||||
__FUNCTION__, ImageContext->ImageAddress, ImageContext->SectionAlignment));
|
"%a: non-TE Image at 0x%lx has SectionAlignment < 4 KB (%lu)\n",
|
||||||
|
__FUNCTION__,
|
||||||
|
ImageContext->ImageAddress,
|
||||||
|
ImageContext->SectionAlignment
|
||||||
|
));
|
||||||
return RETURN_UNSUPPORTED;
|
return RETURN_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImageContext->SectionAlignment = EFI_PAGE_SIZE;
|
ImageContext->SectionAlignment = EFI_PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -234,19 +283,22 @@ GetPeCoffSectionInformation (
|
|||||||
// location in both images.
|
// location in both images.
|
||||||
//
|
//
|
||||||
Hdr.Union = &HdrData;
|
Hdr.Union = &HdrData;
|
||||||
Size = sizeof (EFI_IMAGE_OPTIONAL_HEADER_UNION);
|
Size = sizeof (EFI_IMAGE_OPTIONAL_HEADER_UNION);
|
||||||
ReadSize = Size;
|
ReadSize = Size;
|
||||||
Status = ImageContext->ImageRead (
|
Status = ImageContext->ImageRead (
|
||||||
ImageContext->Handle,
|
ImageContext->Handle,
|
||||||
ImageContext->PeCoffHeaderOffset,
|
ImageContext->PeCoffHeaderOffset,
|
||||||
&Size,
|
&Size,
|
||||||
Hdr.Pe32
|
Hdr.Pe32
|
||||||
);
|
);
|
||||||
|
|
||||||
if (RETURN_ERROR (Status) || (Size != ReadSize)) {
|
if (RETURN_ERROR (Status) || (Size != ReadSize)) {
|
||||||
DEBUG ((DEBUG_ERROR,
|
DEBUG ((
|
||||||
"%a: TmpContext->ImageRead () failed (Status = %r)\n",
|
DEBUG_ERROR,
|
||||||
__FUNCTION__, Status));
|
"%a: TmpContext->ImageRead () failed (Status = %r)\n",
|
||||||
|
__FUNCTION__,
|
||||||
|
Status
|
||||||
|
));
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -255,24 +307,25 @@ GetPeCoffSectionInformation (
|
|||||||
ASSERT (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE);
|
ASSERT (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE);
|
||||||
|
|
||||||
*SectionHeaderOffset = ImageContext->PeCoffHeaderOffset + sizeof (UINT32) +
|
*SectionHeaderOffset = ImageContext->PeCoffHeaderOffset + sizeof (UINT32) +
|
||||||
sizeof (EFI_IMAGE_FILE_HEADER);
|
sizeof (EFI_IMAGE_FILE_HEADER);
|
||||||
*NumberOfSections = Hdr.Pe32->FileHeader.NumberOfSections;
|
*NumberOfSections = Hdr.Pe32->FileHeader.NumberOfSections;
|
||||||
|
|
||||||
switch (Hdr.Pe32->OptionalHeader.Magic) {
|
switch (Hdr.Pe32->OptionalHeader.Magic) {
|
||||||
case EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC:
|
case EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC:
|
||||||
*SectionHeaderOffset += Hdr.Pe32->FileHeader.SizeOfOptionalHeader;
|
*SectionHeaderOffset += Hdr.Pe32->FileHeader.SizeOfOptionalHeader;
|
||||||
break;
|
break;
|
||||||
case EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC:
|
case EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC:
|
||||||
*SectionHeaderOffset += Hdr.Pe32Plus->FileHeader.SizeOfOptionalHeader;
|
*SectionHeaderOffset += Hdr.Pe32Plus->FileHeader.SizeOfOptionalHeader;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
*SectionHeaderOffset = (UINTN)(sizeof (EFI_TE_IMAGE_HEADER));
|
*SectionHeaderOffset = (UINTN)(sizeof (EFI_TE_IMAGE_HEADER));
|
||||||
*NumberOfSections = Hdr.Te->NumberOfSections;
|
*NumberOfSections = Hdr.Te->NumberOfSections;
|
||||||
*ImageBase -= (UINT32)Hdr.Te->StrippedSize - sizeof (EFI_TE_IMAGE_HEADER);
|
*ImageBase -= (UINT32)Hdr.Te->StrippedSize - sizeof (EFI_TE_IMAGE_HEADER);
|
||||||
}
|
}
|
||||||
|
|
||||||
return RETURN_SUCCESS;
|
return RETURN_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -292,14 +345,14 @@ GetPeCoffSectionInformation (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetStandaloneMmCorePeCoffSections (
|
GetStandaloneMmCorePeCoffSections (
|
||||||
IN VOID *TeData,
|
IN VOID *TeData,
|
||||||
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
||||||
OUT EFI_PHYSICAL_ADDRESS *ImageBase,
|
OUT EFI_PHYSICAL_ADDRESS *ImageBase,
|
||||||
IN OUT UINT32 *SectionHeaderOffset,
|
IN OUT UINT32 *SectionHeaderOffset,
|
||||||
IN OUT UINT16 *NumberOfSections
|
IN OUT UINT16 *NumberOfSections
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
// Initialize the Image Context
|
// Initialize the Image Context
|
||||||
ZeroMem (ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT));
|
ZeroMem (ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT));
|
||||||
@@ -308,15 +361,23 @@ GetStandaloneMmCorePeCoffSections (
|
|||||||
|
|
||||||
DEBUG ((DEBUG_INFO, "Found Standalone MM PE data - 0x%x\n", TeData));
|
DEBUG ((DEBUG_INFO, "Found Standalone MM PE data - 0x%x\n", TeData));
|
||||||
|
|
||||||
Status = GetPeCoffSectionInformation (ImageContext, ImageBase,
|
Status = GetPeCoffSectionInformation (
|
||||||
SectionHeaderOffset, NumberOfSections);
|
ImageContext,
|
||||||
|
ImageBase,
|
||||||
|
SectionHeaderOffset,
|
||||||
|
NumberOfSections
|
||||||
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR, "Unable to locate Standalone MM Core PE-COFF Section information - %r\n", Status));
|
DEBUG ((DEBUG_ERROR, "Unable to locate Standalone MM Core PE-COFF Section information - %r\n", Status));
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO, "Standalone MM Core PE-COFF SectionHeaderOffset - 0x%x, NumberOfSections - %d\n",
|
DEBUG ((
|
||||||
*SectionHeaderOffset, *NumberOfSections));
|
DEBUG_INFO,
|
||||||
|
"Standalone MM Core PE-COFF SectionHeaderOffset - 0x%x, NumberOfSections - %d\n",
|
||||||
|
*SectionHeaderOffset,
|
||||||
|
*NumberOfSections
|
||||||
|
));
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
@@ -7,7 +7,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#include <PiMm.h>
|
#include <PiMm.h>
|
||||||
|
|
||||||
#include <Library/Arm/StandaloneMmCoreEntryPoint.h>
|
#include <Library/Arm/StandaloneMmCoreEntryPoint.h>
|
||||||
@@ -29,20 +28,20 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <IndustryStandard/ArmMmSvc.h>
|
#include <IndustryStandard/ArmMmSvc.h>
|
||||||
#include <IndustryStandard/ArmFfaSvc.h>
|
#include <IndustryStandard/ArmFfaSvc.h>
|
||||||
|
|
||||||
#define SPM_MAJOR_VER_MASK 0xFFFF0000
|
#define SPM_MAJOR_VER_MASK 0xFFFF0000
|
||||||
#define SPM_MINOR_VER_MASK 0x0000FFFF
|
#define SPM_MINOR_VER_MASK 0x0000FFFF
|
||||||
#define SPM_MAJOR_VER_SHIFT 16
|
#define SPM_MAJOR_VER_SHIFT 16
|
||||||
#define FFA_NOT_SUPPORTED -1
|
#define FFA_NOT_SUPPORTED -1
|
||||||
|
|
||||||
STATIC CONST UINT32 mSpmMajorVer = SPM_MAJOR_VERSION;
|
STATIC CONST UINT32 mSpmMajorVer = SPM_MAJOR_VERSION;
|
||||||
STATIC CONST UINT32 mSpmMinorVer = SPM_MINOR_VERSION;
|
STATIC CONST UINT32 mSpmMinorVer = SPM_MINOR_VERSION;
|
||||||
|
|
||||||
STATIC CONST UINT32 mSpmMajorVerFfa = SPM_MAJOR_VERSION_FFA;
|
STATIC CONST UINT32 mSpmMajorVerFfa = SPM_MAJOR_VERSION_FFA;
|
||||||
STATIC CONST UINT32 mSpmMinorVerFfa = SPM_MINOR_VERSION_FFA;
|
STATIC CONST UINT32 mSpmMinorVerFfa = SPM_MINOR_VERSION_FFA;
|
||||||
|
|
||||||
#define BOOT_PAYLOAD_VERSION 1
|
#define BOOT_PAYLOAD_VERSION 1
|
||||||
|
|
||||||
PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT CpuDriverEntryPoint = NULL;
|
PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT CpuDriverEntryPoint = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieve a pointer to and print the boot information passed by privileged
|
Retrieve a pointer to and print the boot information passed by privileged
|
||||||
@@ -54,14 +53,14 @@ PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT CpuDriverEntryPoint = NULL;
|
|||||||
**/
|
**/
|
||||||
EFI_SECURE_PARTITION_BOOT_INFO *
|
EFI_SECURE_PARTITION_BOOT_INFO *
|
||||||
GetAndPrintBootinformation (
|
GetAndPrintBootinformation (
|
||||||
IN VOID *SharedBufAddress
|
IN VOID *SharedBufAddress
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_SECURE_PARTITION_BOOT_INFO *PayloadBootInfo;
|
EFI_SECURE_PARTITION_BOOT_INFO *PayloadBootInfo;
|
||||||
EFI_SECURE_PARTITION_CPU_INFO *PayloadCpuInfo;
|
EFI_SECURE_PARTITION_CPU_INFO *PayloadCpuInfo;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
PayloadBootInfo = (EFI_SECURE_PARTITION_BOOT_INFO *) SharedBufAddress;
|
PayloadBootInfo = (EFI_SECURE_PARTITION_BOOT_INFO *)SharedBufAddress;
|
||||||
|
|
||||||
if (PayloadBootInfo == NULL) {
|
if (PayloadBootInfo == NULL) {
|
||||||
DEBUG ((DEBUG_ERROR, "PayloadBootInfo NULL\n"));
|
DEBUG ((DEBUG_ERROR, "PayloadBootInfo NULL\n"));
|
||||||
@@ -69,8 +68,12 @@ GetAndPrintBootinformation (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (PayloadBootInfo->Header.Version != BOOT_PAYLOAD_VERSION) {
|
if (PayloadBootInfo->Header.Version != BOOT_PAYLOAD_VERSION) {
|
||||||
DEBUG ((DEBUG_ERROR, "Boot Information Version Mismatch. Current=0x%x, Expected=0x%x.\n",
|
DEBUG ((
|
||||||
PayloadBootInfo->Header.Version, BOOT_PAYLOAD_VERSION));
|
DEBUG_ERROR,
|
||||||
|
"Boot Information Version Mismatch. Current=0x%x, Expected=0x%x.\n",
|
||||||
|
PayloadBootInfo->Header.Version,
|
||||||
|
BOOT_PAYLOAD_VERSION
|
||||||
|
));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,7 +95,7 @@ GetAndPrintBootinformation (
|
|||||||
DEBUG ((DEBUG_INFO, "NumCpus - 0x%x\n", PayloadBootInfo->NumCpus));
|
DEBUG ((DEBUG_INFO, "NumCpus - 0x%x\n", PayloadBootInfo->NumCpus));
|
||||||
DEBUG ((DEBUG_INFO, "CpuInfo - 0x%p\n", PayloadBootInfo->CpuInfo));
|
DEBUG ((DEBUG_INFO, "CpuInfo - 0x%p\n", PayloadBootInfo->CpuInfo));
|
||||||
|
|
||||||
PayloadCpuInfo = (EFI_SECURE_PARTITION_CPU_INFO *) PayloadBootInfo->CpuInfo;
|
PayloadCpuInfo = (EFI_SECURE_PARTITION_CPU_INFO *)PayloadBootInfo->CpuInfo;
|
||||||
|
|
||||||
if (PayloadCpuInfo == NULL) {
|
if (PayloadCpuInfo == NULL) {
|
||||||
DEBUG ((DEBUG_ERROR, "PayloadCpuInfo NULL\n"));
|
DEBUG ((DEBUG_ERROR, "PayloadCpuInfo NULL\n"));
|
||||||
@@ -117,25 +120,25 @@ GetAndPrintBootinformation (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
DelegatedEventLoop (
|
DelegatedEventLoop (
|
||||||
IN ARM_SVC_ARGS *EventCompleteSvcArgs
|
IN ARM_SVC_ARGS *EventCompleteSvcArgs
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
BOOLEAN FfaEnabled;
|
BOOLEAN FfaEnabled;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN SvcStatus;
|
UINTN SvcStatus;
|
||||||
|
|
||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
ArmCallSvc (EventCompleteSvcArgs);
|
ArmCallSvc (EventCompleteSvcArgs);
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO, "Received delegated event\n"));
|
DEBUG ((DEBUG_INFO, "Received delegated event\n"));
|
||||||
DEBUG ((DEBUG_INFO, "X0 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg0));
|
DEBUG ((DEBUG_INFO, "X0 : 0x%x\n", (UINT32)EventCompleteSvcArgs->Arg0));
|
||||||
DEBUG ((DEBUG_INFO, "X1 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg1));
|
DEBUG ((DEBUG_INFO, "X1 : 0x%x\n", (UINT32)EventCompleteSvcArgs->Arg1));
|
||||||
DEBUG ((DEBUG_INFO, "X2 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg2));
|
DEBUG ((DEBUG_INFO, "X2 : 0x%x\n", (UINT32)EventCompleteSvcArgs->Arg2));
|
||||||
DEBUG ((DEBUG_INFO, "X3 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg3));
|
DEBUG ((DEBUG_INFO, "X3 : 0x%x\n", (UINT32)EventCompleteSvcArgs->Arg3));
|
||||||
DEBUG ((DEBUG_INFO, "X4 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg4));
|
DEBUG ((DEBUG_INFO, "X4 : 0x%x\n", (UINT32)EventCompleteSvcArgs->Arg4));
|
||||||
DEBUG ((DEBUG_INFO, "X5 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg5));
|
DEBUG ((DEBUG_INFO, "X5 : 0x%x\n", (UINT32)EventCompleteSvcArgs->Arg5));
|
||||||
DEBUG ((DEBUG_INFO, "X6 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg6));
|
DEBUG ((DEBUG_INFO, "X6 : 0x%x\n", (UINT32)EventCompleteSvcArgs->Arg6));
|
||||||
DEBUG ((DEBUG_INFO, "X7 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg7));
|
DEBUG ((DEBUG_INFO, "X7 : 0x%x\n", (UINT32)EventCompleteSvcArgs->Arg7));
|
||||||
|
|
||||||
FfaEnabled = FeaturePcdGet (PcdFfaEnable);
|
FfaEnabled = FeaturePcdGet (PcdFfaEnable);
|
||||||
if (FfaEnabled) {
|
if (FfaEnabled) {
|
||||||
@@ -145,8 +148,12 @@ DelegatedEventLoop (
|
|||||||
EventCompleteSvcArgs->Arg3
|
EventCompleteSvcArgs->Arg3
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR, "Failed delegated event 0x%x, Status 0x%x\n",
|
DEBUG ((
|
||||||
EventCompleteSvcArgs->Arg3, Status));
|
DEBUG_ERROR,
|
||||||
|
"Failed delegated event 0x%x, Status 0x%x\n",
|
||||||
|
EventCompleteSvcArgs->Arg3,
|
||||||
|
Status
|
||||||
|
));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Status = CpuDriverEntryPoint (
|
Status = CpuDriverEntryPoint (
|
||||||
@@ -155,30 +162,34 @@ DelegatedEventLoop (
|
|||||||
EventCompleteSvcArgs->Arg1
|
EventCompleteSvcArgs->Arg1
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR, "Failed delegated event 0x%x, Status 0x%x\n",
|
DEBUG ((
|
||||||
EventCompleteSvcArgs->Arg0, Status));
|
DEBUG_ERROR,
|
||||||
|
"Failed delegated event 0x%x, Status 0x%x\n",
|
||||||
|
EventCompleteSvcArgs->Arg0,
|
||||||
|
Status
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (Status) {
|
switch (Status) {
|
||||||
case EFI_SUCCESS:
|
case EFI_SUCCESS:
|
||||||
SvcStatus = ARM_SVC_SPM_RET_SUCCESS;
|
SvcStatus = ARM_SVC_SPM_RET_SUCCESS;
|
||||||
break;
|
break;
|
||||||
case EFI_INVALID_PARAMETER:
|
case EFI_INVALID_PARAMETER:
|
||||||
SvcStatus = ARM_SVC_SPM_RET_INVALID_PARAMS;
|
SvcStatus = ARM_SVC_SPM_RET_INVALID_PARAMS;
|
||||||
break;
|
break;
|
||||||
case EFI_ACCESS_DENIED:
|
case EFI_ACCESS_DENIED:
|
||||||
SvcStatus = ARM_SVC_SPM_RET_DENIED;
|
SvcStatus = ARM_SVC_SPM_RET_DENIED;
|
||||||
break;
|
break;
|
||||||
case EFI_OUT_OF_RESOURCES:
|
case EFI_OUT_OF_RESOURCES:
|
||||||
SvcStatus = ARM_SVC_SPM_RET_NO_MEMORY;
|
SvcStatus = ARM_SVC_SPM_RET_NO_MEMORY;
|
||||||
break;
|
break;
|
||||||
case EFI_UNSUPPORTED:
|
case EFI_UNSUPPORTED:
|
||||||
SvcStatus = ARM_SVC_SPM_RET_NOT_SUPPORTED;
|
SvcStatus = ARM_SVC_SPM_RET_NOT_SUPPORTED;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
SvcStatus = ARM_SVC_SPM_RET_NOT_SUPPORTED;
|
SvcStatus = ARM_SVC_SPM_RET_NOT_SUPPORTED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FfaEnabled) {
|
if (FfaEnabled) {
|
||||||
@@ -202,26 +213,28 @@ DelegatedEventLoop (
|
|||||||
**/
|
**/
|
||||||
STATIC
|
STATIC
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetSpmVersion (VOID)
|
GetSpmVersion (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT16 CalleeSpmMajorVer;
|
UINT16 CalleeSpmMajorVer;
|
||||||
UINT16 CallerSpmMajorVer;
|
UINT16 CallerSpmMajorVer;
|
||||||
UINT16 CalleeSpmMinorVer;
|
UINT16 CalleeSpmMinorVer;
|
||||||
UINT16 CallerSpmMinorVer;
|
UINT16 CallerSpmMinorVer;
|
||||||
UINT32 SpmVersion;
|
UINT32 SpmVersion;
|
||||||
ARM_SVC_ARGS SpmVersionArgs;
|
ARM_SVC_ARGS SpmVersionArgs;
|
||||||
|
|
||||||
if (FeaturePcdGet (PcdFfaEnable)) {
|
if (FeaturePcdGet (PcdFfaEnable)) {
|
||||||
SpmVersionArgs.Arg0 = ARM_SVC_ID_FFA_VERSION_AARCH32;
|
SpmVersionArgs.Arg0 = ARM_SVC_ID_FFA_VERSION_AARCH32;
|
||||||
SpmVersionArgs.Arg1 = mSpmMajorVerFfa << SPM_MAJOR_VER_SHIFT;
|
SpmVersionArgs.Arg1 = mSpmMajorVerFfa << SPM_MAJOR_VER_SHIFT;
|
||||||
SpmVersionArgs.Arg1 |= mSpmMinorVerFfa;
|
SpmVersionArgs.Arg1 |= mSpmMinorVerFfa;
|
||||||
CallerSpmMajorVer = mSpmMajorVerFfa;
|
CallerSpmMajorVer = mSpmMajorVerFfa;
|
||||||
CallerSpmMinorVer = mSpmMinorVerFfa;
|
CallerSpmMinorVer = mSpmMinorVerFfa;
|
||||||
} else {
|
} else {
|
||||||
SpmVersionArgs.Arg0 = ARM_SVC_ID_SPM_VERSION_AARCH32;
|
SpmVersionArgs.Arg0 = ARM_SVC_ID_SPM_VERSION_AARCH32;
|
||||||
CallerSpmMajorVer = mSpmMajorVer;
|
CallerSpmMajorVer = mSpmMajorVer;
|
||||||
CallerSpmMinorVer = mSpmMinorVer;
|
CallerSpmMinorVer = mSpmMinorVer;
|
||||||
}
|
}
|
||||||
|
|
||||||
ArmCallSvc (&SpmVersionArgs);
|
ArmCallSvc (&SpmVersionArgs);
|
||||||
@@ -244,14 +257,22 @@ GetSpmVersion (VOID)
|
|||||||
if ((CalleeSpmMajorVer == CallerSpmMajorVer) &&
|
if ((CalleeSpmMajorVer == CallerSpmMajorVer) &&
|
||||||
(CalleeSpmMinorVer >= CallerSpmMinorVer))
|
(CalleeSpmMinorVer >= CallerSpmMinorVer))
|
||||||
{
|
{
|
||||||
DEBUG ((DEBUG_INFO, "SPM Version: Major=0x%x, Minor=0x%x\n",
|
DEBUG ((
|
||||||
CalleeSpmMajorVer, CalleeSpmMinorVer));
|
DEBUG_INFO,
|
||||||
|
"SPM Version: Major=0x%x, Minor=0x%x\n",
|
||||||
|
CalleeSpmMajorVer,
|
||||||
|
CalleeSpmMinorVer
|
||||||
|
));
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
}
|
} else {
|
||||||
else
|
DEBUG ((
|
||||||
{
|
DEBUG_INFO,
|
||||||
DEBUG ((DEBUG_INFO, "Incompatible SPM Versions.\n Callee Version: Major=0x%x, Minor=0x%x.\n Caller: Major=0x%x, Minor>=0x%x.\n",
|
"Incompatible SPM Versions.\n Callee Version: Major=0x%x, Minor=0x%x.\n Caller: Major=0x%x, Minor>=0x%x.\n",
|
||||||
CalleeSpmMajorVer, CalleeSpmMinorVer, CallerSpmMajorVer, CallerSpmMinorVer));
|
CalleeSpmMajorVer,
|
||||||
|
CalleeSpmMinorVer,
|
||||||
|
CallerSpmMajorVer,
|
||||||
|
CallerSpmMinorVer
|
||||||
|
));
|
||||||
Status = EFI_UNSUPPORTED;
|
Status = EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -268,8 +289,8 @@ GetSpmVersion (VOID)
|
|||||||
STATIC
|
STATIC
|
||||||
VOID
|
VOID
|
||||||
InitArmSvcArgs (
|
InitArmSvcArgs (
|
||||||
OUT ARM_SVC_ARGS *InitMmFoundationSvcArgs,
|
OUT ARM_SVC_ARGS *InitMmFoundationSvcArgs,
|
||||||
OUT INT32 *Ret
|
OUT INT32 *Ret
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (FeaturePcdGet (PcdFfaEnable)) {
|
if (FeaturePcdGet (PcdFfaEnable)) {
|
||||||
@@ -302,17 +323,17 @@ _ModuleEntryPoint (
|
|||||||
IN UINT64 cookie2
|
IN UINT64 cookie2
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
|
PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
|
||||||
EFI_SECURE_PARTITION_BOOT_INFO *PayloadBootInfo;
|
EFI_SECURE_PARTITION_BOOT_INFO *PayloadBootInfo;
|
||||||
ARM_SVC_ARGS InitMmFoundationSvcArgs;
|
ARM_SVC_ARGS InitMmFoundationSvcArgs;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
INT32 Ret;
|
INT32 Ret;
|
||||||
UINT32 SectionHeaderOffset;
|
UINT32 SectionHeaderOffset;
|
||||||
UINT16 NumberOfSections;
|
UINT16 NumberOfSections;
|
||||||
VOID *HobStart;
|
VOID *HobStart;
|
||||||
VOID *TeData;
|
VOID *TeData;
|
||||||
UINTN TeDataSize;
|
UINTN TeDataSize;
|
||||||
EFI_PHYSICAL_ADDRESS ImageBase;
|
EFI_PHYSICAL_ADDRESS ImageBase;
|
||||||
|
|
||||||
// Get Secure Partition Manager Version Information
|
// Get Secure Partition Manager Version Information
|
||||||
Status = GetSpmVersion ();
|
Status = GetSpmVersion ();
|
||||||
@@ -328,7 +349,7 @@ _ModuleEntryPoint (
|
|||||||
|
|
||||||
// Locate PE/COFF File information for the Standalone MM core module
|
// Locate PE/COFF File information for the Standalone MM core module
|
||||||
Status = LocateStandaloneMmCorePeCoffData (
|
Status = LocateStandaloneMmCorePeCoffData (
|
||||||
(EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) PayloadBootInfo->SpImageBase,
|
(EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)PayloadBootInfo->SpImageBase,
|
||||||
&TeData,
|
&TeData,
|
||||||
&TeDataSize
|
&TeDataSize
|
||||||
);
|
);
|
||||||
@@ -395,7 +416,7 @@ _ModuleEntryPoint (
|
|||||||
//
|
//
|
||||||
ProcessModuleEntryPointList (HobStart);
|
ProcessModuleEntryPointList (HobStart);
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO, "Shared Cpu Driver EP %p\n", (VOID *) CpuDriverEntryPoint));
|
DEBUG ((DEBUG_INFO, "Shared Cpu Driver EP %p\n", (VOID *)CpuDriverEntryPoint));
|
||||||
|
|
||||||
finish:
|
finish:
|
||||||
if (Status == RETURN_UNSUPPORTED) {
|
if (Status == RETURN_UNSUPPORTED) {
|
||||||
@@ -407,7 +428,8 @@ finish:
|
|||||||
} else {
|
} else {
|
||||||
Ret = 0;
|
Ret = 0;
|
||||||
}
|
}
|
||||||
ZeroMem (&InitMmFoundationSvcArgs, sizeof(InitMmFoundationSvcArgs));
|
|
||||||
|
ZeroMem (&InitMmFoundationSvcArgs, sizeof (InitMmFoundationSvcArgs));
|
||||||
InitArmSvcArgs (&InitMmFoundationSvcArgs, &Ret);
|
InitArmSvcArgs (&InitMmFoundationSvcArgs, &Ret);
|
||||||
DelegatedEventLoop (&InitMmFoundationSvcArgs);
|
DelegatedEventLoop (&InitMmFoundationSvcArgs);
|
||||||
}
|
}
|
||||||
|
@@ -7,7 +7,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#include <PiMm.h>
|
#include <PiMm.h>
|
||||||
|
|
||||||
#include <Library/StandaloneMmCoreEntryPoint.h>
|
#include <Library/StandaloneMmCoreEntryPoint.h>
|
||||||
@@ -17,7 +16,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
//
|
//
|
||||||
// Cache copy of HobList pointer.
|
// Cache copy of HobList pointer.
|
||||||
//
|
//
|
||||||
VOID *gHobList = NULL;
|
VOID *gHobList = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The entry point of PE/COFF Image for the STANDALONE MM Core.
|
The entry point of PE/COFF Image for the STANDALONE MM Core.
|
||||||
@@ -52,7 +51,6 @@ _ModuleEntryPoint (
|
|||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Required by the EBC compiler and identical in functionality to _ModuleEntryPoint().
|
Required by the EBC compiler and identical in functionality to _ModuleEntryPoint().
|
||||||
|
|
||||||
|
@@ -19,12 +19,12 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
//
|
//
|
||||||
// Cache copy of HobList pointer.
|
// Cache copy of HobList pointer.
|
||||||
//
|
//
|
||||||
VOID *gHobList = NULL;
|
VOID *gHobList = NULL;
|
||||||
|
|
||||||
VOID *
|
VOID *
|
||||||
CreateHob (
|
CreateHob (
|
||||||
IN UINT16 HobType,
|
IN UINT16 HobType,
|
||||||
IN UINT16 HobLength
|
IN UINT16 HobLength
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob;
|
EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob;
|
||||||
@@ -42,19 +42,19 @@ CreateHob (
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
Hob = (VOID*) (UINTN) HandOffHob->EfiEndOfHobList;
|
Hob = (VOID *)(UINTN)HandOffHob->EfiEndOfHobList;
|
||||||
((EFI_HOB_GENERIC_HEADER*) Hob)->HobType = HobType;
|
((EFI_HOB_GENERIC_HEADER *)Hob)->HobType = HobType;
|
||||||
((EFI_HOB_GENERIC_HEADER*) Hob)->HobLength = HobLength;
|
((EFI_HOB_GENERIC_HEADER *)Hob)->HobLength = HobLength;
|
||||||
((EFI_HOB_GENERIC_HEADER*) Hob)->Reserved = 0;
|
((EFI_HOB_GENERIC_HEADER *)Hob)->Reserved = 0;
|
||||||
|
|
||||||
HobEnd = (EFI_HOB_GENERIC_HEADER*) ((UINTN)Hob + HobLength);
|
HobEnd = (EFI_HOB_GENERIC_HEADER *)((UINTN)Hob + HobLength);
|
||||||
HandOffHob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd;
|
HandOffHob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS)(UINTN)HobEnd;
|
||||||
|
|
||||||
HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST;
|
HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST;
|
||||||
HobEnd->HobLength = sizeof (EFI_HOB_GENERIC_HEADER);
|
HobEnd->HobLength = sizeof (EFI_HOB_GENERIC_HEADER);
|
||||||
HobEnd->Reserved = 0;
|
HobEnd->Reserved = 0;
|
||||||
HobEnd++;
|
HobEnd++;
|
||||||
HandOffHob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd;
|
HandOffHob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS)(UINTN)HobEnd;
|
||||||
|
|
||||||
return Hob;
|
return Hob;
|
||||||
}
|
}
|
||||||
@@ -75,16 +75,18 @@ CreateHob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildModuleHob (
|
BuildModuleHob (
|
||||||
IN CONST EFI_GUID *ModuleName,
|
IN CONST EFI_GUID *ModuleName,
|
||||||
IN EFI_PHYSICAL_ADDRESS MemoryAllocationModule,
|
IN EFI_PHYSICAL_ADDRESS MemoryAllocationModule,
|
||||||
IN UINT64 ModuleLength,
|
IN UINT64 ModuleLength,
|
||||||
IN EFI_PHYSICAL_ADDRESS EntryPoint
|
IN EFI_PHYSICAL_ADDRESS EntryPoint
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_MEMORY_ALLOCATION_MODULE *Hob;
|
EFI_HOB_MEMORY_ALLOCATION_MODULE *Hob;
|
||||||
|
|
||||||
ASSERT (((MemoryAllocationModule & (EFI_PAGE_SIZE - 1)) == 0) &&
|
ASSERT (
|
||||||
((ModuleLength & (EFI_PAGE_SIZE - 1)) == 0));
|
((MemoryAllocationModule & (EFI_PAGE_SIZE - 1)) == 0) &&
|
||||||
|
((ModuleLength & (EFI_PAGE_SIZE - 1)) == 0)
|
||||||
|
);
|
||||||
|
|
||||||
Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION_MODULE));
|
Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION_MODULE));
|
||||||
|
|
||||||
@@ -153,23 +155,22 @@ BuildResourceDescriptorHob (
|
|||||||
VOID *
|
VOID *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildGuidHob (
|
BuildGuidHob (
|
||||||
IN CONST EFI_GUID *Guid,
|
IN CONST EFI_GUID *Guid,
|
||||||
IN UINTN DataLength
|
IN UINTN DataLength
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_GUID_TYPE *Hob;
|
EFI_HOB_GUID_TYPE *Hob;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Make sure that data length is not too long.
|
// Make sure that data length is not too long.
|
||||||
//
|
//
|
||||||
ASSERT (DataLength <= (0xffff - sizeof (EFI_HOB_GUID_TYPE)));
|
ASSERT (DataLength <= (0xffff - sizeof (EFI_HOB_GUID_TYPE)));
|
||||||
|
|
||||||
Hob = CreateHob (EFI_HOB_TYPE_GUID_EXTENSION, (UINT16) (sizeof (EFI_HOB_GUID_TYPE) + DataLength));
|
Hob = CreateHob (EFI_HOB_TYPE_GUID_EXTENSION, (UINT16)(sizeof (EFI_HOB_GUID_TYPE) + DataLength));
|
||||||
CopyGuid (&Hob->Name, Guid);
|
CopyGuid (&Hob->Name, Guid);
|
||||||
return Hob + 1;
|
return Hob + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Copies a data buffer to a newly-built HOB.
|
Copies a data buffer to a newly-built HOB.
|
||||||
|
|
||||||
@@ -191,9 +192,9 @@ BuildGuidHob (
|
|||||||
VOID *
|
VOID *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildGuidDataHob (
|
BuildGuidDataHob (
|
||||||
IN CONST EFI_GUID *Guid,
|
IN CONST EFI_GUID *Guid,
|
||||||
IN VOID *Data,
|
IN VOID *Data,
|
||||||
IN UINTN DataLength
|
IN UINTN DataLength
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
VOID *HobData;
|
VOID *HobData;
|
||||||
@@ -218,8 +219,8 @@ BuildGuidDataHob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildFvHob (
|
BuildFvHob (
|
||||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||||
IN UINT64 Length
|
IN UINT64 Length
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_FIRMWARE_VOLUME *Hob;
|
EFI_HOB_FIRMWARE_VOLUME *Hob;
|
||||||
@@ -230,7 +231,6 @@ BuildFvHob (
|
|||||||
Hob->Length = Length;
|
Hob->Length = Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Builds a EFI_HOB_TYPE_FV2 HOB.
|
Builds a EFI_HOB_TYPE_FV2 HOB.
|
||||||
|
|
||||||
@@ -246,10 +246,10 @@ BuildFvHob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildFv2Hob (
|
BuildFv2Hob (
|
||||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||||
IN UINT64 Length,
|
IN UINT64 Length,
|
||||||
IN CONST EFI_GUID *FvName,
|
IN CONST EFI_GUID *FvName,
|
||||||
IN CONST EFI_GUID *FileName
|
IN CONST EFI_GUID *FileName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_FIRMWARE_VOLUME2 *Hob;
|
EFI_HOB_FIRMWARE_VOLUME2 *Hob;
|
||||||
@@ -262,7 +262,6 @@ BuildFv2Hob (
|
|||||||
CopyGuid (&Hob->FileName, FileName);
|
CopyGuid (&Hob->FileName, FileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Builds a HOB for the CPU.
|
Builds a HOB for the CPU.
|
||||||
|
|
||||||
@@ -276,8 +275,8 @@ BuildFv2Hob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildCpuHob (
|
BuildCpuHob (
|
||||||
IN UINT8 SizeOfMemorySpace,
|
IN UINT8 SizeOfMemorySpace,
|
||||||
IN UINT8 SizeOfIoSpace
|
IN UINT8 SizeOfIoSpace
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_CPU *Hob;
|
EFI_HOB_CPU *Hob;
|
||||||
@@ -307,15 +306,17 @@ BuildCpuHob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildMemoryAllocationHob (
|
BuildMemoryAllocationHob (
|
||||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||||
IN UINT64 Length,
|
IN UINT64 Length,
|
||||||
IN EFI_MEMORY_TYPE MemoryType
|
IN EFI_MEMORY_TYPE MemoryType
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_MEMORY_ALLOCATION *Hob;
|
EFI_HOB_MEMORY_ALLOCATION *Hob;
|
||||||
|
|
||||||
ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&
|
ASSERT (
|
||||||
((Length & (EFI_PAGE_SIZE - 1)) == 0));
|
((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&
|
||||||
|
((Length & (EFI_PAGE_SIZE - 1)) == 0)
|
||||||
|
);
|
||||||
|
|
||||||
Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION));
|
Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION));
|
||||||
|
|
||||||
|
@@ -19,9 +19,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
//
|
//
|
||||||
// Cache copy of HobList pointer.
|
// Cache copy of HobList pointer.
|
||||||
//
|
//
|
||||||
extern VOID *gHobList;
|
extern VOID *gHobList;
|
||||||
|
|
||||||
EFI_HOB_HANDOFF_INFO_TABLE*
|
EFI_HOB_HANDOFF_INFO_TABLE *
|
||||||
HobConstructor (
|
HobConstructor (
|
||||||
IN VOID *EfiMemoryBegin,
|
IN VOID *EfiMemoryBegin,
|
||||||
IN UINTN EfiMemoryLength,
|
IN UINTN EfiMemoryLength,
|
||||||
@@ -35,16 +35,16 @@ HobConstructor (
|
|||||||
Hob = EfiFreeMemoryBottom;
|
Hob = EfiFreeMemoryBottom;
|
||||||
HobEnd = (EFI_HOB_GENERIC_HEADER *)(Hob+1);
|
HobEnd = (EFI_HOB_GENERIC_HEADER *)(Hob+1);
|
||||||
|
|
||||||
Hob->Header.HobType = EFI_HOB_TYPE_HANDOFF;
|
Hob->Header.HobType = EFI_HOB_TYPE_HANDOFF;
|
||||||
Hob->Header.HobLength = sizeof (EFI_HOB_HANDOFF_INFO_TABLE);
|
Hob->Header.HobLength = sizeof (EFI_HOB_HANDOFF_INFO_TABLE);
|
||||||
Hob->Header.Reserved = 0;
|
Hob->Header.Reserved = 0;
|
||||||
|
|
||||||
HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST;
|
HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST;
|
||||||
HobEnd->HobLength = sizeof (EFI_HOB_GENERIC_HEADER);
|
HobEnd->HobLength = sizeof (EFI_HOB_GENERIC_HEADER);
|
||||||
HobEnd->Reserved = 0;
|
HobEnd->Reserved = 0;
|
||||||
|
|
||||||
Hob->Version = EFI_HOB_HANDOFF_TABLE_VERSION;
|
Hob->Version = EFI_HOB_HANDOFF_TABLE_VERSION;
|
||||||
Hob->BootMode = BOOT_WITH_FULL_CONFIGURATION;
|
Hob->BootMode = BOOT_WITH_FULL_CONFIGURATION;
|
||||||
|
|
||||||
Hob->EfiMemoryTop = (UINTN)EfiMemoryBegin + EfiMemoryLength;
|
Hob->EfiMemoryTop = (UINTN)EfiMemoryBegin + EfiMemoryLength;
|
||||||
Hob->EfiMemoryBottom = (UINTN)EfiMemoryBegin;
|
Hob->EfiMemoryBottom = (UINTN)EfiMemoryBegin;
|
||||||
|
@@ -56,15 +56,15 @@ GetHobList (
|
|||||||
VOID *
|
VOID *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetNextHob (
|
GetNextHob (
|
||||||
IN UINT16 Type,
|
IN UINT16 Type,
|
||||||
IN CONST VOID *HobStart
|
IN CONST VOID *HobStart
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_PEI_HOB_POINTERS Hob;
|
EFI_PEI_HOB_POINTERS Hob;
|
||||||
|
|
||||||
ASSERT (HobStart != NULL);
|
ASSERT (HobStart != NULL);
|
||||||
|
|
||||||
Hob.Raw = (UINT8 *) HobStart;
|
Hob.Raw = (UINT8 *)HobStart;
|
||||||
//
|
//
|
||||||
// Parse the HOB list until end of list or matching type is found.
|
// Parse the HOB list until end of list or matching type is found.
|
||||||
//
|
//
|
||||||
@@ -72,8 +72,10 @@ GetNextHob (
|
|||||||
if (Hob.Header->HobType == Type) {
|
if (Hob.Header->HobType == Type) {
|
||||||
return Hob.Raw;
|
return Hob.Raw;
|
||||||
}
|
}
|
||||||
|
|
||||||
Hob.Raw = GET_NEXT_HOB (Hob);
|
Hob.Raw = GET_NEXT_HOB (Hob);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,10 +95,10 @@ GetNextHob (
|
|||||||
VOID *
|
VOID *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetFirstHob (
|
GetFirstHob (
|
||||||
IN UINT16 Type
|
IN UINT16 Type
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
VOID *HobList;
|
VOID *HobList;
|
||||||
|
|
||||||
HobList = GetHobList ();
|
HobList = GetHobList ();
|
||||||
return GetNextHob (Type, HobList);
|
return GetNextHob (Type, HobList);
|
||||||
@@ -127,19 +129,21 @@ GetFirstHob (
|
|||||||
VOID *
|
VOID *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetNextGuidHob (
|
GetNextGuidHob (
|
||||||
IN CONST EFI_GUID *Guid,
|
IN CONST EFI_GUID *Guid,
|
||||||
IN CONST VOID *HobStart
|
IN CONST VOID *HobStart
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_PEI_HOB_POINTERS GuidHob;
|
EFI_PEI_HOB_POINTERS GuidHob;
|
||||||
|
|
||||||
GuidHob.Raw = (UINT8 *) HobStart;
|
GuidHob.Raw = (UINT8 *)HobStart;
|
||||||
while ((GuidHob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, GuidHob.Raw)) != NULL) {
|
while ((GuidHob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, GuidHob.Raw)) != NULL) {
|
||||||
if (CompareGuid (Guid, &GuidHob.Guid->Name)) {
|
if (CompareGuid (Guid, &GuidHob.Guid->Name)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
GuidHob.Raw = GET_NEXT_HOB (GuidHob);
|
GuidHob.Raw = GET_NEXT_HOB (GuidHob);
|
||||||
}
|
}
|
||||||
|
|
||||||
return GuidHob.Raw;
|
return GuidHob.Raw;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,10 +168,10 @@ GetNextGuidHob (
|
|||||||
VOID *
|
VOID *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetFirstGuidHob (
|
GetFirstGuidHob (
|
||||||
IN CONST EFI_GUID *Guid
|
IN CONST EFI_GUID *Guid
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
VOID *HobList;
|
VOID *HobList;
|
||||||
|
|
||||||
HobList = GetHobList ();
|
HobList = GetHobList ();
|
||||||
return GetNextGuidHob (Guid, HobList);
|
return GetNextGuidHob (Guid, HobList);
|
||||||
@@ -192,14 +196,13 @@ GetBootModeHob (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob;
|
EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob;
|
||||||
|
|
||||||
HandOffHob = (EFI_HOB_HANDOFF_INFO_TABLE *) GetHobList ();
|
HandOffHob = (EFI_HOB_HANDOFF_INFO_TABLE *)GetHobList ();
|
||||||
|
|
||||||
return HandOffHob->BootMode;
|
return HandOffHob->BootMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Builds a HOB that describes a chunk of system memory with Owner GUID.
|
Builds a HOB that describes a chunk of system memory with Owner GUID.
|
||||||
|
|
||||||
@@ -240,14 +243,13 @@ BuildResourceDescriptorWithOwnerHob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildCvHob (
|
BuildCvHob (
|
||||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||||
IN UINT64 Length
|
IN UINT64 Length
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Builds a HOB for the BSP store.
|
Builds a HOB for the BSP store.
|
||||||
|
|
||||||
@@ -262,9 +264,9 @@ BuildCvHob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildBspStoreHob (
|
BuildBspStoreHob (
|
||||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||||
IN UINT64 Length,
|
IN UINT64 Length,
|
||||||
IN EFI_MEMORY_TYPE MemoryType
|
IN EFI_MEMORY_TYPE MemoryType
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
@@ -283,8 +285,8 @@ BuildBspStoreHob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildStackHob (
|
BuildStackHob (
|
||||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||||
IN UINT64 Length
|
IN UINT64 Length
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
|
@@ -35,10 +35,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildModuleHob (
|
BuildModuleHob (
|
||||||
IN CONST EFI_GUID *ModuleName,
|
IN CONST EFI_GUID *ModuleName,
|
||||||
IN EFI_PHYSICAL_ADDRESS MemoryAllocationModule,
|
IN EFI_PHYSICAL_ADDRESS MemoryAllocationModule,
|
||||||
IN UINT64 ModuleLength,
|
IN UINT64 ModuleLength,
|
||||||
IN EFI_PHYSICAL_ADDRESS EntryPoint
|
IN EFI_PHYSICAL_ADDRESS EntryPoint
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -102,8 +102,8 @@ BuildResourceDescriptorHob (
|
|||||||
VOID *
|
VOID *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildGuidHob (
|
BuildGuidHob (
|
||||||
IN CONST EFI_GUID *Guid,
|
IN CONST EFI_GUID *Guid,
|
||||||
IN UINTN DataLength
|
IN UINTN DataLength
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -141,9 +141,9 @@ BuildGuidHob (
|
|||||||
VOID *
|
VOID *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildGuidDataHob (
|
BuildGuidDataHob (
|
||||||
IN CONST EFI_GUID *Guid,
|
IN CONST EFI_GUID *Guid,
|
||||||
IN VOID *Data,
|
IN VOID *Data,
|
||||||
IN UINTN DataLength
|
IN UINTN DataLength
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -170,8 +170,8 @@ BuildGuidDataHob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildFvHob (
|
BuildFvHob (
|
||||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||||
IN UINT64 Length
|
IN UINT64 Length
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -199,10 +199,10 @@ BuildFvHob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildFv2Hob (
|
BuildFv2Hob (
|
||||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||||
IN UINT64 Length,
|
IN UINT64 Length,
|
||||||
IN CONST EFI_GUID *FvName,
|
IN CONST EFI_GUID *FvName,
|
||||||
IN CONST EFI_GUID *FileName
|
IN CONST EFI_GUID *FileName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
@@ -232,12 +232,12 @@ BuildFv2Hob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildFv3Hob (
|
BuildFv3Hob (
|
||||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||||
IN UINT64 Length,
|
IN UINT64 Length,
|
||||||
IN UINT32 AuthenticationStatus,
|
IN UINT32 AuthenticationStatus,
|
||||||
IN BOOLEAN ExtractedFv,
|
IN BOOLEAN ExtractedFv,
|
||||||
IN CONST EFI_GUID *FvName OPTIONAL,
|
IN CONST EFI_GUID *FvName OPTIONAL,
|
||||||
IN CONST EFI_GUID *FileName OPTIONAL
|
IN CONST EFI_GUID *FileName OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
@@ -259,8 +259,8 @@ BuildFv3Hob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildCpuHob (
|
BuildCpuHob (
|
||||||
IN UINT8 SizeOfMemorySpace,
|
IN UINT8 SizeOfMemorySpace,
|
||||||
IN UINT8 SizeOfIoSpace
|
IN UINT8 SizeOfIoSpace
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@@ -286,9 +286,9 @@ BuildCpuHob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildMemoryAllocationHob (
|
BuildMemoryAllocationHob (
|
||||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||||
IN UINT64 Length,
|
IN UINT64 Length,
|
||||||
IN EFI_MEMORY_TYPE MemoryType
|
IN EFI_MEMORY_TYPE MemoryType
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
|
@@ -17,7 +17,7 @@
|
|||||||
#include <Library/HobLib.h>
|
#include <Library/HobLib.h>
|
||||||
#include "StandaloneMmCoreMemoryAllocationServices.h"
|
#include "StandaloneMmCoreMemoryAllocationServices.h"
|
||||||
|
|
||||||
EFI_MM_SYSTEM_TABLE *gMmst = NULL;
|
EFI_MM_SYSTEM_TABLE *gMmst = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Allocates one or more 4KB pages of a certain memory type.
|
Allocates one or more 4KB pages of a certain memory type.
|
||||||
@@ -49,7 +49,8 @@ InternalAllocatePages (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return (VOID *) (UINTN) Memory;
|
|
||||||
|
return (VOID *)(UINTN)Memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -145,7 +146,7 @@ FreePages (
|
|||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
ASSERT (Pages != 0);
|
ASSERT (Pages != 0);
|
||||||
Status = gMmst->MmFreePages ((EFI_PHYSICAL_ADDRESS) (UINTN) Buffer, Pages);
|
Status = gMmst->MmFreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)Buffer, Pages);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -189,12 +190,13 @@ InternalAllocateAlignedPages (
|
|||||||
if (Pages == 0) {
|
if (Pages == 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Alignment > EFI_PAGE_SIZE) {
|
if (Alignment > EFI_PAGE_SIZE) {
|
||||||
//
|
//
|
||||||
// Calculate the total number of pages since alignment is larger than page size.
|
// Calculate the total number of pages since alignment is larger than page size.
|
||||||
//
|
//
|
||||||
AlignmentMask = Alignment - 1;
|
AlignmentMask = Alignment - 1;
|
||||||
RealPages = Pages + EFI_SIZE_TO_PAGES (Alignment);
|
RealPages = Pages + EFI_SIZE_TO_PAGES (Alignment);
|
||||||
//
|
//
|
||||||
// Make sure that Pages plus EFI_SIZE_TO_PAGES (Alignment) does not overflow.
|
// Make sure that Pages plus EFI_SIZE_TO_PAGES (Alignment) does not overflow.
|
||||||
//
|
//
|
||||||
@@ -204,8 +206,9 @@ InternalAllocateAlignedPages (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
AlignedMemory = ((UINTN) Memory + AlignmentMask) & ~AlignmentMask;
|
|
||||||
UnalignedPages = EFI_SIZE_TO_PAGES (AlignedMemory - (UINTN) Memory);
|
AlignedMemory = ((UINTN)Memory + AlignmentMask) & ~AlignmentMask;
|
||||||
|
UnalignedPages = EFI_SIZE_TO_PAGES (AlignedMemory - (UINTN)Memory);
|
||||||
if (UnalignedPages > 0) {
|
if (UnalignedPages > 0) {
|
||||||
//
|
//
|
||||||
// Free first unaligned page(s).
|
// Free first unaligned page(s).
|
||||||
@@ -213,7 +216,8 @@ InternalAllocateAlignedPages (
|
|||||||
Status = gMmst->MmFreePages (Memory, UnalignedPages);
|
Status = gMmst->MmFreePages (Memory, UnalignedPages);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
}
|
}
|
||||||
Memory = (EFI_PHYSICAL_ADDRESS) (AlignedMemory + EFI_PAGES_TO_SIZE (Pages));
|
|
||||||
|
Memory = (EFI_PHYSICAL_ADDRESS)(AlignedMemory + EFI_PAGES_TO_SIZE (Pages));
|
||||||
UnalignedPages = RealPages - Pages - UnalignedPages;
|
UnalignedPages = RealPages - Pages - UnalignedPages;
|
||||||
if (UnalignedPages > 0) {
|
if (UnalignedPages > 0) {
|
||||||
//
|
//
|
||||||
@@ -230,9 +234,11 @@ InternalAllocateAlignedPages (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
AlignedMemory = (UINTN) Memory;
|
|
||||||
|
AlignedMemory = (UINTN)Memory;
|
||||||
}
|
}
|
||||||
return (VOID *) AlignedMemory;
|
|
||||||
|
return (VOID *)AlignedMemory;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -346,7 +352,7 @@ FreeAlignedPages (
|
|||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
ASSERT (Pages != 0);
|
ASSERT (Pages != 0);
|
||||||
Status = gMmst->MmFreePages ((EFI_PHYSICAL_ADDRESS) (UINTN) Buffer, Pages);
|
Status = gMmst->MmFreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)Buffer, Pages);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -378,6 +384,7 @@ InternalAllocatePool (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
Memory = NULL;
|
Memory = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Memory;
|
return Memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -470,6 +477,7 @@ InternalAllocateZeroPool (
|
|||||||
if (Memory != NULL) {
|
if (Memory != NULL) {
|
||||||
Memory = ZeroMem (Memory, AllocationSize);
|
Memory = ZeroMem (Memory, AllocationSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Memory;
|
return Memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -566,12 +574,13 @@ InternalAllocateCopyPool (
|
|||||||
VOID *Memory;
|
VOID *Memory;
|
||||||
|
|
||||||
ASSERT (Buffer != NULL);
|
ASSERT (Buffer != NULL);
|
||||||
ASSERT (AllocationSize <= (MAX_ADDRESS - (UINTN) Buffer + 1));
|
ASSERT (AllocationSize <= (MAX_ADDRESS - (UINTN)Buffer + 1));
|
||||||
|
|
||||||
Memory = InternalAllocatePool (PoolType, AllocationSize);
|
Memory = InternalAllocatePool (PoolType, AllocationSize);
|
||||||
if (Memory != NULL) {
|
if (Memory != NULL) {
|
||||||
Memory = CopyMem (Memory, Buffer, AllocationSize);
|
Memory = CopyMem (Memory, Buffer, AllocationSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Memory;
|
return Memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -689,10 +698,11 @@ InternalReallocatePool (
|
|||||||
VOID *NewBuffer;
|
VOID *NewBuffer;
|
||||||
|
|
||||||
NewBuffer = InternalAllocateZeroPool (PoolType, NewSize);
|
NewBuffer = InternalAllocateZeroPool (PoolType, NewSize);
|
||||||
if (NewBuffer != NULL && OldBuffer != NULL) {
|
if ((NewBuffer != NULL) && (OldBuffer != NULL)) {
|
||||||
CopyMem (NewBuffer, OldBuffer, MIN (OldSize, NewSize));
|
CopyMem (NewBuffer, OldBuffer, MIN (OldSize, NewSize));
|
||||||
FreePool (OldBuffer);
|
FreePool (OldBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NewBuffer;
|
return NewBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -809,10 +819,10 @@ ReallocateReservedPool (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FreePool (
|
FreePool (
|
||||||
IN VOID *Buffer
|
IN VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Status = gMmst->MmFreePool (Buffer);
|
Status = gMmst->MmFreePool (Buffer);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
@@ -831,17 +841,17 @@ FreePool (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MemoryAllocationLibConstructor (
|
MemoryAllocationLibConstructor (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_MM_SYSTEM_TABLE *MmSystemTable
|
IN EFI_MM_SYSTEM_TABLE *MmSystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
MM_CORE_PRIVATE_DATA *MmCorePrivate;
|
MM_CORE_PRIVATE_DATA *MmCorePrivate;
|
||||||
EFI_HOB_GUID_TYPE *GuidHob;
|
EFI_HOB_GUID_TYPE *GuidHob;
|
||||||
MM_CORE_DATA_HOB_DATA *DataInHob;
|
MM_CORE_DATA_HOB_DATA *DataInHob;
|
||||||
VOID *HobStart;
|
VOID *HobStart;
|
||||||
EFI_MMRAM_HOB_DESCRIPTOR_BLOCK *MmramRangesHobData;
|
EFI_MMRAM_HOB_DESCRIPTOR_BLOCK *MmramRangesHobData;
|
||||||
EFI_MMRAM_DESCRIPTOR *MmramRanges;
|
EFI_MMRAM_DESCRIPTOR *MmramRanges;
|
||||||
UINTN MmramRangeCount;
|
UINTN MmramRangeCount;
|
||||||
EFI_HOB_GUID_TYPE *MmramRangesHob;
|
EFI_HOB_GUID_TYPE *MmramRangesHob;
|
||||||
|
|
||||||
HobStart = GetHobList ();
|
HobStart = GetHobList ();
|
||||||
@@ -868,25 +878,29 @@ MemoryAllocationLibConstructor (
|
|||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
MmramRangeCount = (UINTN) MmramRangesHobData->NumberOfMmReservedRegions;
|
MmramRangeCount = (UINTN)MmramRangesHobData->NumberOfMmReservedRegions;
|
||||||
if (MmramRanges == NULL) {
|
if (MmramRanges == NULL) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
DataInHob = GET_GUID_HOB_DATA (GuidHob);
|
DataInHob = GET_GUID_HOB_DATA (GuidHob);
|
||||||
MmCorePrivate = (MM_CORE_PRIVATE_DATA *)(UINTN)DataInHob->Address;
|
MmCorePrivate = (MM_CORE_PRIVATE_DATA *)(UINTN)DataInHob->Address;
|
||||||
MmramRanges = (EFI_MMRAM_DESCRIPTOR *)(UINTN)MmCorePrivate->MmramRanges;
|
MmramRanges = (EFI_MMRAM_DESCRIPTOR *)(UINTN)MmCorePrivate->MmramRanges;
|
||||||
MmramRangeCount = (UINTN) MmCorePrivate->MmramRangeCount;
|
MmramRangeCount = (UINTN)MmCorePrivate->MmramRangeCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
DEBUG ((DEBUG_INFO, "MmramRangeCount - 0x%x\n", MmramRangeCount));
|
DEBUG ((DEBUG_INFO, "MmramRangeCount - 0x%x\n", MmramRangeCount));
|
||||||
for (Index = 0; Index < MmramRangeCount; Index++) {
|
for (Index = 0; Index < MmramRangeCount; Index++) {
|
||||||
DEBUG ((DEBUG_INFO, "MmramRanges[%d]: 0x%016lx - 0x%016lx\n",
|
DEBUG ((
|
||||||
Index, MmramRanges[Index].CpuStart, MmramRanges[Index].PhysicalSize));
|
DEBUG_INFO,
|
||||||
|
"MmramRanges[%d]: 0x%016lx - 0x%016lx\n",
|
||||||
|
Index,
|
||||||
|
MmramRanges[Index].CpuStart,
|
||||||
|
MmramRanges[Index].PhysicalSize
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -19,7 +19,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
//
|
//
|
||||||
// Cache copy of HobList pointer.
|
// Cache copy of HobList pointer.
|
||||||
//
|
//
|
||||||
STATIC VOID *gHobList = NULL;
|
STATIC VOID *gHobList = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The constructor function caches the pointer to HOB list.
|
The constructor function caches the pointer to HOB list.
|
||||||
@@ -37,11 +37,11 @@ STATIC VOID *gHobList = NULL;
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HobLibConstructor (
|
HobLibConstructor (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_MM_SYSTEM_TABLE *MmSystemTable
|
IN EFI_MM_SYSTEM_TABLE *MmSystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
for (Index = 0; Index < gMmst->NumberOfTableEntries; Index++) {
|
for (Index = 0; Index < gMmst->NumberOfTableEntries; Index++) {
|
||||||
if (CompareGuid (&gEfiHobListGuid, &gMmst->MmConfigurationTable[Index].VendorGuid)) {
|
if (CompareGuid (&gEfiHobListGuid, &gMmst->MmConfigurationTable[Index].VendorGuid)) {
|
||||||
@@ -49,6 +49,7 @@ HobLibConstructor (
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,7 +68,7 @@ GetHobList (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
if (gHobList == NULL) {
|
if (gHobList == NULL) {
|
||||||
for (Index = 0; Index < gMmst->NumberOfTableEntries; Index++) {
|
for (Index = 0; Index < gMmst->NumberOfTableEntries; Index++) {
|
||||||
@@ -77,6 +78,7 @@ GetHobList (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT (gHobList != NULL);
|
ASSERT (gHobList != NULL);
|
||||||
return gHobList;
|
return gHobList;
|
||||||
}
|
}
|
||||||
@@ -101,15 +103,15 @@ GetHobList (
|
|||||||
VOID *
|
VOID *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetNextHob (
|
GetNextHob (
|
||||||
IN UINT16 Type,
|
IN UINT16 Type,
|
||||||
IN CONST VOID *HobStart
|
IN CONST VOID *HobStart
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_PEI_HOB_POINTERS Hob;
|
EFI_PEI_HOB_POINTERS Hob;
|
||||||
|
|
||||||
ASSERT (HobStart != NULL);
|
ASSERT (HobStart != NULL);
|
||||||
|
|
||||||
Hob.Raw = (UINT8 *) HobStart;
|
Hob.Raw = (UINT8 *)HobStart;
|
||||||
//
|
//
|
||||||
// Parse the HOB list until end of list or matching type is found.
|
// Parse the HOB list until end of list or matching type is found.
|
||||||
//
|
//
|
||||||
@@ -117,8 +119,10 @@ GetNextHob (
|
|||||||
if (Hob.Header->HobType == Type) {
|
if (Hob.Header->HobType == Type) {
|
||||||
return Hob.Raw;
|
return Hob.Raw;
|
||||||
}
|
}
|
||||||
|
|
||||||
Hob.Raw = GET_NEXT_HOB (Hob);
|
Hob.Raw = GET_NEXT_HOB (Hob);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,10 +142,10 @@ GetNextHob (
|
|||||||
VOID *
|
VOID *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetFirstHob (
|
GetFirstHob (
|
||||||
IN UINT16 Type
|
IN UINT16 Type
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
VOID *HobList;
|
VOID *HobList;
|
||||||
|
|
||||||
HobList = GetHobList ();
|
HobList = GetHobList ();
|
||||||
return GetNextHob (Type, HobList);
|
return GetNextHob (Type, HobList);
|
||||||
@@ -172,19 +176,21 @@ GetFirstHob (
|
|||||||
VOID *
|
VOID *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetNextGuidHob (
|
GetNextGuidHob (
|
||||||
IN CONST EFI_GUID *Guid,
|
IN CONST EFI_GUID *Guid,
|
||||||
IN CONST VOID *HobStart
|
IN CONST VOID *HobStart
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_PEI_HOB_POINTERS GuidHob;
|
EFI_PEI_HOB_POINTERS GuidHob;
|
||||||
|
|
||||||
GuidHob.Raw = (UINT8 *) HobStart;
|
GuidHob.Raw = (UINT8 *)HobStart;
|
||||||
while ((GuidHob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, GuidHob.Raw)) != NULL) {
|
while ((GuidHob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, GuidHob.Raw)) != NULL) {
|
||||||
if (CompareGuid (Guid, &GuidHob.Guid->Name)) {
|
if (CompareGuid (Guid, &GuidHob.Guid->Name)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
GuidHob.Raw = GET_NEXT_HOB (GuidHob);
|
GuidHob.Raw = GET_NEXT_HOB (GuidHob);
|
||||||
}
|
}
|
||||||
|
|
||||||
return GuidHob.Raw;
|
return GuidHob.Raw;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -209,10 +215,10 @@ GetNextGuidHob (
|
|||||||
VOID *
|
VOID *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetFirstGuidHob (
|
GetFirstGuidHob (
|
||||||
IN CONST EFI_GUID *Guid
|
IN CONST EFI_GUID *Guid
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
VOID *HobList;
|
VOID *HobList;
|
||||||
|
|
||||||
HobList = GetHobList ();
|
HobList = GetHobList ();
|
||||||
return GetNextGuidHob (Guid, HobList);
|
return GetNextGuidHob (Guid, HobList);
|
||||||
@@ -237,17 +243,17 @@ GetBootModeHob (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob;
|
EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob;
|
||||||
|
|
||||||
HandOffHob = (EFI_HOB_HANDOFF_INFO_TABLE *) GetHobList ();
|
HandOffHob = (EFI_HOB_HANDOFF_INFO_TABLE *)GetHobList ();
|
||||||
|
|
||||||
return HandOffHob->BootMode;
|
return HandOffHob->BootMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID *
|
VOID *
|
||||||
CreateHob (
|
CreateHob (
|
||||||
IN UINT16 HobType,
|
IN UINT16 HobType,
|
||||||
IN UINT16 HobLength
|
IN UINT16 HobLength
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob;
|
EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob;
|
||||||
@@ -262,22 +268,22 @@ CreateHob (
|
|||||||
FreeMemory = HandOffHob->EfiFreeMemoryTop - HandOffHob->EfiFreeMemoryBottom;
|
FreeMemory = HandOffHob->EfiFreeMemoryTop - HandOffHob->EfiFreeMemoryBottom;
|
||||||
|
|
||||||
if (FreeMemory < HobLength) {
|
if (FreeMemory < HobLength) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
Hob = (VOID*) (UINTN) HandOffHob->EfiEndOfHobList;
|
Hob = (VOID *)(UINTN)HandOffHob->EfiEndOfHobList;
|
||||||
((EFI_HOB_GENERIC_HEADER*) Hob)->HobType = HobType;
|
((EFI_HOB_GENERIC_HEADER *)Hob)->HobType = HobType;
|
||||||
((EFI_HOB_GENERIC_HEADER*) Hob)->HobLength = HobLength;
|
((EFI_HOB_GENERIC_HEADER *)Hob)->HobLength = HobLength;
|
||||||
((EFI_HOB_GENERIC_HEADER*) Hob)->Reserved = 0;
|
((EFI_HOB_GENERIC_HEADER *)Hob)->Reserved = 0;
|
||||||
|
|
||||||
HobEnd = (EFI_HOB_GENERIC_HEADER*) ((UINTN)Hob + HobLength);
|
HobEnd = (EFI_HOB_GENERIC_HEADER *)((UINTN)Hob + HobLength);
|
||||||
HandOffHob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd;
|
HandOffHob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS)(UINTN)HobEnd;
|
||||||
|
|
||||||
HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST;
|
HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST;
|
||||||
HobEnd->HobLength = sizeof(EFI_HOB_GENERIC_HEADER);
|
HobEnd->HobLength = sizeof (EFI_HOB_GENERIC_HEADER);
|
||||||
HobEnd->Reserved = 0;
|
HobEnd->Reserved = 0;
|
||||||
HobEnd++;
|
HobEnd++;
|
||||||
HandOffHob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd;
|
HandOffHob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS)(UINTN)HobEnd;
|
||||||
|
|
||||||
return Hob;
|
return Hob;
|
||||||
}
|
}
|
||||||
@@ -298,16 +304,18 @@ CreateHob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildModuleHob (
|
BuildModuleHob (
|
||||||
IN CONST EFI_GUID *ModuleName,
|
IN CONST EFI_GUID *ModuleName,
|
||||||
IN EFI_PHYSICAL_ADDRESS MemoryAllocationModule,
|
IN EFI_PHYSICAL_ADDRESS MemoryAllocationModule,
|
||||||
IN UINT64 ModuleLength,
|
IN UINT64 ModuleLength,
|
||||||
IN EFI_PHYSICAL_ADDRESS EntryPoint
|
IN EFI_PHYSICAL_ADDRESS EntryPoint
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_MEMORY_ALLOCATION_MODULE *Hob;
|
EFI_HOB_MEMORY_ALLOCATION_MODULE *Hob;
|
||||||
|
|
||||||
ASSERT (((MemoryAllocationModule & (EFI_PAGE_SIZE - 1)) == 0) &&
|
ASSERT (
|
||||||
((ModuleLength & (EFI_PAGE_SIZE - 1)) == 0));
|
((MemoryAllocationModule & (EFI_PAGE_SIZE - 1)) == 0) &&
|
||||||
|
((ModuleLength & (EFI_PAGE_SIZE - 1)) == 0)
|
||||||
|
);
|
||||||
|
|
||||||
Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION_MODULE));
|
Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION_MODULE));
|
||||||
|
|
||||||
@@ -349,7 +357,7 @@ BuildResourceDescriptorHob (
|
|||||||
EFI_HOB_RESOURCE_DESCRIPTOR *Hob;
|
EFI_HOB_RESOURCE_DESCRIPTOR *Hob;
|
||||||
|
|
||||||
Hob = CreateHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, sizeof (EFI_HOB_RESOURCE_DESCRIPTOR));
|
Hob = CreateHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, sizeof (EFI_HOB_RESOURCE_DESCRIPTOR));
|
||||||
ASSERT(Hob != NULL);
|
ASSERT (Hob != NULL);
|
||||||
|
|
||||||
Hob->ResourceType = ResourceType;
|
Hob->ResourceType = ResourceType;
|
||||||
Hob->ResourceAttribute = ResourceAttribute;
|
Hob->ResourceAttribute = ResourceAttribute;
|
||||||
@@ -376,23 +384,22 @@ BuildResourceDescriptorHob (
|
|||||||
VOID *
|
VOID *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildGuidHob (
|
BuildGuidHob (
|
||||||
IN CONST EFI_GUID *Guid,
|
IN CONST EFI_GUID *Guid,
|
||||||
IN UINTN DataLength
|
IN UINTN DataLength
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_GUID_TYPE *Hob;
|
EFI_HOB_GUID_TYPE *Hob;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Make sure that data length is not too long.
|
// Make sure that data length is not too long.
|
||||||
//
|
//
|
||||||
ASSERT (DataLength <= (0xffff - sizeof (EFI_HOB_GUID_TYPE)));
|
ASSERT (DataLength <= (0xffff - sizeof (EFI_HOB_GUID_TYPE)));
|
||||||
|
|
||||||
Hob = CreateHob (EFI_HOB_TYPE_GUID_EXTENSION, (UINT16) (sizeof (EFI_HOB_GUID_TYPE) + DataLength));
|
Hob = CreateHob (EFI_HOB_TYPE_GUID_EXTENSION, (UINT16)(sizeof (EFI_HOB_GUID_TYPE) + DataLength));
|
||||||
CopyGuid (&Hob->Name, Guid);
|
CopyGuid (&Hob->Name, Guid);
|
||||||
return Hob + 1;
|
return Hob + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Copies a data buffer to a newly-built HOB.
|
Copies a data buffer to a newly-built HOB.
|
||||||
|
|
||||||
@@ -414,9 +421,9 @@ BuildGuidHob (
|
|||||||
VOID *
|
VOID *
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildGuidDataHob (
|
BuildGuidDataHob (
|
||||||
IN CONST EFI_GUID *Guid,
|
IN CONST EFI_GUID *Guid,
|
||||||
IN VOID *Data,
|
IN VOID *Data,
|
||||||
IN UINTN DataLength
|
IN UINTN DataLength
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
VOID *HobData;
|
VOID *HobData;
|
||||||
@@ -441,8 +448,8 @@ BuildGuidDataHob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildFvHob (
|
BuildFvHob (
|
||||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||||
IN UINT64 Length
|
IN UINT64 Length
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_FIRMWARE_VOLUME *Hob;
|
EFI_HOB_FIRMWARE_VOLUME *Hob;
|
||||||
@@ -453,7 +460,6 @@ BuildFvHob (
|
|||||||
Hob->Length = Length;
|
Hob->Length = Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Builds a EFI_HOB_TYPE_FV2 HOB.
|
Builds a EFI_HOB_TYPE_FV2 HOB.
|
||||||
|
|
||||||
@@ -469,10 +475,10 @@ BuildFvHob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildFv2Hob (
|
BuildFv2Hob (
|
||||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||||
IN UINT64 Length,
|
IN UINT64 Length,
|
||||||
IN CONST EFI_GUID *FvName,
|
IN CONST EFI_GUID *FvName,
|
||||||
IN CONST EFI_GUID *FileName
|
IN CONST EFI_GUID *FileName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_FIRMWARE_VOLUME2 *Hob;
|
EFI_HOB_FIRMWARE_VOLUME2 *Hob;
|
||||||
@@ -485,7 +491,6 @@ BuildFv2Hob (
|
|||||||
CopyGuid (&Hob->FileName, FileName);
|
CopyGuid (&Hob->FileName, FileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Builds a HOB for the CPU.
|
Builds a HOB for the CPU.
|
||||||
|
|
||||||
@@ -499,8 +504,8 @@ BuildFv2Hob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildCpuHob (
|
BuildCpuHob (
|
||||||
IN UINT8 SizeOfMemorySpace,
|
IN UINT8 SizeOfMemorySpace,
|
||||||
IN UINT8 SizeOfIoSpace
|
IN UINT8 SizeOfIoSpace
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_CPU *Hob;
|
EFI_HOB_CPU *Hob;
|
||||||
@@ -530,15 +535,17 @@ BuildCpuHob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildMemoryAllocationHob (
|
BuildMemoryAllocationHob (
|
||||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||||
IN UINT64 Length,
|
IN UINT64 Length,
|
||||||
IN EFI_MEMORY_TYPE MemoryType
|
IN EFI_MEMORY_TYPE MemoryType
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HOB_MEMORY_ALLOCATION *Hob;
|
EFI_HOB_MEMORY_ALLOCATION *Hob;
|
||||||
|
|
||||||
ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&
|
ASSERT (
|
||||||
((Length & (EFI_PAGE_SIZE - 1)) == 0));
|
((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&
|
||||||
|
((Length & (EFI_PAGE_SIZE - 1)) == 0)
|
||||||
|
);
|
||||||
|
|
||||||
Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION));
|
Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION));
|
||||||
|
|
||||||
@@ -592,14 +599,13 @@ BuildResourceDescriptorWithOwnerHob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildCvHob (
|
BuildCvHob (
|
||||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||||
IN UINT64 Length
|
IN UINT64 Length
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Builds a HOB for the BSP store.
|
Builds a HOB for the BSP store.
|
||||||
|
|
||||||
@@ -614,9 +620,9 @@ BuildCvHob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildBspStoreHob (
|
BuildBspStoreHob (
|
||||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||||
IN UINT64 Length,
|
IN UINT64 Length,
|
||||||
IN EFI_MEMORY_TYPE MemoryType
|
IN EFI_MEMORY_TYPE MemoryType
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
@@ -635,8 +641,8 @@ BuildBspStoreHob (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
BuildStackHob (
|
BuildStackHob (
|
||||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||||
IN UINT64 Length
|
IN UINT64 Length
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
|
@@ -21,10 +21,10 @@
|
|||||||
extern EFI_PHYSICAL_ADDRESS mMmMemLibInternalMaximumSupportAddress;
|
extern EFI_PHYSICAL_ADDRESS mMmMemLibInternalMaximumSupportAddress;
|
||||||
|
|
||||||
#ifdef MDE_CPU_AARCH64
|
#ifdef MDE_CPU_AARCH64
|
||||||
#define ARM_PHYSICAL_ADDRESS_BITS 36
|
#define ARM_PHYSICAL_ADDRESS_BITS 36
|
||||||
#endif
|
#endif
|
||||||
#ifdef MDE_CPU_ARM
|
#ifdef MDE_CPU_ARM
|
||||||
#define ARM_PHYSICAL_ADDRESS_BITS 32
|
#define ARM_PHYSICAL_ADDRESS_BITS 32
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,7 +36,7 @@ MmMemLibInternalCalculateMaximumSupportAddress (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINT8 PhysicalAddressBits;
|
UINT8 PhysicalAddressBits;
|
||||||
|
|
||||||
PhysicalAddressBits = ARM_PHYSICAL_ADDRESS_BITS;
|
PhysicalAddressBits = ARM_PHYSICAL_ADDRESS_BITS;
|
||||||
|
|
||||||
@@ -74,4 +74,3 @@ MmMemLibInternalFreeMmramRanges (
|
|||||||
{
|
{
|
||||||
// Not implemented for AARCH64.
|
// Not implemented for AARCH64.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -13,15 +13,14 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#include <PiMm.h>
|
#include <PiMm.h>
|
||||||
|
|
||||||
#include <Library/BaseLib.h>
|
#include <Library/BaseLib.h>
|
||||||
#include <Library/BaseMemoryLib.h>
|
#include <Library/BaseMemoryLib.h>
|
||||||
#include <Library/DebugLib.h>
|
#include <Library/DebugLib.h>
|
||||||
|
|
||||||
EFI_MMRAM_DESCRIPTOR *mMmMemLibInternalMmramRanges;
|
EFI_MMRAM_DESCRIPTOR *mMmMemLibInternalMmramRanges;
|
||||||
UINTN mMmMemLibInternalMmramCount;
|
UINTN mMmMemLibInternalMmramCount;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Maximum support address used to check input buffer
|
// Maximum support address used to check input buffer
|
||||||
@@ -82,7 +81,8 @@ MmIsBufferOutsideMmValid (
|
|||||||
//
|
//
|
||||||
if ((Length > mMmMemLibInternalMaximumSupportAddress) ||
|
if ((Length > mMmMemLibInternalMaximumSupportAddress) ||
|
||||||
(Buffer > mMmMemLibInternalMaximumSupportAddress) ||
|
(Buffer > mMmMemLibInternalMaximumSupportAddress) ||
|
||||||
((Length != 0) && (Buffer > (mMmMemLibInternalMaximumSupportAddress - (Length - 1)))) ) {
|
((Length != 0) && (Buffer > (mMmMemLibInternalMaximumSupportAddress - (Length - 1)))))
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// Overflow happen
|
// Overflow happen
|
||||||
//
|
//
|
||||||
@@ -96,11 +96,12 @@ MmIsBufferOutsideMmValid (
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Index = 0; Index < mMmMemLibInternalMmramCount; Index ++) {
|
for (Index = 0; Index < mMmMemLibInternalMmramCount; Index++) {
|
||||||
if (((Buffer >= mMmMemLibInternalMmramRanges[Index].CpuStart) &&
|
if (((Buffer >= mMmMemLibInternalMmramRanges[Index].CpuStart) &&
|
||||||
(Buffer < mMmMemLibInternalMmramRanges[Index].CpuStart + mMmMemLibInternalMmramRanges[Index].PhysicalSize)) ||
|
(Buffer < mMmMemLibInternalMmramRanges[Index].CpuStart + mMmMemLibInternalMmramRanges[Index].PhysicalSize)) ||
|
||||||
((mMmMemLibInternalMmramRanges[Index].CpuStart >= Buffer) &&
|
((mMmMemLibInternalMmramRanges[Index].CpuStart >= Buffer) &&
|
||||||
(mMmMemLibInternalMmramRanges[Index].CpuStart < Buffer + Length))) {
|
(mMmMemLibInternalMmramRanges[Index].CpuStart < Buffer + Length)))
|
||||||
|
{
|
||||||
DEBUG ((
|
DEBUG ((
|
||||||
DEBUG_ERROR,
|
DEBUG_ERROR,
|
||||||
"MmIsBufferOutsideMmValid: Overlap: Buffer (0x%lx) - Length (0x%lx), ",
|
"MmIsBufferOutsideMmValid: Overlap: Buffer (0x%lx) - Length (0x%lx), ",
|
||||||
@@ -149,6 +150,7 @@ MmCopyMemToMmram (
|
|||||||
DEBUG ((DEBUG_ERROR, "MmCopyMemToMmram: Security Violation: Source (0x%x), Length (0x%x)\n", SourceBuffer, Length));
|
DEBUG ((DEBUG_ERROR, "MmCopyMemToMmram: Security Violation: Source (0x%x), Length (0x%x)\n", SourceBuffer, Length));
|
||||||
return EFI_SECURITY_VIOLATION;
|
return EFI_SECURITY_VIOLATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyMem (DestinationBuffer, SourceBuffer, Length);
|
CopyMem (DestinationBuffer, SourceBuffer, Length);
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -179,10 +181,15 @@ MmCopyMemFromMmram (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (!MmIsBufferOutsideMmValid ((EFI_PHYSICAL_ADDRESS)(UINTN)DestinationBuffer, Length)) {
|
if (!MmIsBufferOutsideMmValid ((EFI_PHYSICAL_ADDRESS)(UINTN)DestinationBuffer, Length)) {
|
||||||
DEBUG ((DEBUG_ERROR, "MmCopyMemFromMmram: Security Violation: Destination (0x%x), Length (0x%x)\n",
|
DEBUG ((
|
||||||
DestinationBuffer, Length));
|
DEBUG_ERROR,
|
||||||
|
"MmCopyMemFromMmram: Security Violation: Destination (0x%x), Length (0x%x)\n",
|
||||||
|
DestinationBuffer,
|
||||||
|
Length
|
||||||
|
));
|
||||||
return EFI_SECURITY_VIOLATION;
|
return EFI_SECURITY_VIOLATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyMem (DestinationBuffer, SourceBuffer, Length);
|
CopyMem (DestinationBuffer, SourceBuffer, Length);
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -214,14 +221,20 @@ MmCopyMem (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (!MmIsBufferOutsideMmValid ((EFI_PHYSICAL_ADDRESS)(UINTN)DestinationBuffer, Length)) {
|
if (!MmIsBufferOutsideMmValid ((EFI_PHYSICAL_ADDRESS)(UINTN)DestinationBuffer, Length)) {
|
||||||
DEBUG ((DEBUG_ERROR, "MmCopyMem: Security Violation: Destination (0x%x), Length (0x%x)\n",
|
DEBUG ((
|
||||||
DestinationBuffer, Length));
|
DEBUG_ERROR,
|
||||||
|
"MmCopyMem: Security Violation: Destination (0x%x), Length (0x%x)\n",
|
||||||
|
DestinationBuffer,
|
||||||
|
Length
|
||||||
|
));
|
||||||
return EFI_SECURITY_VIOLATION;
|
return EFI_SECURITY_VIOLATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!MmIsBufferOutsideMmValid ((EFI_PHYSICAL_ADDRESS)(UINTN)SourceBuffer, Length)) {
|
if (!MmIsBufferOutsideMmValid ((EFI_PHYSICAL_ADDRESS)(UINTN)SourceBuffer, Length)) {
|
||||||
DEBUG ((DEBUG_ERROR, "MmCopyMem: Security Violation: Source (0x%x), Length (0x%x)\n", SourceBuffer, Length));
|
DEBUG ((DEBUG_ERROR, "MmCopyMem: Security Violation: Source (0x%x), Length (0x%x)\n", SourceBuffer, Length));
|
||||||
return EFI_SECURITY_VIOLATION;
|
return EFI_SECURITY_VIOLATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyMem (DestinationBuffer, SourceBuffer, Length);
|
CopyMem (DestinationBuffer, SourceBuffer, Length);
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -254,6 +267,7 @@ MmSetMem (
|
|||||||
DEBUG ((DEBUG_ERROR, "MmSetMem: Security Violation: Source (0x%x), Length (0x%x)\n", Buffer, Length));
|
DEBUG ((DEBUG_ERROR, "MmSetMem: Security Violation: Source (0x%x), Length (0x%x)\n", Buffer, Length));
|
||||||
return EFI_SECURITY_VIOLATION;
|
return EFI_SECURITY_VIOLATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetMem (Buffer, Length, Value);
|
SetMem (Buffer, Length, Value);
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -270,11 +284,11 @@ MmSetMem (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MemLibConstructor (
|
MemLibConstructor (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_MM_SYSTEM_TABLE *MmSystemTable
|
IN EFI_MM_SYSTEM_TABLE *MmSystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Calculate and save maximum support address
|
// Calculate and save maximum support address
|
||||||
@@ -301,11 +315,10 @@ MemLibConstructor (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
MemLibDestructor (
|
MemLibDestructor (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_MM_SYSTEM_TABLE *MmSystemTable
|
IN EFI_MM_SYSTEM_TABLE *MmSystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
//
|
//
|
||||||
// Deinitialize cached Mmram Ranges.
|
// Deinitialize cached Mmram Ranges.
|
||||||
//
|
//
|
||||||
|
@@ -27,7 +27,7 @@
|
|||||||
// Maximum support address used to check input buffer
|
// Maximum support address used to check input buffer
|
||||||
//
|
//
|
||||||
extern EFI_PHYSICAL_ADDRESS mMmMemLibInternalMaximumSupportAddress;
|
extern EFI_PHYSICAL_ADDRESS mMmMemLibInternalMaximumSupportAddress;
|
||||||
extern EFI_MMRAM_DESCRIPTOR *mMmMemLibInternalMmramRanges;
|
extern EFI_MMRAM_DESCRIPTOR *mMmMemLibInternalMmramRanges;
|
||||||
extern UINTN mMmMemLibInternalMmramCount;
|
extern UINTN mMmMemLibInternalMmramCount;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -39,25 +39,26 @@ MmMemLibInternalCalculateMaximumSupportAddress (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
VOID *Hob;
|
VOID *Hob;
|
||||||
UINT32 RegEax;
|
UINT32 RegEax;
|
||||||
UINT8 PhysicalAddressBits;
|
UINT8 PhysicalAddressBits;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get physical address bits supported.
|
// Get physical address bits supported.
|
||||||
//
|
//
|
||||||
Hob = GetFirstHob (EFI_HOB_TYPE_CPU);
|
Hob = GetFirstHob (EFI_HOB_TYPE_CPU);
|
||||||
if (Hob != NULL) {
|
if (Hob != NULL) {
|
||||||
PhysicalAddressBits = ((EFI_HOB_CPU *) Hob)->SizeOfMemorySpace;
|
PhysicalAddressBits = ((EFI_HOB_CPU *)Hob)->SizeOfMemorySpace;
|
||||||
} else {
|
} else {
|
||||||
AsmCpuid (0x80000000, &RegEax, NULL, NULL, NULL);
|
AsmCpuid (0x80000000, &RegEax, NULL, NULL, NULL);
|
||||||
if (RegEax >= 0x80000008) {
|
if (RegEax >= 0x80000008) {
|
||||||
AsmCpuid (0x80000008, &RegEax, NULL, NULL, NULL);
|
AsmCpuid (0x80000008, &RegEax, NULL, NULL, NULL);
|
||||||
PhysicalAddressBits = (UINT8) RegEax;
|
PhysicalAddressBits = (UINT8)RegEax;
|
||||||
} else {
|
} else {
|
||||||
PhysicalAddressBits = 36;
|
PhysicalAddressBits = 36;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// IA-32e paging translates 48-bit linear addresses to 52-bit physical addresses.
|
// IA-32e paging translates 48-bit linear addresses to 52-bit physical addresses.
|
||||||
//
|
//
|
||||||
@@ -108,32 +109,34 @@ MmMemLibInternalPopulateMmramRanges (
|
|||||||
}
|
}
|
||||||
|
|
||||||
MmramRangesHobData = GET_GUID_HOB_DATA (MmramRangesHob);
|
MmramRangesHobData = GET_GUID_HOB_DATA (MmramRangesHob);
|
||||||
if (MmramRangesHobData == NULL || MmramRangesHobData->Descriptor == NULL) {
|
if ((MmramRangesHobData == NULL) || (MmramRangesHobData->Descriptor == NULL)) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
mMmMemLibInternalMmramCount = MmramRangesHobData->NumberOfMmReservedRegions;
|
mMmMemLibInternalMmramCount = MmramRangesHobData->NumberOfMmReservedRegions;
|
||||||
MmramDescriptors = MmramRangesHobData->Descriptor;
|
MmramDescriptors = MmramRangesHobData->Descriptor;
|
||||||
} else {
|
} else {
|
||||||
DataInHob = GET_GUID_HOB_DATA (GuidHob);
|
DataInHob = GET_GUID_HOB_DATA (GuidHob);
|
||||||
if (DataInHob == NULL) {
|
if (DataInHob == NULL) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
MmCorePrivateData = (MM_CORE_PRIVATE_DATA *) (UINTN) DataInHob->Address;
|
MmCorePrivateData = (MM_CORE_PRIVATE_DATA *)(UINTN)DataInHob->Address;
|
||||||
if (MmCorePrivateData == NULL || MmCorePrivateData->MmramRanges == 0) {
|
if ((MmCorePrivateData == NULL) || (MmCorePrivateData->MmramRanges == 0)) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
mMmMemLibInternalMmramCount = (UINTN) MmCorePrivateData->MmramRangeCount;
|
mMmMemLibInternalMmramCount = (UINTN)MmCorePrivateData->MmramRangeCount;
|
||||||
MmramDescriptors = (EFI_MMRAM_DESCRIPTOR *) (UINTN) MmCorePrivateData->MmramRanges;
|
MmramDescriptors = (EFI_MMRAM_DESCRIPTOR *)(UINTN)MmCorePrivateData->MmramRanges;
|
||||||
}
|
}
|
||||||
|
|
||||||
mMmMemLibInternalMmramRanges = AllocatePool (mMmMemLibInternalMmramCount * sizeof (EFI_MMRAM_DESCRIPTOR));
|
mMmMemLibInternalMmramRanges = AllocatePool (mMmMemLibInternalMmramCount * sizeof (EFI_MMRAM_DESCRIPTOR));
|
||||||
if (mMmMemLibInternalMmramRanges) {
|
if (mMmMemLibInternalMmramRanges) {
|
||||||
CopyMem (mMmMemLibInternalMmramRanges,
|
CopyMem (
|
||||||
MmramDescriptors,
|
mMmMemLibInternalMmramRanges,
|
||||||
mMmMemLibInternalMmramCount * sizeof (EFI_MMRAM_DESCRIPTOR));
|
MmramDescriptors,
|
||||||
|
mMmMemLibInternalMmramCount * sizeof (EFI_MMRAM_DESCRIPTOR)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@@ -152,4 +155,3 @@ MmMemLibInternalFreeMmramRanges (
|
|||||||
FreePool (mMmMemLibInternalMmramRanges);
|
FreePool (mMmMemLibInternalMmramRanges);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -45,6 +45,7 @@ InternalAllocatePages (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (VOID *)(UINTN)Memory;
|
return (VOID *)(UINTN)Memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,7 +142,7 @@ FreePages (
|
|||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
ASSERT (Pages != 0);
|
ASSERT (Pages != 0);
|
||||||
Status = gMmst->MmFreePages ((EFI_PHYSICAL_ADDRESS) (UINTN)Buffer, Pages);
|
Status = gMmst->MmFreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)Buffer, Pages);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,23 +186,25 @@ InternalAllocateAlignedPages (
|
|||||||
if (Pages == 0) {
|
if (Pages == 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Alignment > EFI_PAGE_SIZE) {
|
if (Alignment > EFI_PAGE_SIZE) {
|
||||||
//
|
//
|
||||||
// Calculate the total number of pages since alignment is larger than page size.
|
// Calculate the total number of pages since alignment is larger than page size.
|
||||||
//
|
//
|
||||||
AlignmentMask = Alignment - 1;
|
AlignmentMask = Alignment - 1;
|
||||||
RealPages = Pages + EFI_SIZE_TO_PAGES (Alignment);
|
RealPages = Pages + EFI_SIZE_TO_PAGES (Alignment);
|
||||||
//
|
//
|
||||||
// Make sure that Pages plus EFI_SIZE_TO_PAGES (Alignment) does not overflow.
|
// Make sure that Pages plus EFI_SIZE_TO_PAGES (Alignment) does not overflow.
|
||||||
//
|
//
|
||||||
ASSERT (RealPages > Pages);
|
ASSERT (RealPages > Pages);
|
||||||
|
|
||||||
Status = gMmst->MmAllocatePages (AllocateAnyPages, MemoryType, RealPages, &Memory);
|
Status = gMmst->MmAllocatePages (AllocateAnyPages, MemoryType, RealPages, &Memory);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
AlignedMemory = ((UINTN)Memory + AlignmentMask) & ~AlignmentMask;
|
AlignedMemory = ((UINTN)Memory + AlignmentMask) & ~AlignmentMask;
|
||||||
UnalignedPages = EFI_SIZE_TO_PAGES (AlignedMemory - (UINTN) Memory);
|
UnalignedPages = EFI_SIZE_TO_PAGES (AlignedMemory - (UINTN)Memory);
|
||||||
if (UnalignedPages > 0) {
|
if (UnalignedPages > 0) {
|
||||||
//
|
//
|
||||||
// Free first unaligned page(s).
|
// Free first unaligned page(s).
|
||||||
@@ -209,6 +212,7 @@ InternalAllocateAlignedPages (
|
|||||||
Status = gMmst->MmFreePages (Memory, UnalignedPages);
|
Status = gMmst->MmFreePages (Memory, UnalignedPages);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
Memory = (EFI_PHYSICAL_ADDRESS)(AlignedMemory + EFI_PAGES_TO_SIZE (Pages));
|
Memory = (EFI_PHYSICAL_ADDRESS)(AlignedMemory + EFI_PAGES_TO_SIZE (Pages));
|
||||||
UnalignedPages = RealPages - Pages - UnalignedPages;
|
UnalignedPages = RealPages - Pages - UnalignedPages;
|
||||||
if (UnalignedPages > 0) {
|
if (UnalignedPages > 0) {
|
||||||
@@ -226,9 +230,11 @@ InternalAllocateAlignedPages (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
AlignedMemory = (UINTN) Memory;
|
|
||||||
|
AlignedMemory = (UINTN)Memory;
|
||||||
}
|
}
|
||||||
return (VOID *) AlignedMemory;
|
|
||||||
|
return (VOID *)AlignedMemory;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -374,6 +380,7 @@ InternalAllocatePool (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
Memory = NULL;
|
Memory = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Memory;
|
return Memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -466,6 +473,7 @@ InternalAllocateZeroPool (
|
|||||||
if (Memory != NULL) {
|
if (Memory != NULL) {
|
||||||
Memory = ZeroMem (Memory, AllocationSize);
|
Memory = ZeroMem (Memory, AllocationSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Memory;
|
return Memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -562,12 +570,13 @@ InternalAllocateCopyPool (
|
|||||||
VOID *Memory;
|
VOID *Memory;
|
||||||
|
|
||||||
ASSERT (Buffer != NULL);
|
ASSERT (Buffer != NULL);
|
||||||
ASSERT (AllocationSize <= (MAX_ADDRESS - (UINTN) Buffer + 1));
|
ASSERT (AllocationSize <= (MAX_ADDRESS - (UINTN)Buffer + 1));
|
||||||
|
|
||||||
Memory = InternalAllocatePool (PoolType, AllocationSize);
|
Memory = InternalAllocatePool (PoolType, AllocationSize);
|
||||||
if (Memory != NULL) {
|
if (Memory != NULL) {
|
||||||
Memory = CopyMem (Memory, Buffer, AllocationSize);
|
Memory = CopyMem (Memory, Buffer, AllocationSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Memory;
|
return Memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -685,10 +694,11 @@ InternalReallocatePool (
|
|||||||
VOID *NewBuffer;
|
VOID *NewBuffer;
|
||||||
|
|
||||||
NewBuffer = InternalAllocateZeroPool (PoolType, NewSize);
|
NewBuffer = InternalAllocateZeroPool (PoolType, NewSize);
|
||||||
if (NewBuffer != NULL && OldBuffer != NULL) {
|
if ((NewBuffer != NULL) && (OldBuffer != NULL)) {
|
||||||
CopyMem (NewBuffer, OldBuffer, MIN (OldSize, NewSize));
|
CopyMem (NewBuffer, OldBuffer, MIN (OldSize, NewSize));
|
||||||
FreePool (OldBuffer);
|
FreePool (OldBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NewBuffer;
|
return NewBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -805,10 +815,10 @@ ReallocateReservedPool (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
FreePool (
|
FreePool (
|
||||||
IN VOID *Buffer
|
IN VOID *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Status = gMmst->MmFreePool (Buffer);
|
Status = gMmst->MmFreePool (Buffer);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
@@ -19,29 +19,29 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Library/PeCoffExtraActionLib.h>
|
#include <Library/PeCoffExtraActionLib.h>
|
||||||
|
|
||||||
typedef RETURN_STATUS (*REGION_PERMISSION_UPDATE_FUNC) (
|
typedef RETURN_STATUS (*REGION_PERMISSION_UPDATE_FUNC) (
|
||||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||||
IN UINT64 Length
|
IN UINT64 Length
|
||||||
);
|
);
|
||||||
|
|
||||||
STATIC
|
STATIC
|
||||||
RETURN_STATUS
|
RETURN_STATUS
|
||||||
UpdatePeCoffPermissions (
|
UpdatePeCoffPermissions (
|
||||||
IN CONST PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
IN CONST PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
||||||
IN REGION_PERMISSION_UPDATE_FUNC NoExecUpdater,
|
IN REGION_PERMISSION_UPDATE_FUNC NoExecUpdater,
|
||||||
IN REGION_PERMISSION_UPDATE_FUNC ReadOnlyUpdater
|
IN REGION_PERMISSION_UPDATE_FUNC ReadOnlyUpdater
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
RETURN_STATUS Status;
|
RETURN_STATUS Status;
|
||||||
EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;
|
EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;
|
||||||
EFI_IMAGE_OPTIONAL_HEADER_UNION HdrData;
|
EFI_IMAGE_OPTIONAL_HEADER_UNION HdrData;
|
||||||
UINTN Size;
|
UINTN Size;
|
||||||
UINTN ReadSize;
|
UINTN ReadSize;
|
||||||
UINT32 SectionHeaderOffset;
|
UINT32 SectionHeaderOffset;
|
||||||
UINTN NumberOfSections;
|
UINTN NumberOfSections;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
EFI_IMAGE_SECTION_HEADER SectionHeader;
|
EFI_IMAGE_SECTION_HEADER SectionHeader;
|
||||||
PE_COFF_LOADER_IMAGE_CONTEXT TmpContext;
|
PE_COFF_LOADER_IMAGE_CONTEXT TmpContext;
|
||||||
EFI_PHYSICAL_ADDRESS Base;
|
EFI_PHYSICAL_ADDRESS Base;
|
||||||
|
|
||||||
//
|
//
|
||||||
// We need to copy ImageContext since PeCoffLoaderGetImageInfo ()
|
// We need to copy ImageContext since PeCoffLoaderGetImageInfo ()
|
||||||
@@ -52,17 +52,25 @@ UpdatePeCoffPermissions (
|
|||||||
if (TmpContext.PeCoffHeaderOffset == 0) {
|
if (TmpContext.PeCoffHeaderOffset == 0) {
|
||||||
Status = PeCoffLoaderGetImageInfo (&TmpContext);
|
Status = PeCoffLoaderGetImageInfo (&TmpContext);
|
||||||
if (RETURN_ERROR (Status)) {
|
if (RETURN_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR,
|
DEBUG ((
|
||||||
|
DEBUG_ERROR,
|
||||||
"%a: PeCoffLoaderGetImageInfo () failed (Status = %r)\n",
|
"%a: PeCoffLoaderGetImageInfo () failed (Status = %r)\n",
|
||||||
__FUNCTION__, Status));
|
__FUNCTION__,
|
||||||
|
Status
|
||||||
|
));
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TmpContext.IsTeImage &&
|
if (TmpContext.IsTeImage &&
|
||||||
TmpContext.ImageAddress == ImageContext->ImageAddress) {
|
(TmpContext.ImageAddress == ImageContext->ImageAddress))
|
||||||
DEBUG ((DEBUG_INFO, "%a: ignoring XIP TE image at 0x%lx\n", __FUNCTION__,
|
{
|
||||||
ImageContext->ImageAddress));
|
DEBUG ((
|
||||||
|
DEBUG_INFO,
|
||||||
|
"%a: ignoring XIP TE image at 0x%lx\n",
|
||||||
|
__FUNCTION__,
|
||||||
|
ImageContext->ImageAddress
|
||||||
|
));
|
||||||
return RETURN_SUCCESS;
|
return RETURN_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,10 +81,15 @@ UpdatePeCoffPermissions (
|
|||||||
// noexec permissions on the entire region.
|
// noexec permissions on the entire region.
|
||||||
//
|
//
|
||||||
if (!TmpContext.IsTeImage) {
|
if (!TmpContext.IsTeImage) {
|
||||||
DEBUG ((DEBUG_WARN,
|
DEBUG ((
|
||||||
|
DEBUG_WARN,
|
||||||
"%a: non-TE Image at 0x%lx has SectionAlignment < 4 KB (%lu)\n",
|
"%a: non-TE Image at 0x%lx has SectionAlignment < 4 KB (%lu)\n",
|
||||||
__FUNCTION__, ImageContext->ImageAddress, TmpContext.SectionAlignment));
|
__FUNCTION__,
|
||||||
|
ImageContext->ImageAddress,
|
||||||
|
TmpContext.SectionAlignment
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
Base = ImageContext->ImageAddress & ~(EFI_PAGE_SIZE - 1);
|
Base = ImageContext->ImageAddress & ~(EFI_PAGE_SIZE - 1);
|
||||||
Size = ImageContext->ImageAddress - Base + ImageContext->ImageSize;
|
Size = ImageContext->ImageAddress - Base + ImageContext->ImageSize;
|
||||||
return NoExecUpdater (Base, ALIGN_VALUE (Size, EFI_PAGE_SIZE));
|
return NoExecUpdater (Base, ALIGN_VALUE (Size, EFI_PAGE_SIZE));
|
||||||
@@ -89,14 +102,21 @@ UpdatePeCoffPermissions (
|
|||||||
// location in both images.
|
// location in both images.
|
||||||
//
|
//
|
||||||
Hdr.Union = &HdrData;
|
Hdr.Union = &HdrData;
|
||||||
Size = sizeof (EFI_IMAGE_OPTIONAL_HEADER_UNION);
|
Size = sizeof (EFI_IMAGE_OPTIONAL_HEADER_UNION);
|
||||||
ReadSize = Size;
|
ReadSize = Size;
|
||||||
Status = TmpContext.ImageRead (TmpContext.Handle,
|
Status = TmpContext.ImageRead (
|
||||||
TmpContext.PeCoffHeaderOffset, &Size, Hdr.Pe32);
|
TmpContext.Handle,
|
||||||
|
TmpContext.PeCoffHeaderOffset,
|
||||||
|
&Size,
|
||||||
|
Hdr.Pe32
|
||||||
|
);
|
||||||
if (RETURN_ERROR (Status) || (Size != ReadSize)) {
|
if (RETURN_ERROR (Status) || (Size != ReadSize)) {
|
||||||
DEBUG ((DEBUG_ERROR,
|
DEBUG ((
|
||||||
|
DEBUG_ERROR,
|
||||||
"%a: TmpContext.ImageRead () failed (Status = %r)\n",
|
"%a: TmpContext.ImageRead () failed (Status = %r)\n",
|
||||||
__FUNCTION__, Status));
|
__FUNCTION__,
|
||||||
|
Status
|
||||||
|
));
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,7 +124,7 @@ UpdatePeCoffPermissions (
|
|||||||
|
|
||||||
SectionHeaderOffset = TmpContext.PeCoffHeaderOffset + sizeof (UINT32) +
|
SectionHeaderOffset = TmpContext.PeCoffHeaderOffset + sizeof (UINT32) +
|
||||||
sizeof (EFI_IMAGE_FILE_HEADER);
|
sizeof (EFI_IMAGE_FILE_HEADER);
|
||||||
NumberOfSections = (UINTN)(Hdr.Pe32->FileHeader.NumberOfSections);
|
NumberOfSections = (UINTN)(Hdr.Pe32->FileHeader.NumberOfSections);
|
||||||
|
|
||||||
switch (Hdr.Pe32->OptionalHeader.Magic) {
|
switch (Hdr.Pe32->OptionalHeader.Magic) {
|
||||||
case EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC:
|
case EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC:
|
||||||
@@ -124,42 +144,63 @@ UpdatePeCoffPermissions (
|
|||||||
//
|
//
|
||||||
// Read section header from file
|
// Read section header from file
|
||||||
//
|
//
|
||||||
Size = sizeof (EFI_IMAGE_SECTION_HEADER);
|
Size = sizeof (EFI_IMAGE_SECTION_HEADER);
|
||||||
ReadSize = Size;
|
ReadSize = Size;
|
||||||
Status = TmpContext.ImageRead (TmpContext.Handle, SectionHeaderOffset,
|
Status = TmpContext.ImageRead (
|
||||||
&Size, &SectionHeader);
|
TmpContext.Handle,
|
||||||
|
SectionHeaderOffset,
|
||||||
|
&Size,
|
||||||
|
&SectionHeader
|
||||||
|
);
|
||||||
if (RETURN_ERROR (Status) || (Size != ReadSize)) {
|
if (RETURN_ERROR (Status) || (Size != ReadSize)) {
|
||||||
DEBUG ((DEBUG_ERROR,
|
DEBUG ((
|
||||||
|
DEBUG_ERROR,
|
||||||
"%a: TmpContext.ImageRead () failed (Status = %r)\n",
|
"%a: TmpContext.ImageRead () failed (Status = %r)\n",
|
||||||
__FUNCTION__, Status));
|
__FUNCTION__,
|
||||||
|
Status
|
||||||
|
));
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Base = TmpContext.ImageAddress + SectionHeader.VirtualAddress;
|
Base = TmpContext.ImageAddress + SectionHeader.VirtualAddress;
|
||||||
|
|
||||||
if ((SectionHeader.Characteristics & EFI_IMAGE_SCN_MEM_EXECUTE) == 0) {
|
if ((SectionHeader.Characteristics & EFI_IMAGE_SCN_MEM_EXECUTE) == 0) {
|
||||||
|
|
||||||
if ((SectionHeader.Characteristics & EFI_IMAGE_SCN_MEM_WRITE) == 0) {
|
if ((SectionHeader.Characteristics & EFI_IMAGE_SCN_MEM_WRITE) == 0) {
|
||||||
|
DEBUG ((
|
||||||
DEBUG ((DEBUG_INFO,
|
DEBUG_INFO,
|
||||||
"%a: Mapping section %d of image at 0x%lx with RO-XN permissions and size 0x%x\n",
|
"%a: Mapping section %d of image at 0x%lx with RO-XN permissions and size 0x%x\n",
|
||||||
__FUNCTION__, Index, Base, SectionHeader.Misc.VirtualSize));
|
__FUNCTION__,
|
||||||
|
Index,
|
||||||
|
Base,
|
||||||
|
SectionHeader.Misc.VirtualSize
|
||||||
|
));
|
||||||
ReadOnlyUpdater (Base, SectionHeader.Misc.VirtualSize);
|
ReadOnlyUpdater (Base, SectionHeader.Misc.VirtualSize);
|
||||||
} else {
|
} else {
|
||||||
DEBUG ((DEBUG_WARN,
|
DEBUG ((
|
||||||
|
DEBUG_WARN,
|
||||||
"%a: Mapping section %d of image at 0x%lx with RW-XN permissions and size 0x%x\n",
|
"%a: Mapping section %d of image at 0x%lx with RW-XN permissions and size 0x%x\n",
|
||||||
__FUNCTION__, Index, Base, SectionHeader.Misc.VirtualSize));
|
__FUNCTION__,
|
||||||
|
Index,
|
||||||
|
Base,
|
||||||
|
SectionHeader.Misc.VirtualSize
|
||||||
|
));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
DEBUG ((DEBUG_INFO,
|
DEBUG ((
|
||||||
"%a: Mapping section %d of image at 0x%lx with RO-X permissions and size 0x%x\n",
|
DEBUG_INFO,
|
||||||
__FUNCTION__, Index, Base, SectionHeader.Misc.VirtualSize));
|
"%a: Mapping section %d of image at 0x%lx with RO-X permissions and size 0x%x\n",
|
||||||
ReadOnlyUpdater (Base, SectionHeader.Misc.VirtualSize);
|
__FUNCTION__,
|
||||||
NoExecUpdater (Base, SectionHeader.Misc.VirtualSize);
|
Index,
|
||||||
|
Base,
|
||||||
|
SectionHeader.Misc.VirtualSize
|
||||||
|
));
|
||||||
|
ReadOnlyUpdater (Base, SectionHeader.Misc.VirtualSize);
|
||||||
|
NoExecUpdater (Base, SectionHeader.Misc.VirtualSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
SectionHeaderOffset += sizeof (EFI_IMAGE_SECTION_HEADER);
|
SectionHeaderOffset += sizeof (EFI_IMAGE_SECTION_HEADER);
|
||||||
}
|
}
|
||||||
|
|
||||||
return RETURN_SUCCESS;
|
return RETURN_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,8 +226,6 @@ PeCoffLoaderRelocateImageExtraAction (
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Performs additional actions just before a PE/COFF image is unloaded. Any resources
|
Performs additional actions just before a PE/COFF image is unloaded. Any resources
|
||||||
that were allocated by PeCoffLoaderRelocateImageExtraAction() must be freed.
|
that were allocated by PeCoffLoaderRelocateImageExtraAction() must be freed.
|
||||||
|
@@ -26,12 +26,12 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
VariableMmDependencyLibConstructor (
|
VariableMmDependencyLibConstructor (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_HANDLE Handle;
|
EFI_HANDLE Handle;
|
||||||
|
|
||||||
Handle = NULL;
|
Handle = NULL;
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
|
Reference in New Issue
Block a user