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

📄 bitops.c

📁 嵌入式系统设计与实例开发源码
💻 C
字号:
/* * BK Id: SCCS/s.bitops.c 1.7 05/17/01 18:14:21 cort *//* * Copyright (C) 1996 Paul Mackerras. */#include <linux/kernel.h>#include <asm/bitops.h>/* * If the bitops are not inlined in bitops.h, they are defined here. *  -- paulus */#if !__INLINE_BITOPSvoid set_bit(int nr, volatile void * addr){	unsigned long old;	unsigned long mask = 1 << (nr & 0x1f);	unsigned long *p = ((unsigned long *)addr) + (nr >> 5);		__asm__ __volatile__(SMP_WMB "\n\1:	lwarx	%0,0,%3 \n\	or	%0,%0,%2 \n\	stwcx.	%0,0,%3 \n\	bne	1b"	SMP_MB	: "=&r" (old), "=m" (*p)	: "r" (mask), "r" (p), "m" (*p)	: "cc" );}void clear_bit(int nr, volatile void *addr){	unsigned long old;	unsigned long mask = 1 << (nr & 0x1f);	unsigned long *p = ((unsigned long *)addr) + (nr >> 5);	__asm__ __volatile__(SMP_WMB "\n\1:	lwarx	%0,0,%3 \n\	andc	%0,%0,%2 \n\	stwcx.	%0,0,%3 \n\	bne	1b"	SMP_MB	: "=&r" (old), "=m" (*p)	: "r" (mask), "r" (p), "m" (*p)	: "cc");}void change_bit(int nr, volatile void *addr){	unsigned long old;	unsigned long mask = 1 << (nr & 0x1f);	unsigned long *p = ((unsigned long *)addr) + (nr >> 5);	__asm__ __volatile__(SMP_WMB "\n\1:	lwarx	%0,0,%3 \n\	xor	%0,%0,%2 \n\	stwcx.	%0,0,%3 \n\	bne	1b"	SMP_MB	: "=&r" (old), "=m" (*p)	: "r" (mask), "r" (p), "m" (*p)	: "cc");}int test_and_set_bit(int nr, volatile void *addr){	unsigned int old, t;	unsigned int mask = 1 << (nr & 0x1f);	volatile unsigned int *p = ((volatile unsigned int *)addr) + (nr >> 5);	__asm__ __volatile__(SMP_WMB "\n\1:	lwarx	%0,0,%4 \n\	or	%1,%0,%3 \n\	stwcx.	%1,0,%4 \n\	bne	1b"	SMP_MB	: "=&r" (old), "=&r" (t), "=m" (*p)	: "r" (mask), "r" (p), "m" (*p)	: "cc");	return (old & mask) != 0;}int test_and_clear_bit(int nr, volatile void *addr){	unsigned int old, t;	unsigned int mask = 1 << (nr & 0x1f);	volatile unsigned int *p = ((volatile unsigned int *)addr) + (nr >> 5);	__asm__ __volatile__(SMP_WMB "\n\1:	lwarx	%0,0,%4 \n\	andc	%1,%0,%3 \n\	stwcx.	%1,0,%4 \n\	bne	1b"	SMP_MB	: "=&r" (old), "=&r" (t), "=m" (*p)	: "r" (mask), "r" (p), "m" (*p)	: "cc");	return (old & mask) != 0;}int test_and_change_bit(int nr, volatile void *addr){	unsigned int old, t;	unsigned int mask = 1 << (nr & 0x1f);	volatile unsigned int *p = ((volatile unsigned int *)addr) + (nr >> 5);	__asm__ __volatile__(SMP_WMB "\n\1:	lwarx	%0,0,%4 \n\	xor	%1,%0,%3 \n\	stwcx.	%1,0,%4 \n\	bne	1b"	SMP_MB	: "=&r" (old), "=&r" (t), "=m" (*p)	: "r" (mask), "r" (p), "m" (*p)	: "cc");	return (old & mask) != 0;}#endif /* !__INLINE_BITOPS */

⌨️ 快捷键说明

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