DDI_MODEL_CONVERT_FROM(9F)                      Kernel Functions for Drivers
NAME
       ddi_model_convert_from - determine data model type mismatch
SYNOPSIS
       #include <sys/ddi.h>
       #include <sys/sunddi.h>        
uint_tddi_model_convert_from(
uint_t model);
INTERFACE LEVEL
       illumos DDI specific (illumos 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 device driver. The
       64-bit version of illumos 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 program 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 
C Language Type Model of the
       user-mode originator of an kernel event. For example any data which
       flows between programs and the device driver or vice versa need to be
       identical in format. 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 application requires 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.
       The following is an example how to use 
ddi_model_convert_from() in
       the 
ioctl() entry point to support 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 Drivers                              February 8, 2001    DDI_MODEL_CONVERT_FROM(9F)