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