diff -Nurb qemu_cvs/hw/ne2000.c qemu_ne2000_savevm/hw/ne2000.c --- qemu_cvs/hw/ne2000.c 2004-09-24 05:28:43.000000000 +0200 +++ qemu_ne2000_savevm/hw/ne2000.c 2004-09-24 05:28:43.000000000 +0200 @@ -538,6 +538,59 @@ return 0; } +static void ne2000_save(QEMUFile* f,void* opaque) +{ + NE2000State* s=(NE2000State*)opaque; + + qemu_put_8s(f, &s->cmd); + qemu_put_be32s(f, &s->start); + qemu_put_be32s(f, &s->stop); + qemu_put_8s(f, &s->boundary); + qemu_put_8s(f, &s->tsr); + qemu_put_8s(f, &s->tpsr); + qemu_put_be16s(f, &s->tcnt); + qemu_put_be16s(f, &s->rcnt); + qemu_put_be32s(f, &s->rsar); + qemu_put_8s(f, &s->rsr); + qemu_put_8s(f, &s->isr); + qemu_put_8s(f, &s->dcfg); + qemu_put_8s(f, &s->imr); + qemu_put_buffer(f, s->phys, 6); + qemu_put_8s(f, &s->curpag); + qemu_put_buffer(f, s->mult, 8); + qemu_put_be32s(f, &s->irq); + qemu_put_buffer(f, s->mem, NE2000_MEM_SIZE); +} + +static int ne2000_load(QEMUFile* f,void* opaque,int version_id) +{ + NE2000State* s=(NE2000State*)opaque; + + if (version_id != 1) + return -EINVAL; + + qemu_get_8s(f, &s->cmd); + qemu_get_be32s(f, &s->start); + qemu_get_be32s(f, &s->stop); + qemu_get_8s(f, &s->boundary); + qemu_get_8s(f, &s->tsr); + qemu_get_8s(f, &s->tpsr); + qemu_get_be16s(f, &s->tcnt); + qemu_get_be16s(f, &s->rcnt); + qemu_get_be32s(f, &s->rsar); + qemu_get_8s(f, &s->rsr); + qemu_get_8s(f, &s->isr); + qemu_get_8s(f, &s->dcfg); + qemu_get_8s(f, &s->imr); + qemu_get_buffer(f, s->phys, 6); + qemu_get_8s(f, &s->curpag); + qemu_get_buffer(f, s->mult, 8); + qemu_get_be32s(f, &s->irq); + qemu_get_buffer(f, s->mem, NE2000_MEM_SIZE); + + return 0; +} + void isa_ne2000_init(int base, int irq, NetDriverState *nd) { NE2000State *s; @@ -546,6 +599,8 @@ if (!s) return; + register_savevm("ne2000", 0, 1, ne2000_save, ne2000_load, s); + register_ioport_write(base, 16, 1, ne2000_ioport_write, s); register_ioport_read(base, 16, 1, ne2000_ioport_read, s); @@ -620,4 +675,8 @@ s->nd = nd; ne2000_reset(s); qemu_add_read_packet(nd, ne2000_can_receive, ne2000_receive, s); + + register_savevm("ne2000", 0, 1, ne2000_save, ne2000_load, s); + } + diff -Nurb qemu_cvs/hw/pci.c qemu_ne2000_savevm/hw/pci.c --- qemu_cvs/hw/pci.c 2004-09-24 05:28:43.000000000 +0200 +++ qemu_ne2000_savevm/hw/pci.c 2004-09-24 05:28:43.000000000 +0200 @@ -62,6 +62,31 @@ return bus; } +static void generic_pci_save(QEMUFile* f,void* opaque) +{ + PCIDevice* s=(PCIDevice*)opaque; + + qemu_put_buffer(f, s->config, 256); + qemu_put_be32s(f, &s->devfn); + qemu_put_buffer(f, s->name, 64); + qemu_put_be32s(f, &s->irq_index); +} + +static int generic_pci_load(QEMUFile* f,void* opaque,int version_id) +{ + PCIDevice* s=(PCIDevice*)opaque; + + if (version_id != 1) + return -EINVAL; + + qemu_get_buffer(f, s->config, 256); + qemu_get_be32s(f, &s->devfn); + qemu_get_buffer(f, s->name, 64); + qemu_get_be32s(f, &s->irq_index); + + return 0; +} + /* -1 for devfn means auto assign */ PCIDevice *pci_register_device(PCIBus *bus, const char *name, int instance_size, int devfn, @@ -96,6 +121,9 @@ pci_dev->config_write = config_write; pci_dev->irq_index = pci_irq_index++; bus->devices[devfn] = pci_dev; + + register_savevm(name, 0, 1, generic_pci_save, generic_pci_load, pci_dev); + return pci_dev; }