forked from Assunzain/Kernel_asus_X01AD
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
tools include: Add basic atomic.h implementation from the kernel sources
Uses the arch/x86/ kernel code for x86_64/i386, fallbacking to a gcc intrinsics implementation that has been tested in at least sparc64. Will be used for reference counting in tools/perf. Acked-by: David Ahern <[email protected]> Cc: Adrian Hunter <[email protected]> Cc: Borislav Petkov <[email protected]> Cc: Don Zickus <[email protected]> Cc: Frederic Weisbecker <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Stephane Eranian <[email protected]> Link: http://lkml.kernel.org/n/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
- Loading branch information
Showing
7 changed files
with
193 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
#ifndef _TOOLS_LINUX_ASM_X86_ATOMIC_H | ||
#define _TOOLS_LINUX_ASM_X86_ATOMIC_H | ||
|
||
#include <linux/compiler.h> | ||
#include <linux/types.h> | ||
#include "rmwcc.h" | ||
|
||
#define LOCK_PREFIX "\n\tlock; " | ||
|
||
/* | ||
* Atomic operations that C can't guarantee us. Useful for | ||
* resource counting etc.. | ||
*/ | ||
|
||
#define ATOMIC_INIT(i) { (i) } | ||
|
||
/** | ||
* atomic_read - read atomic variable | ||
* @v: pointer of type atomic_t | ||
* | ||
* Atomically reads the value of @v. | ||
*/ | ||
static inline int atomic_read(const atomic_t *v) | ||
{ | ||
return ACCESS_ONCE((v)->counter); | ||
} | ||
|
||
/** | ||
* atomic_set - set atomic variable | ||
* @v: pointer of type atomic_t | ||
* @i: required value | ||
* | ||
* Atomically sets the value of @v to @i. | ||
*/ | ||
static inline void atomic_set(atomic_t *v, int i) | ||
{ | ||
v->counter = i; | ||
} | ||
|
||
/** | ||
* atomic_inc - increment atomic variable | ||
* @v: pointer of type atomic_t | ||
* | ||
* Atomically increments @v by 1. | ||
*/ | ||
static inline void atomic_inc(atomic_t *v) | ||
{ | ||
asm volatile(LOCK_PREFIX "incl %0" | ||
: "+m" (v->counter)); | ||
} | ||
|
||
/** | ||
* atomic_dec_and_test - decrement and test | ||
* @v: pointer of type atomic_t | ||
* | ||
* Atomically decrements @v by 1 and | ||
* returns true if the result is 0, or false for all other | ||
* cases. | ||
*/ | ||
static inline int atomic_dec_and_test(atomic_t *v) | ||
{ | ||
GEN_UNARY_RMWcc(LOCK_PREFIX "decl", v->counter, "%0", "e"); | ||
} | ||
|
||
#endif /* _TOOLS_LINUX_ASM_X86_ATOMIC_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
#ifndef _TOOLS_LINUX_ASM_X86_RMWcc | ||
#define _TOOLS_LINUX_ASM_X86_RMWcc | ||
|
||
#ifdef CC_HAVE_ASM_GOTO | ||
|
||
#define __GEN_RMWcc(fullop, var, cc, ...) \ | ||
do { \ | ||
asm_volatile_goto (fullop "; j" cc " %l[cc_label]" \ | ||
: : "m" (var), ## __VA_ARGS__ \ | ||
: "memory" : cc_label); \ | ||
return 0; \ | ||
cc_label: \ | ||
return 1; \ | ||
} while (0) | ||
|
||
#define GEN_UNARY_RMWcc(op, var, arg0, cc) \ | ||
__GEN_RMWcc(op " " arg0, var, cc) | ||
|
||
#define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc) \ | ||
__GEN_RMWcc(op " %1, " arg0, var, cc, vcon (val)) | ||
|
||
#else /* !CC_HAVE_ASM_GOTO */ | ||
|
||
#define __GEN_RMWcc(fullop, var, cc, ...) \ | ||
do { \ | ||
char c; \ | ||
asm volatile (fullop "; set" cc " %1" \ | ||
: "+m" (var), "=qm" (c) \ | ||
: __VA_ARGS__ : "memory"); \ | ||
return c != 0; \ | ||
} while (0) | ||
|
||
#define GEN_UNARY_RMWcc(op, var, arg0, cc) \ | ||
__GEN_RMWcc(op " " arg0, var, cc) | ||
|
||
#define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc) \ | ||
__GEN_RMWcc(op " %2, " arg0, var, cc, vcon (val)) | ||
|
||
#endif /* CC_HAVE_ASM_GOTO */ | ||
|
||
#endif /* _TOOLS_LINUX_ASM_X86_RMWcc */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
#ifndef __TOOLS_ASM_GENERIC_ATOMIC_H | ||
#define __TOOLS_ASM_GENERIC_ATOMIC_H | ||
|
||
#include <linux/compiler.h> | ||
#include <linux/types.h> | ||
|
||
/* | ||
* Atomic operations that C can't guarantee us. Useful for | ||
* resource counting etc.. | ||
* | ||
* Excerpts obtained from the Linux kernel sources. | ||
*/ | ||
|
||
#define ATOMIC_INIT(i) { (i) } | ||
|
||
/** | ||
* atomic_read - read atomic variable | ||
* @v: pointer of type atomic_t | ||
* | ||
* Atomically reads the value of @v. | ||
*/ | ||
static inline int atomic_read(const atomic_t *v) | ||
{ | ||
return ACCESS_ONCE((v)->counter); | ||
} | ||
|
||
/** | ||
* atomic_set - set atomic variable | ||
* @v: pointer of type atomic_t | ||
* @i: required value | ||
* | ||
* Atomically sets the value of @v to @i. | ||
*/ | ||
static inline void atomic_set(atomic_t *v, int i) | ||
{ | ||
v->counter = i; | ||
} | ||
|
||
/** | ||
* atomic_inc - increment atomic variable | ||
* @v: pointer of type atomic_t | ||
* | ||
* Atomically increments @v by 1. | ||
*/ | ||
static inline void atomic_inc(atomic_t *v) | ||
{ | ||
__sync_add_and_fetch(&v->counter, 1); | ||
} | ||
|
||
/** | ||
* atomic_dec_and_test - decrement and test | ||
* @v: pointer of type atomic_t | ||
* | ||
* Atomically decrements @v by 1 and | ||
* returns true if the result is 0, or false for all other | ||
* cases. | ||
*/ | ||
static inline int atomic_dec_and_test(atomic_t *v) | ||
{ | ||
return __sync_sub_and_fetch(&v->counter, 1) == 0; | ||
} | ||
|
||
#endif /* __TOOLS_ASM_GENERIC_ATOMIC_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
#ifndef __TOOLS_LINUX_ASM_ATOMIC_H | ||
#define __TOOLS_LINUX_ASM_ATOMIC_H | ||
|
||
#if defined(__i386__) || defined(__x86_64__) | ||
#include "../../arch/x86/include/asm/atomic.h" | ||
#else | ||
#include <asm-generic/atomic-gcc.h> | ||
#endif | ||
|
||
#endif /* __TOOLS_LINUX_ASM_ATOMIC_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
#ifndef __TOOLS_LINUX_ATOMIC_H | ||
#define __TOOLS_LINUX_ATOMIC_H | ||
|
||
#include <asm/atomic.h> | ||
|
||
#endif /* __TOOLS_LINUX_ATOMIC_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters