Linux and UNIX Man Pages

Linux & Unix Commands - Search Man Pages

ddi_mmap_get_model(9f) [sunos man page]

ddi_mmap_get_model(9F)					   Kernel Functions for Drivers 				    ddi_mmap_get_model(9F)

NAME
ddi_mmap_get_model - return data model type of current thread SYNOPSIS
#include <sys/ddi.h> #include <sys/sunddi.h> uint_t ddi_mmap_get_model(void); INTERFACE LEVEL
Solaris DDI specific (Solaris DDI). DESCRIPTION
ddi_mmap_get_model() returns the C Language Type Model which the current thread expects. ddi_mmap_get_model() is used in combination with ddi_model_convert_from(9F) in the mmap(9E) driver entry point to determine whether there is a data model mismatch between the current thread and the device driver. The device driver might have to adjust the shape of data structures before exporting them to a user thread which supports a different data model. RETURN VALUES
"small and bold">DDI_MODCurrent2thread expects 32-bit (ILP32) semantics. DDI_MODEL_LP64 Current thread expects 64-bit (LP64) semantics. DDI_FAILURE The ddi_mmap_get_model() function was not called from the mmap(9E) entry point. CONTEXT
The ddi_mmap_get_model() function can only be called from the mmap(9E) driver entry point. EXAMPLES
Example 1: : Using ddi_mmap_get_model() The following is an example of the mmap(9E) entry point and how to support 32-bit and 64-bit applications with the same device driver. struct data32 { int len; caddr32_t addr; }; struct data { int len; caddr_t addr; }; xxmmap(dev_t dev, off_t off, int prot) { struct data dtc; /* a local copy for clash resolution */ struct data *dp = (struct data *)shared_area; switch (ddi_model_convert_from(ddi_mmap_get_model())) { case DDI_MODEL_ILP32: { struct data32 *da32p; da32p = (struct data32 *)shared_area; dp = &dtc; dp->len = da32p->len; dp->address = da32->address; break; } case DDI_MODEL_NONE: break; } /* continues along using dp */ ... } SEE ALSO
mmap(9E), ddi_model_convert_from(9F) Writing Device Drivers SunOS 5.10 8 Feb 2001 ddi_mmap_get_model(9F)

Check Out this Related Man Page

ddi_model_convert_from(9F)				   Kernel Functions for Drivers 				ddi_model_convert_from(9F)

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
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 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
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 SunOS 5.10 8 Feb 2001 ddi_model_convert_from(9F)
Man Page