diff options
Diffstat (limited to 'bsd')
| -rw-r--r-- | bsd/drm_os_freebsd.h | 25 | 
1 files changed, 16 insertions, 9 deletions
diff --git a/bsd/drm_os_freebsd.h b/bsd/drm_os_freebsd.h index 461a26ce..acbd7cf3 100644 --- a/bsd/drm_os_freebsd.h +++ b/bsd/drm_os_freebsd.h @@ -249,16 +249,23 @@ typedef u_int8_t u8;  #if __FreeBSD_version < 500000  /* The extra atomic functions from 5.0 haven't been merged to 4.x */  static __inline int -atomic_cmpset_int(volatile int *dst, int old, int new) +atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src)  { -	int s = splhigh(); -	if (*dst==old) { -		*dst = new; -		splx(s); -		return 1; -	} -	splx(s); -	return 0; +	int res = exp; + +	__asm __volatile ( +	"	lock ;			" +	"	cmpxchgl %1,%2 ;	" +	"       setz	%%al ;		" +	"	movzbl	%%al,%0 ;	" +	"1:				" +	"# atomic_cmpset_int" +	: "+a" (res)			/* 0 (result) */ +	: "r" (src),			/* 1 */ +	  "m" (*(dst))			/* 2 */ +	: "memory");				  + +	return (res);  }  #endif  | 
