genode/repos/base/include/x86/cpu/atomic.h

56 lines
1.3 KiB
C++

/*
* \brief Atomic operations for x86
* \author Norman Feske
* \date 2006-07-26
*
* Based on l4util/include/ARCH-x86/atomic_arch.h.
*/
/*
* Copyright (C) 2006-2013 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
#ifndef _INCLUDE__X86__CPU__ATOMIC_H_
#define _INCLUDE__X86__CPU__ATOMIC_H_
namespace Genode {
/**
* Atomic compare and exchange
*
* This function compares the value at dest with cmp_val.
* If both values are equal, dest is set to new_val. If
* both values are different, the value at dest remains
* unchanged.
*
* Note, that cmpxchg() represents a memory barrier.
*
* \return 1 if the value was successfully changed to new_val,
* 0 if cmp_val and the value at dest differ.
*/
inline int cmpxchg(volatile int *dest, int cmp_val, int new_val)
{
int tmp;
__asm__ __volatile__
(
"lock cmpxchgl %1, %3 \n\t"
:
"=a" (tmp) /* 0 EAX, return val */
:
"r" (new_val), /* 1 reg, new value */
"0" (cmp_val), /* 2 EAX, compare value */
"m" (*dest) /* 3 mem, destination operand */
:
"memory", "cc"
);
return tmp == cmp_val;
}
}
#endif /* _INCLUDE__X86__CPU__ATOMIC_H_ */