endian: Replace explicit byte swapping with compiler builtin
gcc seems to have some stupid problem with deciding when to inline byte swapping functions (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92716). Using the compiler builtin instead seems to solve the problem. (This doesn't yet solve the issue for the read_be32()-family of functions, which we should maybe just get rid of at some point?) Change-Id: Ia2a6d8ea98987266ccc32ffaa0a7f78965fca1cd Signed-off-by: Julius Werner <jwerner@chromium.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/37343 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
		
				
					committed by
					
						 Patrick Georgi
						Patrick Georgi
					
				
			
			
				
	
			
			
			
						parent
						
							6fdf122fc3
						
					
				
				
					commit
					879ea7fce8
				
			| @@ -34,23 +34,6 @@ | |||||||
| #include <arch/types.h> | #include <arch/types.h> | ||||||
| #include <libpayload-config.h> | #include <libpayload-config.h> | ||||||
|  |  | ||||||
| static inline uint16_t swap_bytes16(uint16_t in) |  | ||||||
| { |  | ||||||
| 	return ((in & 0xFF) << 8) | ((in & 0xFF00) >> 8); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| 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" */ | ||||||
|  |  | ||||||
| #if CONFIG(LP_BIG_ENDIAN) | #if CONFIG(LP_BIG_ENDIAN) | ||||||
| @@ -59,15 +42,15 @@ static inline uint64_t swap_bytes64(uint64_t in) | |||||||
| #define htobe32(in) (in) | #define htobe32(in) (in) | ||||||
| #define htobe64(in) (in) | #define htobe64(in) (in) | ||||||
|  |  | ||||||
| #define htole16(in) swap_bytes16(in) | #define htole16(in) ((uint16_t)__builtin_bswap16(in)) | ||||||
| #define htole32(in) swap_bytes32(in) | #define htole32(in) ((uint32_t)__builtin_bswap32(in)) | ||||||
| #define htole64(in) swap_bytes64(in) | #define htole64(in) ((uint64_t)__builtin_bswap64(in)) | ||||||
|  |  | ||||||
| #elif CONFIG(LP_LITTLE_ENDIAN) | #elif CONFIG(LP_LITTLE_ENDIAN) | ||||||
|  |  | ||||||
| #define htobe16(in) swap_bytes16(in) | #define htobe16(in) ((uint16_t)__builtin_bswap16(in)) | ||||||
| #define htobe32(in) swap_bytes32(in) | #define htobe32(in) ((uint32_t)__builtin_bswap32(in)) | ||||||
| #define htobe64(in) swap_bytes64(in) | #define htobe64(in) ((uint64_t)__builtin_bswap64(in)) | ||||||
|  |  | ||||||
| #define htole16(in) (in) | #define htole16(in) (in) | ||||||
| #define htole32(in) (in) | #define htole32(in) (in) | ||||||
|   | |||||||
| @@ -1,44 +0,0 @@ | |||||||
| #ifndef _SWAB_H |  | ||||||
| #define _SWAB_H |  | ||||||
|  |  | ||||||
| /* |  | ||||||
|  * linux/byteorder/swab.h |  | ||||||
|  * Byte-swapping, independently from CPU endianness |  | ||||||
|  *	swabXX[ps]?(foo) |  | ||||||
|  * |  | ||||||
|  * Francois-Rene Rideau <fare@tunes.org> 19971205 |  | ||||||
|  *    separated swab functions from cpu_to_XX, |  | ||||||
|  *    to clean up support for bizarre-endian architectures. |  | ||||||
|  * |  | ||||||
|  * See asm-i386/byteorder.h and suches for examples of how to provide |  | ||||||
|  * architecture-dependent optimized versions |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| /* casts are necessary for constants, because we never know for sure |  | ||||||
|  * how U/UL/ULL map to __u16, __u32, __u64. At least not in a portable way. |  | ||||||
|  */ |  | ||||||
| #define swab16(x) \ |  | ||||||
| 	((unsigned short)( \ |  | ||||||
| 		(((unsigned short)(x) & (unsigned short)0x00ffU) << 8) | \ |  | ||||||
| 		(((unsigned short)(x) & (unsigned short)0xff00U) >> 8))) |  | ||||||
|  |  | ||||||
| #define swab32(x) \ |  | ||||||
| 	((unsigned int)( \ |  | ||||||
| 		(((unsigned int)(x) & (unsigned int)0x000000ffUL) << 24) | \ |  | ||||||
| 		(((unsigned int)(x) & (unsigned int)0x0000ff00UL) <<  8) | \ |  | ||||||
| 		(((unsigned int)(x) & (unsigned int)0x00ff0000UL) >>  8) | \ |  | ||||||
| 		(((unsigned int)(x) & (unsigned int)0xff000000UL) >> 24))) |  | ||||||
|  |  | ||||||
| #define swab64(x) \ |  | ||||||
| 	((uint64_t)( \ |  | ||||||
| 		(((uint64_t)(x) & (uint64_t)0x00000000000000ffULL) << 56) | \ |  | ||||||
| 		(((uint64_t)(x) & (uint64_t)0x000000000000ff00ULL) << 40) | \ |  | ||||||
| 		(((uint64_t)(x) & (uint64_t)0x0000000000ff0000ULL) << 24) | \ |  | ||||||
| 		(((uint64_t)(x) & (uint64_t)0x00000000ff000000ULL) <<  8) | \ |  | ||||||
| 		(((uint64_t)(x) & (uint64_t)0x000000ff00000000ULL) >>  8) | \ |  | ||||||
| 		(((uint64_t)(x) & (uint64_t)0x0000ff0000000000ULL) >> 24) | \ |  | ||||||
| 		(((uint64_t)(x) & (uint64_t)0x00ff000000000000ULL) >> 40) | \ |  | ||||||
| 		(((uint64_t)(x) & (uint64_t)0xff00000000000000ULL) >> 56))) |  | ||||||
|  |  | ||||||
| #endif /* _SWAB_H */ |  | ||||||
| @@ -21,6 +21,7 @@ | |||||||
|  |  | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
|  |  | ||||||
|  | #if defined(__ROMCC__) || ENV_ARMV4 | ||||||
| #define swab16(x) \ | #define swab16(x) \ | ||||||
| 	((unsigned short)( \ | 	((unsigned short)( \ | ||||||
| 		(((unsigned short)(x) & (unsigned short)0x00ffU) << 8) | \ | 		(((unsigned short)(x) & (unsigned short)0x00ffU) << 8) | \ | ||||||
| @@ -43,5 +44,10 @@ | |||||||
| 		(((uint64_t)(x) & (uint64_t)0x0000ff0000000000ULL) >> 24) | \ | 		(((uint64_t)(x) & (uint64_t)0x0000ff0000000000ULL) >> 24) | \ | ||||||
| 		(((uint64_t)(x) & (uint64_t)0x00ff000000000000ULL) >> 40) | \ | 		(((uint64_t)(x) & (uint64_t)0x00ff000000000000ULL) >> 40) | \ | ||||||
| 		(((uint64_t)(x) & (uint64_t)0xff00000000000000ULL) >> 56))) | 		(((uint64_t)(x) & (uint64_t)0xff00000000000000ULL) >> 56))) | ||||||
|  | #else	/* __ROMCC__ || ENV_ARMV4 */ | ||||||
|  | #define swab16(x) ((uint16_t)__builtin_bswap16(x)) | ||||||
|  | #define swab32(x) ((uint32_t)__builtin_bswap32(x)) | ||||||
|  | #define swab64(x) ((uint64_t)__builtin_bswap64(x)) | ||||||
|  | #endif	/* !(__ROMCC__ || ENV_ARMV4) */ | ||||||
|  |  | ||||||
| #endif /* _SWAB_H */ | #endif /* _SWAB_H */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user