MyWebUniversity.com Home Page
 



OpenSolaris man pages main menu


Kernel Functions for Drivers                           copyin(9F)



NAME
     copyin - copy data from a user program to a driver buffer

SYNOPSIS
     #include 
     #include 



     int copyin(const void *userbuf, void *driverbuf, sizet cn);


INTERFACE LEVEL
     This interface is obsolete. ddicopyin(9F)  should  be  used
     instead.

PARAMETERS
     userbuf       User program source address from which data is
                   transferred.


     driverbuf     Driver destination address to  which  data  is
                   transferred.


     cn            Number of bytes transferred.


DESCRIPTION
     copyin() copies data from a user program source address to a
     driver  buffer.   The driver developer must ensure that ade-
     quate space is allocated for the destination address.


     Addresses that are word-aligned are moved most  efficiently.
     However,  the  driver  developer  is not obligated to ensure
     alignment.  This function automatically finds the most effi-
     cient move according to address alignment.

RETURN VALUES
     Under normal conditions, a 0 is returned indicating  a  suc-
     cessful  copy.   Otherwise,  a  -1 is returned if one of the
     following occurs:

         o    Paging fault; the driver tried to access a page  of
              memory  for  which  it  did  not have read or write
              access.

         o    Invalid user address, such as a user area or  stack
              area.

         o    Invalid address that would have  resulted  in  data



SunOS 5.11          Last change: 27 Sep 2002                    1






Kernel Functions for Drivers                           copyin(9F)



              being copied into the user block.

         o    Hardware fault; a hardware error  prevented  access
              to  the  specified  user  memory.  For  example, an
              uncorrectable parity or EC error occurred.


     If a -1 is returned to the caller, driver entry  point  rou-
     tines should return EFAULT.

CONTEXT
     copyin() can be called from user context only.

EXAMPLES
     Example 1 An ioctl() Routine


     A driver ioctl(9E) routine (line 10) can be used to  get  or
     set device attributes or registers. In the XGETREGS condi-
     tion (line 17), the driver copies the current device  regis-
     ter  values to a user data area (line 18).  If the specified
     argument contains an  invalid  address,  an  error  code  is
     returned.



        1  struct device  {         /* layout of physical device registers  */
        2       int      control;   /* physical device control word  */
        3       int      status;    /* physical device status word   */
        4       short    recvchar; /* receive character from device */
        5       short    xmitchar; /* transmit character to device  */
        6  };
        7
        8  extern struct device xxaddr[];   /* phys. device regs. location */
        9    . . .
       10  xxioctl(devt dev, int cmd, int arg, int mode,
       11      credt *credp, int *rvalp)
       12               ...
       13  {
       14      register struct device *rp = &xxaddr[getminor(dev) >> 4];
       15      switch (cmd) {
       16
       17      case XGETREGS: /* copy device regs. to user program */
       18            if (copyin(arg, rp, sizeof(struct device)))
       19                return(EFAULT);
       20            break;
       21               ...
       22      }
       23               ...
       24  }





SunOS 5.11          Last change: 27 Sep 2002                    2






Kernel Functions for Drivers                           copyin(9F)



ATRIBUTES
     See attributes(5) for a description of the following  attri-
     butes:



     
           ATRIBUTE TYPE               ATRIBUTE VALUE       
    
     Stability Level              Obsolete                    
    


SEE ALSO
     attributes(5),    ioctl(9E),     bcopy(9F),     copyout(9F),
     ddicopyin(9F), ddicopyout(9F), uiomove(9F).


     Writing Device Drivers

NOTES
     Driver writers who intend to support layered ioctls in their
     ioctl(9E) routines should use ddicopyin(9F) instead.


     Driver defined locks should not be held across calls to this
     function.


     copyin() should not be  used  from  a  streams  driver.  See
     MCOPYIN and MCOPYOUT in STREAMS Programming Guide.
























SunOS 5.11          Last change: 27 Sep 2002                    3



OpenSolaris man pages main menu

Contact us      |       About us      |       Term of use      |       Copyright © 2000-2010 MyWebUniversity.com ™