Skip site navigation (1)Skip section navigation (2)
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>