|
@@ -78,27 +78,32 @@ static unsigned desc_size(const struct kvm_device_desc *desc)
|
|
+ desc->config_len;
|
|
+ desc->config_len;
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * This tests (and acknowleges) a feature bit.
|
|
|
|
- */
|
|
|
|
-static bool kvm_feature(struct virtio_device *vdev, unsigned fbit)
|
|
|
|
|
|
+/* This gets the device's feature bits. */
|
|
|
|
+static u32 kvm_get_features(struct virtio_device *vdev)
|
|
{
|
|
{
|
|
|
|
+ unsigned int i;
|
|
|
|
+ u32 features = 0;
|
|
struct kvm_device_desc *desc = to_kvmdev(vdev)->desc;
|
|
struct kvm_device_desc *desc = to_kvmdev(vdev)->desc;
|
|
- u8 *features;
|
|
|
|
|
|
+ u8 *in_features = kvm_vq_features(desc);
|
|
|
|
|
|
- if (fbit / 8 > desc->feature_len)
|
|
|
|
- return false;
|
|
|
|
|
|
+ for (i = 0; i < min(desc->feature_len * 8, 32); i++)
|
|
|
|
+ if (in_features[i / 8] & (1 << (i % 8)))
|
|
|
|
+ features |= (1 << i);
|
|
|
|
+ return features;
|
|
|
|
+}
|
|
|
|
|
|
- features = kvm_vq_features(desc);
|
|
|
|
- if (!(features[fbit / 8] & (1 << (fbit % 8))))
|
|
|
|
- return false;
|
|
|
|
|
|
+static void kvm_set_features(struct virtio_device *vdev, u32 features)
|
|
|
|
+{
|
|
|
|
+ unsigned int i;
|
|
|
|
+ struct kvm_device_desc *desc = to_kvmdev(vdev)->desc;
|
|
|
|
+ /* Second half of bitmap is features we accept. */
|
|
|
|
+ u8 *out_features = kvm_vq_features(desc) + desc->feature_len;
|
|
|
|
|
|
- /*
|
|
|
|
- * We set the matching bit in the other half of the bitmap to tell the
|
|
|
|
- * Host we want to use this feature.
|
|
|
|
- */
|
|
|
|
- features[desc->feature_len + fbit / 8] |= (1 << (fbit % 8));
|
|
|
|
- return true;
|
|
|
|
|
|
+ memset(out_features, 0, desc->feature_len);
|
|
|
|
+ for (i = 0; i < min(desc->feature_len * 8, 32); i++) {
|
|
|
|
+ if (features & (1 << i))
|
|
|
|
+ out_features[i / 8] |= (1 << (i % 8));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -221,7 +226,8 @@ static void kvm_del_vq(struct virtqueue *vq)
|
|
* The config ops structure as defined by virtio config
|
|
* The config ops structure as defined by virtio config
|
|
*/
|
|
*/
|
|
static struct virtio_config_ops kvm_vq_configspace_ops = {
|
|
static struct virtio_config_ops kvm_vq_configspace_ops = {
|
|
- .feature = kvm_feature,
|
|
|
|
|
|
+ .get_features = kvm_get_features,
|
|
|
|
+ .set_features = kvm_set_features,
|
|
.get = kvm_get,
|
|
.get = kvm_get,
|
|
.set = kvm_set,
|
|
.set = kvm_set,
|
|
.get_status = kvm_get_status,
|
|
.get_status = kvm_get_status,
|