Commit 30ca2aab8e7419d2c8cf597743633a6477840277
1 parent
8a8a608f
ne2000 savevm support (Johannes Schindelin)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1092 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
84 additions
and
1 deletions
hw/ne2000.c
| @@ -538,6 +538,59 @@ static uint32_t ne2000_reset_ioport_read(void *opaque, uint32_t addr) | @@ -538,6 +538,59 @@ static uint32_t ne2000_reset_ioport_read(void *opaque, uint32_t addr) | ||
| 538 | return 0; | 538 | return 0; |
| 539 | } | 539 | } |
| 540 | 540 | ||
| 541 | +static void ne2000_save(QEMUFile* f,void* opaque) | ||
| 542 | +{ | ||
| 543 | + NE2000State* s=(NE2000State*)opaque; | ||
| 544 | + | ||
| 545 | + qemu_put_8s(f, &s->cmd); | ||
| 546 | + qemu_put_be32s(f, &s->start); | ||
| 547 | + qemu_put_be32s(f, &s->stop); | ||
| 548 | + qemu_put_8s(f, &s->boundary); | ||
| 549 | + qemu_put_8s(f, &s->tsr); | ||
| 550 | + qemu_put_8s(f, &s->tpsr); | ||
| 551 | + qemu_put_be16s(f, &s->tcnt); | ||
| 552 | + qemu_put_be16s(f, &s->rcnt); | ||
| 553 | + qemu_put_be32s(f, &s->rsar); | ||
| 554 | + qemu_put_8s(f, &s->rsr); | ||
| 555 | + qemu_put_8s(f, &s->isr); | ||
| 556 | + qemu_put_8s(f, &s->dcfg); | ||
| 557 | + qemu_put_8s(f, &s->imr); | ||
| 558 | + qemu_put_buffer(f, s->phys, 6); | ||
| 559 | + qemu_put_8s(f, &s->curpag); | ||
| 560 | + qemu_put_buffer(f, s->mult, 8); | ||
| 561 | + qemu_put_be32s(f, &s->irq); | ||
| 562 | + qemu_put_buffer(f, s->mem, NE2000_MEM_SIZE); | ||
| 563 | +} | ||
| 564 | + | ||
| 565 | +static int ne2000_load(QEMUFile* f,void* opaque,int version_id) | ||
| 566 | +{ | ||
| 567 | + NE2000State* s=(NE2000State*)opaque; | ||
| 568 | + | ||
| 569 | + if (version_id != 1) | ||
| 570 | + return -EINVAL; | ||
| 571 | + | ||
| 572 | + qemu_get_8s(f, &s->cmd); | ||
| 573 | + qemu_get_be32s(f, &s->start); | ||
| 574 | + qemu_get_be32s(f, &s->stop); | ||
| 575 | + qemu_get_8s(f, &s->boundary); | ||
| 576 | + qemu_get_8s(f, &s->tsr); | ||
| 577 | + qemu_get_8s(f, &s->tpsr); | ||
| 578 | + qemu_get_be16s(f, &s->tcnt); | ||
| 579 | + qemu_get_be16s(f, &s->rcnt); | ||
| 580 | + qemu_get_be32s(f, &s->rsar); | ||
| 581 | + qemu_get_8s(f, &s->rsr); | ||
| 582 | + qemu_get_8s(f, &s->isr); | ||
| 583 | + qemu_get_8s(f, &s->dcfg); | ||
| 584 | + qemu_get_8s(f, &s->imr); | ||
| 585 | + qemu_get_buffer(f, s->phys, 6); | ||
| 586 | + qemu_get_8s(f, &s->curpag); | ||
| 587 | + qemu_get_buffer(f, s->mult, 8); | ||
| 588 | + qemu_get_be32s(f, &s->irq); | ||
| 589 | + qemu_get_buffer(f, s->mem, NE2000_MEM_SIZE); | ||
| 590 | + | ||
| 591 | + return 0; | ||
| 592 | +} | ||
| 593 | + | ||
| 541 | void isa_ne2000_init(int base, int irq, NetDriverState *nd) | 594 | void isa_ne2000_init(int base, int irq, NetDriverState *nd) |
| 542 | { | 595 | { |
| 543 | NE2000State *s; | 596 | NE2000State *s; |
| @@ -562,6 +615,9 @@ void isa_ne2000_init(int base, int irq, NetDriverState *nd) | @@ -562,6 +615,9 @@ void isa_ne2000_init(int base, int irq, NetDriverState *nd) | ||
| 562 | ne2000_reset(s); | 615 | ne2000_reset(s); |
| 563 | 616 | ||
| 564 | qemu_add_read_packet(nd, ne2000_can_receive, ne2000_receive, s); | 617 | qemu_add_read_packet(nd, ne2000_can_receive, ne2000_receive, s); |
| 618 | + | ||
| 619 | + register_savevm("ne2000", 0, 1, ne2000_save, ne2000_load, s); | ||
| 620 | + | ||
| 565 | } | 621 | } |
| 566 | 622 | ||
| 567 | /***********************************************************/ | 623 | /***********************************************************/ |
| @@ -612,7 +668,7 @@ void pci_ne2000_init(PCIBus *bus, NetDriverState *nd) | @@ -612,7 +668,7 @@ void pci_ne2000_init(PCIBus *bus, NetDriverState *nd) | ||
| 612 | pci_conf[0x0e] = 0x00; // header_type | 668 | pci_conf[0x0e] = 0x00; // header_type |
| 613 | pci_conf[0x3d] = 1; // interrupt pin 0 | 669 | pci_conf[0x3d] = 1; // interrupt pin 0 |
| 614 | 670 | ||
| 615 | - pci_register_io_region((PCIDevice *)d, 0, 0x100, | 671 | + pci_register_io_region(&d->dev, 0, 0x100, |
| 616 | PCI_ADDRESS_SPACE_IO, ne2000_map); | 672 | PCI_ADDRESS_SPACE_IO, ne2000_map); |
| 617 | s = &d->ne2000; | 673 | s = &d->ne2000; |
| 618 | s->irq = 16; // PCI interrupt | 674 | s->irq = 16; // PCI interrupt |
| @@ -620,4 +676,9 @@ void pci_ne2000_init(PCIBus *bus, NetDriverState *nd) | @@ -620,4 +676,9 @@ void pci_ne2000_init(PCIBus *bus, NetDriverState *nd) | ||
| 620 | s->nd = nd; | 676 | s->nd = nd; |
| 621 | ne2000_reset(s); | 677 | ne2000_reset(s); |
| 622 | qemu_add_read_packet(nd, ne2000_can_receive, ne2000_receive, s); | 678 | qemu_add_read_packet(nd, ne2000_can_receive, ne2000_receive, s); |
| 679 | + | ||
| 680 | + /* XXX: instance number ? */ | ||
| 681 | + register_savevm("ne2000", 0, 1, ne2000_save, ne2000_load, s); | ||
| 682 | + register_savevm("ne2000_pci", 0, 1, generic_pci_save, generic_pci_load, | ||
| 683 | + &d->dev); | ||
| 623 | } | 684 | } |
hw/pci.c
| @@ -62,6 +62,24 @@ static PCIBus *pci_register_bus(void) | @@ -62,6 +62,24 @@ static PCIBus *pci_register_bus(void) | ||
| 62 | return bus; | 62 | return bus; |
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | +void generic_pci_save(QEMUFile* f, void *opaque) | ||
| 66 | +{ | ||
| 67 | + PCIDevice* s=(PCIDevice*)opaque; | ||
| 68 | + | ||
| 69 | + qemu_put_buffer(f, s->config, 256); | ||
| 70 | +} | ||
| 71 | + | ||
| 72 | +int generic_pci_load(QEMUFile* f, void *opaque, int version_id) | ||
| 73 | +{ | ||
| 74 | + PCIDevice* s=(PCIDevice*)opaque; | ||
| 75 | + | ||
| 76 | + if (version_id != 1) | ||
| 77 | + return -EINVAL; | ||
| 78 | + | ||
| 79 | + qemu_get_buffer(f, s->config, 256); | ||
| 80 | + return 0; | ||
| 81 | +} | ||
| 82 | + | ||
| 65 | /* -1 for devfn means auto assign */ | 83 | /* -1 for devfn means auto assign */ |
| 66 | PCIDevice *pci_register_device(PCIBus *bus, const char *name, | 84 | PCIDevice *pci_register_device(PCIBus *bus, const char *name, |
| 67 | int instance_size, int devfn, | 85 | int instance_size, int devfn, |
| @@ -558,6 +576,8 @@ void piix3_init(PCIBus *bus) | @@ -558,6 +576,8 @@ void piix3_init(PCIBus *bus) | ||
| 558 | 576 | ||
| 559 | d = (PIIX3State *)pci_register_device(bus, "PIIX3", sizeof(PIIX3State), | 577 | d = (PIIX3State *)pci_register_device(bus, "PIIX3", sizeof(PIIX3State), |
| 560 | -1, NULL, NULL); | 578 | -1, NULL, NULL); |
| 579 | + register_savevm("PIIX3", 0, 1, generic_pci_save, generic_pci_load, d); | ||
| 580 | + | ||
| 561 | piix3_state = d; | 581 | piix3_state = d; |
| 562 | pci_conf = d->dev.config; | 582 | pci_conf = d->dev.config; |
| 563 | 583 |
vl.h
| @@ -480,6 +480,8 @@ uint32_t pci_default_read_config(PCIDevice *d, | @@ -480,6 +480,8 @@ uint32_t pci_default_read_config(PCIDevice *d, | ||
| 480 | uint32_t address, int len); | 480 | uint32_t address, int len); |
| 481 | void pci_default_write_config(PCIDevice *d, | 481 | void pci_default_write_config(PCIDevice *d, |
| 482 | uint32_t address, uint32_t val, int len); | 482 | uint32_t address, uint32_t val, int len); |
| 483 | +void generic_pci_save(QEMUFile* f, void *opaque); | ||
| 484 | +int generic_pci_load(QEMUFile* f, void *opaque, int version_id); | ||
| 483 | 485 | ||
| 484 | extern struct PIIX3State *piix3_state; | 486 | extern struct PIIX3State *piix3_state; |
| 485 | 487 |