blob: 1ec472f5d20ad2857e85c4af641870822cb953b0 [file] [log] [blame]
Aaron Durbinf66a0262015-09-17 11:24:08 -05001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright 2015 Google Inc.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
Aaron Durbinf66a0262015-09-17 11:24:08 -050014 */
15
16#ifndef _COMMONLIB_ENDIAN_H_
17#define _COMMONLIB_ENDIAN_H_
18
19#include <stddef.h>
20#include <stdint.h>
21
22/* Endian agnostic functions working on single byte. */
23
24static inline uint8_t read_ble8(const void *src)
25{
26 const uint8_t *s = src;
27 return *s;
28}
29
30static inline uint8_t read_at_ble8(const void *src, size_t offset)
31{
32 const uint8_t *s = src;
33 s += offset;
34 return read_ble8(s);
35}
36
37static inline void write_ble8(void *dest, uint8_t val)
38{
39 *(uint8_t *)dest = val;
40}
41
42static inline void write_at_ble8(void *dest, uint8_t val, size_t offset)
43{
44 uint8_t *d = dest;
45 d += offset;
46 write_ble8(d, val);
47}
48
49/* Big Endian functions. */
50
51static inline uint8_t read_be8(const void *src)
52{
53 return read_ble8(src);
54}
55
56static inline uint8_t read_at_be8(const void *src, size_t offset)
57{
58 return read_at_ble8(src, offset);
59}
60
61static inline void write_be8(void *dest, uint8_t val)
62{
63 write_ble8(dest, val);
64}
65
66static inline void write_at_be8(void *dest, uint8_t val, size_t offset)
67{
68 write_at_ble8(dest, val, offset);
69}
70
71static inline uint16_t read_be16(const void *src)
72{
73 const uint8_t *s = src;
74 return (((uint16_t)s[0]) << 8) | (((uint16_t)s[1]) << 0);
75}
76
77static inline uint16_t read_at_be16(const void *src, size_t offset)
78{
79 const uint8_t *s = src;
80 s += offset;
81 return read_be16(s);
82}
83
84static inline void write_be16(void *dest, uint16_t val)
85{
86 write_be8(dest, val >> 8);
87 write_at_be8(dest, val >> 0, sizeof(uint8_t));
88}
89
90static inline void write_at_be16(void *dest, uint16_t val, size_t offset)
91{
92 uint8_t *d = dest;
93 d += offset;
94 write_be16(d, val);
95}
96
97static inline uint32_t read_be32(const void *src)
98{
99 const uint8_t *s = src;
100 return (((uint32_t)s[0]) << 24) | (((uint32_t)s[1]) << 16) |
101 (((uint32_t)s[2]) << 8) | (((uint32_t)s[3]) << 0);
102}
103
104static inline uint32_t read_at_be32(const void *src, size_t offset)
105{
106 const uint8_t *s = src;
107 s += offset;
108 return read_be32(s);
109}
110
111static inline void write_be32(void *dest, uint32_t val)
112{
113 write_be16(dest, val >> 16);
114 write_at_be16(dest, val >> 0, sizeof(uint16_t));
115}
116
117static inline void write_at_be32(void *dest, uint32_t val, size_t offset)
118{
119 uint8_t *d = dest;
120 d += offset;
121 write_be32(d, val);
122}
123
124static inline uint64_t read_be64(const void *src)
125{
126 uint64_t val;
127 val = read_be32(src);
128 val <<= 32;
129 val |= read_at_be32(src, sizeof(uint32_t));
130 return val;
131}
132
133static inline uint64_t read_at_be64(const void *src, size_t offset)
134{
135 const uint8_t *s = src;
136 s += offset;
137 return read_be64(s);
138}
139
140static inline void write_be64(void *dest, uint64_t val)
141{
142 write_be32(dest, val >> 32);
143 write_at_be32(dest, val >> 0, sizeof(uint32_t));
144}
145
146static inline void write_at_be64(void *dest, uint64_t val, size_t offset)
147{
148 uint8_t *d = dest;
149 d += offset;
150 write_be64(d, val);
151}
152
153/* Little Endian functions. */
154
155static inline uint8_t read_le8(const void *src)
156{
157 return read_ble8(src);
158}
159
160static inline uint8_t read_at_le8(const void *src, size_t offset)
161{
162 return read_at_ble8(src, offset);
163}
164
165static inline void write_le8(void *dest, uint8_t val)
166{
167 write_ble8(dest, val);
168}
169
170static inline void write_at_le8(void *dest, uint8_t val, size_t offset)
171{
172 write_at_ble8(dest, val, offset);
173}
174
175static inline uint16_t read_le16(const void *src)
176{
177 const uint8_t *s = src;
178 return (((uint16_t)s[1]) << 8) | (((uint16_t)s[0]) << 0);
179}
180
181static inline uint16_t read_at_le16(const void *src, size_t offset)
182{
183 const uint8_t *s = src;
184 s += offset;
185 return read_le16(s);
186}
187
188static inline void write_le16(void *dest, uint16_t val)
189{
190 write_le8(dest, val >> 0);
191 write_at_le8(dest, val >> 8, sizeof(uint8_t));
192}
193
194static inline void write_at_le16(void *dest, uint16_t val, size_t offset)
195{
196 uint8_t *d = dest;
197 d += offset;
198 write_le16(d, val);
199}
200
201static inline uint32_t read_le32(const void *src)
202{
203 const uint8_t *s = src;
204 return (((uint32_t)s[3]) << 24) | (((uint32_t)s[2]) << 16) |
205 (((uint32_t)s[1]) << 8) | (((uint32_t)s[0]) << 0);
206}
207
208static inline uint32_t read_at_le32(const void *src, size_t offset)
209{
210 const uint8_t *s = src;
211 s += offset;
212 return read_le32(s);
213}
214
215static inline void write_le32(void *dest, uint32_t val)
216{
217 write_le16(dest, val >> 0);
218 write_at_le16(dest, val >> 16, sizeof(uint16_t));
219}
220
221static inline void write_at_le32(void *dest, uint32_t val, size_t offset)
222{
223 uint8_t *d = dest;
224 d += offset;
225 write_le32(d, val);
226}
227
228static inline uint64_t read_le64(const void *src)
229{
230 uint64_t val;
231 val = read_at_le32(src, sizeof(uint32_t));
232 val <<= 32;
233 val |= read_le32(src);
234 return val;
235}
236
237static inline uint64_t read_at_le64(const void *src, size_t offset)
238{
239 const uint8_t *s = src;
240 s += offset;
241 return read_le64(s);
242}
243
244static inline void write_le64(void *dest, uint64_t val)
245{
246 write_le32(dest, val >> 0);
247 write_at_le32(dest, val >> 32, sizeof(uint32_t));
248}
249
250static inline void write_at_le64(void *dest, uint64_t val, size_t offset)
251{
252 uint8_t *d = dest;
253 d += offset;
254 write_le64(d, val);
255}
256
257#endif