unaligned.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __LINUX_UNALIGNED_H
  3. #define __LINUX_UNALIGNED_H
  4. /*
  5. * This is the most generic implementation of unaligned accesses
  6. * and should work almost anywhere.
  7. */
  8. #include <vdso/unaligned.h>
  9. #define get_unaligned(ptr) __get_unaligned_t(typeof(*(ptr)), (ptr))
  10. #define put_unaligned(val, ptr) __put_unaligned_t(typeof(*(ptr)), (val), (ptr))
  11. static inline u16 get_unaligned_le16(const void *p)
  12. {
  13. return le16_to_cpu(__get_unaligned_t(__le16, p));
  14. }
  15. static inline u32 get_unaligned_le32(const void *p)
  16. {
  17. return le32_to_cpu(__get_unaligned_t(__le32, p));
  18. }
  19. static inline u64 get_unaligned_le64(const void *p)
  20. {
  21. return le64_to_cpu(__get_unaligned_t(__le64, p));
  22. }
  23. static inline void put_unaligned_le16(u16 val, void *p)
  24. {
  25. __put_unaligned_t(__le16, cpu_to_le16(val), p);
  26. }
  27. static inline void put_unaligned_le32(u32 val, void *p)
  28. {
  29. __put_unaligned_t(__le32, cpu_to_le32(val), p);
  30. }
  31. static inline void put_unaligned_le64(u64 val, void *p)
  32. {
  33. __put_unaligned_t(__le64, cpu_to_le64(val), p);
  34. }
  35. static inline u16 get_unaligned_be16(const void *p)
  36. {
  37. return be16_to_cpu(__get_unaligned_t(__be16, p));
  38. }
  39. static inline u32 get_unaligned_be32(const void *p)
  40. {
  41. return be32_to_cpu(__get_unaligned_t(__be32, p));
  42. }
  43. static inline u64 get_unaligned_be64(const void *p)
  44. {
  45. return be64_to_cpu(__get_unaligned_t(__be64, p));
  46. }
  47. static inline void put_unaligned_be16(u16 val, void *p)
  48. {
  49. __put_unaligned_t(__be16, cpu_to_be16(val), p);
  50. }
  51. static inline void put_unaligned_be32(u32 val, void *p)
  52. {
  53. __put_unaligned_t(__be32, cpu_to_be32(val), p);
  54. }
  55. static inline void put_unaligned_be64(u64 val, void *p)
  56. {
  57. __put_unaligned_t(__be64, cpu_to_be64(val), p);
  58. }
  59. static inline u32 __get_unaligned_be24(const u8 *p)
  60. {
  61. return p[0] << 16 | p[1] << 8 | p[2];
  62. }
  63. static inline u32 get_unaligned_be24(const void *p)
  64. {
  65. return __get_unaligned_be24(p);
  66. }
  67. static inline u32 __get_unaligned_le24(const u8 *p)
  68. {
  69. return p[0] | p[1] << 8 | p[2] << 16;
  70. }
  71. static inline u32 get_unaligned_le24(const void *p)
  72. {
  73. return __get_unaligned_le24(p);
  74. }
  75. static inline void __put_unaligned_be24(const u32 val, u8 *p)
  76. {
  77. *p++ = (val >> 16) & 0xff;
  78. *p++ = (val >> 8) & 0xff;
  79. *p++ = val & 0xff;
  80. }
  81. static inline void put_unaligned_be24(const u32 val, void *p)
  82. {
  83. __put_unaligned_be24(val, p);
  84. }
  85. static inline void __put_unaligned_le24(const u32 val, u8 *p)
  86. {
  87. *p++ = val & 0xff;
  88. *p++ = (val >> 8) & 0xff;
  89. *p++ = (val >> 16) & 0xff;
  90. }
  91. static inline void put_unaligned_le24(const u32 val, void *p)
  92. {
  93. __put_unaligned_le24(val, p);
  94. }
  95. static inline void __put_unaligned_be48(const u64 val, u8 *p)
  96. {
  97. *p++ = (val >> 40) & 0xff;
  98. *p++ = (val >> 32) & 0xff;
  99. *p++ = (val >> 24) & 0xff;
  100. *p++ = (val >> 16) & 0xff;
  101. *p++ = (val >> 8) & 0xff;
  102. *p++ = val & 0xff;
  103. }
  104. static inline void put_unaligned_be48(const u64 val, void *p)
  105. {
  106. __put_unaligned_be48(val, p);
  107. }
  108. static inline u64 __get_unaligned_be48(const u8 *p)
  109. {
  110. return (u64)p[0] << 40 | (u64)p[1] << 32 | (u64)p[2] << 24 |
  111. p[3] << 16 | p[4] << 8 | p[5];
  112. }
  113. static inline u64 get_unaligned_be48(const void *p)
  114. {
  115. return __get_unaligned_be48(p);
  116. }
  117. #endif /* __LINUX_UNALIGNED_H */