lkml.org 
[lkml]   [2008]   [Jun]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 14 of 36] x86_64: add sync_cmpxchg
    Date
    From
    Add sync_cmpxchg to match 32-bit's sync_cmpxchg.

    Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
    ---
    include/asm-x86/cmpxchg_64.h | 37 +++++++++++++++++++++++++++++++++++++
    1 file changed, 37 insertions(+)

    diff --git a/include/asm-x86/cmpxchg_64.h b/include/asm-x86/cmpxchg_64.h
    --- a/include/asm-x86/cmpxchg_64.h
    +++ b/include/asm-x86/cmpxchg_64.h
    @@ -93,6 +93,39 @@
    return old;
    }

    +/*
    + * Always use locked operations when touching memory shared with a
    + * hypervisor, since the system may be SMP even if the guest kernel
    + * isn't.
    + */
    +static inline unsigned long __sync_cmpxchg(volatile void *ptr,
    + unsigned long old,
    + unsigned long new, int size)
    +{
    + unsigned long prev;
    + switch (size) {
    + case 1:
    + asm volatile("lock; cmpxchgb %b1,%2"
    + : "=a"(prev)
    + : "q"(new), "m"(*__xg(ptr)), "0"(old)
    + : "memory");
    + return prev;
    + case 2:
    + asm volatile("lock; cmpxchgw %w1,%2"
    + : "=a"(prev)
    + : "r"(new), "m"(*__xg(ptr)), "0"(old)
    + : "memory");
    + return prev;
    + case 4:
    + asm volatile("lock; cmpxchgl %1,%2"
    + : "=a"(prev)
    + : "r"(new), "m"(*__xg(ptr)), "0"(old)
    + : "memory");
    + return prev;
    + }
    + return old;
    +}
    +
    static inline unsigned long __cmpxchg_local(volatile void *ptr,
    unsigned long old,
    unsigned long new, int size)
    @@ -139,6 +172,10 @@
    ((__typeof__(*(ptr)))__cmpxchg_local((ptr), (unsigned long)(o), \
    (unsigned long)(n), \
    sizeof(*(ptr))))
    +#define sync_cmpxchg(ptr, o, n) \
    + ((__typeof__(*(ptr)))__sync_cmpxchg((ptr), (unsigned long)(o), \
    + (unsigned long)(n), \
    + sizeof(*(ptr))))
    #define cmpxchg64_local(ptr, o, n) \
    ({ \
    BUILD_BUG_ON(sizeof(*(ptr)) != 8); \



    \
     
     \ /
      Last update: 2008-06-25 06:55    [W:4.389 / U:0.180 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site