/* Virtio MMIO bindings
 *
 * Copyright (c) 2011 Linaro Limited
 * Copyright (C) 1991-2016, the Linux Kernel authors
 * Copyright (c) 2016 Google Inc.
 *
 * Author:
 *  Peter Maydell <peter.maydell@linaro.org>
 *  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.
 *
 * Akaros's virtio_mmio (this file) is inspired by QEMU's virtio-mmio.c
 * and Linux's lguest.c.  Both of QEMU's virtio-mmio.c and Linux's
 * lguest.c are released under the GNU General Public License version 2
 * or later.  Their original files were heavily 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
 *
 * Original virtio-mmio.c:
 *   https://github.com/qemu/qemu/blob/v2.5.0/hw/virtio/virtio-mmio.c
 *   most recent hash on the file as of v2.5.0 tag:
 *     ab223c9518e8c7eb542ef3133de1a34475b69790
 *
 * TODO: This needs major refactoring/reformatting.
 */

#include <parlib/stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/eventfd.h>
#include <vmm/virtio_config.h>
#include <vmm/virtio_mmio.h>

#define VIRT_MAGIC 0x74726976 /* 'virt' */

#define VIRT_MMIO_VERSION 0x2

#define VIRT_MMIO_VENDOR 0x52414B41 /* 'AKAR' */

void virtio_mmio_set_vring_irq(struct virtio_mmio_dev *mmio_dev)
{
	mmio_dev->isr |= VIRTIO_MMIO_INT_VRING;
}

void virtio_mmio_set_cfg_irq(struct virtio_mmio_dev *mmio_dev)
{
	mmio_dev->isr |= VIRTIO_MMIO_INT_CONFIG;
}

static void virtio_mmio_reset_cfg(struct virtio_mmio_dev *mmio_dev)
{
	if (!mmio_dev->vqdev->cfg || mmio_dev->vqdev->cfg_sz == 0)
		VIRTIO_DEV_WARNX(mmio_dev->vqdev,
			"Attempt to reset the device-specific configuration space, but the device does not provide it. Generally, this region is required, so you should probably do something about that.");

	// If a default device-specific configuration is provided, copy that
	// into the device-specific configuration space. Otherwise, clear the
	// device-specific configuration space.
	if (mmio_dev->vqdev->cfg_d)
		memcpy(mmio_dev->vqdev->cfg, mmio_dev->vqdev->cfg_d,
			   mmio_dev->vqdev->cfg_sz);
	else
		memset(mmio_dev->vqdev->cfg, 0x0, mmio_dev->vqdev->cfg_sz);

	// Increment the ConfigGeneration, since the config space just got
	// reset.  We can't simply set it to 0, because we must ensure that it
	// changes when the config space changes and it might currently be set
	// to 0.
	mmio_dev->cfg_gen++;
}

// TODO: virtio_mmio_reset could use a careful audit. We have not yet
//       encountered a scenario where the driver resets the device
//       while lots of things are in-flight; thus far we have only seen
//       device resets prior to the first initialization sequence.
static void virtio_mmio_reset(struct virtio_mmio_dev *mmio_dev)
{
	int i;

	if (!mmio_dev->vqdev)
		return;

	// Clear any driver-activated feature bits
	mmio_dev->vqdev->dri_feat = 0;

	// virtio-v1.0-cs04 s2.1.2 Device Status Field
	// The device MUST initialize device status to 0 upon reset
	mmio_dev->status = 0;

	// virtio-v1.0-cs04 s4.2.2.1 MMIO Device Register Layout
	// Upon reset, the device MUST clear all bits in InterruptStatus
	mmio_dev->isr = 0;

	// virtio-v1.0-cs04 s4.2.2.1 MMIO Device Register Layout
	// Upon reset, the device MUST clear...ready bits in the QueueReady
	// register for all queues in the device.
	for (i = 0; i < mmio_dev->vqdev->num_vqs; ++i) {
		if (mmio_dev->vqdev->vqs[i].srv_th) {
		// FIXME! PLEASE, FIXME!
		// TODO: For now we are going to make device resets an error
		// once service threads exist on the queues. This is obviously
		// not sustainable, because the driver needs to be able to reset
		// the device after certain errors occur.
		//
		//       In the future, when we actually decide how we want
		//       to clean up the threads, the sequence might look
		//       something like this:
		//       1. Ask the queue's service thread to exit and wait
		//          for it to finish and exit.
		//       2. Once it has exited, close the queue's eventfd
		//          and set both the eventfd and srv_th fields to 0.
			VIRTIO_DEV_ERRX(mmio_dev->vqdev,
				"The driver reset the device after queue service threads had started running. This is NOT a restriction imposed by virtio! We just haven't implemented something that will kill service threads yet.");
		}

		mmio_dev->vqdev->vqs[i].qready = 0;
		mmio_dev->vqdev->vqs[i].last_avail = 0;
	}

	virtio_mmio_reset_cfg(mmio_dev);
}

