return RShiftU64 (Size, EFI_PAGE_SHIFT) + ((((UINTN)Size) & EFI_PAGE_MASK) ? 1 : 0);\r
}\r
\r
-/**\r
- Check the consistency of Smm memory attributes table.\r
-\r
- @param[in] MemoryAttributesTable PI SMM memory attributes table\r
-**/\r
-VOID\r
-SmmMemoryAttributesTableConsistencyCheck (\r
- IN EDKII_PI_SMM_MEMORY_ATTRIBUTES_TABLE *MemoryAttributesTable\r
- )\r
-{\r
- EFI_MEMORY_DESCRIPTOR *MemoryMap;\r
- UINTN MemoryMapEntryCount;\r
- UINTN DescriptorSize;\r
- UINTN Index;\r
- UINT64 Address;\r
-\r
- Address = 0;\r
- MemoryMapEntryCount = MemoryAttributesTable->NumberOfEntries;\r
- DescriptorSize = MemoryAttributesTable->DescriptorSize;\r
- MemoryMap = (EFI_MEMORY_DESCRIPTOR *)(MemoryAttributesTable + 1);\r
- for (Index = 0; Index < MemoryMapEntryCount; Index++) {\r
- if (Address != 0) {\r
- ASSERT (Address == MemoryMap->PhysicalStart);\r
- }\r
- Address = MemoryMap->PhysicalStart + EfiPagesToSize(MemoryMap->NumberOfPages);\r
- MemoryMap = NEXT_MEMORY_DESCRIPTOR(MemoryMap, DescriptorSize);\r
- }\r
-}\r
\r
/**\r
Sort memory map entries based upon PhysicalStart, from low to high.\r
return ;\r
}\r
\r
-/**\r
- Find image record according to image base and size.\r
-\r
- @param[in] ImageBase Base of PE image\r
- @param[in] ImageSize Size of PE image\r
-\r
- @return image record\r
-**/\r
-STATIC\r
-IMAGE_PROPERTIES_RECORD *\r
-FindImageRecord (\r
- IN EFI_PHYSICAL_ADDRESS ImageBase,\r
- IN UINT64 ImageSize\r
- )\r
-{\r
- IMAGE_PROPERTIES_RECORD *ImageRecord;\r
- LIST_ENTRY *ImageRecordLink;\r
- LIST_ENTRY *ImageRecordList;\r
-\r
- ImageRecordList = &mImagePropertiesPrivateData.ImageRecordList;\r
-\r
- for (ImageRecordLink = ImageRecordList->ForwardLink;\r
- ImageRecordLink != ImageRecordList;\r
- ImageRecordLink = ImageRecordLink->ForwardLink) {\r
- ImageRecord = CR (\r
- ImageRecordLink,\r
- IMAGE_PROPERTIES_RECORD,\r
- Link,\r
- IMAGE_PROPERTIES_RECORD_SIGNATURE\r
- );\r
-\r
- if ((ImageBase == ImageRecord->ImageBase) &&\r
- (ImageSize == ImageRecord->ImageSize)) {\r
- return ImageRecord;\r
- }\r
- }\r
-\r
- return NULL;\r
-}\r
-\r
-/**\r
- Remove Image record.\r
-\r
- @param[in] DriverEntry Driver information\r
-**/\r
-VOID\r
-SmmRemoveImageRecord (\r
- IN EFI_SMM_DRIVER_ENTRY *DriverEntry\r
- )\r
-{\r
- IMAGE_PROPERTIES_RECORD *ImageRecord;\r
- LIST_ENTRY *CodeSegmentListHead;\r
- IMAGE_PROPERTIES_RECORD_CODE_SECTION *ImageRecordCodeSection;\r
-\r
- DEBUG ((DEBUG_VERBOSE, "SMM RemoveImageRecord - 0x%x\n", DriverEntry));\r
- DEBUG ((DEBUG_VERBOSE, "SMM RemoveImageRecord - 0x%016lx - 0x%016lx\n", DriverEntry->ImageBuffer, DriverEntry->NumberOfPage));\r
-\r
- ImageRecord = FindImageRecord (DriverEntry->ImageBuffer, EfiPagesToSize(DriverEntry->NumberOfPage));\r
- if (ImageRecord == NULL) {\r
- DEBUG ((DEBUG_ERROR, "SMM !!!!!!!! ImageRecord not found !!!!!!!!\n"));\r
- return ;\r
- }\r
-\r
- CodeSegmentListHead = &ImageRecord->CodeSegmentList;\r
- while (!IsListEmpty (CodeSegmentListHead)) {\r
- ImageRecordCodeSection = CR (\r
- CodeSegmentListHead->ForwardLink,\r
- IMAGE_PROPERTIES_RECORD_CODE_SECTION,\r
- Link,\r
- IMAGE_PROPERTIES_RECORD_CODE_SECTION_SIGNATURE\r
- );\r
- RemoveEntryList (&ImageRecordCodeSection->Link);\r
- FreePool (ImageRecordCodeSection);\r
- }\r
-\r
- RemoveEntryList (&ImageRecord->Link);\r
- FreePool (ImageRecord);\r
- mImagePropertiesPrivateData.ImageRecordCount--;\r
-}\r
\r
/**\r
Publish MemoryAttributesTable to SMM configuration table.\r
ASSERT_EFI_ERROR (Status);\r
}\r
\r
-/**\r
- This function returns if image is inside SMRAM.\r
-\r
- @param[in] LoadedImage LoadedImage protocol instance for an image.\r
-\r
- @retval TRUE the image is inside SMRAM.\r
- @retval FALSE the image is outside SMRAM.\r
-**/\r
-BOOLEAN\r
-IsImageInsideSmram (\r
- IN EFI_LOADED_IMAGE_PROTOCOL *LoadedImage\r
- )\r
-{\r
- UINTN Index;\r
-\r
- for (Index = 0; Index < mFullSmramRangeCount; Index++) {\r
- if ((mFullSmramRanges[Index].PhysicalStart <= (UINTN)LoadedImage->ImageBase)&&\r
- (mFullSmramRanges[Index].PhysicalStart + mFullSmramRanges[Index].PhysicalSize >= (UINTN)LoadedImage->ImageBase + LoadedImage->ImageSize)) {\r
- return TRUE;\r
- }\r
- }\r
-\r
- return FALSE;\r
-}\r
\r
/**\r
This function installs all SMM image record information.\r