blob: 1b446c83c8dfcd5075ae23231caf8f265238092f [file] [log] [blame]
/*
* Copyright (c) 2016 Google Inc.
*
* 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.
*/
#include <vmm/virtio.h>
#include <vmm/virtio_ids.h>
#include <vmm/virtio_config.h>
// Returns NULL if the features are valid, otherwise returns
// an error string describing what part of validation failed
// We pass the vqdev instead of just the dev_id in case we
// also want to validate the device-specific config space.
// feat is the feature vector that you want to validate for the vqdev
const char *virtio_validate_feat(struct virtio_vq_dev *vqdev, uint64_t feat)
{
// First validate device-specific features. We want to tell someone
// when they forgot to implement validation code for a new device
// as soon as possible, so that they don't skip this when they
// implement new devices.
switch (vqdev->dev_id) {
case VIRTIO_ID_CONSOLE:
// No interdependent features for the console.
break;
case VIRTIO_ID_NET:
// There is no "mandatory" feature bit that we always want to
// have, either the device can set its own MAC Address (as it
// does now) or the driver can set it using a controller thread.
break;
case VIRTIO_ID_BLOCK:
break;
case 0:
return "Invalid device id (0x0)! On the MMIO transport, this value indicates that the device is a system memory map with placeholder devices at static, well known addresses. In any case, this is not something you validate features for.";
default:
return "Validation not implemented for this device type! You MUST implement validation for this device! You should add your new code to the virtio_validate_feat function in vmm/virtio.c.";
}
// Validate common features
if (!(feat & ((uint64_t)1 << VIRTIO_F_VERSION_1)))
return "A device MUST offer the VIRTIO_F_VERSION_1 feature bit and a driver MUST accept it.\n"
" See virtio-v1.0-cs04 s6.1 & s6.2.";
return NULL;
}