mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-08-18 16:08:53 +09:00
![Remy Bohmer](/assets/img/avatar_default.png)
The asm-arm/unaligned.h includes linux/unaligned/access_ok.h This file is unsafe to be used on ARM, since it does an unaligned memory accesses which fails on ARM. Lookin at Linux the basic difference seems to be the header "include/asm-arm/unaligned.h". The Linux version of "unaligned.h" does *not* include "access_ok.h" at all. It includes "le_byteshift.h" and "be_byteshift.h" instead. Signed-off-by: Remy Bohmer <linux@bohmer.net> Signed-off-by: Stefan Roese <sr@denx.de> -- include/asm-arm/unaligned.h | 3 - include/linux/unaligned/be_byteshift.h | 70 +++++++++++++++++++++++++++++++++ include/linux/unaligned/le_byteshift.h | 70 +++++++++++++++++++++++++++++++++ 3 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 include/linux/unaligned/be_byteshift.h create mode 100644 include/linux/unaligned/le_byteshift.h
71 lines
1.4 KiB
C
71 lines
1.4 KiB
C
#ifndef _LINUX_UNALIGNED_LE_BYTESHIFT_H
|
|
#define _LINUX_UNALIGNED_LE_BYTESHIFT_H
|
|
|
|
#include <linux/types.h>
|
|
|
|
static inline u16 __get_unaligned_le16(const u8 *p)
|
|
{
|
|
return p[0] | p[1] << 8;
|
|
}
|
|
|
|
static inline u32 __get_unaligned_le32(const u8 *p)
|
|
{
|
|
return p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24;
|
|
}
|
|
|
|
static inline u64 __get_unaligned_le64(const u8 *p)
|
|
{
|
|
return (u64)__get_unaligned_le32(p + 4) << 32 |
|
|
__get_unaligned_le32(p);
|
|
}
|
|
|
|
static inline void __put_unaligned_le16(u16 val, u8 *p)
|
|
{
|
|
*p++ = val;
|
|
*p++ = val >> 8;
|
|
}
|
|
|
|
static inline void __put_unaligned_le32(u32 val, u8 *p)
|
|
{
|
|
__put_unaligned_le16(val >> 16, p + 2);
|
|
__put_unaligned_le16(val, p);
|
|
}
|
|
|
|
static inline void __put_unaligned_le64(u64 val, u8 *p)
|
|
{
|
|
__put_unaligned_le32(val >> 32, p + 4);
|
|
__put_unaligned_le32(val, p);
|
|
}
|
|
|
|
static inline u16 get_unaligned_le16(const void *p)
|
|
{
|
|
return __get_unaligned_le16((const u8 *)p);
|
|
}
|
|
|
|
static inline u32 get_unaligned_le32(const void *p)
|
|
{
|
|
return __get_unaligned_le32((const u8 *)p);
|
|
}
|
|
|
|
static inline u64 get_unaligned_le64(const void *p)
|
|
{
|
|
return __get_unaligned_le64((const u8 *)p);
|
|
}
|
|
|
|
static inline void put_unaligned_le16(u16 val, void *p)
|
|
{
|
|
__put_unaligned_le16(val, p);
|
|
}
|
|
|
|
static inline void put_unaligned_le32(u32 val, void *p)
|
|
{
|
|
__put_unaligned_le32(val, p);
|
|
}
|
|
|
|
static inline void put_unaligned_le64(u64 val, void *p)
|
|
{
|
|
__put_unaligned_le64(val, p);
|
|
}
|
|
|
|
#endif /* _LINUX_UNALIGNED_LE_BYTESHIFT_H */
|