Date: Wed, 27 Oct 1999 10:16:58 +1000 From: Peter Jeremy <jeremyp@gsmx07.alcatel.com.au> To: jbryant@tfs.net Cc: freebsd-current@FreeBSD.ORG Subject: Re: * $FreeBSD: src/sys/i386/include/atomic.h,v 1.9 1999/10/04 16:24:08 peter Exp $ Message-ID: <99Oct27.101208est.40374@border.alcanet.com.au> In-Reply-To: <199910262343.SAA02009@argus.tfs.net> References: <199910262343.SAA02009@argus.tfs.net>
next in thread | previous in thread | raw e-mail | index | archive | help
On 1999-Oct-27 09:43:52 +1000, Jim Bryant wrote: >after several months, I decided to re-sync to -current... > >i cannot build a kernel due the the following errors. ... >machine/atomic.h:124: inconsistent operand constraints in an `asm' ... > >how do i get around this? The quick solution is to compile with `-O'. As for the correct solution: There are various problems with the atomic_XXX code on the 386 that get triggered by different combinations of compiler, optimisation options and operand attributes. I had a look at it a few weeks ago and came up with the code below. It isn't a drop-in replacement for the existing atomic.h (because it isn't currently compatible with modules). I intend to convert it into a suitable patch and send it as a PR, but don't know when I'll get a round tuit. In the meantime, feel free to hack the following: #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8) #define ATOMIC_DEST "+m" #else /* gcc < 2.8 version */ #define ATOMIC_DEST "=m" #endif #if defined(SMP) #define ATOMIC_LOCK "lock ; " #else #define ATOMIC_LOCK #endif #define atomic_set_char(p, v) \ __asm(ATOMIC_LOCK "orb %b1,%0" \ : ATOMIC_DEST (*(p)) \ : "iq" (v) \ : "cc") #define atomic_clear_char(p, v) \ __asm(ATOMIC_LOCK "andb %b1,%0" \ : ATOMIC_DEST (*(p)) \ : "iq" (~(v)) \ : "cc") #define atomic_add_char(p, v) \ __asm(ATOMIC_LOCK "addb %b1,%0" \ : ATOMIC_DEST (*(p)) \ : "iq" (v) \ : "cc") #define atomic_subtract_char(p, v) \ __asm(ATOMIC_LOCK "subb %b1,%0" \ : ATOMIC_DEST (*(p)) \ : "iq" (v) \ : "cc") #define atomic_set_short(p, v) \ __asm(ATOMIC_LOCK "orw %w1,%0" \ : ATOMIC_DEST (*(p)) \ : "ir" (v) \ : "cc") #define atomic_clear_short(p, v) \ __asm(ATOMIC_LOCK "andw %w1,%0" \ : ATOMIC_DEST (*(p)) \ : "ir" (~(v)) \ : "cc") #define atomic_add_short(p, v) \ __asm(ATOMIC_LOCK "addw %w1,%0" \ : ATOMIC_DEST (*(p)) \ : "ir" (v) \ : "cc") #define atomic_subtract_short(p, v) \ __asm(ATOMIC_LOCK "subw %w1,%0" \ : ATOMIC_DEST (*(p)) \ : "ir" (v) \ : "cc") #define atomic_set_int(p, v) \ __asm(ATOMIC_LOCK "orl %1,%0" \ : ATOMIC_DEST (*(p)) \ : "ir" (v) \ : "cc") #define atomic_clear_int(p, v) \ __asm(ATOMIC_LOCK "andl %1,%0" \ : ATOMIC_DEST (*(p)) \ : "ir" (~(v)) \ : "cc") #define atomic_add_int(p, v) \ __asm(ATOMIC_LOCK "addl %1,%0" \ : ATOMIC_DEST (*(p)) \ : "ir" (v) \ : "cc") #define atomic_subtract_int(p, v) \ __asm(ATOMIC_LOCK "subl %1,%0" \ : ATOMIC_DEST (*(p)) \ : "ir" (v) \ : "cc") #define atomic_set_long(p, v) \ __asm(ATOMIC_LOCK "orl %1,%0" \ : ATOMIC_DEST (*(p)) \ : "ir" (v) \ : "cc") #define atomic_clear_long(p, v) \ __asm(ATOMIC_LOCK "andl %1,%0" \ : ATOMIC_DEST (*(p)) \ : "ir" (~(v)) \ : "cc") #define atomic_add_long(p, v) \ __asm(ATOMIC_LOCK "addl %1,%0" \ : ATOMIC_DEST (*(p)) \ : "ir" (v) \ : "cc") #define atomic_subtract_long(p, v) \ __asm(ATOMIC_LOCK "subl %1,%0" \ : ATOMIC_DEST (*(p)) \ : "ir" (v) \ : "cc") Peter -- Peter Jeremy (VK2PJ) peter.jeremy@alcatel.com.au Alcatel Australia Limited 41 Mandible St Phone: +61 2 9690 5019 ALEXANDRIA NSW 2015 Fax: +61 2 9690 5982 To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?99Oct27.101208est.40374>