EFI_STATUS\r
EFIAPI\r
SmmCommunicationMmCommunicate2 (\r
- IN CONST EFI_MM_COMMUNICATION2_PROTOCOL *This,\r
- IN OUT VOID *CommBufferPhysical,\r
- IN OUT VOID *CommBufferVirtual,\r
- IN OUT UINTN *CommSize OPTIONAL\r
+ IN CONST EFI_MM_COMMUNICATION2_PROTOCOL *This,\r
+ IN OUT VOID *CommBufferPhysical,\r
+ IN OUT VOID *CommBufferVirtual,\r
+ IN OUT UINTN *CommSize OPTIONAL\r
);\r
\r
/**\r
// notifications required by the SMM IPL\r
//\r
typedef struct {\r
- BOOLEAN Protocol;\r
- BOOLEAN CloseOnLock;\r
- EFI_GUID *Guid;\r
- EFI_EVENT_NOTIFY NotifyFunction;\r
- VOID *NotifyContext;\r
- EFI_TPL NotifyTpl;\r
- EFI_EVENT Event;\r
+ BOOLEAN Protocol;\r
+ BOOLEAN CloseOnLock;\r
+ EFI_GUID *Guid;\r
+ EFI_EVENT_NOTIFY NotifyFunction;\r
+ VOID *NotifyContext;\r
+ EFI_TPL NotifyTpl;\r
+ EFI_EVENT Event;\r
} SMM_IPL_EVENT_NOTIFICATION;\r
\r
//\r
EFI_PHYSICAL_ADDRESS mSmramCacheBase;\r
UINT64 mSmramCacheSize;\r
\r
-EFI_SMM_COMMUNICATE_HEADER mCommunicateHeader;\r
-EFI_LOAD_FIXED_ADDRESS_CONFIGURATION_TABLE *mLMFAConfigurationTable = NULL;\r
+EFI_SMM_COMMUNICATE_HEADER mCommunicateHeader;\r
+EFI_LOAD_FIXED_ADDRESS_CONFIGURATION_TABLE *mLMFAConfigurationTable = NULL;\r
\r
//\r
// Table of Protocol notification and GUIDed Event notifications that the SMM IPL requires\r
**/\r
VOID\r
GetSmramCacheRange (\r
- IN EFI_SMRAM_DESCRIPTOR *SmramRange,\r
- OUT EFI_PHYSICAL_ADDRESS *SmramCacheBase,\r
- OUT UINT64 *SmramCacheSize\r
+ IN EFI_SMRAM_DESCRIPTOR *SmramRange,\r
+ OUT EFI_PHYSICAL_ADDRESS *SmramCacheBase,\r
+ OUT UINT64 *SmramCacheSize\r
)\r
{\r
- UINTN Index;\r
- EFI_PHYSICAL_ADDRESS RangeCpuStart;\r
- UINT64 RangePhysicalSize;\r
- BOOLEAN FoundAjacentRange;\r
+ UINTN Index;\r
+ EFI_PHYSICAL_ADDRESS RangeCpuStart;\r
+ UINT64 RangePhysicalSize;\r
+ BOOLEAN FoundAjacentRange;\r
\r
*SmramCacheBase = SmramRange->CpuStart;\r
*SmramCacheSize = SmramRange->PhysicalSize;\r
for (Index = 0; Index < gSmmCorePrivate->SmramRangeCount; Index++) {\r
RangeCpuStart = gSmmCorePrivate->SmramRanges[Index].CpuStart;\r
RangePhysicalSize = gSmmCorePrivate->SmramRanges[Index].PhysicalSize;\r
- if (RangeCpuStart < *SmramCacheBase && *SmramCacheBase == (RangeCpuStart + RangePhysicalSize)) {\r
+ if ((RangeCpuStart < *SmramCacheBase) && (*SmramCacheBase == (RangeCpuStart + RangePhysicalSize))) {\r
*SmramCacheBase = RangeCpuStart;\r
*SmramCacheSize += RangePhysicalSize;\r
FoundAjacentRange = TRUE;\r
- } else if ((*SmramCacheBase + *SmramCacheSize) == RangeCpuStart && RangePhysicalSize > 0) {\r
+ } else if (((*SmramCacheBase + *SmramCacheSize) == RangeCpuStart) && (RangePhysicalSize > 0)) {\r
*SmramCacheSize += RangePhysicalSize;\r
FoundAjacentRange = TRUE;\r
}\r
}\r
} while (FoundAjacentRange);\r
-\r
}\r
\r
/**\r
OUT EFI_SMM_SYSTEM_TABLE2 **Smst\r
)\r
{\r
- if ((This == NULL) ||(Smst == NULL)) {\r
+ if ((This == NULL) || (Smst == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- CommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *) CommBuffer;\r
+ CommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *)CommBuffer;\r
\r
if (CommSize == NULL) {\r
TempCommSize = OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data) + CommunicateHeader->MessageLength;\r
if (CommSize != NULL) {\r
*CommSize = gSmmCorePrivate->BufferSize;\r
}\r
+\r
return gSmmCorePrivate->ReturnStatus;\r
}\r
\r
// has been called, then a direct invocation of the Software SMI is not allowed,\r
// so return EFI_INVALID_PARAMETER.\r
//\r
- if (EfiGoneVirtual()) {\r
+ if (EfiGoneVirtual ()) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
//\r
// Save current InSmm state and set InSmm state to TRUE\r
//\r
- OldInSmm = gSmmCorePrivate->InSmm;\r
+ OldInSmm = gSmmCorePrivate->InSmm;\r
gSmmCorePrivate->InSmm = TRUE;\r
\r
//\r
// Before SetVirtualAddressMap(), we are in SMM or SMRAM is open and unlocked, call SmiManage() directly.\r
//\r
TempCommSize -= OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data);\r
- Status = gSmmCorePrivate->Smst->SmiManage (\r
- &CommunicateHeader->HeaderGuid,\r
- NULL,\r
- CommunicateHeader->Data,\r
- &TempCommSize\r
- );\r
+ Status = gSmmCorePrivate->Smst->SmiManage (\r
+ &CommunicateHeader->HeaderGuid,\r
+ NULL,\r
+ CommunicateHeader->Data,\r
+ &TempCommSize\r
+ );\r
TempCommSize += OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data);\r
if (CommSize != NULL) {\r
*CommSize = TempCommSize;\r
EFI_STATUS\r
EFIAPI\r
SmmCommunicationMmCommunicate2 (\r
- IN CONST EFI_MM_COMMUNICATION2_PROTOCOL *This,\r
- IN OUT VOID *CommBufferPhysical,\r
- IN OUT VOID *CommBufferVirtual,\r
- IN OUT UINTN *CommSize OPTIONAL\r
+ IN CONST EFI_MM_COMMUNICATION2_PROTOCOL *This,\r
+ IN OUT VOID *CommBufferPhysical,\r
+ IN OUT VOID *CommBufferVirtual,\r
+ IN OUT UINTN *CommSize OPTIONAL\r
)\r
{\r
- return SmmCommunicationCommunicate (&mSmmCommunication,\r
- CommBufferPhysical,\r
- CommSize);\r
+ return SmmCommunicationCommunicate (\r
+ &mSmmCommunication,\r
+ CommBufferPhysical,\r
+ CommSize\r
+ );\r
}\r
\r
/**\r
IN VOID *Context\r
)\r
{\r
- UINTN Size;\r
+ UINTN Size;\r
\r
//\r
// Use Guid to initialize EFI_SMM_COMMUNICATE_HEADER structure\r
//\r
CopyGuid (&mCommunicateHeader.HeaderGuid, (EFI_GUID *)Context);\r
mCommunicateHeader.MessageLength = 1;\r
- mCommunicateHeader.Data[0] = 0;\r
+ mCommunicateHeader.Data[0] = 0;\r
\r
//\r
// Generate the Software SMI and return the result\r
IN VOID *Context\r
)\r
{\r
- UINTN Size;\r
- EFI_STATUS Status;\r
+ UINTN Size;\r
+ EFI_STATUS Status;\r
\r
//\r
// Keep calling the SMM Core Dispatcher until there is no request to restart it.\r
//\r
CopyGuid (&mCommunicateHeader.HeaderGuid, (EFI_GUID *)Context);\r
mCommunicateHeader.MessageLength = 1;\r
- mCommunicateHeader.Data[0] = 0;\r
+ mCommunicateHeader.Data[0] = 0;\r
\r
//\r
// Generate the Software SMI and return the result\r
@retval EFI_NOT_FOUND The image has no assigned fixed loading address.\r
**/\r
EFI_STATUS\r
-GetPeCoffImageFixLoadingAssignedAddress(\r
+GetPeCoffImageFixLoadingAssignedAddress (\r
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
)\r
{\r
- UINTN SectionHeaderOffset;\r
- EFI_STATUS Status;\r
- EFI_IMAGE_SECTION_HEADER SectionHeader;\r
- EFI_IMAGE_OPTIONAL_HEADER_UNION *ImgHdr;\r
- EFI_PHYSICAL_ADDRESS FixLoadingAddress;\r
- UINT16 Index;\r
- UINTN Size;\r
- UINT16 NumberOfSections;\r
- EFI_PHYSICAL_ADDRESS SmramBase;\r
- UINT64 SmmCodeSize;\r
- UINT64 ValueInSectionHeader;\r
- //\r
- // Build tool will calculate the smm code size and then patch the PcdLoadFixAddressSmmCodePageNumber\r
- //\r
- SmmCodeSize = EFI_PAGES_TO_SIZE (PcdGet32(PcdLoadFixAddressSmmCodePageNumber));\r
-\r
- FixLoadingAddress = 0;\r
- Status = EFI_NOT_FOUND;\r
- SmramBase = mLMFAConfigurationTable->SmramBase;\r
- //\r
- // Get PeHeader pointer\r
- //\r
- ImgHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)((CHAR8* )ImageContext->Handle + ImageContext->PeCoffHeaderOffset);\r
- SectionHeaderOffset = ImageContext->PeCoffHeaderOffset +\r
- sizeof (UINT32) +\r
- sizeof (EFI_IMAGE_FILE_HEADER) +\r
- ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader;\r
- NumberOfSections = ImgHdr->Pe32.FileHeader.NumberOfSections;\r
-\r
- //\r
- // Get base address from the first section header that doesn't point to code section.\r
- //\r
- for (Index = 0; Index < NumberOfSections; Index++) {\r
- //\r
- // Read section header from file\r
- //\r
- Size = sizeof (EFI_IMAGE_SECTION_HEADER);\r
- Status = ImageContext->ImageRead (\r
- ImageContext->Handle,\r
- SectionHeaderOffset,\r
- &Size,\r
- &SectionHeader\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- Status = EFI_NOT_FOUND;\r
-\r
- if ((SectionHeader.Characteristics & EFI_IMAGE_SCN_CNT_CODE) == 0) {\r
- //\r
- // Build tool saves the offset to SMRAM base as image base in PointerToRelocations & PointerToLineNumbers fields in the\r
- // first section header that doesn't point to code section in image header. And there is an assumption that when the\r
- // feature is enabled, if a module is assigned a loading address by tools, PointerToRelocations & PointerToLineNumbers\r
- // fields should NOT be Zero, or else, these 2 fields should be set to Zero\r
- //\r
- ValueInSectionHeader = ReadUnaligned64((UINT64*)&SectionHeader.PointerToRelocations);\r
- if (ValueInSectionHeader != 0) {\r
- //\r
- // Found first section header that doesn't point to code section in which build tool saves the\r
- // offset to SMRAM base as image base in PointerToRelocations & PointerToLineNumbers fields\r
- //\r
- FixLoadingAddress = (EFI_PHYSICAL_ADDRESS)(SmramBase + (INT64)ValueInSectionHeader);\r
-\r
- if (SmramBase + SmmCodeSize > FixLoadingAddress && SmramBase <= FixLoadingAddress) {\r
- //\r
- // The assigned address is valid. Return the specified loading address\r
- //\r
- ImageContext->ImageAddress = FixLoadingAddress;\r
- Status = EFI_SUCCESS;\r
- }\r
- }\r
- break;\r
- }\r
- SectionHeaderOffset += sizeof (EFI_IMAGE_SECTION_HEADER);\r
- }\r
- DEBUG ((DEBUG_INFO|DEBUG_LOAD, "LOADING MODULE FIXED INFO: Loading module at fixed address %x, Status = %r \n", FixLoadingAddress, Status));\r
- return Status;\r
+ UINTN SectionHeaderOffset;\r
+ EFI_STATUS Status;\r
+ EFI_IMAGE_SECTION_HEADER SectionHeader;\r
+ EFI_IMAGE_OPTIONAL_HEADER_UNION *ImgHdr;\r
+ EFI_PHYSICAL_ADDRESS FixLoadingAddress;\r
+ UINT16 Index;\r
+ UINTN Size;\r
+ UINT16 NumberOfSections;\r
+ EFI_PHYSICAL_ADDRESS SmramBase;\r
+ UINT64 SmmCodeSize;\r
+ UINT64 ValueInSectionHeader;\r
+\r
+ //\r
+ // Build tool will calculate the smm code size and then patch the PcdLoadFixAddressSmmCodePageNumber\r
+ //\r
+ SmmCodeSize = EFI_PAGES_TO_SIZE (PcdGet32 (PcdLoadFixAddressSmmCodePageNumber));\r
+\r
+ FixLoadingAddress = 0;\r
+ Status = EFI_NOT_FOUND;\r
+ SmramBase = mLMFAConfigurationTable->SmramBase;\r
+ //\r
+ // Get PeHeader pointer\r
+ //\r
+ ImgHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)((CHAR8 *)ImageContext->Handle + ImageContext->PeCoffHeaderOffset);\r
+ SectionHeaderOffset = ImageContext->PeCoffHeaderOffset +\r
+ sizeof (UINT32) +\r
+ sizeof (EFI_IMAGE_FILE_HEADER) +\r
+ ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader;\r
+ NumberOfSections = ImgHdr->Pe32.FileHeader.NumberOfSections;\r
+\r
+ //\r
+ // Get base address from the first section header that doesn't point to code section.\r
+ //\r
+ for (Index = 0; Index < NumberOfSections; Index++) {\r
+ //\r
+ // Read section header from file\r
+ //\r
+ Size = sizeof (EFI_IMAGE_SECTION_HEADER);\r
+ Status = ImageContext->ImageRead (\r
+ ImageContext->Handle,\r
+ SectionHeaderOffset,\r
+ &Size,\r
+ &SectionHeader\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ Status = EFI_NOT_FOUND;\r
+\r
+ if ((SectionHeader.Characteristics & EFI_IMAGE_SCN_CNT_CODE) == 0) {\r
+ //\r
+ // Build tool saves the offset to SMRAM base as image base in PointerToRelocations & PointerToLineNumbers fields in the\r
+ // first section header that doesn't point to code section in image header. And there is an assumption that when the\r
+ // feature is enabled, if a module is assigned a loading address by tools, PointerToRelocations & PointerToLineNumbers\r
+ // fields should NOT be Zero, or else, these 2 fields should be set to Zero\r
+ //\r
+ ValueInSectionHeader = ReadUnaligned64 ((UINT64 *)&SectionHeader.PointerToRelocations);\r
+ if (ValueInSectionHeader != 0) {\r
+ //\r
+ // Found first section header that doesn't point to code section in which build tool saves the\r
+ // offset to SMRAM base as image base in PointerToRelocations & PointerToLineNumbers fields\r
+ //\r
+ FixLoadingAddress = (EFI_PHYSICAL_ADDRESS)(SmramBase + (INT64)ValueInSectionHeader);\r
+\r
+ if ((SmramBase + SmmCodeSize > FixLoadingAddress) && (SmramBase <= FixLoadingAddress)) {\r
+ //\r
+ // The assigned address is valid. Return the specified loading address\r
+ //\r
+ ImageContext->ImageAddress = FixLoadingAddress;\r
+ Status = EFI_SUCCESS;\r
+ }\r
+ }\r
+\r
+ break;\r
+ }\r
+\r
+ SectionHeaderOffset += sizeof (EFI_IMAGE_SECTION_HEADER);\r
+ }\r
+\r
+ DEBUG ((DEBUG_INFO|DEBUG_LOAD, "LOADING MODULE FIXED INFO: Loading module at fixed address %x, Status = %r \n", FixLoadingAddress, Status));\r
+ return Status;\r
}\r
+\r
/**\r
Load the SMM Core image into SMRAM and executes the SMM Core from SMRAM.\r
\r
**/\r
EFI_STATUS\r
ExecuteSmmCoreFromSmram (\r
- IN OUT EFI_SMRAM_DESCRIPTOR *SmramRange,\r
- IN OUT EFI_SMRAM_DESCRIPTOR *SmramRangeSmmCore,\r
- IN VOID *Context\r
+ IN OUT EFI_SMRAM_DESCRIPTOR *SmramRange,\r
+ IN OUT EFI_SMRAM_DESCRIPTOR *SmramRangeSmmCore,\r
+ IN VOID *Context\r
)\r
{\r
EFI_STATUS Status;\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
+\r
//\r
// if Loading module at Fixed Address feature is enabled, the SMM core driver will be loaded to\r
// the address assigned by build tool.\r
//\r
- if (PcdGet64(PcdLoadModuleAtFixAddressEnable) != 0) {\r
+ if (PcdGet64 (PcdLoadModuleAtFixAddressEnable) != 0) {\r
//\r
// Get the fixed loading address assigned by Build tool\r
//\r
//\r
// Reserved Smram Region for SmmCore is not used, and remove it from SmramRangeCount.\r
//\r
- gSmmCorePrivate->SmramRangeCount --;\r
+ gSmmCorePrivate->SmramRangeCount--;\r
} else {\r
DEBUG ((DEBUG_INFO, "LOADING MODULE FIXED ERROR: Loading module at fixed address at address failed\n"));\r
//\r
// Allocate memory for the image being loaded from the EFI_SRAM_DESCRIPTOR\r
// specified by SmramRange\r
//\r
- PageCount = (UINTN)EFI_SIZE_TO_PAGES((UINTN)ImageContext.ImageSize + ImageContext.SectionAlignment);\r
+ PageCount = (UINTN)EFI_SIZE_TO_PAGES ((UINTN)ImageContext.ImageSize + ImageContext.SectionAlignment);\r
\r
ASSERT ((SmramRange->PhysicalSize & EFI_PAGE_MASK) == 0);\r
ASSERT (SmramRange->PhysicalSize > EFI_PAGES_TO_SIZE (PageCount));\r
\r
- SmramRange->PhysicalSize -= EFI_PAGES_TO_SIZE (PageCount);\r
- SmramRangeSmmCore->CpuStart = SmramRange->CpuStart + SmramRange->PhysicalSize;\r
+ SmramRange->PhysicalSize -= EFI_PAGES_TO_SIZE (PageCount);\r
+ SmramRangeSmmCore->CpuStart = SmramRange->CpuStart + SmramRange->PhysicalSize;\r
SmramRangeSmmCore->PhysicalStart = SmramRange->PhysicalStart + SmramRange->PhysicalSize;\r
- SmramRangeSmmCore->RegionState = SmramRange->RegionState | EFI_ALLOCATED;\r
- SmramRangeSmmCore->PhysicalSize = EFI_PAGES_TO_SIZE (PageCount);\r
+ SmramRangeSmmCore->RegionState = SmramRange->RegionState | EFI_ALLOCATED;\r
+ SmramRangeSmmCore->PhysicalSize = EFI_PAGES_TO_SIZE (PageCount);\r
\r
//\r
// Align buffer on section boundary\r
// Allocate memory for the image being loaded from the EFI_SRAM_DESCRIPTOR\r
// specified by SmramRange\r
//\r
- PageCount = (UINTN)EFI_SIZE_TO_PAGES((UINTN)ImageContext.ImageSize + ImageContext.SectionAlignment);\r
+ PageCount = (UINTN)EFI_SIZE_TO_PAGES ((UINTN)ImageContext.ImageSize + ImageContext.SectionAlignment);\r
\r
ASSERT ((SmramRange->PhysicalSize & EFI_PAGE_MASK) == 0);\r
ASSERT (SmramRange->PhysicalSize > EFI_PAGES_TO_SIZE (PageCount));\r
\r
- SmramRange->PhysicalSize -= EFI_PAGES_TO_SIZE (PageCount);\r
- SmramRangeSmmCore->CpuStart = SmramRange->CpuStart + SmramRange->PhysicalSize;\r
+ SmramRange->PhysicalSize -= EFI_PAGES_TO_SIZE (PageCount);\r
+ SmramRangeSmmCore->CpuStart = SmramRange->CpuStart + SmramRange->PhysicalSize;\r
SmramRangeSmmCore->PhysicalStart = SmramRange->PhysicalStart + SmramRange->PhysicalSize;\r
- SmramRangeSmmCore->RegionState = SmramRange->RegionState | EFI_ALLOCATED;\r
- SmramRangeSmmCore->PhysicalSize = EFI_PAGES_TO_SIZE (PageCount);\r
+ SmramRangeSmmCore->RegionState = SmramRange->RegionState | EFI_ALLOCATED;\r
+ SmramRangeSmmCore->PhysicalSize = EFI_PAGES_TO_SIZE (PageCount);\r
\r
//\r
// Align buffer on section boundary\r
// Execute image\r
//\r
EntryPoint = (EFI_IMAGE_ENTRY_POINT)(UINTN)ImageContext.EntryPoint;\r
- Status = EntryPoint ((EFI_HANDLE)Context, gST);\r
+ Status = EntryPoint ((EFI_HANDLE)Context, gST);\r
}\r
}\r
\r
IN OUT UINTN *FinalRangeCount\r
)\r
{\r
- UINT64 RangeToCompareEnd;\r
- UINT64 ReservedRangeToCompareEnd;\r
+ UINT64 RangeToCompareEnd;\r
+ UINT64 ReservedRangeToCompareEnd;\r
\r
RangeToCompareEnd = RangeToCompare->CpuStart + RangeToCompare->PhysicalSize;\r
ReservedRangeToCompareEnd = ReservedRangeToCompare->SmramReservedStart + ReservedRangeToCompare->SmramReservedSize;\r
\r
if ((RangeToCompare->CpuStart >= ReservedRangeToCompare->SmramReservedStart) &&\r
- (RangeToCompare->CpuStart < ReservedRangeToCompareEnd)) {\r
+ (RangeToCompare->CpuStart < ReservedRangeToCompareEnd))\r
+ {\r
if (RangeToCompareEnd < ReservedRangeToCompareEnd) {\r
//\r
// RangeToCompare ReservedRangeToCompare\r
FinalRanges[*FinalRangeCount].PhysicalStart = RangeToCompare->PhysicalStart;\r
FinalRanges[*FinalRangeCount].RegionState = RangeToCompare->RegionState | EFI_ALLOCATED;\r
FinalRanges[*FinalRangeCount].PhysicalSize = RangeToCompare->PhysicalSize;\r
- *FinalRangeCount += 1;\r
- RangeToCompare->PhysicalSize = 0;\r
+ *FinalRangeCount += 1;\r
+ RangeToCompare->PhysicalSize = 0;\r
//\r
// 3. Update ReservedRanges[*ReservedRangeCount] and increment *ReservedRangeCount.\r
//\r
ReservedRanges[*ReservedRangeCount].SmramReservedStart = FinalRanges[*FinalRangeCount - 1].CpuStart + FinalRanges[*FinalRangeCount - 1].PhysicalSize;\r
ReservedRanges[*ReservedRangeCount].SmramReservedSize = ReservedRangeToCompareEnd - RangeToCompareEnd;\r
- *ReservedRangeCount += 1;\r
+ *ReservedRangeCount += 1;\r
} else {\r
//\r
// RangeToCompare ReservedRangeToCompare\r
FinalRanges[*FinalRangeCount].PhysicalStart = RangeToCompare->PhysicalStart;\r
FinalRanges[*FinalRangeCount].RegionState = RangeToCompare->RegionState | EFI_ALLOCATED;\r
FinalRanges[*FinalRangeCount].PhysicalSize = ReservedRangeToCompareEnd - RangeToCompare->CpuStart;\r
- *FinalRangeCount += 1;\r
+ *FinalRangeCount += 1;\r
//\r
// 3. Update RangeToCompare.\r
//\r
RangeToCompare->PhysicalSize -= FinalRanges[*FinalRangeCount - 1].PhysicalSize;\r
}\r
} else if ((ReservedRangeToCompare->SmramReservedStart >= RangeToCompare->CpuStart) &&\r
- (ReservedRangeToCompare->SmramReservedStart < RangeToCompareEnd)) {\r
+ (ReservedRangeToCompare->SmramReservedStart < RangeToCompareEnd))\r
+ {\r
if (ReservedRangeToCompareEnd < RangeToCompareEnd) {\r
//\r
// RangeToCompare ReservedRangeToCompare\r
FinalRanges[*FinalRangeCount].PhysicalStart = RangeToCompare->PhysicalStart + RangeToCompare->PhysicalSize;\r
FinalRanges[*FinalRangeCount].RegionState = RangeToCompare->RegionState | EFI_ALLOCATED;\r
FinalRanges[*FinalRangeCount].PhysicalSize = ReservedRangeToCompare->SmramReservedSize;\r
- *FinalRangeCount += 1;\r
- ReservedRangeToCompare->SmramReservedSize = 0;\r
+ *FinalRangeCount += 1;\r
+ ReservedRangeToCompare->SmramReservedSize = 0;\r
//\r
// 3. Update Ranges[*RangeCount] and increment *RangeCount.\r
//\r
Ranges[*RangeCount].PhysicalStart = FinalRanges[*FinalRangeCount - 1].PhysicalStart + FinalRanges[*FinalRangeCount - 1].PhysicalSize;\r
Ranges[*RangeCount].RegionState = RangeToCompare->RegionState;\r
Ranges[*RangeCount].PhysicalSize = RangeToCompareEnd - ReservedRangeToCompareEnd;\r
- *RangeCount += 1;\r
+ *RangeCount += 1;\r
} else {\r
//\r
// RangeToCompare ReservedRangeToCompare\r
FinalRanges[*FinalRangeCount].PhysicalStart = RangeToCompare->PhysicalStart + RangeToCompare->PhysicalSize;\r
FinalRanges[*FinalRangeCount].RegionState = RangeToCompare->RegionState | EFI_ALLOCATED;\r
FinalRanges[*FinalRangeCount].PhysicalSize = RangeToCompareEnd - ReservedRangeToCompare->SmramReservedStart;\r
- *FinalRangeCount += 1;\r
+ *FinalRangeCount += 1;\r
//\r
// 3. Update ReservedRangeToCompare.\r
//\r
IN EFI_SMM_RESERVED_SMRAM_REGION *ReservedRangeToCompare\r
)\r
{\r
- UINT64 RangeToCompareEnd;\r
- UINT64 ReservedRangeToCompareEnd;\r
+ UINT64 RangeToCompareEnd;\r
+ UINT64 ReservedRangeToCompareEnd;\r
\r
RangeToCompareEnd = RangeToCompare->CpuStart + RangeToCompare->PhysicalSize;\r
ReservedRangeToCompareEnd = ReservedRangeToCompare->SmramReservedStart + ReservedRangeToCompare->SmramReservedSize;\r
\r
if ((RangeToCompare->CpuStart >= ReservedRangeToCompare->SmramReservedStart) &&\r
- (RangeToCompare->CpuStart < ReservedRangeToCompareEnd)) {\r
+ (RangeToCompare->CpuStart < ReservedRangeToCompareEnd))\r
+ {\r
return TRUE;\r
} else if ((ReservedRangeToCompare->SmramReservedStart >= RangeToCompare->CpuStart) &&\r
- (ReservedRangeToCompare->SmramReservedStart < RangeToCompareEnd)) {\r
+ (ReservedRangeToCompare->SmramReservedStart < RangeToCompareEnd))\r
+ {\r
return TRUE;\r
}\r
+\r
return FALSE;\r
}\r
\r
**/\r
EFI_SMRAM_DESCRIPTOR *\r
GetFullSmramRanges (\r
- OUT UINTN *FullSmramRangeCount\r
+ OUT UINTN *FullSmramRangeCount\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_SMM_CONFIGURATION_PROTOCOL *SmmConfiguration;\r
- UINTN Size;\r
- UINTN Index;\r
- UINTN Index2;\r
- EFI_SMRAM_DESCRIPTOR *FullSmramRanges;\r
- UINTN TempSmramRangeCount;\r
- UINTN AdditionSmramRangeCount;\r
- EFI_SMRAM_DESCRIPTOR *TempSmramRanges;\r
- UINTN SmramRangeCount;\r
- EFI_SMRAM_DESCRIPTOR *SmramRanges;\r
- UINTN SmramReservedCount;\r
- EFI_SMM_RESERVED_SMRAM_REGION *SmramReservedRanges;\r
- UINTN MaxCount;\r
- BOOLEAN Rescan;\r
+ EFI_STATUS Status;\r
+ EFI_SMM_CONFIGURATION_PROTOCOL *SmmConfiguration;\r
+ UINTN Size;\r
+ UINTN Index;\r
+ UINTN Index2;\r
+ EFI_SMRAM_DESCRIPTOR *FullSmramRanges;\r
+ UINTN TempSmramRangeCount;\r
+ UINTN AdditionSmramRangeCount;\r
+ EFI_SMRAM_DESCRIPTOR *TempSmramRanges;\r
+ UINTN SmramRangeCount;\r
+ EFI_SMRAM_DESCRIPTOR *SmramRanges;\r
+ UINTN SmramReservedCount;\r
+ EFI_SMM_RESERVED_SMRAM_REGION *SmramReservedRanges;\r
+ UINTN MaxCount;\r
+ BOOLEAN Rescan;\r
\r
//\r
// Get SMM Configuration Protocol if it is present.\r
//\r
SmmConfiguration = NULL;\r
- Status = gBS->LocateProtocol (&gEfiSmmConfigurationProtocolGuid, NULL, (VOID **) &SmmConfiguration);\r
+ Status = gBS->LocateProtocol (&gEfiSmmConfigurationProtocolGuid, NULL, (VOID **)&SmmConfiguration);\r
\r
//\r
// Get SMRAM information.\r
//\r
- Size = 0;\r
+ Size = 0;\r
Status = mSmmAccess->GetCapabilities (mSmmAccess, &Size, NULL);\r
ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
\r
// Reserve one entry for SMM Core in the full SMRAM ranges.\r
//\r
AdditionSmramRangeCount = 1;\r
- if (PcdGet64(PcdLoadModuleAtFixAddressEnable) != 0) {\r
+ if (PcdGet64 (PcdLoadModuleAtFixAddressEnable) != 0) {\r
//\r
// Reserve two entries for all SMM drivers and SMM Core in the full SMRAM ranges.\r
//\r
// No reserved SMRAM entry from SMM Configuration Protocol.\r
//\r
*FullSmramRangeCount = SmramRangeCount + AdditionSmramRangeCount;\r
- Size = (*FullSmramRangeCount) * sizeof (EFI_SMRAM_DESCRIPTOR);\r
- FullSmramRanges = (EFI_SMRAM_DESCRIPTOR *) AllocateZeroPool (Size);\r
+ Size = (*FullSmramRangeCount) * sizeof (EFI_SMRAM_DESCRIPTOR);\r
+ FullSmramRanges = (EFI_SMRAM_DESCRIPTOR *)AllocateZeroPool (Size);\r
ASSERT (FullSmramRanges != NULL);\r
\r
Status = mSmmAccess->GetCapabilities (mSmmAccess, &Size, FullSmramRanges);\r
//\r
MaxCount = SmramRangeCount + 2 * SmramReservedCount;\r
\r
- Size = MaxCount * sizeof (EFI_SMM_RESERVED_SMRAM_REGION);\r
- SmramReservedRanges = (EFI_SMM_RESERVED_SMRAM_REGION *) AllocatePool (Size);\r
+ Size = MaxCount * sizeof (EFI_SMM_RESERVED_SMRAM_REGION);\r
+ SmramReservedRanges = (EFI_SMM_RESERVED_SMRAM_REGION *)AllocatePool (Size);\r
ASSERT (SmramReservedRanges != NULL);\r
for (Index = 0; Index < SmramReservedCount; Index++) {\r
CopyMem (&SmramReservedRanges[Index], &SmmConfiguration->SmramReservedRegions[Index], sizeof (EFI_SMM_RESERVED_SMRAM_REGION));\r
}\r
\r
- Size = MaxCount * sizeof (EFI_SMRAM_DESCRIPTOR);\r
- TempSmramRanges = (EFI_SMRAM_DESCRIPTOR *) AllocatePool (Size);\r
+ Size = MaxCount * sizeof (EFI_SMRAM_DESCRIPTOR);\r
+ TempSmramRanges = (EFI_SMRAM_DESCRIPTOR *)AllocatePool (Size);\r
ASSERT (TempSmramRanges != NULL);\r
TempSmramRangeCount = 0;\r
\r
- SmramRanges = (EFI_SMRAM_DESCRIPTOR *) AllocatePool (Size);\r
+ SmramRanges = (EFI_SMRAM_DESCRIPTOR *)AllocatePool (Size);\r
ASSERT (SmramRanges != NULL);\r
Status = mSmmAccess->GetCapabilities (mSmmAccess, &Size, SmramRanges);\r
ASSERT_EFI_ERROR (Status);\r
if (SmmIsSmramOverlap (\r
&SmramRanges[Index],\r
&SmramReservedRanges[Index2]\r
- )) {\r
+ ))\r
+ {\r
//\r
// There is overlap, need to split entry and then rescan.\r
//\r
}\r
}\r
}\r
+\r
if (!Rescan) {\r
//\r
// No any overlap, copy the entry to the temp SMRAM ranges.\r
}\r
}\r
} while (Rescan);\r
+\r
ASSERT (TempSmramRangeCount <= MaxCount);\r
\r
//\r
break;\r
}\r
}\r
+\r
ASSERT (Index < TempSmramRangeCount);\r
for (Index2 = 0; Index2 < TempSmramRangeCount; Index2++) {\r
if ((Index2 != Index) && (TempSmramRanges[Index2].PhysicalSize != 0) && (TempSmramRanges[Index2].CpuStart < TempSmramRanges[Index].CpuStart)) {\r
Index = Index2;\r
}\r
}\r
+\r
CopyMem (&FullSmramRanges[*FullSmramRangeCount], &TempSmramRanges[Index], sizeof (EFI_SMRAM_DESCRIPTOR));\r
- *FullSmramRangeCount += 1;\r
+ *FullSmramRangeCount += 1;\r
TempSmramRanges[Index].PhysicalSize = 0;\r
} while (*FullSmramRangeCount < TempSmramRangeCount);\r
+\r
ASSERT (*FullSmramRangeCount == TempSmramRangeCount);\r
*FullSmramRangeCount += AdditionSmramRangeCount;\r
\r
IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINT64 MaxSize;\r
- VOID *Registration;\r
- UINT64 SmmCodeSize;\r
- EFI_CPU_ARCH_PROTOCOL *CpuArch;\r
- EFI_STATUS SetAttrStatus;\r
- EFI_SMRAM_DESCRIPTOR *SmramRangeSmmDriver;\r
- EFI_GCD_MEMORY_SPACE_DESCRIPTOR MemDesc;\r
+ EFI_STATUS Status;\r
+ UINTN Index;\r
+ UINT64 MaxSize;\r
+ VOID *Registration;\r
+ UINT64 SmmCodeSize;\r
+ EFI_CPU_ARCH_PROTOCOL *CpuArch;\r
+ EFI_STATUS SetAttrStatus;\r
+ EFI_SMRAM_DESCRIPTOR *SmramRangeSmmDriver;\r
+ EFI_GCD_MEMORY_SPACE_DESCRIPTOR MemDesc;\r
\r
//\r
// Fill in the image handle of the SMM IPL so the SMM Core can use this as the\r
if (gSmmCorePrivate->SmramRanges[Index].CpuStart >= BASE_1MB) {\r
if ((gSmmCorePrivate->SmramRanges[Index].CpuStart + gSmmCorePrivate->SmramRanges[Index].PhysicalSize - 1) <= MAX_ADDRESS) {\r
if (gSmmCorePrivate->SmramRanges[Index].PhysicalSize >= MaxSize) {\r
- MaxSize = gSmmCorePrivate->SmramRanges[Index].PhysicalSize;\r
+ MaxSize = gSmmCorePrivate->SmramRanges[Index].PhysicalSize;\r
mCurrentSmramRange = &gSmmCorePrivate->SmramRanges[Index];\r
}\r
}\r
//\r
// Print debug message showing SMRAM window that will be used by SMM IPL and SMM Core\r
//\r
- DEBUG ((DEBUG_INFO, "SMM IPL found SMRAM window %p - %p\n",\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "SMM IPL found SMRAM window %p - %p\n",\r
(VOID *)(UINTN)mCurrentSmramRange->CpuStart,\r
(VOID *)(UINTN)(mCurrentSmramRange->CpuStart + mCurrentSmramRange->PhysicalSize - 1)\r
));\r
MemDesc.Capabilities | SMRAM_CAPABILITIES\r
);\r
}\r
+\r
//\r
// If CPU AP is present, attempt to set SMRAM cacheability to WB and clear\r
// all paging attributes.\r
// is not available here.\r
//\r
CpuArch = NULL;\r
- Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&CpuArch);\r
+ Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&CpuArch);\r
if (!EFI_ERROR (Status)) {\r
MemDesc.Attributes &= ~(EFI_CACHE_ATTRIBUTE_MASK | EFI_MEMORY_ATTRIBUTE_MASK);\r
MemDesc.Attributes |= EFI_MEMORY_WB;\r
- Status = gDS->SetMemorySpaceAttributes (\r
- mSmramCacheBase,\r
- mSmramCacheSize,\r
- MemDesc.Attributes\r
- );\r
+ Status = gDS->SetMemorySpaceAttributes (\r
+ mSmramCacheBase,\r
+ mSmramCacheSize,\r
+ MemDesc.Attributes\r
+ );\r
if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_WARN, "SMM IPL failed to set SMRAM window to EFI_MEMORY_WB\n"));\r
}\r
);\r
DEBUG ((DEBUG_INFO, "SMRAM attributes: %016lx\n", MemDesc.Attributes));\r
ASSERT ((MemDesc.Attributes & EFI_MEMORY_ATTRIBUTE_MASK) == 0);\r
- );\r
+ );\r
}\r
+\r
//\r
// if Loading module at Fixed Address feature is enabled, save the SMRAM base to Load\r
// Modules At Fixed Address Configuration Table.\r
//\r
- if (PcdGet64(PcdLoadModuleAtFixAddressEnable) != 0) {\r
+ if (PcdGet64 (PcdLoadModuleAtFixAddressEnable) != 0) {\r
//\r
// Build tool will calculate the smm code size and then patch the PcdLoadFixAddressSmmCodePageNumber\r
//\r
- SmmCodeSize = LShiftU64 (PcdGet32(PcdLoadFixAddressSmmCodePageNumber), EFI_PAGE_SHIFT);\r
+ SmmCodeSize = LShiftU64 (PcdGet32 (PcdLoadFixAddressSmmCodePageNumber), EFI_PAGE_SHIFT);\r
//\r
// The SMRAM available memory is assumed to be larger than SmmCodeSize\r
//\r
// Retrieve Load modules At fixed address configuration table and save the SMRAM base.\r
//\r
Status = EfiGetSystemConfigurationTable (\r
- &gLoadFixedAddressConfigurationTableGuid,\r
- (VOID **) &mLMFAConfigurationTable\r
- );\r
- if (!EFI_ERROR (Status) && mLMFAConfigurationTable != NULL) {\r
+ &gLoadFixedAddressConfigurationTableGuid,\r
+ (VOID **)&mLMFAConfigurationTable\r
+ );\r
+ if (!EFI_ERROR (Status) && (mLMFAConfigurationTable != NULL)) {\r
mLMFAConfigurationTable->SmramBase = mCurrentSmramRange->CpuStart;\r
//\r
// Print the SMRAM base\r
//\r
// Fill the Smram range for all SMM code\r
//\r
- SmramRangeSmmDriver = &gSmmCorePrivate->SmramRanges[gSmmCorePrivate->SmramRangeCount - 2];\r
+ SmramRangeSmmDriver = &gSmmCorePrivate->SmramRanges[gSmmCorePrivate->SmramRangeCount - 2];\r
SmramRangeSmmDriver->CpuStart = mCurrentSmramRange->CpuStart;\r
SmramRangeSmmDriver->PhysicalStart = mCurrentSmramRange->PhysicalStart;\r
SmramRangeSmmDriver->RegionState = mCurrentSmramRange->RegionState | EFI_ALLOCATED;\r
SmramRangeSmmDriver->PhysicalSize = SmmCodeSize;\r
\r
- mCurrentSmramRange->PhysicalSize -= SmmCodeSize;\r
- mCurrentSmramRange->CpuStart = mCurrentSmramRange->CpuStart + SmmCodeSize;\r
- mCurrentSmramRange->PhysicalStart = mCurrentSmramRange->PhysicalStart + SmmCodeSize;\r
+ mCurrentSmramRange->PhysicalSize -= SmmCodeSize;\r
+ mCurrentSmramRange->CpuStart = mCurrentSmramRange->CpuStart + SmmCodeSize;\r
+ mCurrentSmramRange->PhysicalStart = mCurrentSmramRange->PhysicalStart + SmmCodeSize;\r
}\r
+\r
//\r
// Load SMM Core into SMRAM and execute it from SMRAM\r
//\r
// Attempt to reset SMRAM cacheability to UC\r
//\r
if (CpuArch != NULL) {\r
- SetAttrStatus = gDS->SetMemorySpaceAttributes(\r
+ SetAttrStatus = gDS->SetMemorySpaceAttributes (\r
mSmramCacheBase,\r
mSmramCacheSize,\r
EFI_MEMORY_UC\r
// If the SMM Core could not be loaded then close SMRAM window, free allocated\r
// resources, and return an error so SMM IPL will be unloaded.\r
//\r
- if (mCurrentSmramRange == NULL || EFI_ERROR (Status)) {\r
+ if ((mCurrentSmramRange == NULL) || EFI_ERROR (Status)) {\r
//\r
// Close all SMRAM ranges\r
//\r
//\r
Status = gBS->InstallMultipleProtocolInterfaces (\r
&mSmmIplHandle,\r
- &gEfiSmmBase2ProtocolGuid, &mSmmBase2,\r
- &gEfiSmmCommunicationProtocolGuid, &mSmmCommunication,\r
- &gEfiMmCommunication2ProtocolGuid, &mMmCommunication2,\r
+ &gEfiSmmBase2ProtocolGuid,\r
+ &mSmmBase2,\r
+ &gEfiSmmCommunicationProtocolGuid,\r
+ &mSmmCommunication,\r
+ &gEfiMmCommunication2ProtocolGuid,\r
+ &mMmCommunication2,\r
NULL\r
);\r
ASSERT_EFI_ERROR (Status);\r
mSmmIplEvents[Index].NotifyTpl,\r
mSmmIplEvents[Index].NotifyFunction,\r
mSmmIplEvents[Index].NotifyContext,\r
- &Registration\r
- );\r
+ &Registration\r
+ );\r
} else {\r
Status = gBS->CreateEventEx (\r
EVT_NOTIFY_SIGNAL,\r