ne2000 savevm support (Johannes Schindelin)
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Sun, 3 Oct 2004 13:56:00 +0000 (13:56 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Sun, 3 Oct 2004 13:56:00 +0000 (13:56 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1092 c046a42c-6fe2-441c-8c8c-71466251a162

hw/ne2000.c
hw/pci.c
vl.h

index 0b094d1..79d3026 100644 (file)
@@ -538,6 +538,59 @@ static uint32_t ne2000_reset_ioport_read(void *opaque, uint32_t addr)
     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;
@@ -562,6 +615,9 @@ void isa_ne2000_init(int base, int irq, NetDriverState *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);
+
 }
 
 /***********************************************************/
@@ -612,7 +668,7 @@ void pci_ne2000_init(PCIBus *bus, NetDriverState *nd)
     pci_conf[0x0e] = 0x00; // header_type
     pci_conf[0x3d] = 1; // interrupt pin 0
     
-    pci_register_io_region((PCIDevice *)d, 0, 0x100, 
+    pci_register_io_region(&d->dev, 0, 0x100, 
                            PCI_ADDRESS_SPACE_IO, ne2000_map);
     s = &d->ne2000;
     s->irq = 16; // PCI interrupt
@@ -620,4 +676,9 @@ void pci_ne2000_init(PCIBus *bus, NetDriverState *nd)
     s->nd = nd;
     ne2000_reset(s);
     qemu_add_read_packet(nd, ne2000_can_receive, ne2000_receive, s);
+
+    /* XXX: instance number ? */
+    register_savevm("ne2000", 0, 1, ne2000_save, ne2000_load, s);
+    register_savevm("ne2000_pci", 0, 1, generic_pci_save, generic_pci_load, 
+                    &d->dev);
 }
index a6f452f..f159dc2 100644 (file)
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -62,6 +62,24 @@ static PCIBus *pci_register_bus(void)
     return bus;
 }
 
+void generic_pci_save(QEMUFile* f, void *opaque)
+{
+    PCIDevice* s=(PCIDevice*)opaque;
+
+    qemu_put_buffer(f, s->config, 256);
+}
+
+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);
+    return 0;
+}
+
 /* -1 for devfn means auto assign */
 PCIDevice *pci_register_device(PCIBus *bus, const char *name, 
                                int instance_size, int devfn,
@@ -558,6 +576,8 @@ void piix3_init(PCIBus *bus)
 
     d = (PIIX3State *)pci_register_device(bus, "PIIX3", sizeof(PIIX3State),
                                           -1, NULL, NULL);
+    register_savevm("PIIX3", 0, 1, generic_pci_save, generic_pci_load, d);
+
     piix3_state = d;
     pci_conf = d->dev.config;
 
diff --git a/vl.h b/vl.h
index 3eb1367..8ebb268 100644 (file)
--- a/vl.h
+++ b/vl.h
@@ -480,6 +480,8 @@ uint32_t pci_default_read_config(PCIDevice *d,
                                  uint32_t address, int len);
 void pci_default_write_config(PCIDevice *d, 
                               uint32_t address, uint32_t val, int len);
+void generic_pci_save(QEMUFile* f, void *opaque);
+int generic_pci_load(QEMUFile* f, void *opaque, int version_id);
 
 extern struct PIIX3State *piix3_state;