1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2 #pragma once
3 
4 #include <endian.h>
5 #include <stdint.h>
6 
7 /* BE */
8 
unaligned_read_be16(const void * _u)9 static inline uint16_t unaligned_read_be16(const void *_u) {
10         const struct __attribute__((__packed__, __may_alias__)) { uint16_t x; } *u = _u;
11 
12         return be16toh(u->x);
13 }
14 
unaligned_read_be32(const void * _u)15 static inline uint32_t unaligned_read_be32(const void *_u) {
16         const struct __attribute__((__packed__, __may_alias__)) { uint32_t x; } *u = _u;
17 
18         return be32toh(u->x);
19 }
20 
unaligned_read_be64(const void * _u)21 static inline uint64_t unaligned_read_be64(const void *_u) {
22         const struct __attribute__((__packed__, __may_alias__)) { uint64_t x; } *u = _u;
23 
24         return be64toh(u->x);
25 }
26 
unaligned_write_be16(void * _u,uint16_t a)27 static inline void unaligned_write_be16(void *_u, uint16_t a) {
28         struct __attribute__((__packed__, __may_alias__)) { uint16_t x; } *u = _u;
29 
30         u->x = be16toh(a);
31 }
32 
unaligned_write_be32(void * _u,uint32_t a)33 static inline void unaligned_write_be32(void *_u, uint32_t a) {
34         struct __attribute__((__packed__, __may_alias__)) { uint32_t x; } *u = _u;
35 
36         u->x = be32toh(a);
37 }
38 
unaligned_write_be64(void * _u,uint64_t a)39 static inline void unaligned_write_be64(void *_u, uint64_t a) {
40         struct __attribute__((__packed__, __may_alias__)) { uint64_t x; } *u = _u;
41 
42         u->x = be64toh(a);
43 }
44 
45 /* LE */
46 
unaligned_read_le16(const void * _u)47 static inline uint16_t unaligned_read_le16(const void *_u) {
48         const struct __attribute__((__packed__, __may_alias__)) { uint16_t x; } *u = _u;
49 
50         return le16toh(u->x);
51 }
52 
unaligned_read_le32(const void * _u)53 static inline uint32_t unaligned_read_le32(const void *_u) {
54         const struct __attribute__((__packed__, __may_alias__)) { uint32_t x; } *u = _u;
55 
56         return le32toh(u->x);
57 }
58 
unaligned_read_le64(const void * _u)59 static inline uint64_t unaligned_read_le64(const void *_u) {
60         const struct __attribute__((__packed__, __may_alias__)) { uint64_t x; } *u = _u;
61 
62         return le64toh(u->x);
63 }
64 
unaligned_write_le16(void * _u,uint16_t a)65 static inline void unaligned_write_le16(void *_u, uint16_t a) {
66         struct __attribute__((__packed__, __may_alias__)) { uint16_t x; } *u = _u;
67 
68         u->x = le16toh(a);
69 }
70 
unaligned_write_le32(void * _u,uint32_t a)71 static inline void unaligned_write_le32(void *_u, uint32_t a) {
72         struct __attribute__((__packed__, __may_alias__)) { uint32_t x; } *u = _u;
73 
74         u->x = le32toh(a);
75 }
76 
unaligned_write_le64(void * _u,uint64_t a)77 static inline void unaligned_write_le64(void *_u, uint64_t a) {
78         struct __attribute__((__packed__, __may_alias__)) { uint64_t x; } *u = _u;
79 
80         u->x = le64toh(a);
81 }
82 
83 #if __BYTE_ORDER == __BIG_ENDIAN
84 #define unaligned_read_ne16 unaligned_read_be16
85 #define unaligned_read_ne32 unaligned_read_be32
86 #define unaligned_read_ne64 unaligned_read_be64
87 
88 #define unaligned_write_ne16 unaligned_write_be16
89 #define unaligned_write_ne32 unaligned_write_be32
90 #define unaligned_write_ne64 unaligned_write_be64
91 #else
92 #define unaligned_read_ne16 unaligned_read_le16
93 #define unaligned_read_ne32 unaligned_read_le32
94 #define unaligned_read_ne64 unaligned_read_le64
95 
96 #define unaligned_write_ne16 unaligned_write_le16
97 #define unaligned_write_ne32 unaligned_write_le32
98 #define unaligned_write_ne64 unaligned_write_le64
99 #endif
100