uio(9)

NAME

uio, uiomove - device driver I/O routines

SYNOPSIS

#include <sys/types.h>
#include <sys/uio.h>
struct uio {
        struct  iovec *uio_iov;
        int     uio_iovcnt;
        off_t   uio_offset;
        int     uio_resid;
        enum    uio_seg uio_segflg;
        enum    uio_rw uio_rw;
        struct  thread *uio_td;
};
int
uiomove(void *buf, int howmuch, struct uio *uiop);

DESCRIPTION

The function uiomove() is used to handle transfer of data
between buffers
and I/O vectors that might possibly also cross the user/ker
nel space
boundary.
As a result of any read(2), write(2), readv(2), or writev(2)
system call
that is being passed to a character-device driver, the ap
propriate driver
d_read or d_write entry will be called with a pointer to a
struct uio
being passed. The transfer request is encoded in this
structure. The
driver itself should use uiomove() to get at the data in
this structure.
The fields in the uio structure are:
uio_iov The array of I/O vectors to be processed.
In the case of
scatter/gather I/O, this will be more than
one vector.
uio_iovcnt The number of I/O vectors present.
uio_offset The offset into the device.
uio_resid The number of bytes to process.
uio_segflg One of the following flags:

UIO_USERSPACE The I/O vector points in
to a process's
address space.
UIO_SYSSPACE The I/O vector points in
to the kernel
address space.
UIO_NOCOPY Do not copy, already in
object.
uio_rw The direction of the desired transfer, ei
ther UIO_READ,
or UIO_WRITE.
uio_td The pointer to a struct thread for the asso
ciated thread;
used if uio_segflg indicates that the trans
fer is to be
made from/to a process's address space.

RETURN VALUES

uiomove() can return EFAULT from the invoked copyin(9) or
copyout(9) in
case the transfer was to/from a process's address space.

EXAMPLES

The idea is that the driver maintains a private buffer for
its data, and
processes the request in chunks of maximal the size of this
buffer. Note
that the buffer handling below is very simplified and will
not work (the
buffer pointer is not being advanced in case of a partial
read), it is
just here to demonstrate the uio handling.
/* MIN() can be found there: */
#include <sys/param.h>
#define BUFSIZE 512
static char buffer[BUFSIZE];
static int data_available; /* amount of data that can
be read */
static int
fooread(dev_t dev, struct uio *uio, int flag)
{
int rv, amnt;
rv = 0;
while (uio->uio_resid > 0) {
if (data_available > 0) {
amnt = MIN(uio->uio_resid, da
ta_available);
rv = uiomove(buffer, amnt, uio);
if (rv != 0)
break;
data_available -= amnt;
} else
tsleep(...); /* wait for a better
time */
}
if (rv != 0) {
/* do error cleanup here */
}
return (rv);
}

SEE ALSO

read(2), readv(2), write(2), writev(2), copyin(9), copy
out(9), sleep(9)

HISTORY

The uio mechanism appeared in some early version of UNIX.

AUTHORS

This manual page was written by Jorg Wunsch.
BSD February 2, 1997
Copyright © 2010-2024 Platon Technologies, s.r.o.           Home | Man pages | tLDP | Documents | Utilities | About
Design by styleshout