+ for (; MemoryMap != MemoryMapDescriptor; MemoryMap = NEXT_MEMORY_DESCRIPTOR (MemoryMap, DescriptorSize)) {\r
+ //\r
+ // Check to see if the Type fields are identical.\r
+ //\r
+ if (MemoryMap->Type != MemoryMapDescriptor->Type) {\r
+ continue;\r
+ }\r
+\r
+ //\r
+ // Check to see if the Attribute fields are identical.\r
+ //\r
+ if (MemoryMap->Attribute != MemoryMapDescriptor->Attribute) {\r
+ continue;\r
+ }\r
+\r
+ //\r
+ // Check to see if MemoryMapDescriptor is immediately above MemoryMap\r
+ //\r
+ if (MemoryMap->PhysicalStart + EFI_PAGES_TO_SIZE ((UINTN)MemoryMap->NumberOfPages) == MemoryMapDescriptor->PhysicalStart) { \r
+ //\r
+ // Merge MemoryMapDescriptor into MemoryMap\r
+ //\r
+ MemoryMap->NumberOfPages += MemoryMapDescriptor->NumberOfPages;\r
+\r
+ //\r
+ // Return MemoryMapDescriptor as the next available slot int he MemoryMap array\r
+ //\r
+ return MemoryMapDescriptor;\r
+ }\r
+\r
+ //\r
+ // Check to see if MemoryMapDescriptor is immediately below MemoryMap\r
+ //\r
+ if (MemoryMap->PhysicalStart - EFI_PAGES_TO_SIZE ((UINTN)MemoryMapDescriptor->NumberOfPages) == MemoryMapDescriptor->PhysicalStart) {\r
+ //\r
+ // Merge MemoryMapDescriptor into MemoryMap\r
+ //\r
+ MemoryMap->PhysicalStart = MemoryMapDescriptor->PhysicalStart;\r
+ MemoryMap->VirtualStart = MemoryMapDescriptor->VirtualStart;\r
+ MemoryMap->NumberOfPages += MemoryMapDescriptor->NumberOfPages;\r
+\r
+ //\r
+ // Return MemoryMapDescriptor as the next available slot int he MemoryMap array\r
+ //\r
+ return MemoryMapDescriptor;\r
+ }\r