Re: Endian-specific types
<[email protected]> Mon, 11 Apr 2016 20:07:00 +0000
| Newsgroups | gmane.os.netbsd.devel.general |
|---|---|
| Message-ID | <[email protected]> |
> On Apr 11, 2016, at 3:46 PM, Mouse <[email protected]> wrote: > >>> It uses __le16, what should I convert that to in NetBSD? >> What does it do? > > I _think_ __le16 is just uint16 (or maybe int16) but with an additional > annotation for humans and (potentially?) automated codewalkers that the > value is thought of as little-endian. > > I have never really understood their use of it. IMO values in > integer-typed variables should not even conceptually have endiannesses; > endianness is a property of not the variable or its value but rather of > a serialization of that value. True, if you're dealing with data serialization, and if this is merely an annotation. But possibly it's a data type with actually different semantics, as in "this value is a 16 bit integer, represented in memory as a 2 byte little endian item". If so, it's definitely useful for some situations. This is useful for device registers, which (depending on the sanity of the hardware designer) may have a specified byte order. If so, using types like this either for pointers to CSRs, or as fields in structs which map the layout of registers in I/O space, is very helpful. It isolates the byte order issue nicely (especially in the struct case) and avoids bugs caused by forgetting a byte swap operation in one out of 100 CSR references. I used this many years ago in drivers written in C++ (where you can easily do this with classes and type conversion methods). It made the code a lot cleaner and more reliable. paul