diff options
author | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2004-10-03 13:56:00 +0000 |
---|---|---|
committer | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2004-10-03 13:56:00 +0000 |
commit | 30ca2aab8e7419d2c8cf597743633a6477840277 (patch) | |
tree | 5692e8dfdb7f3745c4b9e8af3fa149c0af124d5a /hw | |
parent | 8a8a608f6e2dc3d258bd765afa0aea6e1c33475c (diff) |
ne2000 savevm support (Johannes Schindelin)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1092 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'hw')
-rw-r--r-- | hw/ne2000.c | 63 | ||||
-rw-r--r-- | hw/pci.c | 20 |
2 files changed, 82 insertions, 1 deletions
diff --git a/hw/ne2000.c b/hw/ne2000.c index 0b094d1e34..79d3026c01 100644 --- a/hw/ne2000.c +++ b/hw/ne2000.c @@ -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); } @@ -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; |