uint32_t virtio_mmio_rd(struct virtual_machine *unused_vm,
                        struct virtio_mmio_dev *mmio_dev,
                        uint64_t gpa, uint8_t size)
{
	uint64_t offset = gpa - mmio_dev->addr;
	uint8_t *target; // target of read from device-specific config space
	const char *err; // returned err strings

	// Return 0 for all registers except the magic number,
	// the mmio version, and the device vendor when either
	// there is no vqdev or no vqs on the vqdev.
	if (!mmio_dev->vqdev || mmio_dev->vqdev->num_vqs == 0) {
		switch (offset) {
		case VIRTIO_MMIO_MAGIC_VALUE:
			return VIRT_MAGIC;
		case VIRTIO_MMIO_VERSION:
			return VIRT_MMIO_VERSION;
		case VIRTIO_MMIO_VENDOR_ID:
			return VIRT_MMIO_VENDOR;
		default:
			return 0;
		}
	}

	// virtio-v1.0-cs04 s4.2.3.1.1 Device Initialization (MMIO section)
	if (mmio_dev->vqdev->dev_id == 0
		&& offset != VIRTIO_MMIO_MAGIC_VALUE
		&& offset != VIRTIO_MMIO_VERSION
		&& offset != VIRTIO_MMIO_DEVICE_ID)
		VIRTIO_DRI_ERRX(mmio_dev->vqdev,
			"Attempt to read from a register not MagicValue, Version, or DeviceID on a device whose DeviceID is 0x0\n"
			"  See virtio-v1.0-cs04 s4.2.3.1.1 Device Initialization");

	// Now we know that the host provided a vqdev. As soon as the driver
	// tries to read the magic number, we know it's considering the device.
	// This is a great time to validate the features the host is providing.
	// The host must provide a valid combination of features, or we crash
	// here until the offered feature combination is made valid.
	if (offset == VIRTIO_MMIO_MAGIC_VALUE) {
		// NOTE: If you ever decide to change this to a warning instead
		// of an error, you might want to return an invalid magic value
		// here to tell the driver that it is poking at a bad device.
		err = virtio_validate_feat(mmio_dev->vqdev,
		                           mmio_dev->vqdev->dev_feat);
		if (err)
			VIRTIO_DEV_ERRX(mmio_dev->vqdev,
				"The feature combination offered by the device is not valid. This must be fixed before the device can be used.\n"
				"  Validation Error: %s", err);
	}


	// Warn if FAILED status bit is set.
	// virtio-v1.0-cs04 s2.1.1 Device Status Field
	if (mmio_dev->status & VIRTIO_CONFIG_S_FAILED)
		VIRTIO_DRI_WARNX(mmio_dev->vqdev,
			"The FAILED status bit is set. The driver should probably reset the device before continuing.\n"
			"  See virtio-v1.0-cs04 s2.1.1 Device Status Field");

	// TODO: I could only do a limited amount of testing on the device-
	//       specific config space, because I was limited to seeing what
	//       the guest driver for the console device would do. You may
	//       run into issues when you implement virtio-net, since that
	//       does more with the device-specific config.
	if (offset >= VIRTIO_MMIO_CONFIG) {
		offset -= VIRTIO_MMIO_CONFIG;

		if (!mmio_dev->vqdev->cfg || mmio_dev->vqdev->cfg_sz == 0) {
			VIRTIO_DEV_ERRX(mmio_dev->vqdev,
				"Driver attempted to read the device-specific configuration space, but the device failed to provide it.");
		}

		// virtio-v1.0-cs04 s3.1.1 Device Initialization
		if (!(mmio_dev->status & VIRTIO_CONFIG_S_DRIVER)) {
			VIRTIO_DRI_ERRX(mmio_dev->vqdev,
				"Driver attempted to read the device-specific configuration space before setting the DRIVER status bit.\n"
				"  See virtio-v1.0-cs04 s3.1.1 Device Initialization");
		}

		if ((offset + size) > mmio_dev->vqdev->cfg_sz
			|| (offset + size) < offset) {
			VIRTIO_DRI_ERRX(mmio_dev->vqdev,
				"Attempt to read invalid offset of the device specific  configuration space, or (offset + read width) wrapped around.");
		}

		target = (uint8_t*)((uint64_t)mmio_dev->vqdev->cfg + offset);

		// TODO: Check that size matches the size of the field at offset
		//       for the given device? i.e. virtio_console_config.rows
		//       should only be accessible via a 16 bit read or write.
		//       I haven't done this yet, it will be a significant
		//       undertaking and maintenance commitment, because you
		//       will have to do it for every virtio device you
		//       want to use in the future.
		switch (size) {
		case 1:
			return *((uint8_t*)target);
		case 2:
			if ((uint64_t)target % 2 != 0)
				VIRTIO_DRI_ERRX(mmio_dev->vqdev,
					"The driver must use 16 bit aligned reads for reading from 16 bit values in the device-specific configuration space.\n"
					"  See virtio-v1.0-cs04 s4.2.2.2 MMIO Device Register Layout");
			return *((uint16_t*)target);
		case 4:
			if ((uint64_t)target % 4 != 0)
				VIRTIO_DRI_ERRX(mmio_dev->vqdev,
					"The driver must use 32 bit aligned reads for reading from 32 or 64 bit values in the device-specific configuration space.\n"
					"  See virtio-v1.0-cs04 s4.2.2.2 MMIO Device Register Layout");
			return *((uint32_t*)target);
		default:
			VIRTIO_DRI_ERRX(mmio_dev->vqdev,
				"The driver must use 8, 16, or 32 bit wide and aligned reads for reading from the device-specific configuration space.\n"
				"  See virtio-v1.0-cs04 s4.2.2.2 MMIO Device Register Layout");
		}
	}

	// virtio-v1.0-cs04 4.2.2.2 MMIO Device Register Layout
	if (size != 4 || (offset % 4) != 0) {
		VIRTIO_DRI_ERRX(mmio_dev->vqdev,
			"The driver must only use 32 bit wide and aligned reads for reading the control registers on the MMIO transport.\n"
			"  See virtio-v1.0-cs04 4.2.2.2 MMIO Device Register Layout");
	}

	// virtio-v1.0-cs04 Table 4.1
	switch (offset) {
	// Magic value
	// 0x74726976 (a Little Endian equivalent of the “virt” string).
	case VIRTIO_MMIO_MAGIC_VALUE:
		return VIRT_MAGIC;

	// Device version number
	// 0x2. Note: Legacy devices (see 4.2.4 Legacy interface) used 0x1.
	case VIRTIO_MMIO_VERSION:
		return VIRT_MMIO_VERSION;

	// Virtio Subsystem Device ID (see virtio-v1.0-cs04 sec. 5 for values)
	// Value 0x0 is used to define a system memory map with placeholder
	// devices at static, well known addresses.
	case VIRTIO_MMIO_DEVICE_ID:
		return mmio_dev->vqdev->dev_id;

	// Virtio Subsystem Vendor ID
	case VIRTIO_MMIO_VENDOR_ID:
		return VIRT_MMIO_VENDOR;

	// Flags representing features the device supports
	case VIRTIO_MMIO_DEVICE_FEATURES:
		if (!(mmio_dev->status & VIRTIO_CONFIG_S_DRIVER))
			VIRTIO_DRI_ERRX(mmio_dev->vqdev,
			         "Attempt to read device features before setting the DRIVER status bit.\n"
			         "  See virtio-v1.0-cs04 s3.1.1 Device Initialization");

		// high 32 bits requested
		if (mmio_dev->dev_feat_sel)
			return mmio_dev->vqdev->dev_feat >> 32;
		return mmio_dev->vqdev->dev_feat; // low 32 bits requested

	// Maximum virtual queue size
	// Returns the maximum size (number of elements) of the queue the device
	// is ready to process or zero (0x0) if the queue is not available.
	// Applies to the queue selected by writing to QueueSel.
	case VIRTIO_MMIO_QUEUE_NUM_MAX:
	// TODO: Are there other cases that count as "queue not available"?
	// NOTE: !qready does not count as "queue not available".
		if (mmio_dev->qsel >= mmio_dev->vqdev->num_vqs)
			return 0;
		return mmio_dev->vqdev->vqs[mmio_dev->qsel].qnum_max;

	// Virtual queue ready bit
	// Applies to the queue selected by writing to QueueSel.
	case VIRTIO_MMIO_QUEUE_READY:
		if (mmio_dev->qsel >= mmio_dev->vqdev->num_vqs)
			return 0;
		return mmio_dev->vqdev->vqs[mmio_dev->qsel].qready;

	// Interrupt status
	// Bit mask of events that caused the device interrupt to be asserted.
	// bit 0: Used Ring Update
	// bit 1: Configuration Change
	case VIRTIO_MMIO_INTERRUPT_STATUS:
		return mmio_dev->isr;

	// Device status
	case VIRTIO_MMIO_STATUS:
		return mmio_dev->status;

	// Configuration atomicity value
	// Contains a version for the device-specific configuration space
	// The driver checks this version before and after accessing the config
	// space, and if the values don't match it repeats the access.
	case VIRTIO_MMIO_CONFIG_GENERATION:
		return mmio_dev->cfg_gen;

	// Write-only register offsets:
	case VIRTIO_MMIO_DEVICE_FEATURES_SEL:
	case VIRTIO_MMIO_DRIVER_FEATURES:
	case VIRTIO_MMIO_DRIVER_FEATURES_SEL:
	case VIRTIO_MMIO_QUEUE_SEL:
	case VIRTIO_MMIO_QUEUE_NUM:
	case VIRTIO_MMIO_QUEUE_NOTIFY:
	case VIRTIO_MMIO_INTERRUPT_ACK:
	case VIRTIO_MMIO_QUEUE_DESC_LOW:
	case VIRTIO_MMIO_QUEUE_DESC_HIGH:
	case VIRTIO_MMIO_QUEUE_AVAIL_LOW:
	case VIRTIO_MMIO_QUEUE_AVAIL_HIGH:
	case VIRTIO_MMIO_QUEUE_USED_LOW:
	case VIRTIO_MMIO_QUEUE_USED_HIGH:
		// Read of write-only register
		VIRTIO_DRI_ERRX(mmio_dev->vqdev,
			"Attempt to read write-only device register offset 0x%x.",
			offset);
		return 0;
	default:
		// Bad register offset
		VIRTIO_DRI_ERRX(mmio_dev->vqdev,
			"Attempt to read invalid device register offset 0x%x.",
			offset);
		return 0;
	}

	return 0;
}

