You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

263 lines
5.4 KiB

  1. /*
  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.
  14. */
  15. #ifndef _COMMONLIB_ENDIAN_H_
  16. #define _COMMONLIB_ENDIAN_H_
  17. #include <stddef.h>
  18. #include <stdint.h>
  19. #include <string.h>
  20. /* Endian agnostic functions working on single byte. */
  21. static inline uint8_t read_ble8(const void *src)
  22. {
  23. const uint8_t *s = src;
  24. return *s;
  25. }
  26. static inline uint8_t read_at_ble8(const void *src, size_t offset)
  27. {
  28. const uint8_t *s = src;
  29. s += offset;
  30. return read_ble8(s);
  31. }
  32. static inline void write_ble8(void *dest, uint8_t val)
  33. {
  34. *(uint8_t *)dest = val;
  35. }
  36. static inline void write_at_ble8(void *dest, uint8_t val, size_t offset)
  37. {
  38. uint8_t *d = dest;
  39. d += offset;
  40. write_ble8(d, val);
  41. }
  42. /* Big Endian functions. */
  43. static inline uint8_t read_be8(const void *src)
  44. {
  45. return read_ble8(src);
  46. }
  47. static inline uint8_t read_at_be8(const void *src, size_t offset)
  48. {
  49. return read_at_ble8(src, offset);
  50. }
  51. static inline void write_be8(void *dest, uint8_t val)
  52. {
  53. write_ble8(dest, val);
  54. }
  55. static inline void write_at_be8(void *dest, uint8_t val, size_t offset)
  56. {
  57. write_at_ble8(dest, val, offset);
  58. }
  59. static inline uint16_t read_be16(const void *src)
  60. {
  61. const uint8_t *s = src;
  62. return (((uint16_t)s[0]) << 8) | (((uint16_t)s[1]) << 0);
  63. }
  64. static inline uint16_t read_at_be16(const void *src, size_t offset)
  65. {
  66. const uint8_t *s = src;
  67. s += offset;
  68. return read_be16(s);
  69. }
  70. static inline void write_be16(void *dest, uint16_t val)
  71. {
  72. write_be8(dest, val >> 8);
  73. write_at_be8(dest, val >> 0, sizeof(uint8_t));
  74. }
  75. static inline void write_at_be16(void *dest, uint16_t val, size_t offset)
  76. {
  77. uint8_t *d = dest;
  78. d += offset;
  79. write_be16(d, val);
  80. }
  81. static inline uint32_t read_be32(const void *src)
  82. {
  83. const uint8_t *s = src;
  84. return (((uint32_t)s[0]) << 24) | (((uint32_t)s[1]) << 16) |
  85. (((uint32_t)s[2]) << 8) | (((uint32_t)s[3]) << 0);
  86. }
  87. static inline uint32_t read_at_be32(const void *src, size_t offset)
  88. {
  89. const uint8_t *s = src;
  90. s += offset;
  91. return read_be32(s);
  92. }
  93. static inline void write_be32(void *dest, uint32_t val)
  94. {
  95. write_be16(dest, val >> 16);
  96. write_at_be16(dest, val >> 0, sizeof(uint16_t));
  97. }
  98. static inline void write_at_be32(void *dest, uint32_t val, size_t offset)
  99. {
  100. uint8_t *d = dest;
  101. d += offset;
  102. write_be32(d, val);
  103. }
  104. static inline uint64_t read_be64(const void *src)
  105. {
  106. uint64_t val;
  107. val = read_be32(src);
  108. val <<= 32;
  109. val |= read_at_be32(src, sizeof(uint32_t));
  110. return val;
  111. }
  112. static inline uint64_t read_at_be64(const void *src, size_t offset)
  113. {
  114. const uint8_t *s = src;
  115. s += offset;
  116. return read_be64(s);
  117. }
  118. static inline void write_be64(void *dest, uint64_t val)
  119. {
  120. write_be32(dest, val >> 32);
  121. write_at_be32(dest, val >> 0, sizeof(uint32_t));
  122. }
  123. static inline void write_at_be64(void *dest, uint64_t val, size_t offset)
  124. {
  125. uint8_t *d = dest;
  126. d += offset;
  127. write_be64(d, val);
  128. }
  129. /* Little Endian functions. */
  130. static inline uint8_t read_le8(const void *src)
  131. {
  132. return read_ble8(src);
  133. }
  134. static inline uint8_t read_at_le8(const void *src, size_t offset)
  135. {
  136. return read_at_ble8(src, offset);
  137. }
  138. static inline void write_le8(void *dest, uint8_t val)
  139. {
  140. write_ble8(dest, val);
  141. }
  142. static inline void write_at_le8(void *dest, uint8_t val, size_t offset)
  143. {
  144. write_at_ble8(dest, val, offset);
  145. }
  146. static inline uint16_t read_le16(const void *src)
  147. {
  148. const uint8_t *s = src;
  149. return (((uint16_t)s[1]) << 8) | (((uint16_t)s[0]) << 0);
  150. }
  151. static inline uint16_t read_at_le16(const void *src, size_t offset)
  152. {
  153. const uint8_t *s = src;
  154. s += offset;
  155. return read_le16(s);
  156. }
  157. static inline void write_le16(void *dest, uint16_t val)
  158. {
  159. write_le8(dest, val >> 0);
  160. write_at_le8(dest, val >> 8, sizeof(uint8_t));
  161. }
  162. static inline void write_at_le16(void *dest, uint16_t val, size_t offset)
  163. {
  164. uint8_t *d = dest;
  165. d += offset;
  166. write_le16(d, val);
  167. }
  168. static inline uint32_t read_le32(const void *src)
  169. {
  170. const uint8_t *s = src;
  171. return (((uint32_t)s[3]) << 24) | (((uint32_t)s[2]) << 16) |
  172. (((uint32_t)s[1]) << 8) | (((uint32_t)s[0]) << 0);
  173. }
  174. static inline uint32_t read_at_le32(const void *src, size_t offset)
  175. {
  176. const uint8_t *s = src;
  177. s += offset;
  178. return read_le32(s);
  179. }
  180. static inline void write_le32(void *dest, uint32_t val)
  181. {
  182. write_le16(dest, val >> 0);
  183. write_at_le16(dest, val >> 16, sizeof(uint16_t));
  184. }
  185. static inline void write_at_le32(void *dest, uint32_t val, size_t offset)
  186. {
  187. uint8_t *d = dest;
  188. d += offset;
  189. write_le32(d, val);
  190. }
  191. static inline uint64_t read_le64(const void *src)
  192. {
  193. uint64_t val;
  194. val = read_at_le32(src, sizeof(uint32_t));
  195. val <<= 32;
  196. val |= read_le32(src);
  197. return val;
  198. }
  199. static inline uint64_t read_at_le64(const void *src, size_t offset)
  200. {
  201. const uint8_t *s = src;
  202. s += offset;
  203. return read_le64(s);
  204. }
  205. static inline void write_le64(void *dest, uint64_t val)
  206. {
  207. write_le32(dest, val >> 0);
  208. write_at_le32(dest, val >> 32, sizeof(uint32_t));
  209. }
  210. static inline void write_at_le64(void *dest, uint64_t val, size_t offset)
  211. {
  212. uint8_t *d = dest;
  213. d += offset;
  214. write_le64(d, val);
  215. }
  216. static inline void zero_n(void *dest, size_t n)
  217. {
  218. memset(dest, 0, n);
  219. }
  220. #endif