1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 #ifndef _OBJTOOL_ENDIANNESS_H 3 #define _OBJTOOL_ENDIANNESS_H 4 5 #include <arch/endianness.h> 6 #include <linux/kernel.h> 7 #include <endian.h> 8 9 #ifndef __TARGET_BYTE_ORDER 10 #error undefined arch __TARGET_BYTE_ORDER 11 #endif 12 13 #if __BYTE_ORDER != __TARGET_BYTE_ORDER 14 #define __NEED_BSWAP 1 15 #else 16 #define __NEED_BSWAP 0 17 #endif 18 19 /* 20 * Does a byte swap if target endianness doesn't match the host, i.e. cross 21 * compilation for little endian on big endian and vice versa. 22 * To be used for multi-byte values conversion, which are read from / about 23 * to be written to a target native endianness ELF file. 24 */ 25 #define bswap_if_needed(val) \ 26 ({ \ 27 __typeof__(val) __ret; \ 28 switch (sizeof(val)) { \ 29 case 8: __ret = __NEED_BSWAP ? bswap_64(val) : (val); break; \ 30 case 4: __ret = __NEED_BSWAP ? bswap_32(val) : (val); break; \ 31 case 2: __ret = __NEED_BSWAP ? bswap_16(val) : (val); break; \ 32 default: \ 33 BUILD_BUG(); break; \ 34 } \ 35 __ret; \ 36 }) 37 38 #endif /* _OBJTOOL_ENDIANNESS_H */ 39