diff options
-rw-r--r-- | arch/x86/include/asm/atomic_32.h | 22 | ||||
-rw-r--r-- | arch/x86/lib/atomic64_32.c | 23 |
2 files changed, 23 insertions, 22 deletions
diff --git a/arch/x86/include/asm/atomic_32.h b/arch/x86/include/asm/atomic_32.h index d7c8849b8c67..dc5a667ff791 100644 --- a/arch/x86/include/asm/atomic_32.h +++ b/arch/x86/include/asm/atomic_32.h | |||
@@ -295,6 +295,28 @@ extern void atomic64_set(atomic64_t *ptr, u64 new_val); | |||
295 | * | 295 | * |
296 | * Atomically reads the value of @ptr and returns it. | 296 | * Atomically reads the value of @ptr and returns it. |
297 | */ | 297 | */ |
298 | static inline u64 atomic64_read(atomic64_t *ptr) | ||
299 | { | ||
300 | u64 res; | ||
301 | |||
302 | /* | ||
303 | * Note, we inline this atomic64_t primitive because | ||
304 | * it only clobbers EAX/EDX and leaves the others | ||
305 | * untouched. We also (somewhat subtly) rely on the | ||
306 | * fact that cmpxchg8b returns the current 64-bit value | ||
307 | * of the memory location we are touching: | ||
308 | */ | ||
309 | asm volatile( | ||
310 | "mov %%ebx, %%eax\n\t" | ||
311 | "mov %%ecx, %%edx\n\t" | ||
312 | LOCK_PREFIX "cmpxchg8b %1\n" | ||
313 | : "=&A" (res) | ||
314 | : "m" (*ptr) | ||
315 | ); | ||
316 | |||
317 | return res; | ||
318 | } | ||
319 | |||
298 | extern u64 atomic64_read(atomic64_t *ptr); | 320 | extern u64 atomic64_read(atomic64_t *ptr); |
299 | 321 | ||
300 | /** | 322 | /** |
diff --git a/arch/x86/lib/atomic64_32.c b/arch/x86/lib/atomic64_32.c index 1d98c9eb6eac..824fa0be55a3 100644 --- a/arch/x86/lib/atomic64_32.c +++ b/arch/x86/lib/atomic64_32.c | |||
@@ -66,31 +66,10 @@ void atomic64_set(atomic64_t *ptr, u64 new_val) | |||
66 | { | 66 | { |
67 | atomic64_xchg(ptr, new_val); | 67 | atomic64_xchg(ptr, new_val); |
68 | } | 68 | } |
69 | EXPORT_SYMBOL(atomic64_read); | 69 | EXPORT_SYMBOL(atomic64_set); |
70 | 70 | ||
71 | /** | 71 | /** |
72 | * atomic64_read - read atomic64 variable | ||
73 | * @ptr: pointer to type atomic64_t | ||
74 | * | ||
75 | * Atomically reads the value of @ptr and returns it. | ||
76 | */ | ||
77 | u64 atomic64_read(atomic64_t *ptr) | ||
78 | { | ||
79 | u64 res; | ||
80 | |||
81 | asm volatile( | ||
82 | "mov %%ebx, %%eax\n\t" | ||
83 | "mov %%ecx, %%edx\n\t" | ||
84 | LOCK_PREFIX "cmpxchg8b %1\n" | ||
85 | : "+A" (res) | ||
86 | : "m" (*ptr) | ||
87 | ); | ||
88 | |||
89 | return res; | ||
90 | } | ||
91 | EXPORT_SYMBOL(atomic64_read); | 72 | EXPORT_SYMBOL(atomic64_read); |
92 | |||
93 | /** | ||
94 | * atomic64_add_return - add and return | 73 | * atomic64_add_return - add and return |
95 | * @delta: integer value to add | 74 | * @delta: integer value to add |
96 | * @ptr: pointer to type atomic64_t | 75 | * @ptr: pointer to type atomic64_t |