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:
parent
d723c5b554
commit
332795cc59
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue