Introduction to 64-Bit Driver Design
For drivers that only need support for the 32-bit kernel, existing 32-bit device
drivers will continue to work without recompilation. However, most device drivers require some
changes to run correctly in the 64-bit kernel, and all device drivers require
recompilation to create a 64-bit driver module. The information in this appendix will
help you to enable drivers for 32-bit and 64-bit environments to be generated
from common source code, thus increasing code portability and reducing the maintenance effort.
Before starting to modify a device driver for the 64-bit environment, you should
understand how the 32-bit environment differs from the 64-bit environment. In particular, you
must be familiar with the C language data type models ILP32 and LP64.
See the following table.
Table C-1 Comparison of ILP32 and LP64 Data Types
C Type |
ILP32 |
LP64 |
char |
8 |
8 |
short |
16 |
16 |
int |
32 |
32 |
long |
32 |
64 |
long long |
64 |
64 |
float |
32 |
32 |
double |
64 |
64 |
long double |
96 |
128 |
pointer |
32 |
64 |
The driver-specific issues due to the differences between ILP32 and LP64 are the
subject of this appendix. More general topics are covered in the Solaris 64-bit Developer’s Guide.
In addition to general code cleanup to support the data model changes for
LP64, driver writers have to provide support for both 32-bit and 64-bit applications.
The ioctl(9E), devmap(9E), and mmap(9E) entry points enable data structures to be shared
directly between applications and device drivers. If those data structures change size between
the 32-bit and 64-bit environments, then the entry points must be modified so
that the driver can determine whether the data model of the application is
the same as that of the kernel. When the data models differ, data
structures can be adjusted. See I/O Control Support for 64-Bit Capable Device Drivers, 32-bit and 64-bit Data Structure Macros, and Associating Kernel Memory With User Mappings.
In many drivers, only a few ioctls need this kind of handling. The
other ioctls should work without change as long as these ioctls pass data
structures that do not change in size.