+/**\r
+ Check whether an address is runtime memory or not.\r
+ \r
+ @param Address The Address being checked.\r
+ \r
+ @retval TRUE The address is runtime memory.\r
+ @retval FALSE The address is not runtime memory.\r
+**/\r
+BOOLEAN\r
+IsRuntimeMemory (\r
+ IN VOID *Address\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINT8 TmpMemoryMap[1];\r
+ UINTN MapKey;\r
+ UINTN DescriptorSize;\r
+ UINT32 DescriptorVersion;\r
+ UINTN MemoryMapSize;\r
+ EFI_MEMORY_DESCRIPTOR *MemoryMap;\r
+ EFI_MEMORY_DESCRIPTOR *MemoryMapPtr;\r
+ BOOLEAN IsRuntime;\r
+ UINTN Index;\r
+\r
+ IsRuntime = FALSE;\r
+\r
+ //\r
+ // Get System MemoryMapSize\r
+ //\r
+ MemoryMapSize = 1;\r
+ Status = gBS->GetMemoryMap (\r
+ &MemoryMapSize,\r
+ (EFI_MEMORY_DESCRIPTOR *)TmpMemoryMap,\r
+ &MapKey,\r
+ &DescriptorSize,\r
+ &DescriptorVersion\r
+ );\r
+ ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
+ //\r
+ // Enlarge space here, because we will allocate pool now.\r
+ //\r
+ MemoryMapSize += EFI_PAGE_SIZE;\r
+ Status = gBS->AllocatePool (\r
+ EfiBootServicesData,\r
+ MemoryMapSize,\r
+ (VOID**)&MemoryMap\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ //\r
+ // Get System MemoryMap\r
+ //\r
+ Status = gBS->GetMemoryMap (\r
+ &MemoryMapSize,\r
+ MemoryMap,\r
+ &MapKey,\r
+ &DescriptorSize,\r
+ &DescriptorVersion\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ MemoryMapPtr = MemoryMap;\r
+ //\r
+ // Search the request Address\r
+ //\r
+ for (Index = 0; Index < (MemoryMapSize / DescriptorSize); Index++) {\r
+ if (((EFI_PHYSICAL_ADDRESS)(UINTN)Address >= MemoryMap->PhysicalStart) &&\r
+ ((EFI_PHYSICAL_ADDRESS)(UINTN)Address < MemoryMap->PhysicalStart\r
+ + LShiftU64 (MemoryMap->NumberOfPages, EFI_PAGE_SHIFT))) {\r
+ //\r
+ // Found it\r
+ //\r
+ if (MemoryMap->Attribute & EFI_MEMORY_RUNTIME) {\r
+ IsRuntime = TRUE;\r
+ }\r
+ break;\r
+ }\r
+ //\r
+ // Get next item\r
+ //\r
+ MemoryMap = (EFI_MEMORY_DESCRIPTOR *)((UINTN)MemoryMap + DescriptorSize);\r
+ }\r
+\r
+ //\r
+ // Done\r
+ //\r
+ gBS->FreePool (MemoryMapPtr);\r
+\r
+ return IsRuntime;\r
+}\r
+\r
+/**\r
+ Update mFvbEntry. Add new entry, or update existing entry if Fvb protocol is\r
+ reinstalled.\r
+ \r
+ @param Event The Event that is being processed\r
+ @param Context Event Context\r
+ \r
+**/\r