From mboxrd@z Thu Jan 1 00:00:00 1970 From: Konrad Rzeszutek Wilk Subject: Re: [PATCH v5 02/17] Add cmpxchg16b support for x86-64 Date: Wed, 12 Aug 2015 11:38:56 -0400 Message-ID: <20150812153856.GB17650@l.oracle.com> References: <1439346938-31824-1-git-send-email-feng.wu@intel.com> <1439346938-31824-3-git-send-email-feng.wu@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Content-Disposition: inline In-Reply-To: <1439346938-31824-3-git-send-email-feng.wu@intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Feng Wu Cc: Andrew Cooper , Keir Fraser , Jan Beulich , xen-devel@lists.xen.org List-Id: xen-devel@lists.xenproject.org On Wed, Aug 12, 2015 at 10:35:23AM +0800, Feng Wu wrote: > This patch adds cmpxchg16b support for x86-64, so software > can perform 128-bit atomic write/read. > > CC: Keir Fraser > CC: Jan Beulich > CC: Andrew Cooper > Signed-off-by: Feng Wu > --- > v5: > - Change back the parameters of __cmpxchg16b() to __uint128_t * > - Remove pointless cast for 'ptr' > - Remove pointless parentheses > - Use A constraint for the output > > v4: > - Use pointer as the parameter of __cmpxchg16b(). > - Use gcc's __uint128_t built-in type > - Make the parameters of __cmpxchg16b() void * > > v3: > - Newly added. > > xen/include/asm-x86/x86_64/system.h | 28 ++++++++++++++++++++++++++++ > 1 file changed, 28 insertions(+) > > diff --git a/xen/include/asm-x86/x86_64/system.h b/xen/include/asm-x86/x86_64/system.h > index 662813a..ebbe4b5 100644 > --- a/xen/include/asm-x86/x86_64/system.h > +++ b/xen/include/asm-x86/x86_64/system.h > @@ -6,6 +6,34 @@ > (unsigned long)(n),sizeof(*(ptr)))) > > /* > + * Atomic 16 bytes compare and exchange. Compare OLD with MEM, if > + * identical, store NEW in MEM. Return the initial value in MEM. > + * Success is indicated by comparing RETURN with OLD. > + * > + * This function can only be called when cpu_has_cx16 is ture. s/ture/true/ > + */ > + > +static always_inline __uint128_t __cmpxchg16b( > + volatile void *ptr, __uint128_t *old, __uint128_t *new) > +{ > + __uint128_t prev; > + uint64_t new_high = *new >> 64; > + uint64_t new_low = (uint64_t)*new; > + > + ASSERT(cpu_has_cx16); > + > + asm volatile ( "lock; cmpxchg16b %3" > + : "=A" (prev) > + : "c" (new_high), "b" (new_low), "m" (*__xg(ptr)), "0" (*old) > + : "memory" ); > + > + return prev; > +} > + > +#define cmpxchg16b(ptr,o,n) \ > + __cmpxchg16b((ptr), (__uint128_t *)(o), (__uint128_t *)(n)) > + > +/* > * This function causes value _o to be changed to _n at location _p. > * If this access causes a fault then we return 1, otherwise we return 0. > * If no fault occurs then _o is updated to the value we saw at _p. If this > -- > 2.1.0 > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel