blob: 4d6962171b0ba64b6adb829ccb9bfd8ddb645cab [file] [log] [blame]
/* Virtio helper functions from linux/tools/lguest/lguest.c
*
* Copyright (C) 1991-2016, the Linux Kernel authors
* Copyright (c) 2016 Google Inc.
*
* Author:
* Rusty Russell <rusty@rustcorp.com.au>
* Michael Taufen <mtaufen@gmail.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* The code from lguest.c has been modified for Akaros.
*
* Original linux/tools/lguest/lguest.c:
* https://github.com/torvalds/linux/blob/v4.5/tools/lguest/lguest.c
* most recent hash on the file as of v4.5 tag:
* e523caa601f4a7c2fa1ecd040db921baf7453798
*/
#pragma once
// Validates memory regions provided by the guest's virtio driver
void *virtio_check_pointer(struct virtio_vq *vq, uint64_t addr,
uint32_t size, char *file, uint32_t line);
// Adds descriptor chain to the used ring of the vq
// Based on add_used in Linux's lguest.c
void virtio_add_used_desc(struct virtio_vq *vq, uint32_t head, uint32_t len);
// Waits for the next available descriptor chain and writes the addresses
// and sizes of the buffers it describes to an iovec to make them easy to use.
// Based on wait_for_vq_desc in Linux lguest.c
uint32_t virtio_next_avail_vq_desc(struct virtio_vq *vq, struct iovec iov[],
uint32_t *olen, uint32_t *ilen);
// After the driver tells us that a queue is ready for processing,
// we use this to validate the addresses on the vring it gave us.
void virtio_check_vring(struct virtio_vq *vq);