Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. #ifndef _LINUX_UNALIGNED_GENERIC_H
  2. #define _LINUX_UNALIGNED_GENERIC_H
  3.  
  4. /*
  5.  * Cause a link-time error if we try an unaligned access other than
  6.  * 1,2,4 or 8 bytes long
  7.  */
  8. extern void __bad_unaligned_access_size(void);
  9.  
  10. #define __get_unaligned_le(ptr) ((__force typeof(*(ptr)))({                     \
  11.         __builtin_choose_expr(sizeof(*(ptr)) == 1, *(ptr),                      \
  12.         __builtin_choose_expr(sizeof(*(ptr)) == 2, get_unaligned_le16((ptr)),   \
  13.         __builtin_choose_expr(sizeof(*(ptr)) == 4, get_unaligned_le32((ptr)),   \
  14.         __builtin_choose_expr(sizeof(*(ptr)) == 8, get_unaligned_le64((ptr)),   \
  15.         __bad_unaligned_access_size()))));                                      \
  16.         }))
  17.  
  18. #define __get_unaligned_be(ptr) ((__force typeof(*(ptr)))({                     \
  19.         __builtin_choose_expr(sizeof(*(ptr)) == 1, *(ptr),                      \
  20.         __builtin_choose_expr(sizeof(*(ptr)) == 2, get_unaligned_be16((ptr)),   \
  21.         __builtin_choose_expr(sizeof(*(ptr)) == 4, get_unaligned_be32((ptr)),   \
  22.         __builtin_choose_expr(sizeof(*(ptr)) == 8, get_unaligned_be64((ptr)),   \
  23.         __bad_unaligned_access_size()))));                                      \
  24.         }))
  25.  
  26. #define __put_unaligned_le(val, ptr) ({                                 \
  27.         void *__gu_p = (ptr);                                           \
  28.         switch (sizeof(*(ptr))) {                                       \
  29.         case 1:                                                         \
  30.                 *(u8 *)__gu_p = (__force u8)(val);                      \
  31.                 break;                                                  \
  32.         case 2:                                                         \
  33.                 put_unaligned_le16((__force u16)(val), __gu_p);         \
  34.                 break;                                                  \
  35.         case 4:                                                         \
  36.                 put_unaligned_le32((__force u32)(val), __gu_p);         \
  37.                 break;                                                  \
  38.         case 8:                                                         \
  39.                 put_unaligned_le64((__force u64)(val), __gu_p);         \
  40.                 break;                                                  \
  41.         default:                                                        \
  42.                 __bad_unaligned_access_size();                          \
  43.                 break;                                                  \
  44.         }                                                               \
  45.         (void)0; })
  46.  
  47. #define __put_unaligned_be(val, ptr) ({                                 \
  48.         void *__gu_p = (ptr);                                           \
  49.         switch (sizeof(*(ptr))) {                                       \
  50.         case 1:                                                         \
  51.                 *(u8 *)__gu_p = (__force u8)(val);                      \
  52.                 break;                                                  \
  53.         case 2:                                                         \
  54.                 put_unaligned_be16((__force u16)(val), __gu_p);         \
  55.                 break;                                                  \
  56.         case 4:                                                         \
  57.                 put_unaligned_be32((__force u32)(val), __gu_p);         \
  58.                 break;                                                  \
  59.         case 8:                                                         \
  60.                 put_unaligned_be64((__force u64)(val), __gu_p);         \
  61.                 break;                                                  \
  62.         default:                                                        \
  63.                 __bad_unaligned_access_size();                          \
  64.                 break;                                                  \
  65.         }                                                               \
  66.         (void)0; })
  67.  
  68. #endif /* _LINUX_UNALIGNED_GENERIC_H */
  69.