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

📄 bitops.c

📁 一个2.4.21版本的嵌入式linux内核
💻 C
字号:
/* * bitops.c: atomic operations which got too long to be inlined all over *      the place. *  * Copyright 1999 Philipp Rumpf (prumpf@tux.org) * Copyright 2000 Grant Grundler (grundler@cup.hp.com) */#include <linux/config.h>#include <linux/kernel.h>#include <linux/spinlock.h>#include <asm/system.h>#include <asm/atomic.h>#ifdef CONFIG_SMPspinlock_t __atomic_hash[ATOMIC_HASH_SIZE] = {	[0 ... (ATOMIC_HASH_SIZE-1)]  = SPIN_LOCK_UNLOCKED};#endifspinlock_t __atomic_lock = SPIN_LOCK_UNLOCKED;#ifdef __LP64__unsigned long __xchg64(unsigned long x, unsigned long *ptr){	unsigned long temp, flags;	SPIN_LOCK_IRQSAVE(ATOMIC_HASH(ptr), flags);	temp = *ptr;	*ptr = x;	SPIN_UNLOCK_IRQRESTORE(ATOMIC_HASH(ptr), flags);	return temp;}#endifunsigned long __xchg32(int x, int *ptr){	unsigned long flags;	unsigned long temp;	SPIN_LOCK_IRQSAVE(ATOMIC_HASH(ptr), flags);	(long) temp = (long) *ptr;	/* XXX - sign extension wanted? */	*ptr = x;	SPIN_UNLOCK_IRQRESTORE(ATOMIC_HASH(ptr), flags);	return temp;}unsigned long __xchg8(char x, char *ptr){	unsigned long flags;	unsigned long temp;	SPIN_LOCK_IRQSAVE(ATOMIC_HASH(ptr), flags);	(long) temp = (long) *ptr;	/* XXX - sign extension wanted? */	*ptr = x;	SPIN_UNLOCK_IRQRESTORE(ATOMIC_HASH(ptr), flags);	return temp;}#ifdef __LP64__unsigned long __cmpxchg_u64(volatile unsigned long *ptr, unsigned long old, unsigned long new){	unsigned long flags;	unsigned long prev;	SPIN_LOCK_IRQSAVE(ATOMIC_HASH(ptr), flags);	if ((prev = *ptr) == old)		*ptr = new;	SPIN_UNLOCK_IRQRESTORE(ATOMIC_HASH(ptr), flags);	return prev;}#endifunsigned long __cmpxchg_u32(volatile unsigned int *ptr, unsigned int old, unsigned int new){	unsigned long flags;	unsigned int prev;	SPIN_LOCK_IRQSAVE(ATOMIC_HASH(ptr), flags);	if ((prev = *ptr) == old)		*ptr = new;	SPIN_UNLOCK_IRQRESTORE(ATOMIC_HASH(ptr), flags);	return (unsigned long)prev;}

⌨️ 快捷键说明

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