15f60d5f6SAl Viro /* SPDX-License-Identifier: GPL-2.0 */
25f60d5f6SAl Viro #ifndef __LINUX_UNALIGNED_H
35f60d5f6SAl Viro #define __LINUX_UNALIGNED_H
45f60d5f6SAl Viro
55f60d5f6SAl Viro /*
65f60d5f6SAl Viro * This is the most generic implementation of unaligned accesses
75f60d5f6SAl Viro * and should work almost anywhere.
85f60d5f6SAl Viro */
95f60d5f6SAl Viro #pragma GCC diagnostic push
105f60d5f6SAl Viro #pragma GCC diagnostic ignored "-Wpacked"
115f60d5f6SAl Viro #pragma GCC diagnostic ignored "-Wattributes"
12*55f1b540SArnaldo Carvalho de Melo #include <vdso/unaligned.h>
135f60d5f6SAl Viro
145f60d5f6SAl Viro #define get_unaligned(ptr) __get_unaligned_t(typeof(*(ptr)), (ptr))
155f60d5f6SAl Viro #define put_unaligned(val, ptr) __put_unaligned_t(typeof(*(ptr)), (val), (ptr))
165f60d5f6SAl Viro
get_unaligned_le16(const void * p)175f60d5f6SAl Viro static inline u16 get_unaligned_le16(const void *p)
185f60d5f6SAl Viro {
195f60d5f6SAl Viro return le16_to_cpu(__get_unaligned_t(__le16, p));
205f60d5f6SAl Viro }
215f60d5f6SAl Viro
get_unaligned_le32(const void * p)225f60d5f6SAl Viro static inline u32 get_unaligned_le32(const void *p)
235f60d5f6SAl Viro {
245f60d5f6SAl Viro return le32_to_cpu(__get_unaligned_t(__le32, p));
255f60d5f6SAl Viro }
265f60d5f6SAl Viro
get_unaligned_le64(const void * p)275f60d5f6SAl Viro static inline u64 get_unaligned_le64(const void *p)
285f60d5f6SAl Viro {
295f60d5f6SAl Viro return le64_to_cpu(__get_unaligned_t(__le64, p));
305f60d5f6SAl Viro }
315f60d5f6SAl Viro
put_unaligned_le16(u16 val,void * p)325f60d5f6SAl Viro static inline void put_unaligned_le16(u16 val, void *p)
335f60d5f6SAl Viro {
345f60d5f6SAl Viro __put_unaligned_t(__le16, cpu_to_le16(val), p);
355f60d5f6SAl Viro }
365f60d5f6SAl Viro
put_unaligned_le32(u32 val,void * p)375f60d5f6SAl Viro static inline void put_unaligned_le32(u32 val, void *p)
385f60d5f6SAl Viro {
395f60d5f6SAl Viro __put_unaligned_t(__le32, cpu_to_le32(val), p);
405f60d5f6SAl Viro }
415f60d5f6SAl Viro
put_unaligned_le64(u64 val,void * p)425f60d5f6SAl Viro static inline void put_unaligned_le64(u64 val, void *p)
435f60d5f6SAl Viro {
445f60d5f6SAl Viro __put_unaligned_t(__le64, cpu_to_le64(val), p);
455f60d5f6SAl Viro }
465f60d5f6SAl Viro
get_unaligned_be16(const void * p)475f60d5f6SAl Viro static inline u16 get_unaligned_be16(const void *p)
485f60d5f6SAl Viro {
495f60d5f6SAl Viro return be16_to_cpu(__get_unaligned_t(__be16, p));
505f60d5f6SAl Viro }
515f60d5f6SAl Viro
get_unaligned_be32(const void * p)525f60d5f6SAl Viro static inline u32 get_unaligned_be32(const void *p)
535f60d5f6SAl Viro {
545f60d5f6SAl Viro return be32_to_cpu(__get_unaligned_t(__be32, p));
555f60d5f6SAl Viro }
565f60d5f6SAl Viro
get_unaligned_be64(const void * p)575f60d5f6SAl Viro static inline u64 get_unaligned_be64(const void *p)
585f60d5f6SAl Viro {
595f60d5f6SAl Viro return be64_to_cpu(__get_unaligned_t(__be64, p));
605f60d5f6SAl Viro }
615f60d5f6SAl Viro
put_unaligned_be16(u16 val,void * p)625f60d5f6SAl Viro static inline void put_unaligned_be16(u16 val, void *p)
635f60d5f6SAl Viro {
645f60d5f6SAl Viro __put_unaligned_t(__be16, cpu_to_be16(val), p);
655f60d5f6SAl Viro }
665f60d5f6SAl Viro
put_unaligned_be32(u32 val,void * p)675f60d5f6SAl Viro static inline void put_unaligned_be32(u32 val, void *p)
685f60d5f6SAl Viro {
695f60d5f6SAl Viro __put_unaligned_t(__be32, cpu_to_be32(val), p);
705f60d5f6SAl Viro }
715f60d5f6SAl Viro
put_unaligned_be64(u64 val,void * p)725f60d5f6SAl Viro static inline void put_unaligned_be64(u64 val, void *p)
735f60d5f6SAl Viro {
745f60d5f6SAl Viro __put_unaligned_t(__be64, cpu_to_be64(val), p);
755f60d5f6SAl Viro }
765f60d5f6SAl Viro
__get_unaligned_be24(const u8 * p)775f60d5f6SAl Viro static inline u32 __get_unaligned_be24(const u8 *p)
785f60d5f6SAl Viro {
795f60d5f6SAl Viro return p[0] << 16 | p[1] << 8 | p[2];
805f60d5f6SAl Viro }
815f60d5f6SAl Viro
get_unaligned_be24(const void * p)825f60d5f6SAl Viro static inline u32 get_unaligned_be24(const void *p)
835f60d5f6SAl Viro {
845f60d5f6SAl Viro return __get_unaligned_be24(p);
855f60d5f6SAl Viro }
865f60d5f6SAl Viro
__get_unaligned_le24(const u8 * p)875f60d5f6SAl Viro static inline u32 __get_unaligned_le24(const u8 *p)
885f60d5f6SAl Viro {
895f60d5f6SAl Viro return p[0] | p[1] << 8 | p[2] << 16;
905f60d5f6SAl Viro }
915f60d5f6SAl Viro
get_unaligned_le24(const void * p)925f60d5f6SAl Viro static inline u32 get_unaligned_le24(const void *p)
935f60d5f6SAl Viro {
945f60d5f6SAl Viro return __get_unaligned_le24(p);
955f60d5f6SAl Viro }
965f60d5f6SAl Viro
__put_unaligned_be24(const u32 val,u8 * p)975f60d5f6SAl Viro static inline void __put_unaligned_be24(const u32 val, u8 *p)
985f60d5f6SAl Viro {
995f60d5f6SAl Viro *p++ = (val >> 16) & 0xff;
1005f60d5f6SAl Viro *p++ = (val >> 8) & 0xff;
1015f60d5f6SAl Viro *p++ = val & 0xff;
1025f60d5f6SAl Viro }
1035f60d5f6SAl Viro
put_unaligned_be24(const u32 val,void * p)1045f60d5f6SAl Viro static inline void put_unaligned_be24(const u32 val, void *p)
1055f60d5f6SAl Viro {
1065f60d5f6SAl Viro __put_unaligned_be24(val, p);
1075f60d5f6SAl Viro }
1085f60d5f6SAl Viro
__put_unaligned_le24(const u32 val,u8 * p)1095f60d5f6SAl Viro static inline void __put_unaligned_le24(const u32 val, u8 *p)
1105f60d5f6SAl Viro {
1115f60d5f6SAl Viro *p++ = val & 0xff;
1125f60d5f6SAl Viro *p++ = (val >> 8) & 0xff;
1135f60d5f6SAl Viro *p++ = (val >> 16) & 0xff;
1145f60d5f6SAl Viro }
1155f60d5f6SAl Viro
put_unaligned_le24(const u32 val,void * p)1165f60d5f6SAl Viro static inline void put_unaligned_le24(const u32 val, void *p)
1175f60d5f6SAl Viro {
1185f60d5f6SAl Viro __put_unaligned_le24(val, p);
1195f60d5f6SAl Viro }
1205f60d5f6SAl Viro
__put_unaligned_be48(const u64 val,u8 * p)1215f60d5f6SAl Viro static inline void __put_unaligned_be48(const u64 val, u8 *p)
1225f60d5f6SAl Viro {
1235f60d5f6SAl Viro *p++ = (val >> 40) & 0xff;
1245f60d5f6SAl Viro *p++ = (val >> 32) & 0xff;
1255f60d5f6SAl Viro *p++ = (val >> 24) & 0xff;
1265f60d5f6SAl Viro *p++ = (val >> 16) & 0xff;
1275f60d5f6SAl Viro *p++ = (val >> 8) & 0xff;
1285f60d5f6SAl Viro *p++ = val & 0xff;
1295f60d5f6SAl Viro }
1305f60d5f6SAl Viro
put_unaligned_be48(const u64 val,void * p)1315f60d5f6SAl Viro static inline void put_unaligned_be48(const u64 val, void *p)
1325f60d5f6SAl Viro {
1335f60d5f6SAl Viro __put_unaligned_be48(val, p);
1345f60d5f6SAl Viro }
1355f60d5f6SAl Viro
__get_unaligned_be48(const u8 * p)1365f60d5f6SAl Viro static inline u64 __get_unaligned_be48(const u8 *p)
1375f60d5f6SAl Viro {
1385f60d5f6SAl Viro return (u64)p[0] << 40 | (u64)p[1] << 32 | (u64)p[2] << 24 |
1395f60d5f6SAl Viro p[3] << 16 | p[4] << 8 | p[5];
1405f60d5f6SAl Viro }
1415f60d5f6SAl Viro
get_unaligned_be48(const void * p)1425f60d5f6SAl Viro static inline u64 get_unaligned_be48(const void *p)
1435f60d5f6SAl Viro {
1445f60d5f6SAl Viro return __get_unaligned_be48(p);
1455f60d5f6SAl Viro }
1465f60d5f6SAl Viro #pragma GCC diagnostic pop
1475f60d5f6SAl Viro
1485f60d5f6SAl Viro #endif /* __LINUX_UNALIGNED_H */
149