From f14bcbec98cc33209a29d1d49cf6656cc8d4b8a6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fran=C3=A7ois=20Tigeot?= Date: Sat, 31 Oct 2015 09:51:00 +0100 Subject: [PATCH] kernel: Add atomic_cmpxchg_int() Submitted-by: Yellow Rabbit --- sys/cpu/x86_64/include/atomic.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/sys/cpu/x86_64/include/atomic.h b/sys/cpu/x86_64/include/atomic.h index 11051bb2dd..80f3ce5384 100644 --- a/sys/cpu/x86_64/include/atomic.h +++ b/sys/cpu/x86_64/include/atomic.h @@ -417,6 +417,7 @@ atomic_intr_cond_exit(__atomic_intr_t *p, void (*func)(void *), void *arg) */ #if defined(KLD_MODULE) +extern int atomic_cmpxchg_int(volatile u_int *_dst, u_int _old, u_int _new); extern int atomic_cmpset_int(volatile u_int *_dst, u_int _old, u_int _new); extern long atomic_cmpset_long(volatile u_long *_dst, u_long _exp, u_long _src); extern u_int atomic_fetchadd_int(volatile u_int *_p, u_int _v); @@ -425,6 +426,18 @@ extern u_long atomic_fetchadd_long(volatile u_long *_p, u_long _v); #else static __inline int +atomic_cmpxchg_int(volatile u_int *_dst, u_int _old, u_int _new) +{ + u_int res = _old; + + __asm __volatile(MPLOCKED "cmpxchgl %2,%1; " \ + : "+a" (res), "=m" (*_dst) \ + : "r" (_new), "m" (*_dst) \ + : "memory"); + return (res); +} + +static __inline int atomic_cmpset_int(volatile u_int *_dst, u_int _old, u_int _new) { u_int res = _old; -- 2.11.4.GIT