Kernel Functions for Drivers ddi_model_convert_from(9F)
NAME
ddi_model_convert_from - determine data model type mismatch
SYNOPSIS
#include
#include
uint_tddi_model_convert_from(uint_t model);
INTERFACE LEVEL
Solaris DDI specific (Solaris DDI).PARAMETERS
model The data model type of the current thread.DESCRIPTION
ddi_model_convert_from() is used to determine if the current
thread uses a different C Language Type Model than the dev-
ice driver. The 64-bit version of Solaris will require a
64-bit kernel to support both 64-bit and 32-bit user mode
programs. The difference between a 32-bit program and a 64-
bit program is in its C Language Type Model: a 32-bit pro-
gram is ILP32 (integer, longs, and pointers are 32-bit) and
a 64-bit program is LP64 (longs and pointers are 64-bit).
There are a number of driver entry points such as ioctl(9E) and mmap(9E) where it is necessary to identify the CLanguage Type Model of the user-mode originator of an kernel
event. For example any data which flows between programs andthe device driver or vice versa need to be identical in for-
mat. A 64-bit device driver may need to modify the format of
the data before sending it to a 32-bit application.
ddi_model_convert_from() is used to determine if data that
is passed between the device driver and the applicationrequires reformatting to any non-native data model.
RETURN VALUES
DDI_MODEL_ILP32 A conversion to/from ILP32 is necessary.
DDI_MODEL_NONE No conversion is necessary. Current
thread and driver use the same data model.CONTEXT
ddi_model_convert_from() can be called from any context.
EXAMPLES
Example 1 : Using ddi_model_convert_from() in the ioctl()
entry point to support both 32-bit and 64-bit applications.
SunOS 5.11 Last change: 8 Feb 2001 1
Kernel Functions for Drivers ddi_model_convert_from(9F)
The following is an example how to useddi_model_convert_from() in the ioctl() entry point to sup-
port both 32-bit and 64-bit applications.
struct passargs32 { int len;caddr32_t addr;
}; struct passargs { int len;caddr_t addr;
};xxioctl(dev_t dev, int cmd, intptr_t arg, int mode,
cred_t *credp, int *rvalp) {
struct passargs pa;switch (ddi_model_convert_from(mode & FMODELS)) {
case DDI_MODEL_ILP32:
{ struct passargs32 pa32;ddi_copyin(arg, &pa32, sizeof (struct passargs32), mode);
pa.len = pa32.len; pa.address = pa32.address; break; }case DDI_MODEL_NONE:
ddi_copyin(arg, &pa, sizeof (struct passargs), mode);
break; }do_ioctl(&pa);
.... }SEE ALSO
ioctl(9E), mmap(9E), ddi_mmap_get_model(9F)
Writing Device DriversSunOS 5.11 Last change: 8 Feb 2001 2