Cornelia Huck <cornelia.huck@xxxxxxxxxx> writes: > On Thu, 21 Mar 2013 18:59:24 +1030 > Rusty Russell <rusty@xxxxxxxxxxxxxxx> wrote: ... >> diff --git a/drivers/s390/kvm/kvm_virtio.c b/drivers/s390/kvm/kvm_virtio.c >> index 6711e65..dcf35b1 100644 >> --- a/drivers/s390/kvm/kvm_virtio.c >> +++ b/drivers/s390/kvm/kvm_virtio.c >> @@ -112,26 +112,82 @@ static void kvm_finalize_features(struct virtio_device *vdev) >> } >> >> /* >> - * Reading and writing elements in config space >> + * Reading and writing elements in config space. Host and guest are always >> + * big-endian, so no conversion necessary. >> */ >> -static void kvm_get(struct virtio_device *vdev, unsigned int offset, >> - void *buf, unsigned len) >> +static u8 kvm_get8(struct virtio_device *vdev, unsigned int offset) >> { >> - struct kvm_device_desc *desc = to_kvmdev(vdev)->desc; >> + struct lguest_device_desc *desc = to_lgdev(vdev)->desc; > ^^^^^^^^^^^^^^^^^^ > > This looks weird? Nice understatement. I guess you know where I cut & pasted from... Here is the updated version. Thanks, Rusty. diff --git a/drivers/s390/kvm/kvm_virtio.c b/drivers/s390/kvm/kvm_virtio.c index 6711e65..9b8c527 100644 --- a/drivers/s390/kvm/kvm_virtio.c +++ b/drivers/s390/kvm/kvm_virtio.c @@ -112,24 +112,79 @@ static void kvm_finalize_features(struct virtio_device *vdev) } /* - * Reading and writing elements in config space + * Reading and writing elements in config space. Host and guest are always + * big-endian, so no conversion necessary. */ -static void kvm_get(struct virtio_device *vdev, unsigned int offset, - void *buf, unsigned len) +static u8 kvm_get8(struct virtio_device *vdev, unsigned int offset) { struct kvm_device_desc *desc = to_kvmdev(vdev)->desc; - BUG_ON(offset + len > desc->config_len); - memcpy(buf, kvm_vq_configspace(desc) + offset, len); + /* Check they didn't ask for more than the length of the config! */ + BUG_ON(offset + sizeof(u8) > desc->config_len); + return *(u8 *)(kvm_vq_configspace(desc) + offset); } -static void kvm_set(struct virtio_device *vdev, unsigned int offset, - const void *buf, unsigned len) +static void kvm_set8(struct virtio_device *vdev, unsigned int offset, u8 val) { struct kvm_device_desc *desc = to_kvmdev(vdev)->desc; - BUG_ON(offset + len > desc->config_len); - memcpy(kvm_vq_configspace(desc) + offset, buf, len); + /* Check they didn't ask for more than the length of the config! */ + BUG_ON(offset + sizeof(val) > desc->config_len); + *(u8 *)(kvm_vq_configspace(desc) + offset) = val; +} + +static u16 kvm_get16(struct virtio_device *vdev, unsigned int offset) +{ + struct kvm_device_desc *desc = to_kvmdev(vdev)->desc; + + /* Check they didn't ask for more than the length of the config! */ + BUG_ON(offset + sizeof(u16) > desc->config_len); + return *(u16 *)(kvm_vq_configspace(desc) + offset); +} + +static void kvm_set16(struct virtio_device *vdev, unsigned int offset, u16 val) +{ + struct kvm_device_desc *desc = to_kvmdev(vdev)->desc; + + /* Check they didn't ask for more than the length of the config! */ + BUG_ON(offset + sizeof(val) > desc->config_len); + *(u16 *)(kvm_vq_configspace(desc) + offset) = val; +} + +static u32 kvm_get32(struct virtio_device *vdev, unsigned int offset) +{ + struct kvm_device_desc *desc = to_kvmdev(vdev)->desc; + + /* Check they didn't ask for more than the length of the config! */ + BUG_ON(offset + sizeof(u32) > desc->config_len); + return *(u32 *)(kvm_vq_configspace(desc) + offset); +} + +static void kvm_set32(struct virtio_device *vdev, unsigned int offset, u32 val) +{ + struct kvm_device_desc *desc = to_kvmdev(vdev)->desc; + + /* Check they didn't ask for more than the length of the config! */ + BUG_ON(offset + sizeof(val) > desc->config_len); + *(u32 *)(kvm_vq_configspace(desc) + offset) = val; +} + +static u64 kvm_get64(struct virtio_device *vdev, unsigned int offset) +{ + struct kvm_device_desc *desc = to_kvmdev(vdev)->desc; + + /* Check they didn't ask for more than the length of the config! */ + BUG_ON(offset + sizeof(u64) > desc->config_len); + return *(u64 *)(kvm_vq_configspace(desc) + offset); +} + +static void kvm_set64(struct virtio_device *vdev, unsigned int offset, u64 val) +{ + struct kvm_device_desc *desc = to_kvmdev(vdev)->desc; + + /* Check they didn't ask for more than the length of the config! */ + BUG_ON(offset + sizeof(val) > desc->config_len); + *(u64 *)(kvm_vq_configspace(desc) + offset) = val; } /* @@ -278,8 +333,14 @@ static const char *kvm_bus_name(struct virtio_device *vdev) static const struct virtio_config_ops kvm_vq_configspace_ops = { .get_features = kvm_get_features, .finalize_features = kvm_finalize_features, - .get = kvm_get, - .set = kvm_set, + .get8 = kvm_get8, + .set8 = kvm_set8, + .get16 = kvm_get16, + .set16 = kvm_set16, + .get32 = kvm_get32, + .set32 = kvm_set32, + .get64 = kvm_get64, + .set64 = kvm_set64, .get_status = kvm_get_status, .set_status = kvm_set_status, .reset = kvm_reset, _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization