On Mon, 2008-03-03 at 09:27 -0600, Anthony Liguori wrote: > Hi Dor, > > Dor Laor wrote: > > void *virtio_net_init(PCIBus *bus, NICInfo *nd, int devfn) > > { > > VirtIONet *n; > > + const char *info_str = "virtio-net"; > > > > - n = (VirtIONet *)virtio_init_pci(bus, "virtio-net", 6900, 0x1000, > > + n = (VirtIONet *)virtio_init_pci(bus, info_str, 6900, 0x1000, > > 0, VIRTIO_ID_NET, > > 0x02, 0x00, 0x00, > > 6, sizeof(VirtIONet)); > > @@ -308,5 +353,11 @@ void *virtio_net_init(PCIBus *bus, NICInfo *nd, int > > devfn) > > n->tx_timer = qemu_new_timer(vm_clock, virtio_net_tx_timer, n); > > n->tx_timer_active = 0; > > > > + snprintf(n->vc->info_str, sizeof(n->vc->info_str), > > + "%s macaddr=%02x:%02x:%02x:%02x:%02x:%02x", info_str, > > + nd->macaddr[0], nd->macaddr[1], nd->macaddr[2], > > + nd->macaddr[3], nd->macaddr[4], nd->macaddr[5]); > > + register_savevm(info_str, 1, 1, virtio_net_save, virtio_net_load, n); > > > > I think we need to maintain an instance id and increment it here like we > do for the rest of the network cards. >
Sure > > return &n->vdev; > > } > > diff --git a/qemu/hw/virtio.c b/qemu/hw/virtio.c > > index 634f869..69fe810 100644 > > --- a/qemu/hw/virtio.c > > +++ b/qemu/hw/virtio.c > > @@ -180,6 +180,59 @@ void virtio_reset(void *opaque) > > } > > } > > > > +void virtio_dev_save(QEMUFile *f, VirtIODevice *vdev) > > +{ > > + int i; > > + > > + qemu_put_be32s(f, &vdev->features); > > + qemu_put_be16s(f, &vdev->queue_sel); > > + qemu_put_8s(f, &vdev->status); > > + qemu_put_8s(f, &vdev->isr); > > + > > + for(i = 0; i < VIRTIO_PCI_QUEUE_MAX; i++) { > > + if (!vdev->vq[i].vring.num) > > + continue; > > + qemu_put_be32s(f, &vdev->vq[i].pfn); > > + qemu_put_be16s(f, &vdev->vq[i].last_avail_idx); > > + qemu_put_be32s(f, &vdev->vq[i].index); > > + > > + /* Save the descriptor ring instead of constantly mark them dirty > > */ > > + qemu_put_buffer(f, (uint8_t*)vdev->vq[i].vring.desc, > > vdev->vq[i].vring.num * sizeof(VRingDesc)); > > + qemu_put_buffer(f, (uint8_t*)vdev->vq[i].vring.avail, > > TARGET_PAGE_SIZE); > > + qemu_put_buffer(f, (uint8_t*)vdev->vq[i].vring.used, > > TARGET_PAGE_SIZE); > > > > I think these two need to be sizeof(VRingAvail) * vring.num and > sizeof(VringUsed) * vring.num > Right, actually it should be sizeof(VRingAvail) + 2 * vring.num and sizeof(VRingUsedElem) * vring.num + sizeof(VRingUsed) respectively. Thanks, Dor > Regards, > > Anthony Liguori > ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel