+ VA_START (VaListMarker, Format);\r
+ for (; *Format != '\0'; Format++) {\r
+ //\r
+ // Only format with prefix % is processed.\r
+ //\r
+ if (*Format != '%') {\r
+ continue;\r
+ }\r
+ Long = FALSE;\r
+ //\r
+ // Parse Flags and Width\r
+ //\r
+ for (Format++; TRUE; Format++) {\r
+ if (*Format == '.' || *Format == '-' || *Format == '+' || *Format == ' ') {\r
+ //\r
+ // These characters in format field are omitted.\r
+ //\r
+ continue;\r
+ }\r
+ if (*Format >= '0' && *Format <= '9') {\r
+ //\r
+ // These characters in format field are omitted.\r
+ //\r
+ continue;\r
+ }\r
+ if (*Format == 'L' || *Format == 'l') {\r
+ //\r
+ // 'L" or "l" in format field means the number being printed is a UINT64\r
+ //\r
+ Long = TRUE;\r
+ continue;\r
+ }\r
+ if (*Format == '*') {\r
+ //\r
+ // '*' in format field means the precision of the field is specified by\r
+ // a UINTN argument in the argument list.\r
+ //\r
+ BASE_ARG (BaseListMarker, UINTN) = VA_ARG (VaListMarker, UINTN);\r
+ continue;\r
+ }\r
+ if (*Format == '\0') {\r
+ //\r
+ // Make no output if Format string terminates unexpectedly when\r
+ // looking up for flag, width, precision and type. \r
+ //\r
+ Format--;\r
+ }\r
+ //\r
+ // When valid argument type detected or format string terminates unexpectedly,\r
+ // the inner loop is done.\r
+ //\r
+ break;\r
+ }\r
+ \r
+ //\r
+ // Pack variable arguments into the storage area following EFI_DEBUG_INFO.\r
+ //\r
+ if ((*Format == 'p') && (sizeof (VOID *) > 4)) {\r
+ Long = TRUE;\r
+ }\r
+ if (*Format == 'p' || *Format == 'X' || *Format == 'x' || *Format == 'd' || *Format == 'u') {\r
+ if (Long) {\r
+ BASE_ARG (BaseListMarker, INT64) = VA_ARG (VaListMarker, INT64);\r
+ } else {\r
+ BASE_ARG (BaseListMarker, int) = VA_ARG (VaListMarker, int);\r
+ }\r
+ } else if (*Format == 's' || *Format == 'S' || *Format == 'a' || *Format == 'g' || *Format == 't') {\r
+ BASE_ARG (BaseListMarker, VOID *) = VA_ARG (VaListMarker, VOID *);\r
+ } else if (*Format == 'c') {\r
+ BASE_ARG (BaseListMarker, UINTN) = VA_ARG (VaListMarker, UINTN);\r
+ } else if (*Format == 'r') {\r
+ BASE_ARG (BaseListMarker, RETURN_STATUS) = VA_ARG (VaListMarker, RETURN_STATUS);\r
+ }\r
+\r
+ //\r
+ // If the converted BASE_LIST is larger than the 12 * sizeof (UINT64) allocated bytes, then ASSERT()\r
+ // This indicates that the DEBUG() macro is passing in more argument than can be handled by \r
+ // the EFI_DEBUG_INFO record\r
+ //\r
+ ASSERT ((CHAR8 *)BaseListMarker <= FormatString);\r
+\r
+ //\r
+ // If the converted BASE_LIST is larger than the 12 * sizeof (UINT64) allocated bytes, then return\r
+ //\r
+ if ((CHAR8 *)BaseListMarker > FormatString) {\r
+ VA_END (VaListMarker);\r
+ return;\r
+ }\r