ddi_model_convert_from(9f) 맨 페이지 - 윈디하나의 솔라나라

개요

섹션
맨 페이지 이름
검색(S)

ddi_model_convert_from(9f)

Kernel Functions                                    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  neces‐
       sary  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 in Oracle Solaris 11.4



Oracle Solaris 11.4               8 Feb 2001
                                                    ddi_model_convert_from(9F)
맨 페이지 내용의 저작권은 맨 페이지 작성자에게 있습니다.
RSS ATOM XHTML 5 CSS3