Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 13 Mar 1999 14:39:31 -0800
From:      Jason Thorpe <thorpej@nas.nasa.gov>
To:        Dennis <dennis@etinc.com>
Cc:        hackers@FreeBSD.ORG
Subject:   Re: 'C' language question 
Message-ID:  <199903132239.OAA12983@lestat.nas.nasa.gov>

next in thread | raw e-mail | index | archive | help
On Sat, 13 Mar 1999 17:41:04 -0500 
 Dennis <dennis@etinc.com> wrote:

 > I have a memory mapped controller that requires that all of its
 > register reads and writes be 32 bits....the follow code:
 > 
 > *reg |= 0x80000000;
 > 
 > generates a byte OR (ORB instruction) which trashes the register with
 > gcc 2.9.2....a stupid "optimization" that happens to be wrong in this
 > case.

For gcc's definition of `volatile':

	volatile u_int32_t val, *reg = ...;

	val = *reg;
	val |= 0x80000000;
	*reg = val;

...but, you should really be using bus_space (hey, even FreeBSD has it
now! :-), as the operation primitives there are specifically written
to do access in the explcitly specified size.

For best results, also make sure there are barrier operations in there,
so the system core logic isn't allowed to do write piggybacking.

 > is there a declaration that will force the compiler to generate a 32bit 
 > OR (ORL instruction) on this?

Actually, you get it to do a load and a store, and you place your own
OR operation in between.

        -- Jason R. Thorpe <thorpej@nas.nasa.gov>



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199903132239.OAA12983>