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