summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cryptlib/Include/OpenSslSupport.h2
-rw-r--r--Cryptlib/Include/openssl/bio.h4
-rw-r--r--Cryptlib/Include/openssl/err.h2
-rw-r--r--Cryptlib/OpenSSL/crypto/bio/b_print.c66
-rw-r--r--Cryptlib/OpenSSL/crypto/err/err.c10
-rw-r--r--Makefile1
-rw-r--r--errlog.c22
m---------gnu-efi0
-rw-r--r--include/console.h2
-rw-r--r--include/hexdump.h8
-rw-r--r--include/system/efistdarg.h4
-rw-r--r--include/system/stdarg.h80
-rw-r--r--lib/console.c12
-rw-r--r--shim.h3
14 files changed, 131 insertions, 85 deletions
diff --git a/Cryptlib/Include/OpenSslSupport.h b/Cryptlib/Include/OpenSslSupport.h
index 1f475a32..b97149e2 100644
--- a/Cryptlib/Include/OpenSslSupport.h
+++ b/Cryptlib/Include/OpenSslSupport.h
@@ -227,7 +227,7 @@ size_t fwrite (const void *, size_t, size_t, FILE *);
char *fgets (char *, int, FILE *);
int fputs (const char *, FILE *);
int fprintf (FILE *, const char *, ...);
-int vfprintf (FILE *, const char *, va_list);
+int vfprintf (FILE *, const char *, ms_va_list);
int fflush (FILE *);
int fclose (FILE *);
DIR *opendir (const char *);
diff --git a/Cryptlib/Include/openssl/bio.h b/Cryptlib/Include/openssl/bio.h
index 2efa873d..da8c6580 100644
--- a/Cryptlib/Include/openssl/bio.h
+++ b/Cryptlib/Include/openssl/bio.h
@@ -794,11 +794,11 @@ void BIO_copy_next_retry(BIO *b);
# endif
int EFIAPI BIO_printf(BIO *bio, const char *format, ...)
__bio_h__attr__((__format__(__printf__, 2, 3)));
-int EFIAPI BIO_vprintf(BIO *bio, const char *format, va_list args)
+int EFIAPI BIO_vprintf(BIO *bio, const char *format, ms_va_list args)
__bio_h__attr__((__format__(__printf__, 2, 0)));
int EFIAPI BIO_snprintf(char *buf, size_t n, const char *format, ...)
__bio_h__attr__((__format__(__printf__, 3, 4)));
-int EFIAPI BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)
+int EFIAPI BIO_vsnprintf(char *buf, size_t n, const char *format, ms_va_list args)
__bio_h__attr__((__format__(__printf__, 3, 0)));
# undef __bio_h__attr__
diff --git a/Cryptlib/Include/openssl/err.h b/Cryptlib/Include/openssl/err.h
index 32da8c37..5a019808 100644
--- a/Cryptlib/Include/openssl/err.h
+++ b/Cryptlib/Include/openssl/err.h
@@ -345,7 +345,7 @@ void ERR_print_errors_fp(FILE *fp);
void ERR_print_errors(BIO *bp);
# endif
void EFIAPI ERR_add_error_data(int num, ...);
-void EFIAPI ERR_add_error_vdata(int num, va_list args);
+void EFIAPI ERR_add_error_vdata(int num, ms_va_list args);
void ERR_load_strings(int lib, ERR_STRING_DATA str[]);
void ERR_unload_strings(int lib, ERR_STRING_DATA str[]);
void ERR_load_ERR_strings(void);
diff --git a/Cryptlib/OpenSSL/crypto/bio/b_print.c b/Cryptlib/OpenSSL/crypto/bio/b_print.c
index 34c8fca7..29da9036 100644
--- a/Cryptlib/OpenSSL/crypto/bio/b_print.c
+++ b/Cryptlib/OpenSSL/crypto/bio/b_print.c
@@ -136,7 +136,7 @@ static int fmtfp(char **, char **, size_t *, size_t *,
static int doapr_outch(char **, char **, size_t *, size_t *, int);
static int EFIAPI _dopr(char **sbuffer, char **buffer,
size_t *maxlen, size_t *retlen, int *truncated,
- const char *format, va_list args);
+ const char *format, ms_va_list args);
/* format read states */
#define DP_S_DEFAULT 0
@@ -171,7 +171,7 @@ static int EFIAPI
_dopr(char **sbuffer,
char **buffer,
size_t *maxlen,
- size_t *retlen, int *truncated, const char *format, va_list args)
+ size_t *retlen, int *truncated, const char *format, ms_va_list args)
{
char ch;
LLONG value;
@@ -236,7 +236,7 @@ _dopr(char **sbuffer,
min = 10 * min + char_to_int(ch);
ch = *format++;
} else if (ch == '*') {
- min = va_arg(args, int);
+ min = ms_va_arg(args, int);
ch = *format++;
state = DP_S_DOT;
} else
@@ -256,7 +256,7 @@ _dopr(char **sbuffer,
max = 10 * max + char_to_int(ch);
ch = *format++;
} else if (ch == '*') {
- max = va_arg(args, int);
+ max = ms_va_arg(args, int);
ch = *format++;
state = DP_S_MOD;
} else
@@ -297,16 +297,16 @@ _dopr(char **sbuffer,
case 'i':
switch (cflags) {
case DP_C_SHORT:
- value = (short int)va_arg(args, int);
+ value = (short int)ms_va_arg(args, int);
break;
case DP_C_LONG:
- value = va_arg(args, long int);
+ value = ms_va_arg(args, long int);
break;
case DP_C_LLONG:
- value = va_arg(args, LLONG);
+ value = ms_va_arg(args, LLONG);
break;
default:
- value = va_arg(args, int);
+ value = ms_va_arg(args, int);
break;
}
if (!fmtint(sbuffer, buffer, &currlen, maxlen, value, 10, min,
@@ -322,16 +322,16 @@ _dopr(char **sbuffer,
flags |= DP_F_UNSIGNED;
switch (cflags) {
case DP_C_SHORT:
- value = (unsigned short int)va_arg(args, unsigned int);
+ value = (unsigned short int)ms_va_arg(args, unsigned int);
break;
case DP_C_LONG:
- value = (LLONG) va_arg(args, unsigned long int);
+ value = (LLONG) ms_va_arg(args, unsigned long int);
break;
case DP_C_LLONG:
- value = va_arg(args, unsigned LLONG);
+ value = ms_va_arg(args, unsigned LLONG);
break;
default:
- value = (LLONG) va_arg(args, unsigned int);
+ value = (LLONG) ms_va_arg(args, unsigned int);
break;
}
if (!fmtint(sbuffer, buffer, &currlen, maxlen, value,
@@ -342,9 +342,9 @@ _dopr(char **sbuffer,
#ifndef OPENSSL_SYS_UEFI
case 'f':
if (cflags == DP_C_LDOUBLE)
- fvalue = va_arg(args, LDOUBLE);
+ fvalue = ms_va_arg(args, LDOUBLE);
else
- fvalue = va_arg(args, double);
+ fvalue = ms_va_arg(args, double);
if (!fmtfp(sbuffer, buffer, &currlen, maxlen, fvalue, min, max,
flags))
return 0;
@@ -353,26 +353,26 @@ _dopr(char **sbuffer,
flags |= DP_F_UP;
case 'e':
if (cflags == DP_C_LDOUBLE)
- fvalue = va_arg(args, LDOUBLE);
+ fvalue = ms_va_arg(args, LDOUBLE);
else
- fvalue = va_arg(args, double);
+ fvalue = ms_va_arg(args, double);
break;
case 'G':
flags |= DP_F_UP;
case 'g':
if (cflags == DP_C_LDOUBLE)
- fvalue = va_arg(args, LDOUBLE);
+ fvalue = ms_va_arg(args, LDOUBLE);
else
- fvalue = va_arg(args, double);
+ fvalue = ms_va_arg(args, double);
break;
#endif
case 'c':
if(!doapr_outch(sbuffer, buffer, &currlen, maxlen,
- va_arg(args, int)))
+ ms_va_arg(args, int)))
return 0;
break;
case 's':
- strvalue = va_arg(args, char *);
+ strvalue = ms_va_arg(args, char *);
if (max < 0) {
if (buffer)
max = INT_MAX;
@@ -384,7 +384,7 @@ _dopr(char **sbuffer,
return 0;
break;
case 'p':
- value = (long)va_arg(args, void *);
+ value = (long)ms_va_arg(args, void *);
if (!fmtint(sbuffer, buffer, &currlen, maxlen,
value, 16, min, max, flags | DP_F_NUM))
return 0;
@@ -392,19 +392,19 @@ _dopr(char **sbuffer,
case 'n': /* XXX */
if (cflags == DP_C_SHORT) {
short int *num;
- num = va_arg(args, short int *);
+ num = ms_va_arg(args, short int *);
*num = currlen;
} else if (cflags == DP_C_LONG) { /* XXX */
long int *num;
- num = va_arg(args, long int *);
+ num = ms_va_arg(args, long int *);
*num = (long int)currlen;
} else if (cflags == DP_C_LLONG) { /* XXX */
LLONG *num;
- num = va_arg(args, LLONG *);
+ num = ms_va_arg(args, LLONG *);
*num = (LLONG) currlen;
} else {
int *num;
- num = va_arg(args, int *);
+ num = ms_va_arg(args, int *);
*num = currlen;
}
break;
@@ -799,18 +799,18 @@ doapr_outch(char **sbuffer,
int EFIAPI BIO_printf(BIO *bio, const char *format, ...)
{
- va_list args;
+ ms_va_list args;
int ret;
- va_start(args, format);
+ ms_va_start(args, format);
ret = BIO_vprintf(bio, format, args);
- va_end(args);
+ ms_va_end(args);
return (ret);
}
-int EFIAPI BIO_vprintf(BIO *bio, const char *format, va_list args)
+int EFIAPI BIO_vprintf(BIO *bio, const char *format, ms_va_list args)
{
int ret;
size_t retlen;
@@ -847,18 +847,18 @@ int EFIAPI BIO_vprintf(BIO *bio, const char *format, va_list args)
*/
int EFIAPI BIO_snprintf(char *buf, size_t n, const char *format, ...)
{
- va_list args;
+ ms_va_list args;
int ret;
- va_start(args, format);
+ ms_va_start(args, format);
ret = BIO_vsnprintf(buf, n, format, args);
- va_end(args);
+ ms_va_end(args);
return (ret);
}
-int EFIAPI BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)
+int EFIAPI BIO_vsnprintf(char *buf, size_t n, const char *format, ms_va_list args)
{
size_t retlen;
int truncated;
diff --git a/Cryptlib/OpenSSL/crypto/err/err.c b/Cryptlib/OpenSSL/crypto/err/err.c
index d0752adf..e2251454 100644
--- a/Cryptlib/OpenSSL/crypto/err/err.c
+++ b/Cryptlib/OpenSSL/crypto/err/err.c
@@ -1077,13 +1077,13 @@ void ERR_set_error_data(char *data, int flags)
void EFIAPI ERR_add_error_data(int num, ...)
{
- va_list args;
- va_start(args, num);
+ ms_va_list args;
+ ms_va_start(args, num);
ERR_add_error_vdata(num, args);
- va_end(args);
+ ms_va_end(args);
}
-void EFIAPI ERR_add_error_vdata(int num, va_list args)
+void EFIAPI ERR_add_error_vdata(int num, ms_va_list args)
{
int i, n, s;
char *str, *p, *a;
@@ -1096,7 +1096,7 @@ void EFIAPI ERR_add_error_vdata(int num, va_list args)
n = 0;
for (i = 0; i < num; i++) {
- a = va_arg(args, char *);
+ a = ms_va_arg(args, char *);
/* ignore NULLs, thanks to Bob Beck <beck@obtuse.com> */
if (a != NULL) {
n += strlen(a);
diff --git a/Makefile b/Makefile
index df2d8b6e..9a93d740 100644
--- a/Makefile
+++ b/Makefile
@@ -136,6 +136,7 @@ MokManager.o: $(MOK_SOURCES)
$(MMSONAME): $(MOK_OBJS) $(LIBS)
$(LD) -o $@ $(LDFLAGS) $^ $(EFI_LIBS) lib/lib.a
+gnu-efi/$(ARCH_GNUEFI)/gnuefi/libgnuefi.a gnu-efi/$(ARCH_GNUEFI)/lib/libefi.a: CFLAGS+=-DGNU_EFI_USE_EXTERNAL_STDARG
gnu-efi/$(ARCH_GNUEFI)/gnuefi/libgnuefi.a gnu-efi/$(ARCH_GNUEFI)/lib/libefi.a:
$(MAKE) -C gnu-efi \
ARCH=$(ARCH_GNUEFI) TOPDIR=$(TOPDIR)/gnu-efi \
diff --git a/errlog.c b/errlog.c
index ac657151..cc6a89f5 100644
--- a/errlog.c
+++ b/errlog.c
@@ -11,25 +11,25 @@ static UINTN nerrs = 0;
EFI_STATUS EFIAPI
vdprint_(const CHAR16 *fmt, const char *file, int line, const char *func,
- va_list args)
+ ms_va_list args)
{
- va_list args2;
+ ms_va_list args2;
EFI_STATUS efi_status = EFI_SUCCESS;
if (verbose) {
- va_copy(args2, args);
+ ms_va_copy(args2, args);
console_print(L"%a:%d:%a() ", file, line, func);
efi_status = VPrint(fmt, args2);
- va_end(args2);
+ ms_va_end(args2);
}
return efi_status;
}
EFI_STATUS EFIAPI
VLogError(const char *file, int line, const char *func, const CHAR16 *fmt,
- va_list args)
+ ms_va_list args)
{
- va_list args2;
+ ms_va_list args2;
CHAR16 **newerrs;
newerrs = ReallocatePool(errs, (nerrs + 1) * sizeof(*errs),
@@ -40,11 +40,11 @@ VLogError(const char *file, int line, const char *func, const CHAR16 *fmt,
newerrs[nerrs] = PoolPrint(L"%a:%d %a() ", file, line, func);
if (!newerrs[nerrs])
return EFI_OUT_OF_RESOURCES;
- va_copy(args2, args);
+ ms_va_copy(args2, args);
newerrs[nerrs+1] = VPoolPrint(fmt, args2);
if (!newerrs[nerrs+1])
return EFI_OUT_OF_RESOURCES;
- va_end(args2);
+ ms_va_end(args2);
nerrs += 2;
newerrs[nerrs] = NULL;
@@ -56,12 +56,12 @@ VLogError(const char *file, int line, const char *func, const CHAR16 *fmt,
EFI_STATUS EFIAPI
LogError_(const char *file, int line, const char *func, const CHAR16 *fmt, ...)
{
- va_list args;
+ ms_va_list args;
EFI_STATUS efi_status;
- va_start(args, fmt);
+ ms_va_start(args, fmt);
efi_status = VLogError(file, line, func, fmt, args);
- va_end(args);
+ ms_va_end(args);
return efi_status;
}
diff --git a/gnu-efi b/gnu-efi
-Subproject 4444de49c66b5b6758976ab1e3862bb17cff9d5
+Subproject f922aec7d6d60c245a4d1e1f82598d427c7765b
diff --git a/include/console.h b/include/console.h
index 036262ef..f56b1231 100644
--- a/include/console.h
+++ b/include/console.h
@@ -108,7 +108,7 @@ extern UINT32 verbose;
#endif
extern EFI_STATUS EFIAPI vdprint_(const CHAR16 *fmt, const char *file, int line,
- const char *func, va_list args);
+ const char *func, ms_va_list args);
#define vdprint(fmt, ...) \
vdprint_(fmt, __FILE__, __LINE__ - 1, __func__, ##__VA_ARGS__)
diff --git a/include/hexdump.h b/include/hexdump.h
index f778de9a..381e1a68 100644
--- a/include/hexdump.h
+++ b/include/hexdump.h
@@ -81,7 +81,7 @@ prepare_text(const void *data, size_t size, char *buf, unsigned int position)
*/
static inline void UNUSED EFIAPI
vhexdumpf(const char *file, int line, const char *func, const CHAR16 *const fmt,
- const void *data, unsigned long size, size_t at, va_list ap)
+ const void *data, unsigned long size, size_t at, ms_va_list ap)
{
unsigned long display_offset = at;
unsigned long offset = 0;
@@ -118,11 +118,11 @@ static inline void UNUSED EFIAPI
hexdumpf(const char *file, int line, const char *func, const CHAR16 *const fmt,
const void *data, unsigned long size, size_t at, ...)
{
- va_list ap;
+ ms_va_list ap;
- va_start(ap, at);
+ ms_va_start(ap, at);
vhexdumpf(file, line, func, fmt, data, size, at, ap);
- va_end(ap);
+ ms_va_end(ap);
}
static inline void UNUSED
diff --git a/include/system/efistdarg.h b/include/system/efistdarg.h
index 837c4f23..034977cc 100644
--- a/include/system/efistdarg.h
+++ b/include/system/efistdarg.h
@@ -8,6 +8,10 @@
#ifndef _EFISTDARG_H_
#define _EFISTDARG_H_
+#ifndef GNU_EFI_USE_EXTERNAL_STDARG
+#define GNU_EFI_USE_EXTERNAL_STDARG
+#endif
+
#include <stdarg.h>
#endif /* !_EFISTDARG_H_ */
diff --git a/include/system/stdarg.h b/include/system/stdarg.h
index af1ac59b..ce722249 100644
--- a/include/system/stdarg.h
+++ b/include/system/stdarg.h
@@ -2,39 +2,79 @@
/*
* stdarg.h - try to make consistent va_* handling for EFI
*/
-#ifdef SHIM_UNIT_TEST
-#include_next <stdarg.h>
-#else
#ifndef _STDARG_H
-#define _STDARG_H
+
+/*
+ * clang doesn't know about __builtin_sysv_va_list, apparently.
+ */
+#ifdef __clang__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic warning "-Wcpp"
+typedef __builtin_va_list __builtin_sysv_va_list;
+#warning clang builds may not work at all for anything other than scan-build
+#pragma GCC diagnostic pop
+#endif
#ifndef GNU_EFI_USE_EXTERNAL_STDARG
#define GNU_EFI_USE_EXTERNAL_STDARG
#endif
+#ifdef SHIM_UNIT_TEST
+#include_next <stdarg.h>
+#endif
+
#if defined(__aarch64__) || defined(__arm__) || defined(__i386__) || \
defined(__i486__) || defined(__i686__) || defined(SHIM_UNIT_TEST)
-typedef __builtin_va_list va_list;
-#define va_copy(dest, start) __builtin_va_copy(dest, start)
-#define va_start(marker, arg) __builtin_va_start(marker, arg)
-#define va_arg(marker, type) __builtin_va_arg(marker, type)
-#define va_end(marker) __builtin_va_end(marker)
+
+typedef __builtin_va_list ms_va_list;
+typedef __builtin_va_list __builtin_ms_va_list;
+#define ms_va_copy(dest, start) __builtin_va_copy(dest, start)
+#define ms_va_start(marker, arg) __builtin_va_start(marker, arg)
+#define ms_va_arg(marker, type) __builtin_va_arg(marker, type)
+#define ms_va_end(marker) __builtin_va_end(marker)
+
+typedef __builtin_va_list sysv_va_list;
+#define sysv_va_copy(dest, start) __builtin_va_copy(dest, start)
+#define sysv_va_start(marker, arg) __builtin_va_start(marker, arg)
+#define sysv_va_arg(marker, type) __builtin_va_arg(marker, type)
+#define sysv_va_end(marker) __builtin_va_end(marker)
+/*
+ * OpenSSL's X509ConstructCertificateStack needs this.
+ */
+typedef __builtin_va_list VA_LIST;
+#define VA_COPY(dest, start) __builtin_va_copy(dest, start)
+#define VA_START(marker, arg) __builtin_va_start(marker, arg)
+#define VA_END(marker) __builtin_va_end(marker)
+#define VA_ARG(marker, type) __builtin_va_arg(marker, type)
+
#elif defined(__x86_64__)
-typedef __builtin_ms_va_list va_list;
-#define va_copy(dest, start) __builtin_ms_va_copy(dest, start)
-#define va_start(marker, arg) __builtin_ms_va_start(marker, arg)
-#define va_arg(marker, type) __builtin_va_arg(marker, type)
-#define va_end(marker) __builtin_ms_va_end(marker)
+
+typedef __builtin_ms_va_list ms_va_list;
+#define ms_va_copy(dest, start) __builtin_ms_va_copy(dest, start)
+#define ms_va_start(marker, arg) __builtin_ms_va_start(marker, arg)
+#define ms_va_arg(marker, type) __builtin_va_arg(marker, type)
+#define ms_va_end(marker) __builtin_ms_va_end(marker)
+typedef __builtin_sysv_va_list sysv_va_list;
+#define sysv_va_copy(dest, start) __builtin_sysv_va_copy(dest, start)
+#define sysv_va_start(marker, arg) __builtin_sysv_va_start(marker, arg)
+#define sysv_va_arg(marker, type) __builtin_va_arg(marker, type)
+#define sysv_va_end(marker) __builtin_sysv_va_end(marker)
+/*
+ * OpenSSL's X509ConstructCertificateStack needs this.
+ */
+typedef __builtin_ms_va_list VA_LIST;
+#define VA_COPY(dest, start) __builtin_ms_va_copy(dest, start)
+#define VA_START(marker, arg) __builtin_ms_va_start(marker, arg)
+#define VA_END(marker) __builtin_ms_va_end(marker)
+#define VA_ARG(marker, type) __builtin_va_arg(marker, type)
+
#else
#error what arch is this
#endif
-typedef va_list VA_LIST;
-#define VA_COPY(dest, start) va_copy(dest, start)
-#define VA_START(marker, arg) va_start(marker, arg)
-#define VA_END(marker) va_end(marker)
-#define VA_ARG(marker, type) va_arg(marker, type)
+#ifndef _STDARG_H
+#define _STDARG_H
+#endif /* !_STDARG_H #2 */
#endif /* !_STDARG_H */
-#endif /* !SHIM_UNIT_TEST */
// vim:fenc=utf-8:tw=75:noet
diff --git a/lib/console.c b/lib/console.c
index 2da20b31..c310d213 100644
--- a/lib/console.c
+++ b/lib/console.c
@@ -86,15 +86,15 @@ VOID console_fini(VOID)
UINTN EFIAPI
console_print(const CHAR16 *fmt, ...)
{
- va_list args;
+ ms_va_list args;
UINTN ret;
if (!console_text_mode)
setup_console(1);
- va_start(args, fmt);
+ ms_va_start(args, fmt);
ret = VPrint(fmt, args);
- va_end(args);
+ ms_va_end(args);
return ret;
}
@@ -103,7 +103,7 @@ UINTN EFIAPI
console_print_at(UINTN col, UINTN row, const CHAR16 *fmt, ...)
{
SIMPLE_TEXT_OUTPUT_INTERFACE *co = ST->ConOut;
- va_list args;
+ ms_va_list args;
UINTN ret;
if (!console_text_mode)
@@ -111,9 +111,9 @@ console_print_at(UINTN col, UINTN row, const CHAR16 *fmt, ...)
co->SetCursorPosition(co, col, row);
- va_start(args, fmt);
+ ms_va_start(args, fmt);
ret = VPrint(fmt, args);
- va_end(args);
+ ms_va_end(args);
return ret;
}
diff --git a/shim.h b/shim.h
index 44dddc7a..69ad2cc3 100644
--- a/shim.h
+++ b/shim.h
@@ -22,6 +22,7 @@
#if defined(__x86_64__)
/* gcc 4.5.4 is the first documented release with -mabi=ms */
+/* gcc 4.7.1 is the first one with __builtin_ms_va_list */
#if !GNUC_PREREQ(4, 7) && !CLANG_PREREQ(3, 4)
#error On x86_64 you must have a compiler new enough to support __attribute__((__ms_abi__))
#endif
@@ -226,7 +227,7 @@ extern void shim_fini(void);
extern EFI_STATUS EFIAPI LogError_(const char *file, int line, const char *func,
const CHAR16 *fmt, ...);
extern EFI_STATUS EFIAPI VLogError(const char *file, int line, const char *func,
- const CHAR16 *fmt, va_list args);
+ const CHAR16 *fmt, ms_va_list args);
extern VOID LogHexdump_(const char *file, int line, const char *func,
const void *data, size_t sz);
extern VOID PrintErrors(VOID);