In a 64-bit device driver, these macros do all that is necessary to use the same piece of kernel memory as a buffer for the contents of the native form of the data structure (that is, the LP64 form), and for the ILP32 form of the same structure. This usually means that each structure access is implemented by a conditional expression. When compiled as a 32-bit driver, only one data model is supported and only the native form exists, so no conditional expression is used.
The 64-bit versions of the macros depend on the definition of a shadow version of the data structure that describes the 32-bit interface using fixed-width types. The name of the shadow data structure is formed by appending “32” to the name of the native data structure. For convenience, place the definition of the shadow structure in the same file as the native structure to ease future maintenance costs.
The macros take arguments such as:
The structure name (as would appear after the struct keyword) of the native form of the data structure
A flag word containing the user data model, such as FILP32 or FLP64, extracted from the mode parameter of ioctl(9E)
The name used to refer to a particular instance of a structure that is manipulated by these macros
The name of the field within the structure