tech-misc archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Endian-specific types

> On Apr 11, 2016, at 3:46 PM, Mouse <mouse%Rodents-Montreal.ORG@localhost> 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.


Home | Main Index | Thread Index | Old Index