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>