mirror of
https://git.proxmox.com/git/efi-boot-shim
synced 2025-07-27 12:45:27 +00:00
Cryptlib: Define the va functions for EFIAPI
It turned out that my previous crash fix(*) was wrong.
We actually always used the gcc built-in va functions instead of
the "real" va functions for EFIAPI, and we are just lucky that
ERR_add_error_data didn't crash before.
This commit copies the va functions from MdePkg/Include/Base.h
in edk2 and introdues NO_BUILTIN_VA_FUNCS for x86_64, so that all
the x86_64 build will adopt the new va functions. For safety,
I also added EFIAPI to all the functions which use va_* to avoid
the potential trouble.
(*) a7f4b26cc3
Signed-off-by: Gary Ching-Pang Lin <glin@suse.com>
This commit is contained in:
parent
11a4d912bd
commit
775fdb9f4f
@ -47,6 +47,9 @@ typedef VOID *FILE;
|
|||||||
#define va_arg VA_ARG
|
#define va_arg VA_ARG
|
||||||
#define va_start VA_START
|
#define va_start VA_START
|
||||||
#define va_end VA_END
|
#define va_end VA_END
|
||||||
|
|
||||||
|
# if !defined(NO_BUILTIN_VA_FUNCS)
|
||||||
|
|
||||||
typedef __builtin_va_list VA_LIST;
|
typedef __builtin_va_list VA_LIST;
|
||||||
|
|
||||||
#define VA_START(Marker, Parameter) __builtin_va_start (Marker, Parameter)
|
#define VA_START(Marker, Parameter) __builtin_va_start (Marker, Parameter)
|
||||||
@ -57,6 +60,78 @@ typedef __builtin_va_list VA_LIST;
|
|||||||
|
|
||||||
#define VA_COPY(Dest, Start) __builtin_va_copy (Dest, Start)
|
#define VA_COPY(Dest, Start) __builtin_va_copy (Dest, Start)
|
||||||
|
|
||||||
|
# else
|
||||||
|
|
||||||
|
#define _INT_SIZE_OF(n) ((sizeof (n) + sizeof (UINTN) - 1) &~(sizeof (UINTN) - 1))
|
||||||
|
///
|
||||||
|
/// Variable used to traverse the list of arguments. This type can vary by
|
||||||
|
/// implementation and could be an array or structure.
|
||||||
|
///
|
||||||
|
typedef CHAR8 *VA_LIST;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Retrieves a pointer to the beginning of a variable argument list, based on
|
||||||
|
the name of the parameter that immediately precedes the variable argument list.
|
||||||
|
|
||||||
|
This function initializes Marker to point to the beginning of the variable
|
||||||
|
argument list that immediately follows Parameter. The method for computing the
|
||||||
|
pointer to the next argument in the argument list is CPU-specific following the
|
||||||
|
EFIAPI ABI.
|
||||||
|
|
||||||
|
@param Marker The VA_LIST used to traverse the list of arguments.
|
||||||
|
@param Parameter The name of the parameter that immediately precedes
|
||||||
|
the variable argument list.
|
||||||
|
|
||||||
|
@return A pointer to the beginning of a variable argument list.
|
||||||
|
|
||||||
|
**/
|
||||||
|
#define VA_START(Marker, Parameter) (Marker = (VA_LIST) ((UINTN) & (Parameter) + _INT_SIZE_OF (Parameter)))
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns an argument of a specified type from a variable argument list and updates
|
||||||
|
the pointer to the variable argument list to point to the next argument.
|
||||||
|
|
||||||
|
This function returns an argument of the type specified by TYPE from the beginning
|
||||||
|
of the variable argument list specified by Marker. Marker is then updated to point
|
||||||
|
to the next argument in the variable argument list. The method for computing the
|
||||||
|
pointer to the next argument in the argument list is CPU-specific following the EFIAPI ABI.
|
||||||
|
|
||||||
|
@param Marker VA_LIST used to traverse the list of arguments.
|
||||||
|
@param TYPE The type of argument to retrieve from the beginning
|
||||||
|
of the variable argument list.
|
||||||
|
|
||||||
|
@return An argument of the type specified by TYPE.
|
||||||
|
|
||||||
|
**/
|
||||||
|
#define VA_ARG(Marker, TYPE) (*(TYPE *) ((Marker += _INT_SIZE_OF (TYPE)) - _INT_SIZE_OF (TYPE)))
|
||||||
|
|
||||||
|
/**
|
||||||
|
Terminates the use of a variable argument list.
|
||||||
|
|
||||||
|
This function initializes Marker so it can no longer be used with VA_ARG().
|
||||||
|
After this macro is used, the only way to access the variable argument list is
|
||||||
|
by using VA_START() again.
|
||||||
|
|
||||||
|
@param Marker VA_LIST used to traverse the list of arguments.
|
||||||
|
|
||||||
|
**/
|
||||||
|
#define VA_END(Marker) (Marker = (VA_LIST) 0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
Initializes a VA_LIST as a copy of an existing VA_LIST.
|
||||||
|
|
||||||
|
This macro initializes Dest as a copy of Start, as if the VA_START macro had been applied to Dest
|
||||||
|
followed by the same sequence of uses of the VA_ARG macro as had previously been used to reach
|
||||||
|
the present state of Start.
|
||||||
|
|
||||||
|
@param Dest VA_LIST used to traverse the list of arguments.
|
||||||
|
@param Start VA_LIST used to traverse the list of arguments.
|
||||||
|
|
||||||
|
**/
|
||||||
|
#define VA_COPY(Dest, Start) ((void)((Dest) = (Start)))
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
#else // __CC_ARM
|
#else // __CC_ARM
|
||||||
#define va_start(Marker, Parameter) __va_start(Marker, Parameter)
|
#define va_start(Marker, Parameter) __va_start(Marker, Parameter)
|
||||||
#define va_arg(Marker, TYPE) __va_arg(Marker, TYPE)
|
#define va_arg(Marker, TYPE) __va_arg(Marker, TYPE)
|
||||||
|
@ -787,11 +787,19 @@ void BIO_copy_next_retry(BIO *b);
|
|||||||
# else
|
# else
|
||||||
# define __bio_h__attr__(x)
|
# define __bio_h__attr__(x)
|
||||||
# endif
|
# endif
|
||||||
|
# if defined(OPENSSL_SYS_UEFI)
|
||||||
|
int EFIAPI BIO_printf(BIO *bio, const char *format, ...)
|
||||||
|
# else
|
||||||
int BIO_printf(BIO *bio, const char *format, ...)
|
int BIO_printf(BIO *bio, const char *format, ...)
|
||||||
|
# endif
|
||||||
__bio_h__attr__((__format__(__printf__, 2, 3)));
|
__bio_h__attr__((__format__(__printf__, 2, 3)));
|
||||||
int BIO_vprintf(BIO *bio, const char *format, va_list args)
|
int BIO_vprintf(BIO *bio, const char *format, va_list args)
|
||||||
__bio_h__attr__((__format__(__printf__, 2, 0)));
|
__bio_h__attr__((__format__(__printf__, 2, 0)));
|
||||||
|
# if defined(OPENSSL_SYS_UEFI)
|
||||||
|
int EFIAPI BIO_snprintf(char *buf, size_t n, const char *format, ...)
|
||||||
|
# else
|
||||||
int BIO_snprintf(char *buf, size_t n, const char *format, ...)
|
int BIO_snprintf(char *buf, size_t n, const char *format, ...)
|
||||||
|
# endif
|
||||||
__bio_h__attr__((__format__(__printf__, 3, 4)));
|
__bio_h__attr__((__format__(__printf__, 3, 4)));
|
||||||
int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)
|
int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)
|
||||||
__bio_h__attr__((__format__(__printf__, 3, 0)));
|
__bio_h__attr__((__format__(__printf__, 3, 0)));
|
||||||
|
@ -352,11 +352,7 @@ void EFIAPI ERR_add_error_data(int num, ...);
|
|||||||
void ERR_add_error_data(int num, ...);
|
void ERR_add_error_data(int num, ...);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(OPENSSL_SYS_UEFI)
|
|
||||||
void EFIAPI ERR_add_error_vdata(int num, va_list args);
|
|
||||||
#else
|
|
||||||
void ERR_add_error_vdata(int num, va_list args);
|
void ERR_add_error_vdata(int num, va_list args);
|
||||||
#endif
|
|
||||||
void ERR_load_strings(int lib, ERR_STRING_DATA str[]);
|
void ERR_load_strings(int lib, ERR_STRING_DATA str[]);
|
||||||
void ERR_unload_strings(int lib, ERR_STRING_DATA str[]);
|
void ERR_unload_strings(int lib, ERR_STRING_DATA str[]);
|
||||||
void ERR_load_ERR_strings(void);
|
void ERR_load_ERR_strings(void);
|
||||||
|
@ -7,7 +7,7 @@ CFLAGS = -ggdb -O0 -I. -fno-stack-protector -fno-strict-aliasing -fpic -fshort-
|
|||||||
|
|
||||||
ifeq ($(ARCH),x86_64)
|
ifeq ($(ARCH),x86_64)
|
||||||
CFLAGS += -mno-mmx -mno-sse -mno-red-zone -nostdinc -maccumulate-outgoing-args \
|
CFLAGS += -mno-mmx -mno-sse -mno-red-zone -nostdinc -maccumulate-outgoing-args \
|
||||||
-DEFI_FUNCTION_WRAPPER -DGNU_EFI_USE_MS_ABI
|
-DEFI_FUNCTION_WRAPPER -DGNU_EFI_USE_MS_ABI -DNO_BUILTIN_VA_FUNCS
|
||||||
endif
|
endif
|
||||||
ifeq ($(ARCH),ia32)
|
ifeq ($(ARCH),ia32)
|
||||||
CFLAGS += -mno-mmx -mno-sse -mno-red-zone -nostdinc -maccumulate-outgoing-args -m32
|
CFLAGS += -mno-mmx -mno-sse -mno-red-zone -nostdinc -maccumulate-outgoing-args -m32
|
||||||
|
@ -7,7 +7,8 @@ CFLAGS = -ggdb -O0 -I. -I.. -I../Include/ -Icrypto -fno-stack-protector -fno-st
|
|||||||
|
|
||||||
ifeq ($(ARCH),x86_64)
|
ifeq ($(ARCH),x86_64)
|
||||||
CFLAGS += -mno-mmx -mno-sse -mno-red-zone -maccumulate-outgoing-args \
|
CFLAGS += -mno-mmx -mno-sse -mno-red-zone -maccumulate-outgoing-args \
|
||||||
-DEFI_FUNCTION_WRAPPER -DGNU_EFI_USE_MS_ABI -DSIXTY_FOUR_BIT_LONG
|
-DEFI_FUNCTION_WRAPPER -DGNU_EFI_USE_MS_ABI -DSIXTY_FOUR_BIT_LONG \
|
||||||
|
-DNO_BUILTIN_VA_FUNCS
|
||||||
endif
|
endif
|
||||||
ifeq ($(ARCH),ia32)
|
ifeq ($(ARCH),ia32)
|
||||||
CFLAGS += -mno-mmx -mno-sse -mno-red-zone -maccumulate-outgoing-args \
|
CFLAGS += -mno-mmx -mno-sse -mno-red-zone -maccumulate-outgoing-args \
|
||||||
|
@ -751,7 +751,11 @@ doapr_outch(char **sbuffer,
|
|||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
|
||||||
|
#if defined(OPENSSL_SYS_UEFI)
|
||||||
|
int EFIAPI BIO_printf(BIO *bio, const char *format, ...)
|
||||||
|
#else
|
||||||
int BIO_printf(BIO *bio, const char *format, ...)
|
int BIO_printf(BIO *bio, const char *format, ...)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
int ret;
|
int ret;
|
||||||
@ -795,7 +799,11 @@ int BIO_vprintf(BIO *bio, const char *format, va_list args)
|
|||||||
* closely related to BIO_printf, and we need *some* name prefix ... (XXX the
|
* closely related to BIO_printf, and we need *some* name prefix ... (XXX the
|
||||||
* function should be renamed, but to what?)
|
* function should be renamed, but to what?)
|
||||||
*/
|
*/
|
||||||
|
#if defined(OPENSSL_SYS_UEFI)
|
||||||
|
int EFIAPI BIO_snprintf(char *buf, size_t n, const char *format, ...)
|
||||||
|
#else
|
||||||
int BIO_snprintf(char *buf, size_t n, const char *format, ...)
|
int BIO_snprintf(char *buf, size_t n, const char *format, ...)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -962,7 +962,11 @@ void OPENSSL_showfatal(const char *fmta, ...)
|
|||||||
MessageBox(NULL, buf, _T("OpenSSL: FATAL"), MB_OK | MB_ICONSTOP);
|
MessageBox(NULL, buf, _T("OpenSSL: FATAL"), MB_OK | MB_ICONSTOP);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
# if defined(OPENSSL_SYS_UEFI)
|
||||||
|
void EFIAPI OPENSSL_showfatal(const char *fmta, ...)
|
||||||
|
# else
|
||||||
void OPENSSL_showfatal(const char *fmta, ...)
|
void OPENSSL_showfatal(const char *fmta, ...)
|
||||||
|
# endif
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
|
@ -100,7 +100,11 @@ extern "C" {
|
|||||||
|
|
||||||
void OPENSSL_cpuid_setup(void);
|
void OPENSSL_cpuid_setup(void);
|
||||||
extern unsigned int OPENSSL_ia32cap_P[];
|
extern unsigned int OPENSSL_ia32cap_P[];
|
||||||
|
# if defined(OPENSSL_SYS_UEFI)
|
||||||
|
void EFIAPI OPENSSL_showfatal(const char *fmta, ...);
|
||||||
|
# else
|
||||||
void OPENSSL_showfatal(const char *fmta, ...);
|
void OPENSSL_showfatal(const char *fmta, ...);
|
||||||
|
# endif
|
||||||
void *OPENSSL_stderr(void);
|
void *OPENSSL_stderr(void);
|
||||||
extern int OPENSSL_NONPIC_relocated;
|
extern int OPENSSL_NONPIC_relocated;
|
||||||
|
|
||||||
|
@ -1085,11 +1085,7 @@ void ERR_add_error_data(int num, ...)
|
|||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(OPENSSL_SYS_UEFI)
|
|
||||||
void EFIAPI ERR_add_error_vdata(int num, va_list args)
|
|
||||||
#else
|
|
||||||
void ERR_add_error_vdata(int num, va_list args)
|
void ERR_add_error_vdata(int num, va_list args)
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
int i, n, s;
|
int i, n, s;
|
||||||
char *str, *p, *a;
|
char *str, *p, *a;
|
||||||
|
1
Makefile
1
Makefile
@ -42,6 +42,7 @@ ifeq ($(ARCH),x86_64)
|
|||||||
CFLAGS += -mno-mmx -mno-sse -mno-red-zone -nostdinc \
|
CFLAGS += -mno-mmx -mno-sse -mno-red-zone -nostdinc \
|
||||||
-maccumulate-outgoing-args \
|
-maccumulate-outgoing-args \
|
||||||
-DEFI_FUNCTION_WRAPPER -DGNU_EFI_USE_MS_ABI \
|
-DEFI_FUNCTION_WRAPPER -DGNU_EFI_USE_MS_ABI \
|
||||||
|
-DNO_BUILTIN_VA_FUNCS \
|
||||||
"-DEFI_ARCH=L\"x64\"" \
|
"-DEFI_ARCH=L\"x64\"" \
|
||||||
"-DDEBUGDIR=L\"/usr/lib/debug/usr/share/shim/x64-$(VERSION)$(RELEASE)/\""
|
"-DDEBUGDIR=L\"/usr/lib/debug/usr/share/shim/x64-$(VERSION)$(RELEASE)/\""
|
||||||
endif
|
endif
|
||||||
|
Loading…
Reference in New Issue
Block a user