+typedef struct {\r
+ UINT32 Type;\r
+ UINT64 NumberOfPages;\r
+ LIST_ENTRY Link;\r
+} MEMORY_LENGTH_ENTRY;\r
+\r
+/**\r
+ Add the length of the specified type to List.\r
+\r
+ @param List A list to hold all pairs of <Type, NumberOfPages>.\r
+ @param Type Memory type.\r
+ @param NumberOfPages Number of pages.\r
+**/\r
+VOID\r
+AddMemoryLength (\r
+ LIST_ENTRY *List,\r
+ UINT32 Type,\r
+ UINT64 NumberOfPages\r
+ )\r
+{\r
+ MEMORY_LENGTH_ENTRY *Entry;\r
+ MEMORY_LENGTH_ENTRY *NewEntry;\r
+ LIST_ENTRY *Link;\r
+\r
+ Entry = NULL;\r
+ for (Link = GetFirstNode (List); !IsNull (List, Link); Link = GetNextNode (List, Link)) {\r
+ Entry = BASE_CR (Link, MEMORY_LENGTH_ENTRY, Link);\r
+ if (Entry->Type >= Type) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ if ((Entry != NULL) && (Entry->Type == Type)) {\r
+ //\r
+ // The Entry is the one we look for.\r
+ //\r
+ NewEntry = Entry;\r
+ } else {\r
+ //\r
+ // The search operation breaks due to:\r
+ // 1. Type of every entry < Type --> Insert to tail\r
+ // 2. Type of an entry > Type --> Insert to previous of this entry\r
+ //\r
+ NewEntry = AllocatePool (sizeof (*NewEntry));\r
+ if (NewEntry == NULL) {\r
+ return;\r
+ }\r
+ NewEntry->Type = Type;\r
+ NewEntry->NumberOfPages = 0;\r
+ InsertTailList (Link, &NewEntry->Link);\r
+ }\r
+\r
+ NewEntry->NumberOfPages += NumberOfPages;\r
+}\r
+\r