Many device drivers that manipulate hardware devices use C data structures
to describe the layout of the hardware. In the LP64 data model, data structures
that use long
or unsigned long to define hardware registers are
almost certainly incorrect, because long
is now a 64-bit quantity.
Start by including <sys/inttypes.h>, and update this
class of data structure to use int32_t
or uint32_t
instead
of long
for 32-bit device data. This approach preserves the binary
layout of 32-bit data structures. For example, change:
struct device_regs { ulong_t addr; uint_t count; }; /* Only works for ILP32 compilation */
to:
struct device_regs { uint32_t addr; uint32_t count; }; /* Works for any data model */