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>
This commit is contained in:
Hung-Te Lin 2013-01-28 15:53:34 +08:00
parent d723c5b554
commit 332795cc59
4 changed files with 21 additions and 19 deletions

View File

@ -77,7 +77,7 @@ int parse_elf_to_stage(unsigned char *input, unsigned char **output,
if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB) { if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB) {
elf_bigendian = 1; elf_bigendian = 1;
} }
if (elf_bigendian != host_bigendian) { if (elf_bigendian != is_big_endian()) {
elf32_to_native = swap32; elf32_to_native = swap32;
} }

View File

@ -496,18 +496,6 @@ static void usage(char *name)
print_supported_filetypes(); 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) int main(int argc, char **argv)
{ {
size_t i; size_t i;
@ -518,8 +506,6 @@ int main(int argc, char **argv)
return 1; return 1;
} }
which_endian();
param.cbfs_name = argv[1]; param.cbfs_name = argv[1];
char *cmd = argv[2]; char *cmd = argv[2];
optind += 2; optind += 2;

View File

@ -27,6 +27,19 @@
#include "cbfs.h" #include "cbfs.h"
#include "elf.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 getfilesize(const char *filename)
{ {
size_t size; size_t size;

View File

@ -21,13 +21,16 @@
#define __CBFSTOOL_COMMON_H #define __CBFSTOOL_COMMON_H
#include <stdint.h> #include <stdint.h>
/* Endianess */
#include "swab.h" #include "swab.h"
#ifndef __APPLE__ #ifndef __APPLE__
#define ntohl(x) (host_bigendian?(x):swab32(x)) #define ntohl(x) (is_big_endian() ? (x) : swab32(x))
#define htonl(x) (host_bigendian?(x):swab32(x)) #define htonl(x) (is_big_endian() ? (x) : swab32(x))
#endif #endif
#define ntohll(x) (host_bigendian?(x):swab64(x)) #define ntohll(x) (is_big_endian() ? (x) : swab64(x))
#define htonll(x) (host_bigendian?(x):swab64(x)) #define htonll(x) (is_big_endian() ? (x) : swab64(x))
extern int is_big_endian(void);
/* Message output */ /* Message output */
extern int verbose; extern int verbose;