vmm: Added more syscalls and helpers to linuxemu
[akaros.git] / user / vmm / include / vmm / virtio_lguest_helpers.h
1 /* Virtio helper functions from linux/tools/lguest/lguest.c
2  *
3  * Copyright (C) 1991-2016, the Linux Kernel authors
4  * Copyright (c) 2016 Google Inc.
5  *
6  * Author:
7  *  Rusty Russell <rusty@rustcorp.com.au>
8  *  Michael Taufen <mtaufen@gmail.com>
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License as
12  * published by the Free Software Foundation; either version 2 of
13  * the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * The code from lguest.c has been modified for Akaros.
21  *
22  * Original linux/tools/lguest/lguest.c:
23  *   https://github.com/torvalds/linux/blob/v4.5/tools/lguest/lguest.c
24  *   most recent hash on the file as of v4.5 tag:
25  *     e523caa601f4a7c2fa1ecd040db921baf7453798
26  */
27
28 #pragma once
29
30 // Validates memory regions provided by the guest's virtio driver
31 void *virtio_check_pointer(struct virtio_vq *vq, uint64_t addr,
32                            uint32_t size, char *file, uint32_t line);
33
34 // Adds descriptor chain to the used ring of the vq
35 // Based on add_used in Linux's lguest.c
36 void virtio_add_used_desc(struct virtio_vq *vq, uint32_t head, uint32_t len);
37
38 // Waits for the next available descriptor chain and writes the addresses
39 // and sizes of the buffers it describes to an iovec to make them easy to use.
40 // Based on wait_for_vq_desc in Linux lguest.c
41 uint32_t virtio_next_avail_vq_desc(struct virtio_vq *vq, struct iovec iov[],
42                             uint32_t *olen, uint32_t *ilen);
43
44 // After the driver tells us that a queue is ready for processing,
45 // we use this to validate the addresses on the vring it gave us.
46 void virtio_check_vring(struct virtio_vq *vq);