summaryrefslogtreecommitdiff
path: root/src/boot/efi
diff options
context:
space:
mode:
authorJan Janssen <medhefgo@web.de>2023-01-07 09:19:23 +0100
committerJan Janssen <medhefgo@web.de>2023-02-21 21:07:04 +0100
commit3ceaa05d566f178ccfdc6ba180e0e63f96216d87 (patch)
tree5ae714366f96f841057f691a6923fec569be3d41 /src/boot/efi
parenta4ab05e296a605cff9d3d42d9c80dac910530a96 (diff)
downloadsystemd-3ceaa05d566f178ccfdc6ba180e0e63f96216d87.tar.gz
boot: Do not use errno.h/inttypes.h
These are provided by libc instead of the compiler and are not supposed to be used in freestanding environments. When cross-compiling with clang and the corresponding gcc cross-toolchain is not around, clang may pick up the wrong header from the host system.
Diffstat (limited to 'src/boot/efi')
-rw-r--r--src/boot/efi/boot.c2
-rw-r--r--src/boot/efi/efi-string.h26
-rw-r--r--src/boot/efi/util.c2
3 files changed, 26 insertions, 4 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"