summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Krause <minipli@googlemail.com>2012-07-17 20:52:17 +0200
committerStefan Reinauer <stefan.reinauer@coreboot.org>2012-07-18 00:15:15 +0200
commitd2567c8d92cb2c816dc9e8078740aad93d14dc32 (patch)
tree6ea2f14dea5230af9d7199acb0ec261c74efc27c
parent117198662778778d132ee6077c1f39635adbadd9 (diff)
cbfstool: make endian detection code more robust
Accessing the memory of a char array through a uint32_t pointer breaks strict-aliasing rules as it dereferences memory with lower alignment requirements than the type of the pointer requires. It's no problem on x86 as the architecture is able to handle unaligned memory access but other architectures are not. Fix this by doing the test the other way around -- accessing the first byte of a uint32_t variable though a uint8_t pointer. Change-Id: Id340b406597014232741c98a4fd0b7c159f164c2 Signed-off-by: Mathias Krause <minipli@googlemail.com> Reviewed-on: http://review.coreboot.org/1234 Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org> Tested-by: build bot (Jenkins)
-rw-r--r--util/cbfstool/cbfstool.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c
index 9dbdc1c11a..721bf33fa2 100644
--- a/util/cbfstool/cbfstool.c
+++ b/util/cbfstool/cbfstool.c
@@ -339,9 +339,9 @@ int host_bigendian = 0;
static void which_endian(void)
{
- char test[4] = "1234";
- uint32_t inttest = *(uint32_t *) test;
- if (inttest == 0x31323334) {
+ static const uint32_t inttest = 0x12345678;
+ uint8_t inttest_lsb = *(uint8_t *)&inttest;
+ if (inttest_lsb == 0x12) {
host_bigendian = 1;
}
}