libpayload: Turn the endian conversion macros into functions.

In their current macro form, any arguments that are expressions will be
evaluated multiple times. That can cause problems if they have side effects,
and might not even compile if the overall expression is ambiguous, for
instance if you pass in foo++.

Built with code that previously wouldn't compile because the macros
expanded to ambiguous expressions.

Change-Id: I378c04d7aff5b4ad40581930ce90e49ba7df1d3e
Signed-off-by: Gabe Black <gabeblack@google.com>
Reviewed-on: http://review.coreboot.org/2719
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
This commit is contained in:
Gabe Black 2013-03-08 04:38:13 -08:00 committed by Ronald G. Minnich
parent 7e56855963
commit 1cb414de63
1 changed files with 16 additions and 6 deletions

View File

@ -26,12 +26,22 @@
#include <arch/types.h> #include <arch/types.h>
#include <libpayload-config.h> #include <libpayload-config.h>
#define swap_bytes16(in) ((((in) & 0xFF) << 8) | (((in) & 0xFF00) >> 8)) static inline uint16_t swap_bytes16(uint16_t in)
#define swap_bytes32(in) ((((in) & 0xFF) << 24) | (((in) & 0xFF00) << 8) | \ {
(((in) & 0xFF0000) >> 8) | \ return ((in & 0xFF) << 8) | ((in & 0xFF00) >> 8);
(((in) & 0xFF000000) >> 24)) }
#define swap_bytes64(in) (((uint64_t)swap_bytes32((uint32_t)(in)) << 32) | \
((uint64_t)swap_bytes32((uint32_t)((in) >> 32)))) static inline uint32_t swap_bytes32(uint32_t in)
{
return ((in & 0xFF) << 24) | ((in & 0xFF00) << 8) |
((in & 0xFF0000) >> 8) | ((in & 0xFF000000) >> 24);
}
static inline uint64_t swap_bytes64(uint64_t in)
{
return ((uint64_t)swap_bytes32((uint32_t)in) << 32) |
((uint64_t)swap_bytes32((uint32_t)(in >> 32)));
}
/* Endian functions from glibc 2.9 / BSD "endian.h" */ /* Endian functions from glibc 2.9 / BSD "endian.h" */