⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unaligned.h

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 H
字号:
/* * This file is subject to the terms and conditions of the GNU General Public * License.  See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 1996, 1999, 2000 by Ralf Baechle * Copyright (C) 1999, 2000 Silicon Graphics, Inc. */#ifndef _ASM_UNALIGNED_H#define _ASM_UNALIGNED_Hextern void __get_unaligned_bad_length(void);extern void __put_unaligned_bad_length(void);/* * Load quad unaligned. */extern inline unsigned long __ldq_u(const unsigned long * __addr){	unsigned long __res;	__asm__("uld\t%0,%1"		: "=&r" (__res)		: "m" (*__addr));	return __res;}/* * Load long unaligned. */extern inline unsigned long __ldl_u(const unsigned int * __addr){	unsigned long __res;	__asm__("ulw\t%0,%1"		: "=&r" (__res)		: "m" (*__addr));	return __res;}/* * Load word unaligned. */extern inline unsigned long __ldw_u(const unsigned short * __addr){	unsigned long __res;	__asm__("ulh\t%0,%1"		: "=&r" (__res)		: "m" (*__addr));	return __res;}/* * Store quad ununaligned. */extern inline void __stq_u(unsigned long __val, unsigned long * __addr){	__asm__("usd\t%1, %0"		: "=m" (*__addr)		: "r" (__val));}/* * Store long ununaligned. */extern inline void __stl_u(unsigned long __val, unsigned int * __addr){	__asm__("usw\t%1, %0"		: "=m" (*__addr)		: "r" (__val));}/* * Store word ununaligned. */extern inline void __stw_u(unsigned long __val, unsigned short * __addr){	__asm__("ush\t%1, %0"		: "=m" (*__addr)		: "r" (__val));}/*  * The main single-value unaligned transfer routines. */#define get_unaligned(ptr)						\({									\	__typeof__(*(ptr)) __val;					\									\	switch (sizeof(*(ptr))) {					\	case 1:								\		__val = *(const unsigned char *)(ptr);			\		break;							\	case 2:								\		__val = __ldw_u((const unsigned short *)(ptr));		\		break;							\	case 4:								\		__val = __ldl_u((const unsigned int *)(ptr));		\		break;							\	case 8:								\		__val = __ldq_u((const unsigned long long *)(ptr));	\		break;							\	default:							\		__get_unaligned_bad_length();				\		break;							\	}								\									\	__val;								\})#define put_unaligned(val,ptr)						\do {									\	switch (sizeof(*(ptr))) {					\	case 1:								\		*(unsigned char *)(ptr) = (val);			\		break;							\	case 2:								\		__stw_u((val), (unsigned short *)(ptr));		\		break;							\	case 4:								\		__stl_u((val), (unsigned int *)(ptr));			\		break;							\	case 8:								\		__stq_u((val), (unsigned long long *)(ptr));		\		break;							\	default:							\		__put_unaligned_bad_length();				\		break;							\	}								\} while(0)#endif /* _ASM_UNALIGNED_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -