Revision 7c131dd5 hw/ne2000.c
b/hw/ne2000.c | ||
---|---|---|
623 | 623 |
return 0; |
624 | 624 |
} |
625 | 625 |
|
626 |
void ne2000_save(QEMUFile* f, void* opaque)
|
|
626 |
static int ne2000_post_load(void* opaque, int version_id)
|
|
627 | 627 |
{ |
628 |
NE2000State* s = opaque; |
|
629 |
uint32_t tmp; |
|
630 |
|
|
631 |
qemu_put_8s(f, &s->rxcr); |
|
632 |
|
|
633 |
qemu_put_8s(f, &s->cmd); |
|
634 |
qemu_put_be32s(f, &s->start); |
|
635 |
qemu_put_be32s(f, &s->stop); |
|
636 |
qemu_put_8s(f, &s->boundary); |
|
637 |
qemu_put_8s(f, &s->tsr); |
|
638 |
qemu_put_8s(f, &s->tpsr); |
|
639 |
qemu_put_be16s(f, &s->tcnt); |
|
640 |
qemu_put_be16s(f, &s->rcnt); |
|
641 |
qemu_put_be32s(f, &s->rsar); |
|
642 |
qemu_put_8s(f, &s->rsr); |
|
643 |
qemu_put_8s(f, &s->isr); |
|
644 |
qemu_put_8s(f, &s->dcfg); |
|
645 |
qemu_put_8s(f, &s->imr); |
|
646 |
qemu_put_buffer(f, s->phys, 6); |
|
647 |
qemu_put_8s(f, &s->curpag); |
|
648 |
qemu_put_buffer(f, s->mult, 8); |
|
649 |
tmp = 0; |
|
650 |
qemu_put_be32s(f, &tmp); /* ignored, was irq */ |
|
651 |
qemu_put_buffer(f, s->mem, NE2000_MEM_SIZE); |
|
652 |
} |
|
653 |
|
|
654 |
int ne2000_load(QEMUFile* f, void* opaque, int version_id) |
|
655 |
{ |
|
656 |
NE2000State* s = opaque; |
|
657 |
uint32_t tmp; |
|
658 |
|
|
659 |
if (version_id > 3) |
|
660 |
return -EINVAL; |
|
661 |
|
|
662 |
if (version_id >= 2) { |
|
663 |
qemu_get_8s(f, &s->rxcr); |
|
664 |
} else { |
|
665 |
s->rxcr = 0x0c; |
|
666 |
} |
|
667 |
|
|
668 |
qemu_get_8s(f, &s->cmd); |
|
669 |
qemu_get_be32s(f, &s->start); |
|
670 |
qemu_get_be32s(f, &s->stop); |
|
671 |
qemu_get_8s(f, &s->boundary); |
|
672 |
qemu_get_8s(f, &s->tsr); |
|
673 |
qemu_get_8s(f, &s->tpsr); |
|
674 |
qemu_get_be16s(f, &s->tcnt); |
|
675 |
qemu_get_be16s(f, &s->rcnt); |
|
676 |
qemu_get_be32s(f, &s->rsar); |
|
677 |
qemu_get_8s(f, &s->rsr); |
|
678 |
qemu_get_8s(f, &s->isr); |
|
679 |
qemu_get_8s(f, &s->dcfg); |
|
680 |
qemu_get_8s(f, &s->imr); |
|
681 |
qemu_get_buffer(f, s->phys, 6); |
|
682 |
qemu_get_8s(f, &s->curpag); |
|
683 |
qemu_get_buffer(f, s->mult, 8); |
|
684 |
qemu_get_be32s(f, &tmp); /* ignored */ |
|
685 |
qemu_get_buffer(f, s->mem, NE2000_MEM_SIZE); |
|
686 |
|
|
687 |
return 0; |
|
688 |
} |
|
689 |
|
|
690 |
static void pci_ne2000_save(QEMUFile* f, void* opaque) |
|
691 |
{ |
|
692 |
PCINE2000State* s = opaque; |
|
628 |
NE2000State* s = opaque; |
|
693 | 629 |
|
694 |
pci_device_save(&s->dev, f); |
|
695 |
ne2000_save(f, &s->ne2000); |
|
630 |
if (version_id < 2) { |
|
631 |
s->rxcr = 0x0c; |
|
632 |
} |
|
633 |
return 0; |
|
696 | 634 |
} |
697 | 635 |
|
698 |
static int pci_ne2000_load(QEMUFile* f, void* opaque, int version_id) |
|
699 |
{ |
|
700 |
PCINE2000State* s = opaque; |
|
701 |
int ret; |
|
702 |
|
|
703 |
if (version_id > 3) |
|
704 |
return -EINVAL; |
|
705 |
|
|
706 |
if (version_id >= 3) { |
|
707 |
ret = pci_device_load(&s->dev, f); |
|
708 |
if (ret < 0) |
|
709 |
return ret; |
|
710 |
} |
|
636 |
const VMStateDescription vmstate_ne2000 = { |
|
637 |
.name = "ne2000", |
|
638 |
.version_id = 2, |
|
639 |
.minimum_version_id = 0, |
|
640 |
.minimum_version_id_old = 0, |
|
641 |
.post_load = ne2000_post_load, |
|
642 |
.fields = (VMStateField []) { |
|
643 |
VMSTATE_UINT8_V(rxcr, NE2000State, 2), |
|
644 |
VMSTATE_UINT8(cmd, NE2000State), |
|
645 |
VMSTATE_UINT32(start, NE2000State), |
|
646 |
VMSTATE_UINT32(stop, NE2000State), |
|
647 |
VMSTATE_UINT8(boundary, NE2000State), |
|
648 |
VMSTATE_UINT8(tsr, NE2000State), |
|
649 |
VMSTATE_UINT8(tpsr, NE2000State), |
|
650 |
VMSTATE_UINT16(tcnt, NE2000State), |
|
651 |
VMSTATE_UINT16(rcnt, NE2000State), |
|
652 |
VMSTATE_UINT32(rsar, NE2000State), |
|
653 |
VMSTATE_UINT8(rsr, NE2000State), |
|
654 |
VMSTATE_UINT8(isr, NE2000State), |
|
655 |
VMSTATE_UINT8(dcfg, NE2000State), |
|
656 |
VMSTATE_UINT8(imr, NE2000State), |
|
657 |
VMSTATE_BUFFER(phys, NE2000State), |
|
658 |
VMSTATE_UINT8(curpag, NE2000State), |
|
659 |
VMSTATE_BUFFER(mult, NE2000State), |
|
660 |
VMSTATE_UNUSED(4), /* was irq */ |
|
661 |
VMSTATE_BUFFER(mem, NE2000State), |
|
662 |
VMSTATE_END_OF_LIST() |
|
663 |
} |
|
664 |
}; |
|
711 | 665 |
|
712 |
return ne2000_load(f, &s->ne2000, version_id); |
|
713 |
} |
|
666 |
const VMStateDescription vmstate_pci_ne2000 = { |
|
667 |
.name = "ne2000", |
|
668 |
.version_id = 3, |
|
669 |
.minimum_version_id = 3, |
|
670 |
.minimum_version_id_old = 3, |
|
671 |
.fields = (VMStateField []) { |
|
672 |
VMSTATE_PCI_DEVICE(dev, PCINE2000State), |
|
673 |
VMSTATE_STRUCT(ne2000, PCINE2000State, 0, vmstate_ne2000, NE2000State), |
|
674 |
VMSTATE_END_OF_LIST() |
|
675 |
} |
|
676 |
}; |
|
714 | 677 |
|
715 | 678 |
/***********************************************************/ |
716 | 679 |
/* PCI NE2000 definitions */ |
... | ... | |
776 | 739 |
} |
777 | 740 |
} |
778 | 741 |
|
779 |
register_savevm("ne2000", -1, 3, pci_ne2000_save, pci_ne2000_load, d);
|
|
742 |
vmstate_register(-1, &vmstate_pci_ne2000, d);
|
|
780 | 743 |
return 0; |
781 | 744 |
} |
782 | 745 |
|
... | ... | |
785 | 748 |
PCINE2000State *d = DO_UPCAST(PCINE2000State, dev, pci_dev); |
786 | 749 |
NE2000State *s = &d->ne2000; |
787 | 750 |
|
788 |
unregister_savevm("ne2000", s);
|
|
751 |
vmstate_unregister(&vmstate_pci_ne2000, s);
|
|
789 | 752 |
qemu_del_vlan_client(s->vc); |
790 | 753 |
return 0; |
791 | 754 |
} |
Also available in: Unified diff