diff options
-rw-r--r-- | src/boot/efi/boot.c | 2 | ||||
-rw-r--r-- | src/boot/efi/efi-string.h | 26 | ||||
-rw-r--r-- | src/boot/efi/util.c | 2 | ||||
-rw-r--r-- | src/fundamental/efivars-fundamental.h | 6 |
4 files changed, 31 insertions, 5 deletions
diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c index 79cb36c717..e409168aa4 100644 --- a/src/boot/efi/boot.c +++ b/src/boot/efi/boot.c @@ -1,7 +1,5 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ -#include <inttypes.h> - #include "bcd.h" #include "bootspec-fundamental.h" #include "console.h" diff --git a/src/boot/efi/efi-string.h b/src/boot/efi/efi-string.h index ea9493bcbb..6b6b0d57b4 100644 --- a/src/boot/efi/efi-string.h +++ b/src/boot/efi/efi-string.h @@ -121,6 +121,32 @@ _gnu_printf_(2, 0) _warn_unused_result_ char16_t *xvasprintf_status(EFI_STATUS s # define printf(...) printf_status(EFI_SUCCESS, __VA_ARGS__) # define xasprintf(...) xasprintf_status(EFI_SUCCESS, __VA_ARGS__) +/* inttypes.h is provided by libc instead of the compiler and is not supposed to be used in freestanding + * environments. We could use clang __*_FMT*__ constants for this, bug gcc does not have them. :( */ + +# if defined(__ILP32__) +# define PRI64_PREFIX "ll" +# elif defined(__LP64__) +# define PRI64_PREFIX "l" +# elif defined(__LLP64__) || (__SIZEOF_LONG__ == 4 && __SIZEOF_POINTER__ == 8) +# define PRI64_PREFIX "ll" +# else +# error Unknown 64-bit data model +# endif + +# define PRIi32 "i" +# define PRIu32 "u" +# define PRIx32 "x" +# define PRIX32 "X" +# define PRIiPTR "zi" +# define PRIuPTR "zu" +# define PRIxPTR "zx" +# define PRIXPTR "zX" +# define PRIi64 PRI64_PREFIX "i" +# define PRIu64 PRI64_PREFIX "u" +# define PRIx64 PRI64_PREFIX "x" +# define PRIX64 PRI64_PREFIX "X" + /* The compiler normally has knowledge about standard functions such as memcmp, but this is not the case when * compiling with -ffreestanding. By referring to builtins, the compiler can check arguments and do * optimizations again. Note that we still need to provide implementations as the compiler is free to not diff --git a/src/boot/efi/util.c b/src/boot/efi/util.c index 48b30a8f5a..3166944b03 100644 --- a/src/boot/efi/util.c +++ b/src/boot/efi/util.c @@ -1,7 +1,5 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ -#include <inttypes.h> - #include "proto/device-path.h" #include "proto/simple-text-io.h" #include "ticks.h" diff --git a/src/fundamental/efivars-fundamental.h b/src/fundamental/efivars-fundamental.h index cf785f8b7d..3bad79b036 100644 --- a/src/fundamental/efivars-fundamental.h +++ b/src/fundamental/efivars-fundamental.h @@ -1,7 +1,11 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -#include <errno.h> +#ifdef SD_BOOT +# define EINVAL 22 +#else +# include <errno.h> +#endif #include "string-util-fundamental.h" /* Features of the loader, i.e. systemd-boot */ |