Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3106dbcd authored by Al Viro's avatar Al Viro Committed by Linus Torvalds
Browse files

[PATCH] __get_unaligned() turned into macro



Turns __get_unaligned() and __put_unaligned into macros.  That is
definitely safe; leaving them as inlines breaks on e.g.  alpha [try to
build ncpfs there and you'll get unresolved symbols since we end up
getting __get_unaligned() not inlined]. 

Signed-off-by: default avatarAl Viro <viro@parcelfarce.linux.theplanet.co.uk>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent b5a48dad
Loading
Loading
Loading
Loading
+42 −41
Original line number Diff line number Diff line
@@ -76,46 +76,47 @@ static inline void __ustw(__u16 val, __u16 *addr)
	ptr->x = val;
}

static inline unsigned long __get_unaligned(const void *ptr, size_t size)
{
	unsigned long val;
	switch (size) {
	case 1:
		val = *(const __u8 *)ptr;
		break;
	case 2:
		val = __uldw((const __u16 *)ptr);
		break;
	case 4:
		val = __uldl((const __u32 *)ptr);
		break;
	case 8:
		val = __uldq((const __u64 *)ptr);
		break;
	default:
		bad_unaligned_access_length();
	};
	return val;
}

static inline void __put_unaligned(unsigned long val, void *ptr, size_t size)
{
	switch (size) {
	case 1:
		*(__u8 *)ptr = val;
	        break;
	case 2:
		__ustw(val, (__u16 *)ptr);
		break;
	case 4:
		__ustl(val, (__u32 *)ptr);
		break;
	case 8:
		__ustq(val, (__u64 *)ptr);
		break;
	default:
	    	bad_unaligned_access_length();
	};
}
#define __get_unaligned(ptr, size) ({		\
	const void *__gu_p = ptr;		\
	unsigned long val;			\
	switch (size) {				\
	case 1:					\
		val = *(const __u8 *)__gu_p;	\
		break;				\
	case 2:					\
		val = __uldw(__gu_p);		\
		break;				\
	case 4:					\
		val = __uldl(__gu_p);		\
		break;				\
	case 8:					\
		val = __uldq(__gu_p);		\
		break;				\
	default:				\
		bad_unaligned_access_length();	\
	};					\
	val;					\
})

#define __put_unaligned(val, ptr, size)		\
do {						\
	void *__gu_p = ptr;			\
	switch (size) {				\
	case 1:					\
		*(__u8 *)__gu_p = val;		\
	        break;				\
	case 2:					\
		__ustw(val, __gu_p);		\
		break;				\
	case 4:					\
		__ustl(val, __gu_p);		\
		break;				\
	case 8:					\
		__ustq(val, __gu_p);		\
		break;				\
	default:				\
	    	bad_unaligned_access_length();	\
	};					\
} while(0)

#endif /* _ASM_GENERIC_UNALIGNED_H */