00001
00041 #ifndef GENERIC_UNALIGNED_DIRECT_H_INCLUDED
00042 #define GENERIC_UNALIGNED_DIRECT_H_INCLUDED
00043
00044 #include <compiler.h>
00045 #include <stdint.h>
00046
00052 __always_inline static uint16_t read_unaligned_16(const void *ptr)
00053 {
00054 return *(const uint16_t *)ptr;
00055 }
00056
00057 __always_inline static uint32_t read_unaligned_32(const void *ptr)
00058 {
00059 return *(const uint32_t *)ptr;
00060 }
00061
00062 __always_inline static void write_unaligned_16(void *ptr, uint16_t value)
00063 {
00064 *(uint16_t *)ptr = value;
00065 }
00066
00067 __always_inline static void write_unaligned_32(void *ptr, uint32_t value)
00068 {
00069 *(uint32_t *)ptr = value;
00070 }
00071
00072 #define read_unaligned_be16(ptr) be16_to_cpu(read_unaligned_16(ptr))
00073 #define read_unaligned_be32(ptr) be32_to_cpu(read_unaligned_32(ptr))
00074 #define write_unaligned_be16(ptr, value) \
00075 write_unaligned_16(ptr, cpu_to_be16(value))
00076 #define write_unaligned_be32(ptr, value) \
00077 write_unaligned_32(ptr, cpu_to_be32(value))
00078
00079 #define read_unaligned_le16(ptr) le16_to_cpu(read_unaligned_16(ptr))
00080 #define read_unaligned_le32(ptr) le32_to_cpu(read_unaligned_32(ptr))
00081 #define write_unaligned_le16(ptr, value) \
00082 write_unaligned_16(ptr, cpu_to_le16(value))
00083 #define write_unaligned_le32(ptr, value) \
00084 write_unaligned_32(ptr, cpu_to_le32(value))
00085
00087
00088 #endif