void virtio_mmio_wr(struct virtual_machine *vm,
                    struct virtio_mmio_dev *mmio_dev, uint64_t gpa,
                    uint8_t size, uint32_t *value)
{
	uint64_t offset = gpa - mmio_dev->addr;
	struct virtio_vq *notified_queue;
	uint8_t *target; // target of write to device-specific config space
	void *temp_ptr; // for facilitating bitwise ops on pointers
	const char *err; // returned err strings

	if (!mmio_dev->vqdev) {
		// If there is no vqdev on the mmio_dev,
		// we just make all registers write-ignored.
		return;
	}

	// virtio-v1.0-cs04 s4.2.3.1.1 Device Initialization (MMIO)
	if (mmio_dev->vqdev->dev_id == 0)
		VIRTIO_DRI_ERRX(mmio_dev->vqdev,
			"Attempt to write to a device whose DeviceID is 0x0.\n"
			"  See virtio-v1.0-cs04 s4.2.3.1.1 Device Initialization");

	// Warn if FAILED and trying to do something that is definitely not a
	// reset.  virtio-v1.0-cs04 s2.1.1 Device Status Field
	if (offset != VIRTIO_MMIO_STATUS
		&& (mmio_dev->status & VIRTIO_CONFIG_S_FAILED))
		VIRTIO_DRI_WARNX(mmio_dev->vqdev,
			"The FAILED status bit is set. The driver should probably reset the device before continuing.\n"
			"  See virtio-v1.0-cs04 s2.1.1 Device Status Field");

	// TODO: I could only do a limited amount of testing on the device-
	//       specific config space, because I was limited to seeing what
	//       the guest driver for the console device would do. You may
	//       run into issues when you implement virtio-net, since that
	//       does more with the device-specific config. (In fact, I don't
	//       think the guest driver ever even tried to write the
	//       device-specific config space for the console, so this section
	//       is entirely untested)
	if (offset >= VIRTIO_MMIO_CONFIG) {
		offset -= VIRTIO_MMIO_CONFIG;

		if (!mmio_dev->vqdev->cfg || mmio_dev->vqdev->cfg_sz == 0) {
			VIRTIO_DEV_ERRX(mmio_dev->vqdev,
				"Driver attempted to write to the device-specific configuration space, but the device failed to provide it.");
		}

		// virtio-v1.0-cs04 s3.1.1 Device Initialization
		if (!(mmio_dev->status & VIRTIO_CONFIG_S_FEATURES_OK)) {
			VIRTIO_DRI_ERRX(mmio_dev->vqdev,
				"Driver attempted to write the device-specific configuration space before setting the FEATURES_OK status bit.\n"
				"  See virtio-v1.0-cs04 s3.1.1 Device Initialization");
		}

		if ((offset + size) > mmio_dev->vqdev->cfg_sz
			|| (offset + size) < offset) {
			VIRTIO_DRI_ERRX(mmio_dev->vqdev,
				"Attempt to write invalid offset of the device specific configuration space, or (offset + write width) wrapped around.");
		}

		target = (uint8_t*)((uint64_t)mmio_dev->vqdev->cfg + offset);

		// TODO: Check that size matches the size of the field at offset
		//       for the given device? i.e. virtio_console_config.rows
		//       should only be accessible via a 16 bit read or write.
		//       I haven't done this yet, it will be a significant
		//       undertaking and maintenance commitment, because you
		//       will have to do it for every virtio device you
		//       want to use in the future.
		switch (size) {
		case 1:
			*((uint8_t*)target) = *((uint8_t*)value);
			break;
		case 2:
			if ((uint64_t)target % 2 != 0)
				VIRTIO_DRI_ERRX(mmio_dev->vqdev,
					"The driver must use 16 bit aligned writes for writing to 16 bit values in the device-specific configuration space.\n"
					"  See virtio-v1.0-cs04 s4.2.2.2 MMIO Device Register Layout");
			*((uint16_t*)target) = *((uint16_t*)value);
			break;
		case 4:
			if ((uint64_t)target % 4 != 0)
				VIRTIO_DRI_ERRX(mmio_dev->vqdev,
					"The driver must use 32 bit aligned writes for writing to 32 or 64 bit values in the device-specific configuration space.\n"
					"  See virtio-v1.0-cs04 s4.2.2.2 MMIO Device Register Layout");
			*((uint32_t*)target) = *((uint32_t*)value);
			break;
		default:
			VIRTIO_DRI_ERRX(mmio_dev->vqdev,
				"The driver must use 8, 16, or 32 bit wide and aligned writes for writing to the device-specific configuration space.\n"
				"  See virtio-v1.0-cs04 s4.2.2.2 MMIO Device Register Layout");
		}

		// Increment cfg_gen because the device-specific config changed
		mmio_dev->cfg_gen++;

		// Notify the driver that the device-specific config changed
		virtio_mmio_set_cfg_irq(mmio_dev);
		if (mmio_dev->poke_guest)
			mmio_dev->poke_guest(mmio_dev->vec, mmio_dev->dest);

		return;
	}

	// virtio-v1.0-cs04 4.2.2.2 MMIO Device Register Layout
	if (size != 4 || (offset % 4) != 0) {
		VIRTIO_DRI_ERRX(mmio_dev->vqdev,
			"The driver must only use 32 bit wide and aligned writes for writing the control registers on the MMIO transport.\n"
			"  See virtio-v1.0-cs04 4.2.2.2 MMIO Device Register Layout");
	}

	// virtio-v1.0-cs04 Table 4.1
	switch (offset) {

	// Device (host) features word selection.
	case VIRTIO_MMIO_DEVICE_FEATURES_SEL:
		mmio_dev->dev_feat_sel = *value;
		break;

	// Device feature flags activated by the driver
	case VIRTIO_MMIO_DRIVER_FEATURES:
		// virtio-v1.0-cs04 s3.1.1 Device Initialization
		if (mmio_dev->status & VIRTIO_CONFIG_S_FEATURES_OK) {
			// NOTE: The spec just says the driver isn't allowed to
			// accept NEW feature bits after setting FEATURES_OK.
			// Although the language makes it seem like it might be
			// fine to let the driver un-accept features after it
			// sets FEATURES_OK, this would require very careful
			// handling, so for now we just don't allow the driver
			// to write to the DriverFeatures register after
			// FEATURES_OK is set.
			VIRTIO_DRI_ERRX(mmio_dev->vqdev,
				"The driver may not accept (i.e. activate) new feature bits  offered by the device after setting FEATURES_OK.\n"
				"  See virtio-v1.0-cs04 s3.1.1 Device Initialization");
		} else if (mmio_dev->dri_feat_sel) {
			// clear high 32 bits
			mmio_dev->vqdev->dri_feat &= 0xffffffff;
			// write high 32 bits
			mmio_dev->vqdev->dri_feat |= ((uint64_t)(*value) << 32);
		} else {
			// clear low 32 bits
			mmio_dev->vqdev->dri_feat &= ((uint64_t)0xffffffff <<
						      32);
			// write low 32 bits
			mmio_dev->vqdev->dri_feat |= *value;
		}
		break;

	// Activated (guest) features word selection
	case VIRTIO_MMIO_DRIVER_FEATURES_SEL:
		mmio_dev->dri_feat_sel = *value;
		break;

	// Virtual queue index
	// Selects the virtual queue that QueueNumMax, QueueNum, QueueReady,
	// QueueDescLow, QueueDescHigh, QueueAvailLow, QueueAvailHigh,
	// QueueUsedLow and QueueUsedHigh apply to. The index number of the
	// first queue is zero (0x0).
	case VIRTIO_MMIO_QUEUE_SEL:
	// NOTE: We must allow the driver to write whatever they want to
	//       QueueSel, because QueueNumMax contians 0x0 for invalid
	//       QueueSel indices.
		mmio_dev->qsel = *value;
		break;

	// Virtual queue size
	// The queue size is the number of elements in the queue, thus in the
	// Descriptor Table, the Available Ring and the Used Ring. Writes
	// notify the device what size queue the driver will use.
	// This applies to the queue selected by writing to QueueSel.
	case VIRTIO_MMIO_QUEUE_NUM:
		if (mmio_dev->qsel < mmio_dev->vqdev->num_vqs) {
			// virtio-v1.0-cs04 4.2.2.2 MMIO Device Register Layout
			if (*value <=
			    mmio_dev->vqdev->vqs[mmio_dev->qsel].qnum_max)
				mmio_dev->vqdev->vqs[mmio_dev->qsel].vring.num =
					*value;
			else if ((*value != 0) && (*value & ((*value) - 1)))
				VIRTIO_DRI_ERRX(mmio_dev->vqdev,
					"The driver may only write powers of 2 to the QueueNum register.\n"
					"  See virtio-v1.0-cs04 s2.4 Virtqueues");
			else
				VIRTIO_DRI_ERRX(mmio_dev->vqdev,
					"Attempt to write value greater than QueueNumMax to QueueNum register.");
		} else {
			VIRTIO_DRI_WARNX(mmio_dev->vqdev,
				"Attempt to write QueueNum register for invalid QueueSel. QueueSel was %u, but the number of queues is %u.",
				mmio_dev->qsel, mmio_dev->vqdev->num_vqs);
		}
		break;

	// Virtual queue ready bit
	// Writing one (0x1) to this register notifies the device that it can
	// execute requests from the virtual queue selected by QueueSel.
	case VIRTIO_MMIO_QUEUE_READY:
		if (mmio_dev->qsel < mmio_dev->vqdev->num_vqs) {
			// NOTE: For now, anything that is not a toggle between
			// 0x1 and 0x0 will bounce with no effect whatsoever.
			if (mmio_dev->vqdev->vqs[mmio_dev->qsel].qready == 0x0
				&& *value == 0x1) {
				// Driver is trying to write 0x1 QueueReady when
				// the queue is currently disabled (QueueReady
				// is 0x0). We validate the vring the driver
				// provided, set up an eventfd for the queue,
				// set qready on the queue to 0x1, and then
				// launch the service thread for the queue.

				// Check that the host actually provided a
				// service function
				if (!mmio_dev->vqdev->vqs[mmio_dev->qsel].srv_fn) {
					VIRTIO_DEV_ERRX(mmio_dev->vqdev,
						"The host must provide a service function for each queue on the device before the driver writes 0x1 to QueueReady. No service function found for queue %u."
						, mmio_dev->qsel);
				}

				virtio_check_vring(
					&mmio_dev->vqdev->vqs[mmio_dev->qsel]);

				mmio_dev->vqdev->vqs[mmio_dev->qsel].eventfd =
					eventfd(0, 0);
				mmio_dev->vqdev->vqs[mmio_dev->qsel].qready =
					0x1;

				mmio_dev->vqdev->vqs[mmio_dev->qsel].srv_th =
						vmm_run_task(vm,
								mmio_dev->vqdev->vqs[mmio_dev->qsel].srv_fn,
								&mmio_dev->vqdev->vqs[mmio_dev->qsel]);
				if (!mmio_dev->vqdev->vqs[mmio_dev->qsel].srv_th) {
					VIRTIO_DEV_ERRX(mmio_dev->vqdev,
						"vm_run_task failed when trying to start service thread after driver wrote 0x1 to QueueReady.");
				}
			} else if (mmio_dev->vqdev->vqs[mmio_dev->qsel].qready == 0x1
				       && *value == 0x0) {
				// Driver is trying to revoke QueueReady while
				// the queue is currently enabled (QueueReady is
				// 0x1).
				// TODO: For now we are going to just make this
				// an error.  In the future, when we actually
				// decide how we want to clean up the threads,
				// the sequence might look something like this:
				//       1. Ask the queue's service thread to
				//       exit and wait for it to finish and
				//       exit.
				//       2. Once it has exited, close the
				//       queue's eventfd and set both the
				//       eventfd and srv_th fields to 0.
				//       3. Finally, write 0x0 to QueueReady.
				VIRTIO_DEV_ERRX(mmio_dev->vqdev,
					"Our (Akaros) MMIO device does not currently allow the driver to revoke QueueReady (i.e. change QueueReady from 0x1 to 0x0). The driver tried to revoke it, so whatever you are doing might require this ability.");
			}

		} else {
			VIRTIO_DRI_WARNX(mmio_dev->vqdev,
				"Attempt to write QueueReady register for invalid QueueSel. QueueSel was %u, but the number of queues is %u.",
				mmio_dev->qsel, mmio_dev->vqdev->num_vqs);
		}
		break;

	// Queue notifier
	// Writing a queue index to this register notifies the device that
	// there are new buffers to process in that queue.
	case VIRTIO_MMIO_QUEUE_NOTIFY:
		if (!(mmio_dev->status & VIRTIO_CONFIG_S_DRIVER_OK))
			VIRTIO_DRI_ERRX(mmio_dev->vqdev,
				"Attempt to notify the device before setting the DRIVER_OK status bit.\n"
				"  See virtio-v1.0-cs04 s3.1.1 Device Initialization");
		else if (*value < mmio_dev->vqdev->num_vqs) {
			notified_queue = &mmio_dev->vqdev->vqs[*value];

			// kick the queue's service thread
			if (notified_queue->eventfd > 0)
				eventfd_write(notified_queue->eventfd, 1);
			else
				VIRTIO_DEV_ERRX(mmio_dev->vqdev,
					"You need to provide a valid eventfd on your virtio_vq so that it can be kicked when the driver writes to QueueNotify.");
		}
		break;

	// Interrupt acknowledge
	// Writing a value with bits set as defined in InterruptStatus to this
	// register notifies the device that events causing the interrupt have
	// been handled.
	case VIRTIO_MMIO_INTERRUPT_ACK:
		if (*value & ~0x3)
			VIRTIO_DRI_ERRX(mmio_dev->vqdev,
				"Attempt to set undefined bits in InterruptACK register.\n"
				"  See virtio-v1.0-cs04 s4.2.2.1 MMIO Device Register Layout");
		mmio_dev->isr &= ~(*value);
		break;

	// Device status
	// Writing non-zero values to this register sets the status flags.
	// Writing zero (0x0) to this register triggers a device reset.
	case VIRTIO_MMIO_STATUS:
		if (*value == 0)
			virtio_mmio_reset(mmio_dev);
		else if (mmio_dev->status & ~(*value)) {
			// virtio-v1.0-cs04 s2.1.1. driver must NOT clear a
			// status bit
			VIRTIO_DRI_ERRX(mmio_dev->vqdev,
				"The driver must not clear any device status bits, except as a result of resetting the device.\n"
				"  See virtio-v1.0-cs04 s2.1.1 Device Status Field");
		} else if (mmio_dev->status & VIRTIO_CONFIG_S_FAILED
			&&   mmio_dev->status != *value) {
			// virtio-v1.0-cs04 s2.1.1. MUST reset before re-init if
			// FAILED
			// NOTE: This fails if the driver tries to *change* the
			// status after the FAILED bit is set. The driver can
			// set the same status again all it wants.
			VIRTIO_DRI_ERRX(mmio_dev->vqdev,
				"The driver must reset the device after setting the FAILED status bit, before attempting to re-initialize the device.\n"
				"  See virtio-v1.0-cs04 s2.1.1 Device Status Field");
		}

		// NOTE: If a bit is not set in value, then at this point it
		//       CANNOT be set in status either, because if it were
		//       set in status, we would have just crashed with an
		//       error due to the attempt to clear a status bit.

		// Now we check that status bits are set in the correct
		// sequence during device initialization as described
		// in virtio-v1.0-cs04 s3.1.1 Device Initialization

		else if ((*value & VIRTIO_CONFIG_S_DRIVER)
		          && !(*value & VIRTIO_CONFIG_S_ACKNOWLEDGE)) {
			VIRTIO_DRI_ERRX(mmio_dev->vqdev,
				"Tried to set DRIVER status bit before setting ACKNOWLEDGE feature bit.\n"
				"  See virtio-v1.0-cs04 s3.1.1 Device Initialization");
		} else if ((*value & VIRTIO_CONFIG_S_FEATURES_OK)
		         && !((*value & VIRTIO_CONFIG_S_ACKNOWLEDGE)
			           && (*value & VIRTIO_CONFIG_S_DRIVER))) {
			// All those parentheses... Lisp must be making a
			// comeback.
			VIRTIO_DRI_ERRX(mmio_dev->vqdev,
				"Tried to set FEATURES_OK status bit before setting both ACKNOWLEDGE and DRIVER status bits.\n"
				"  See virtio-v1.0-cs04 s3.1.1 Device Initialization");
		} else if ((*value & VIRTIO_CONFIG_S_DRIVER_OK)
		         && !((*value & VIRTIO_CONFIG_S_ACKNOWLEDGE)
			           && (*value & VIRTIO_CONFIG_S_DRIVER)
			           && (*value & VIRTIO_CONFIG_S_FEATURES_OK))) {
			VIRTIO_DRI_ERRX(mmio_dev->vqdev,
				"Tried to set DRIVER_OK status bit before setting all of ACKNOWLEDGE, DRIVER, and FEATURES_OK status bits.\n"
				"  See virtio-v1.0-cs04 s3.1.1 Device Initialization");
		}

		// NOTE: For now, we allow the driver to set all status bits up
		//       through FEATURES_OK in one fell swoop. The driver is,
		//       however, required to re-read FEATURES_OK after setting
		//       it to be sure that the driver-activated features are a
		//       subset of those supported by the device, so it must
		//       make an additional write to set DRIVER_OK.

		else if ((*value & VIRTIO_CONFIG_S_DRIVER_OK)
		         && !(mmio_dev->status & VIRTIO_CONFIG_S_FEATURES_OK)) {
			VIRTIO_DRI_ERRX(mmio_dev->vqdev,
				"The driver may not set FEATURES_OK and DRIVER_OK status bits simultaneously. It must read back FEATURES_OK after setting it to ensure that its activated features are supported by the device before setting DRIVER_OK.\n"
				"  See virtio-v1.0-cs04 s3.1.1 Device Initialization");
		} else {
			// NOTE: Don't set the FEATURES_OK bit unless the driver
			//       activated a valid subset of the supported
			//       features prior to attempting to set
			//       FEATURES_OK.
			if (!(mmio_dev->status & VIRTIO_CONFIG_S_FEATURES_OK)
			    && (*value & VIRTIO_CONFIG_S_FEATURES_OK)) {

				err = virtio_validate_feat(mmio_dev->vqdev,
						  mmio_dev->vqdev->dri_feat);

				if ((mmio_dev->vqdev->dri_feat
					& ~mmio_dev->vqdev->dev_feat)) {
					VIRTIO_DRI_WARNX(mmio_dev->vqdev,
						"The driver did not accept (e.g. activate) a subset of the features offered by the device prior to attempting to set the FEATURES_OK status bit. The bit will remain unset.\n"
						"  See virtio-v1.0-cs04 s3.1.1 Device Initialization");
					*value &= ~VIRTIO_CONFIG_S_FEATURES_OK;
				} else if (err) {
					VIRTIO_DRI_WARNX(mmio_dev->vqdev,
						"The driver did not accept (e.g. activate) a valid combination of the features offered by the device prior to attempting to set the FEATURES_OK status bit. The bit will remain unset.\n"
						"  See virtio-v1.0-cs04 s3.1.1 Device Initialization\n"
						"  Validation Error: %s", err);
					*value &= ~VIRTIO_CONFIG_S_FEATURES_OK;
				}
			}
			// Device status is only a byte wide.
			mmio_dev->status = *value & 0xff;
		}
		break;

	// Queue's Descriptor Table 64 bit long physical address, low 32
	case VIRTIO_MMIO_QUEUE_DESC_LOW:
		if (mmio_dev->qsel < mmio_dev->vqdev->num_vqs) {
			if (mmio_dev->vqdev->vqs[mmio_dev->qsel].qready != 0)
				VIRTIO_DRI_ERRX(mmio_dev->vqdev,
					"Attempt to access QueueDescLow on queue %d, which has nonzero QueueReady.\n"
					"  See virtio-v1.0-cs04 s4.2.2.2 MMIO Device Register Layout"
					, mmio_dev->qsel);

			// clear low bits
			temp_ptr = (void *)
			    ((uint64_t)mmio_dev->vqdev->vqs[mmio_dev->qsel].vring.desc
			  & ((uint64_t)0xffffffff << 32));
			// write low bits
			temp_ptr = (void *) ((uint64_t)temp_ptr | *value);

			// virtio-v1.0-cs04 s2.4 Virtqueues
			if ((uint64_t)temp_ptr % 16)
				VIRTIO_DRI_ERRX(mmio_dev->vqdev,
					"Physical address of guest's descriptor table (%p) is misaligned. Address should be a multiple of 16.\n"
					"  See virtio-v1.0-cs04 s2.4 Virtqueues");

			// assign the new value to the queue desc
			mmio_dev->vqdev->vqs[mmio_dev->qsel].vring.desc =
				temp_ptr;
		} else {
			VIRTIO_DRI_WARNX(mmio_dev->vqdev,
				"Attempt to write QueueDescLow register for invalid QueueSel. QueueSel was %u, but the number of queues is %u.",
				mmio_dev->qsel, mmio_dev->vqdev->num_vqs);
		}
		break;

	// Queue's Descriptor Table 64 bit long physical address, high 32
	case VIRTIO_MMIO_QUEUE_DESC_HIGH:
		if (mmio_dev->qsel < mmio_dev->vqdev->num_vqs) {
			if (mmio_dev->vqdev->vqs[mmio_dev->qsel].qready != 0)
				VIRTIO_DRI_ERRX(mmio_dev->vqdev,
					"Attempt to access QueueDescHigh on queue %d, which has nonzero QueueReady.\n"
					"  See virtio-v1.0-cs04 s4.2.2.2 MMIO Device Register Layout"
					, mmio_dev->qsel);

			// clear high bits
			temp_ptr = (void *)
			    ((uint64_t)mmio_dev->vqdev->vqs[mmio_dev->qsel].vring.desc
			  & ((uint64_t)0xffffffff));
			// write high bits
			temp_ptr = (void *) ((uint64_t)temp_ptr
			                  | ((uint64_t)(*value) << 32));

			// virtio-v1.0-cs04 s2.4 Virtqueues
			if ((uint64_t)temp_ptr % 16)
				VIRTIO_DRI_ERRX(mmio_dev->vqdev,
					"Physical address of guest's descriptor table (%p) is misaligned. Address should be a multiple of 16.\n"
					"  See virtio-v1.0-cs04 s2.4 Virtqueues");

			// assign the new value to the queue desc
			mmio_dev->vqdev->vqs[mmio_dev->qsel].vring.desc = temp_ptr;
		} else {
			VIRTIO_DRI_WARNX(mmio_dev->vqdev,
				"Attempt to write QueueDescHigh register for invalid QueueSel. QueueSel was %u, but the number of queues is %u."
				, mmio_dev->qsel, mmio_dev->vqdev->num_vqs);
		}
		break;

	// Queue's Available Ring 64 bit long physical address, low 32
	case VIRTIO_MMIO_QUEUE_AVAIL_LOW:
		if (mmio_dev->qsel < mmio_dev->vqdev->num_vqs) {
			if (mmio_dev->vqdev->vqs[mmio_dev->qsel].qready != 0)
				VIRTIO_DRI_ERRX(mmio_dev->vqdev,
					"Attempt to access QueueAvailLow on queue %d, which has nonzero QueueReady.\n"
					"  See virtio-v1.0-cs04 s4.2.2.2 MMIO Device Register Layout"
					, mmio_dev->qsel);

			// clear low bits
			temp_ptr = (void *)
			    ((uint64_t)mmio_dev->vqdev->vqs[mmio_dev->qsel].vring.avail
			  & ((uint64_t)0xffffffff << 32));
			// write low bits
			temp_ptr = (void *) ((uint64_t)temp_ptr | *value);

			// virtio-v1.0-cs04 s2.4 Virtqueues
			if ((uint64_t)temp_ptr % 2)
				VIRTIO_DRI_ERRX(mmio_dev->vqdev,
					"Physical address of guest's available ring (%p) is misaligned. Address should be a multiple of 2.\n"
					"  See virtio-v1.0-cs04 s2.4 Virtqueues");

			// assign the new value to the queue avail
			mmio_dev->vqdev->vqs[mmio_dev->qsel].vring.avail = temp_ptr;
		} else {
			VIRTIO_DRI_WARNX(mmio_dev->vqdev,
				"Attempt to write QueueAvailLow register for invalid QueueSel. QueueSel was %u, but the number of queues is %u."
				, mmio_dev->qsel, mmio_dev->vqdev->num_vqs);
		}
		break;

	// Queue's Available Ring 64 bit long physical address, high 32
	case VIRTIO_MMIO_QUEUE_AVAIL_HIGH:
		if (mmio_dev->qsel < mmio_dev->vqdev->num_vqs) {
			if (mmio_dev->vqdev->vqs[mmio_dev->qsel].qready != 0)
				VIRTIO_DRI_ERRX(mmio_dev->vqdev,
					"Attempt to access QueueAvailHigh on queue %d, which has nonzero QueueReady.\n"
					"  See virtio-v1.0-cs04 s4.2.2.2 MMIO Device Register Layout"
					, mmio_dev->qsel);

			// clear high bits
			temp_ptr = (void *)
			    ((uint64_t)mmio_dev->vqdev->vqs[mmio_dev->qsel].vring.avail
			 &  ((uint64_t)0xffffffff));
			// write high bits
			temp_ptr = (void *) ((uint64_t)temp_ptr
			                  | ((uint64_t)(*value) << 32));

			// virtio-v1.0-cs04 s2.4 Virtqueues
			if ((uint64_t)temp_ptr % 2)
				VIRTIO_DRI_ERRX(mmio_dev->vqdev,
					"Physical address of guest's available ring (%p) is misaligned. Address should be a multiple of 2.\n"
					"  See virtio-v1.0-cs04 s2.4 Virtqueues");

			// assign the new value to the queue avail
			mmio_dev->vqdev->vqs[mmio_dev->qsel].vring.avail = temp_ptr;
		} else {
			VIRTIO_DRI_WARNX(mmio_dev->vqdev,
				"Attempt to write QueueAvailHigh register for invalid QueueSel. QueueSel was %u, but the number of queues is %u."
				, mmio_dev->qsel, mmio_dev->vqdev->num_vqs);
		}
		break;

	// Queue's Used Ring 64 bit long physical address, low 32
	case VIRTIO_MMIO_QUEUE_USED_LOW:
		if (mmio_dev->qsel < mmio_dev->vqdev->num_vqs) {
			if (mmio_dev->vqdev->vqs[mmio_dev->qsel].qready != 0)
				VIRTIO_DRI_ERRX(mmio_dev->vqdev,
					"Attempt to access QueueUsedLow on queue %d, which has nonzero QueueReady.\n"
					"  See virtio-v1.0-cs04 s4.2.2.2 MMIO Device Register Layout"
					, mmio_dev->qsel);

			// clear low bits
			temp_ptr = (void *)
			    ((uint64_t)mmio_dev->vqdev->vqs[mmio_dev->qsel].vring.used
			  & ((uint64_t)0xffffffff << 32));
			// write low bits
			temp_ptr = (void *) ((uint64_t)temp_ptr | *value);

			// virtio-v1.0-cs04 s2.4 Virtqueues
			if ((uint64_t)temp_ptr % 4)
				VIRTIO_DRI_ERRX(mmio_dev->vqdev,
					"Physical address of guest's used ring (%p) is misaligned. Address should be a multiple of 4.\n"
					"  See virtio-v1.0-cs04 s2.4 Virtqueues");

			// assign the new value to the queue used
			mmio_dev->vqdev->vqs[mmio_dev->qsel].vring.used = temp_ptr;
		} else {
			VIRTIO_DRI_WARNX(mmio_dev->vqdev,
				"Attempt to write QueueUsedLow register for invalid QueueSel. QueueSel was %u, but the number of queues is %u."
				, mmio_dev->qsel, mmio_dev->vqdev->num_vqs);
		}
		break;

	// Queue's Used Ring 64 bit long physical address, high 32
	case VIRTIO_MMIO_QUEUE_USED_HIGH:
		if (mmio_dev->qsel < mmio_dev->vqdev->num_vqs) {
			if (mmio_dev->vqdev->vqs[mmio_dev->qsel].qready != 0)
				VIRTIO_DRI_ERRX(mmio_dev->vqdev,
					"Attempt to access QueueUsedHigh on queue %d, which has nonzero QueueReady.\n"
					"  See virtio-v1.0-cs04 s4.2.2.2 MMIO Device Register Layout"
					, mmio_dev->qsel);

			// clear high bits
			temp_ptr = (void *)
			    ((uint64_t)mmio_dev->vqdev->vqs[mmio_dev->qsel].vring.used
			  & ((uint64_t)0xffffffff));
			// write high bits
			temp_ptr = (void *) ((uint64_t)temp_ptr
			                  | ((uint64_t)(*value) << 32));

			// virtio-v1.0-cs04 s2.4 Virtqueues
			if ((uint64_t)temp_ptr % 4)
				VIRTIO_DRI_ERRX(mmio_dev->vqdev,
					"Physical address of guest's used ring (%p) is misaligned. Address should be a multiple of 4.\n"
					"  See virtio-v1.0-cs04 s2.4 Virtqueues");

			// assign the new value to the queue used
			mmio_dev->vqdev->vqs[mmio_dev->qsel].vring.used = temp_ptr;
		} else {
			VIRTIO_DRI_WARNX(mmio_dev->vqdev,
				"Attempt to write QueueUsedHigh register for invalid QueueSel. QueueSel was %u, but the number of queues is %u."
				, mmio_dev->qsel, mmio_dev->vqdev->num_vqs);
		}
		break;

	// Read-only register offsets:
	case VIRTIO_MMIO_MAGIC_VALUE:
	case VIRTIO_MMIO_VERSION:
	case VIRTIO_MMIO_DEVICE_ID:
	case VIRTIO_MMIO_VENDOR_ID:
	case VIRTIO_MMIO_DEVICE_FEATURES:
	case VIRTIO_MMIO_QUEUE_NUM_MAX:
	case VIRTIO_MMIO_INTERRUPT_STATUS:
	case VIRTIO_MMIO_CONFIG_GENERATION:
		// Write to read-only register
		VIRTIO_DRI_ERRX(mmio_dev->vqdev,
			"Attempt to write read-only device register offset 0x%x.",
			offset);
		break;
	default:
		// Bad register offset
		VIRTIO_DRI_ERRX(mmio_dev->vqdev,
			"Attempt to write invalid device register offset 0x%x.",
			offset);
		break;
	}
}
