bcopy(D3)

bcopy - copy data between address locations in the kernel

As shipped in IRIX 6.5.5. Unchanged since IRIX 6.5.

NAME
     bcopy - copy data between address locations in the kernel

SYNOPSIS
     #include <sys/types.h>
     #include <sys/ddi.h>
     void bcopy(caddr_t from, caddr_t to, size_t bcount);

   Arguments
     from      Source address from which the copy is made.

     to        Destination address to which the copy is made.

     bcount    Number of bytes to be copied.

DESCRIPTION
     bcopy copies bcount bytes from one kernel address to another.  It chooses
     the best algorithm based on address alignment and number of bytes to
     copy.

   Return Values
     None

USAGE
     If the input and output addresses overlap, the function executes, but the
     results are undefined.

     The source and destination address ranges must both be within the kernel
     address space and must be memory resident.  No range checking is done.
     Since there is no mechanism by which drivers that conform to the rules of
     the DDI/DKI can obtain and use a kernel address which is not memory
     resident (an address which is paged out), DDI/DKI conforming drivers can
     assume that any address to which they have access is memory resident and
     therefore a valid argument to bcopy.  Addresses within user address space
     are not valid arguments, and specifying such an address may cause the
     driver to corrupt the system in an unpredictable way.  For copying
     between kernel and user space, drivers must use an appropriate function
     defined for that purpose (for example, copyin(D3), copyout(D3),
     uiomove(D3), ureadc(D3), or uwritec(D3)).

     Do not use bcopy to copy to or from I/O (hardware) addresses, because
     they may not allow accesses of the type used by bcopy; use it for memory
     addresses only.  Use the hwcpin(D3), or hwcpout(D3) routines for I/O
     addresses.

   Level
     Initialization, Base or Interrupt.

   Synchronization Constraints
     Does not sleep.
     Driver-defined basic locks, read/write locks, and sleep locks may be held
     across calls to this function.

   Examples
     An I/O request is made for data stored in a RAM disk.  If the I/O
     operation is a read request, data are copied from the RAM disk to a
     buffer (line 9).  If it is a write request, data are copied from a buffer
     to the RAM disk (line 15).  The bcopy function is used since both the RAM
     disk and the buffer are part of the kernel address space.

      1  #define RAMDNBLK    1000           /* number of blocks in RAM disk */
      2  #define RAMDBSIZ    NBPSCTR        /* bytes per block */
      3  char ramdblks[RAMDNBLK][RAMDBSIZ]; /* blocks forming RAM disk */
            ...
      4
      5  if (bp->b_flags & B_READ) {
      6          /*
      7           * read request - copy data from RAM disk to system buffer
      8           */
      9          bcopy(ramdblks[bp->b_blkno], bp->b_un.b_addr, bp->b_bcount);
     10
     11  } else {
     12          /*
     13           * write request - copy data from system buffer to RAM disk
     14           */
     15          bcopy(bp->b_un.b_addr, ramdblks[bp->b_blkno], bp->b_bcount);
     16  }

REFERENCES
     copyin(D3), copyout(D3), hwcpin(D3), hwcpout(D3) uiomove(D3), ureadc(D3),
     uwritec(D3)