#include "kvm/virtio_ring.h"
#include "kvm/virtio_blk.h"
#include "kvm/virtio_pci.h"
+#include "kvm/disk-image.h"
#include "kvm/ioport.h"
#include "kvm/util.h"
#include "kvm/kvm.h"
struct vring_desc *desc;
uint16_t queue_index;
uint16_t desc_ndx;
+ uint32_t dst_len;
+ uint8_t *status;
+ void *dst;
queue_index = ioport__read16(data);
break;
}
+ /* header */
desc = &queue->vring.desc[desc_ndx];
req = guest_flat_to_host(self, desc->addr);
+ /* block */
+ desc = &queue->vring.desc[desc->next];
+
+ dst = guest_flat_to_host(self, desc->addr);
+ dst_len = desc->len;
+
+ /* status */
+ desc = &queue->vring.desc[desc->next];
+
+ status = guest_flat_to_host(self, desc->addr);
+
+ if (self->disk_image) {
+ int err;
+
+ err = disk_image__read_sector(self->disk_image, req->sector, dst, dst_len);
+
+ if (err)
+ *status = VIRTIO_BLK_S_IOERR;
+ else
+ *status = VIRTIO_BLK_S_OK;
+ } else
+ *status = VIRTIO_BLK_S_IOERR;
+
+ queue->vring.used->idx++;
+
kvm__irq_line(self, VIRTIO_BLK_IRQ, 1);
+
break;
}
case VIRTIO_PCI_STATUS:
free(self);
}
-int disk_image__read_sector(struct disk_image *self, uint64_t sector, void *dst)
+int disk_image__read_sector(struct disk_image *self, uint64_t sector, void *dst, uint32_t dst_len)
{
uint64_t offset = sector << SECTOR_SHIFT;
- if (offset + SECTOR_SIZE > self->size)
+ if (offset + dst_len > self->size)
return -1;
- memcpy(dst, self->mmap + offset, SECTOR_SIZE);
+ memcpy(dst, self->mmap + offset, dst_len);
return 0;
}
struct disk_image *disk_image__open(const char *filename);
void disk_image__close(struct disk_image *self);
-int disk_image__read_sector(struct disk_image *self, uint64_t sector, void *dst);
+int disk_image__read_sector(struct disk_image *self, uint64_t sector, void *dst, uint32_t dst_len);
#endif /* KVM__DISK_IMAGE_H */
kvm__setup_cpuid(kvm);
- strcpy(real_cmdline, "notsc nolapic nosmp noacpi pci=conf1 earlyprintk=ttyS0,keep ");
+ strcpy(real_cmdline, "notsc nolapic nosmp noacpi pci=conf1 earlyprintk=ttyS0,keep root=fc00 ");
if (kernel_cmdline) {
strlcat(real_cmdline, kernel_cmdline, sizeof(real_cmdline));
real_cmdline[sizeof(real_cmdline)-1] = '\0';