Right from Linux. I am not comfortable inserting our headers in linux files.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Acked-by: Patrick Georgi <patrick.georgi@coresystems.de>



git-svn-id: svn://coreboot.org/repository/coreboot-v3@1116 f3766cd6-281f-0410-b1cd-43a5c92072e9
This commit is contained in:
Ronald G. Minnich 2009-01-15 16:56:44 +00:00
parent 560ba81528
commit 67d036327d

View file

@ -0,0 +1,70 @@
/* this implementation is from Linux. */
#ifndef ARCH_ATOMIC_H
#define ARCH_ATOMIC_H
/*
* Make sure gcc doesn't try to be clever and move things around
* on us. We need to use _exactly_ the address the user gave us,
* not some alias that contains the same information.
*/
struct atomic { volatile int counter; };
#define ATOMIC_INIT(i) { (i) }
/*
* Atomic operations that C can't guarantee us. Useful for
* resource counting etc..
*/
/**
* atomic_read - read atomic variable
* @v: pointer of type struct atomic
*
* Atomically reads the value of @v. Note that the guaranteed
* useful range of an struct atomic is only 24 bits.
*/
#define atomic_read(v) ((v)->counter)
/**
* atomic_set - set atomic variable
* @v: pointer of type struct atomic
* @i: required value
*
* Atomically sets the value of @v to @i. Note that the guaranteed
* useful range of an struct atomic is only 24 bits.
*/
#define atomic_set(v,i) (((v)->counter) = (i))
/**
* atomic_inc - increment atomic variable
* @v: pointer of type struct atomic
*
* Atomically increments @v by 1. Note that the guaranteed
* useful range of an struct atomic is only 24 bits.
*/
static __inline__ __attribute__((always_inline)) void atomic_inc(struct atomic *v)
{
__asm__ __volatile__(
"lock ; incl %0"
:"=m" (v->counter)
:"m" (v->counter));
}
/**
* atomic_dec - decrement atomic variable
* @v: pointer of type struct atomic
*
* Atomically decrements @v by 1. Note that the guaranteed
* useful range of an struct atomic is only 24 bits.
*/
static __inline__ __attribute__((always_inline)) void atomic_dec(struct atomic *v)
{
__asm__ __volatile__(
"lock ; decl %0"
:"=m" (v->counter)
:"m" (v->counter));
}
#endif /* ARCH_ATOMIC_H */