The x86-64 System V ABi doc may help. It’s a reference, albeit lightweight.
The Variable Argument List reference starts on page 54, then it goes on, page 56-57 documents va_list:
The
va_listTypeThe
va_listtype is an array containing a single element of one structure containing the necessary information to implement theva_argmacro. The C definition ofva_listtype is given in figure 3.34.Figure 3.34:
va_listType Declarationtypedef struct { unsigned int gp_offset; unsigned int fp_offset; void *overflow_arg_area; void *reg_save_area; } va_list[1];The
va_startMacroThe
va_startmacro initializes the structure as follows:
reg_save_areaThe element points to the start of the register save area.
overflow_arg_areaThis pointer is used to fetch arguments passed on the stack. It is initialized with the address of the first argument passed on the stack, if any, and then always updated to point to the start of the next argument on the stack.
gp_offsetThe element holds the offset in bytes fromreg_save_areato the place where the next available general purpose argument register is saved. In case all argument registers have been exhausted, it is set to the value 48 (6 * 8).
fp_offsetThe element holds the offset in bytes fromreg_save_areato the place where the next available floating point argument register is saved. In case all argument registers have been exhausted, it is set to the value 304 (6 * 8 + 16 * 16).