#ifndef _EFISTDARG_H_\r
#define _EFISTDARG_H_\r
\r
-#define _EFI_INT_SIZE_OF(n) ((sizeof (n) + sizeof (UINTN) - 1) &~(sizeof (UINTN) - 1))\r
+/**\r
+ Return the size of argument that has been aligned to sizeof (UINTN).\r
+\r
+ @param n The parameter size to be aligned.\r
+\r
+ @return The aligned size.\r
+**/\r
+#define _INT_SIZE_OF(n) ((sizeof (n) + sizeof (UINTN) - 1) &~(sizeof (UINTN) - 1))\r
\r
#if defined(__CC_ARM)\r
//\r
\r
#define VA_END(Marker) ((void)0)\r
\r
-#define VA_COPY(Dest, Start) __va_copy (Dest, Start)\r
-\r
-#elif defined(__GNUC__)\r
+#elif defined(__GNUC__) && !defined(NO_BUILTIN_VA_FUNCS)\r
//\r
// Use GCC built-in macros for variable argument lists.\r
//\r
\r
#define VA_END(Marker) __builtin_va_end (Marker)\r
\r
-#define VA_COPY(Dest, Start) __builtin_va_copy (Dest, Start)\r
-\r
#else\r
+///\r
+/// Variable used to traverse the list of arguments. This type can vary by \r
+/// implementation and could be an array or structure. \r
+///\r
+typedef CHAR8 *VA_LIST;\r
\r
-//\r
-// Also support coding convention rules for var arg macros\r
-//\r
-#ifndef VA_START\r
+/**\r
+ Retrieves a pointer to the beginning of a variable argument list, based on \r
+ the name of the parameter that immediately precedes the variable argument list. \r
\r
-typedef CHAR8 *VA_LIST;\r
-#define VA_START(ap, v) (ap = (VA_LIST) & (v) + _EFI_INT_SIZE_OF (v))\r
-#define VA_ARG(ap, t) (*(t *) ((ap += _EFI_INT_SIZE_OF (t)) - _EFI_INT_SIZE_OF (t)))\r
-#define VA_END(ap) (ap = (VA_LIST) 0)\r
-#define VA_COPY(dest, src) ((void)((dest) = (src)))\r
+ This function initializes Marker to point to the beginning of the variable \r
+ argument list that immediately follows Parameter. The method for computing the \r
+ pointer to the next argument in the argument list is CPU-specific following the \r
+ EFIAPI ABI.\r
\r
-#endif\r
+ @param Marker The VA_LIST used to traverse the list of arguments.\r
+ @param Parameter The name of the parameter that immediately precedes \r
+ the variable argument list.\r
+ \r
+ @return A pointer to the beginning of a variable argument list.\r
+\r
+**/\r
+#define VA_START(Marker, Parameter) (Marker = (VA_LIST) & (Parameter) + _INT_SIZE_OF (Parameter))\r
\r
+/**\r
+ Returns an argument of a specified type from a variable argument list and updates \r
+ the pointer to the variable argument list to point to the next argument. \r
+\r
+ This function returns an argument of the type specified by TYPE from the beginning \r
+ of the variable argument list specified by Marker. Marker is then updated to point \r
+ to the next argument in the variable argument list. The method for computing the \r
+ pointer to the next argument in the argument list is CPU-specific following the EFIAPI ABI.\r
+\r
+ @param Marker VA_LIST used to traverse the list of arguments.\r
+ @param TYPE The type of argument to retrieve from the beginning \r
+ of the variable argument list.\r
+ \r
+ @return An argument of the type specified by TYPE.\r
+\r
+**/\r
+#define VA_ARG(Marker, TYPE) (*(TYPE *) ((Marker += _INT_SIZE_OF (TYPE)) - _INT_SIZE_OF (TYPE)))\r
+\r
+/**\r
+ Terminates the use of a variable argument list.\r
+\r
+ This function initializes Marker so it can no longer be used with VA_ARG(). \r
+ After this macro is used, the only way to access the variable argument list is \r
+ by using VA_START() again.\r
+\r
+ @param Marker VA_LIST used to traverse the list of arguments.\r
+ \r
+**/\r
+#define VA_END(Marker) (Marker = (VA_LIST) 0)\r
\r
#endif\r
\r