diff options
author | Amit Shah <amit.shah@redhat.com> | 2010-04-27 18:04:05 +0530 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2010-04-28 08:58:22 -0500 |
commit | e4d5639dbb6181ebbfdb554f2594721b2d63882b (patch) | |
tree | 1ad23eabc520022e909e73bbc3affbdfca4cc25f /hw/iov.c | |
parent | 3ecb45f893d09a97b8f24399b5e40808a708261f (diff) | |
download | qemu-e4d5639dbb6181ebbfdb554f2594721b2d63882b.zip qemu-e4d5639dbb6181ebbfdb554f2594721b2d63882b.tar.gz qemu-e4d5639dbb6181ebbfdb554f2594721b2d63882b.tar.bz2 |
iov: Introduce a new file for helpers around iovs, add iov_from_buf()
The virtio-net code uses iov_fill() which fills an iov from a linear
buffer. The virtio-serial-bus code does something similar in an
open-coded function.
Create a new iov.c file that has iov_from_buf().
Convert virtio-net and virtio-serial-bus over to use this functionality.
virtio-net used ints to hold sizes, the new function is going to use
size_t types.
Later commits will add the opposite functionality -- going from an iov
to a linear buffer.
Signed-off-by: Amit Shah <amit.shah@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'hw/iov.c')
-rw-r--r-- | hw/iov.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/hw/iov.c b/hw/iov.c new file mode 100644 index 0000000..07bd499 --- /dev/null +++ b/hw/iov.c @@ -0,0 +1,33 @@ +/* + * Helpers for getting linearized buffers from iov / filling buffers into iovs + * + * Copyright IBM, Corp. 2007, 2008 + * Copyright (C) 2010 Red Hat, Inc. + * + * Author(s): + * Anthony Liguori <aliguori@us.ibm.com> + * Amit Shah <amit.shah@redhat.com> + * + * This work is licensed under the terms of the GNU GPL, version 2. See + * the COPYING file in the top-level directory. + */ + +#include "iov.h" + +size_t iov_from_buf(struct iovec *iov, unsigned int iovcnt, + const void *buf, size_t size) +{ + size_t offset; + unsigned int i; + + offset = 0; + for (i = 0; offset < size && i < iovcnt; i++) { + size_t len; + + len = MIN(iov[i].iov_len, size - offset); + + memcpy(iov[i].iov_base, buf + offset, len); + offset += len; + } + return offset; +} |