1 #ifndef _LINUX_UNALIGNED_GENERIC_H 2 #define _LINUX_UNALIGNED_GENERIC_H 3 4 /* define __force to nothing in U-Boot */ 5 #define __force 6 7 /* 8 * Cause a link-time error if we try an unaligned access other than 9 * 1,2,4 or 8 bytes long 10 */ 11 extern void __bad_unaligned_access_size(void); 12 13 #define __get_unaligned_le(ptr) ((__force typeof(*(ptr)))({ \ 14 __builtin_choose_expr(sizeof(*(ptr)) == 1, *(ptr), \ 15 __builtin_choose_expr(sizeof(*(ptr)) == 2, get_unaligned_le16((ptr)), \ 16 __builtin_choose_expr(sizeof(*(ptr)) == 4, get_unaligned_le32((ptr)), \ 17 __builtin_choose_expr(sizeof(*(ptr)) == 8, get_unaligned_le64((ptr)), \ 18 __bad_unaligned_access_size())))); \ 19 })) 20 21 #define __get_unaligned_be(ptr) ((__force typeof(*(ptr)))({ \ 22 __builtin_choose_expr(sizeof(*(ptr)) == 1, *(ptr), \ 23 __builtin_choose_expr(sizeof(*(ptr)) == 2, get_unaligned_be16((ptr)), \ 24 __builtin_choose_expr(sizeof(*(ptr)) == 4, get_unaligned_be32((ptr)), \ 25 __builtin_choose_expr(sizeof(*(ptr)) == 8, get_unaligned_be64((ptr)), \ 26 __bad_unaligned_access_size())))); \ 27 })) 28 29 #define __put_unaligned_le(val, ptr) ({ \ 30 void *__gu_p = (ptr); \ 31 switch (sizeof(*(ptr))) { \ 32 case 1: \ 33 *(u8 *)__gu_p = (__force u8)(val); \ 34 break; \ 35 case 2: \ 36 put_unaligned_le16((__force u16)(val), __gu_p); \ 37 break; \ 38 case 4: \ 39 put_unaligned_le32((__force u32)(val), __gu_p); \ 40 break; \ 41 case 8: \ 42 put_unaligned_le64((__force u64)(val), __gu_p); \ 43 break; \ 44 default: \ 45 __bad_unaligned_access_size(); \ 46 break; \ 47 } \ 48 (void)0; }) 49 50 #define __put_unaligned_be(val, ptr) ({ \ 51 void *__gu_p = (ptr); \ 52 switch (sizeof(*(ptr))) { \ 53 case 1: \ 54 *(u8 *)__gu_p = (__force u8)(val); \ 55 break; \ 56 case 2: \ 57 put_unaligned_be16((__force u16)(val), __gu_p); \ 58 break; \ 59 case 4: \ 60 put_unaligned_be32((__force u32)(val), __gu_p); \ 61 break; \ 62 case 8: \ 63 put_unaligned_be64((__force u64)(val), __gu_p); \ 64 break; \ 65 default: \ 66 __bad_unaligned_access_size(); \ 67 break; \ 68 } \ 69 (void)0; }) 70 71 #endif /* _LINUX_UNALIGNED_GENERIC_H */ 72