diff options
Diffstat (limited to 'hw/virtio-blk.c')
-rw-r--r-- | hw/virtio-blk.c | 60 |
1 files changed, 2 insertions, 58 deletions
diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c index 75adbec07a..363ffc1be9 100644 --- a/hw/virtio-blk.c +++ b/hw/virtio-blk.c @@ -25,9 +25,7 @@ typedef struct VirtIOBlock BlockDriverState *bs; VirtQueue *vq; void *rq; - char serial_str[BLOCK_SERIAL_STRLEN + 1]; QEMUBH *bh; - size_t config_size; } VirtIOBlock; static VirtIOBlock *to_virtio_blk(VirtIODevice *vdev) @@ -35,47 +33,6 @@ static VirtIOBlock *to_virtio_blk(VirtIODevice *vdev) return (VirtIOBlock *)vdev; } -/* store identify data in little endian format - */ -static inline void put_le16(uint16_t *p, unsigned int v) -{ - *p = cpu_to_le16(v); -} - -/* copy to *dst from *src, nul pad dst tail as needed to len bytes - */ -static inline void padstr(char *dst, const char *src, int len) -{ - while (len--) - *dst++ = *src ? *src++ : '\0'; -} - -/* setup simulated identify data as appropriate for virtio block device - * - * ref: AT Attachment 8 - ATA/ATAPI Command Set (ATA8-ACS) - */ -static inline void virtio_identify_template(struct virtio_blk_config *bc) -{ - uint16_t *p = &bc->identify[0]; - uint64_t lba_sectors = bc->capacity; - - memset(p, 0, sizeof(bc->identify)); - put_le16(p + 0, 0x0); /* ATA device */ - padstr((char *)(p + 23), QEMU_VERSION, 8); /* firmware revision */ - padstr((char *)(p + 27), "QEMU VIRT_BLK", 40); /* model# */ - put_le16(p + 47, 0x80ff); /* max xfer 255 sectors */ - put_le16(p + 49, 0x0b00); /* support IORDY/LBA/DMA */ - put_le16(p + 59, 0x1ff); /* cur xfer 255 sectors */ - put_le16(p + 80, 0x1f0); /* support ATA8/7/6/5/4 */ - put_le16(p + 81, 0x16); - put_le16(p + 82, 0x400); - put_le16(p + 83, 0x400); - put_le16(p + 100, lba_sectors); - put_le16(p + 101, lba_sectors >> 16); - put_le16(p + 102, lba_sectors >> 32); - put_le16(p + 103, lba_sectors >> 48); -} - typedef struct VirtIOBlockReq { VirtIOBlock *dev; @@ -448,10 +405,7 @@ static void virtio_blk_update_config(VirtIODevice *vdev, uint8_t *config) blkcfg.heads = heads; blkcfg.sectors = secs; blkcfg.size_max = 0; - virtio_identify_template(&blkcfg); - memcpy(&blkcfg.identify[VIRTIO_BLK_ID_SN], s->serial_str, - VIRTIO_BLK_ID_SN_BYTES); - memcpy(config, &blkcfg, s->config_size); + memcpy(config, &blkcfg, sizeof(struct virtio_blk_config)); } static uint32_t virtio_blk_get_features(VirtIODevice *vdev, uint32_t features) @@ -463,8 +417,6 @@ static uint32_t virtio_blk_get_features(VirtIODevice *vdev, uint32_t features) if (bdrv_enable_write_cache(s->bs)) features |= (1 << VIRTIO_BLK_F_WCACHE); - if (strcmp(s->serial_str, "0")) - features |= 1 << VIRTIO_BLK_F_IDENTIFY; if (bdrv_is_read_only(s->bs)) features |= 1 << VIRTIO_BLK_F_RO; @@ -510,24 +462,16 @@ VirtIODevice *virtio_blk_init(DeviceState *dev, DriveInfo *dinfo) VirtIOBlock *s; int cylinders, heads, secs; static int virtio_blk_id; - char *ps = (char *)drive_get_serial(dinfo->bdrv); - size_t size = strlen(ps) ? sizeof(struct virtio_blk_config) : - offsetof(struct virtio_blk_config, _blk_size); s = (VirtIOBlock *)virtio_common_init("virtio-blk", VIRTIO_ID_BLOCK, - size, + sizeof(struct virtio_blk_config), sizeof(VirtIOBlock)); - s->config_size = size; s->vdev.get_config = virtio_blk_update_config; s->vdev.get_features = virtio_blk_get_features; s->vdev.reset = virtio_blk_reset; s->bs = dinfo->bdrv; s->rq = NULL; - if (strlen(ps)) - strncpy(s->serial_str, ps, sizeof(s->serial_str)); - else - snprintf(s->serial_str, sizeof(s->serial_str), "0"); bdrv_guess_geometry(s->bs, &cylinders, &heads, &secs); bdrv_set_geometry_hint(s->bs, cylinders, heads, secs); |