176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef ETHERBOOT_BITS_BYTESWAP_H 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define ETHERBOOT_BITS_BYTESWAP_H 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFILE_LICENCE ( GPL2_OR_LATER ); 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __attribute__ ((always_inline, const)) uint16_t 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman__bswap_variable_16(uint16_t x) 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman __asm__("xchgb %b0,%h0\n\t" 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : "=q" (x) 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : "0" (x)); 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return x; 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __attribute__ ((always_inline, const)) uint32_t 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman__bswap_variable_32(uint32_t x) 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman __asm__("xchgb %b0,%h0\n\t" 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "rorl $16,%0\n\t" 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "xchgb %b0,%h0" 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : "=q" (x) 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : "0" (x)); 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return x; 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __attribute__ ((always_inline, const)) uint64_t 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman__bswap_variable_64(uint64_t x) 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union { 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t qword; 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t dword[2]; 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } u; 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u.qword = x; 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u.dword[0] = __bswap_variable_32(u.dword[0]); 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u.dword[1] = __bswap_variable_32(u.dword[1]); 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman __asm__("xchgl %0,%1" 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : "=r" ( u.dword[0] ), "=r" ( u.dword[1] ) 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : "0" ( u.dword[0] ), "1" ( u.dword[1] ) ); 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return u.qword; 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* ETHERBOOT_BITS_BYTESWAP_H */ 44