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)

tribblix@gmail.com :: GitHub :: Privacy