Manual page for ddi_model_convert_from(9F)
ddi_model_convert_from - determine data model type mismatch
SYNOPSIS
#include <sys/ddi.h>
#include <sys/sunddi.h>
uint_t ddi_model_convert_from(uint_t model);
INTERFACE LEVEL
Solaris DDI specific (Solaris DDI).
ARGUMENTS
- 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 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 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
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;
#ifdef _MULTI_DATAMODEL
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;
}
#else /* _MULTI_DATAMODEL */
ddi_copyin(arg, &pa, sizeof (struct passargs), mode);
#endif /* _MULTI_DATAMODEL */
do_ioctl(&pa);
....
}
SEE ALSO
ioctl.9e
mmap.9e
ddi_mmap_get_model.9f
Created by unroff & hp-tools.
© by Hans-Peter Bischof. All Rights Reserved (1997).
Last modified 07/October/97