cbfstool: Make endian detection functions to work without prior setup.
The 'host_bigendian' variable (and functions relying on it like ntohl/htonl)
requires host detection by calling static which_endian() first -- which may be
easily forgotten by developers. It's now a public function in common.c and
doesn't need initialization anymore.
Change-Id: I13dabd1ad15d2d6657137d29138e0878040cb205
Signed-off-by: Hung-Te Lin <hungte@chromium.org>
Reviewed-on: http://review.coreboot.org/2199
Tested-by: build bot (Jenkins)
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
diff --git a/util/cbfstool/cbfs-mkstage.c b/util/cbfstool/cbfs-mkstage.c
index ef5182a..4374bda 100644
--- a/util/cbfstool/cbfs-mkstage.c
+++ b/util/cbfstool/cbfs-mkstage.c
@@ -77,7 +77,7 @@
if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB) {
elf_bigendian = 1;
}
- if (elf_bigendian != host_bigendian) {
+ if (elf_bigendian != is_big_endian()) {
elf32_to_native = swap32;
}
diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c
index 1ad270b..11f1914 100644
--- a/util/cbfstool/cbfstool.c
+++ b/util/cbfstool/cbfstool.c
@@ -496,18 +496,6 @@
print_supported_filetypes();
}
-/* Small, OS/libc independent runtime check for endianess */
-int host_bigendian = 0;
-
-static void which_endian(void)
-{
- static const uint32_t inttest = 0x12345678;
- uint8_t inttest_lsb = *(uint8_t *)&inttest;
- if (inttest_lsb == 0x12) {
- host_bigendian = 1;
- }
-}
-
int main(int argc, char **argv)
{
size_t i;
@@ -518,8 +506,6 @@
return 1;
}
- which_endian();
-
param.cbfs_name = argv[1];
char *cmd = argv[2];
optind += 2;
diff --git a/util/cbfstool/common.c b/util/cbfstool/common.c
index 3394b7b..d4560f6 100644
--- a/util/cbfstool/common.c
+++ b/util/cbfstool/common.c
@@ -27,6 +27,19 @@
#include "cbfs.h"
#include "elf.h"
+/* Utilities */
+
+/* Small, OS/libc independent runtime check for endianess */
+int is_big_endian(void)
+{
+ static const uint32_t inttest = 0x12345678;
+ uint8_t inttest_lsb = *(uint8_t *)&inttest;
+ if (inttest_lsb == 0x12) {
+ return 1;
+ }
+ return 0;
+}
+
size_t getfilesize(const char *filename)
{
size_t size;
diff --git a/util/cbfstool/common.h b/util/cbfstool/common.h
index bd5ef65..5315e69 100644
--- a/util/cbfstool/common.h
+++ b/util/cbfstool/common.h
@@ -21,13 +21,16 @@
#define __CBFSTOOL_COMMON_H
#include <stdint.h>
+
+/* Endianess */
#include "swab.h"
#ifndef __APPLE__
-#define ntohl(x) (host_bigendian?(x):swab32(x))
-#define htonl(x) (host_bigendian?(x):swab32(x))
+#define ntohl(x) (is_big_endian() ? (x) : swab32(x))
+#define htonl(x) (is_big_endian() ? (x) : swab32(x))
#endif
-#define ntohll(x) (host_bigendian?(x):swab64(x))
-#define htonll(x) (host_bigendian?(x):swab64(x))
+#define ntohll(x) (is_big_endian() ? (x) : swab64(x))
+#define htonll(x) (is_big_endian() ? (x) : swab64(x))
+extern int is_big_endian(void);
/* Message output */
extern int verbose;