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

📄 unaligned.h

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 H
字号:
/* $Id$ * * 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 by Ralf Baechle */#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 long * __addr){	unsigned long long __res;	__asm__("uld\t%0,(%1)"		:"=&r" (__res)		:"r" (__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)		:"r" (__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)		:"r" (__addr));	return __res;}/* * Store quad ununaligned. */extern __inline__ void stq_u(unsigned long __val, unsigned long long * __addr){	__asm__ __volatile__(		"usd\t%0,(%1)"		: /* No results */		:"r" (__val),		 "r" (__addr));}/* * Store long ununaligned. */extern __inline__ void stl_u(unsigned long __val, unsigned int * __addr){	__asm__ __volatile__(		"usw\t%0,(%1)"		: /* No results */		:"r" (__val),		 "r" (__addr));}/* * Store word ununaligned. */extern __inline__ void stw_u(unsigned long __val, unsigned short * __addr){	__asm__ __volatile__(		"ush\t%0,(%1)"		: /* No results */		:"r" (__val),		 "r" (__addr));}extern inline unsigned long __get_unaligned(const void *ptr, size_t size){	unsigned long val;	switch (size) {	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;	}	return val;}extern inline void __put_unaligned(unsigned long val, void *ptr, size_t size){	switch (size) {	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;	}}/*  * The main single-value unaligned transfer routines. */#define get_unaligned(ptr) \	((__typeof__(*(ptr)))__get_unaligned((ptr), sizeof(*(ptr))))#define put_unaligned(x,ptr) \	__put_unaligned((unsigned long)(x), (ptr), sizeof(*(ptr)))#endif /* _ASM_UNALIGNED_H */

⌨️ 快捷键说明

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