Commit 2657c6633280f6ed9b1b5e75a6c60f069b39f702
1 parent
fbd1711d
E100 savevm/loadvm support, patch by Jason Wessel.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3041 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
98 additions
and
4 deletions
hw/eepro100.c
... | ... | @@ -1571,10 +1571,9 @@ static void nic_receive(void *opaque, const uint8_t * buf, int size) |
1571 | 1571 | static int nic_load(QEMUFile * f, void *opaque, int version_id) |
1572 | 1572 | { |
1573 | 1573 | EEPRO100State *s = (EEPRO100State *) opaque; |
1574 | + int i; | |
1574 | 1575 | int ret; |
1575 | 1576 | |
1576 | - missing("NIC load"); | |
1577 | - | |
1578 | 1577 | if (version_id > 3) |
1579 | 1578 | return -EINVAL; |
1580 | 1579 | |
... | ... | @@ -1608,14 +1607,61 @@ static int nic_load(QEMUFile * f, void *opaque, int version_id) |
1608 | 1607 | qemu_get_buffer(f, s->mult, 8); |
1609 | 1608 | qemu_get_buffer(f, s->mem, sizeof(s->mem)); |
1610 | 1609 | |
1610 | + /* Restore all members of struct between scv_stat and mem */ | |
1611 | + qemu_get_8s(f, &s->scb_stat); | |
1612 | + qemu_get_8s(f, &s->int_stat); | |
1613 | + for (i = 0; i < 3; i++) | |
1614 | + qemu_get_be32s(f, &s->region[i]); | |
1615 | + qemu_get_buffer(f, s->macaddr, 6); | |
1616 | + for (i = 0; i < 19; i++) | |
1617 | + qemu_get_be32s(f, &s->statcounter[i]); | |
1618 | + for (i = 0; i < 32; i++) | |
1619 | + qemu_get_be16s(f, &s->mdimem[i]); | |
1620 | + /* The eeprom should be saved and restored by its own routines */ | |
1621 | + qemu_get_be32s(f, &s->device); | |
1622 | + qemu_get_be32s(f, &s->pointer); | |
1623 | + qemu_get_be32s(f, &s->cu_base); | |
1624 | + qemu_get_be32s(f, &s->cu_offset); | |
1625 | + qemu_get_be32s(f, &s->ru_base); | |
1626 | + qemu_get_be32s(f, &s->ru_offset); | |
1627 | + qemu_get_be32s(f, &s->statsaddr); | |
1628 | + /* Restore epro100_stats_t statistics */ | |
1629 | + qemu_get_be32s(f, &s->statistics.tx_good_frames); | |
1630 | + qemu_get_be32s(f, &s->statistics.tx_max_collisions); | |
1631 | + qemu_get_be32s(f, &s->statistics.tx_late_collisions); | |
1632 | + qemu_get_be32s(f, &s->statistics.tx_underruns); | |
1633 | + qemu_get_be32s(f, &s->statistics.tx_lost_crs); | |
1634 | + qemu_get_be32s(f, &s->statistics.tx_deferred); | |
1635 | + qemu_get_be32s(f, &s->statistics.tx_single_collisions); | |
1636 | + qemu_get_be32s(f, &s->statistics.tx_multiple_collisions); | |
1637 | + qemu_get_be32s(f, &s->statistics.tx_total_collisions); | |
1638 | + qemu_get_be32s(f, &s->statistics.rx_good_frames); | |
1639 | + qemu_get_be32s(f, &s->statistics.rx_crc_errors); | |
1640 | + qemu_get_be32s(f, &s->statistics.rx_alignment_errors); | |
1641 | + qemu_get_be32s(f, &s->statistics.rx_resource_errors); | |
1642 | + qemu_get_be32s(f, &s->statistics.rx_overrun_errors); | |
1643 | + qemu_get_be32s(f, &s->statistics.rx_cdt_errors); | |
1644 | + qemu_get_be32s(f, &s->statistics.rx_short_frame_errors); | |
1645 | + qemu_get_be32s(f, &s->statistics.fc_xmt_pause); | |
1646 | + qemu_get_be32s(f, &s->statistics.fc_rcv_pause); | |
1647 | + qemu_get_be32s(f, &s->statistics.fc_rcv_unsupported); | |
1648 | + qemu_get_be16s(f, &s->statistics.xmt_tco_frames); | |
1649 | + qemu_get_be16s(f, &s->statistics.rcv_tco_frames); | |
1650 | + qemu_get_be32s(f, &s->statistics.complete); | |
1651 | +#if 0 | |
1652 | + qemu_get_be16s(f, &s->status); | |
1653 | +#endif | |
1654 | + | |
1655 | + /* Configuration bytes. */ | |
1656 | + qemu_get_buffer(f, s->configuration, sizeof(s->configuration)); | |
1657 | + | |
1611 | 1658 | return 0; |
1612 | 1659 | } |
1613 | 1660 | |
1614 | 1661 | static void nic_save(QEMUFile * f, void *opaque) |
1615 | 1662 | { |
1616 | 1663 | EEPRO100State *s = (EEPRO100State *) opaque; |
1617 | - | |
1618 | - missing("NIC save"); | |
1664 | + int i; | |
1619 | 1665 | |
1620 | 1666 | if (s->pci_dev) |
1621 | 1667 | pci_device_save(s->pci_dev, f); |
... | ... | @@ -1639,6 +1685,54 @@ static void nic_save(QEMUFile * f, void *opaque) |
1639 | 1685 | qemu_put_8s(f, &s->curpag); |
1640 | 1686 | qemu_put_buffer(f, s->mult, 8); |
1641 | 1687 | qemu_put_buffer(f, s->mem, sizeof(s->mem)); |
1688 | + | |
1689 | + /* Save all members of struct between scv_stat and mem */ | |
1690 | + qemu_put_8s(f, &s->scb_stat); | |
1691 | + qemu_put_8s(f, &s->int_stat); | |
1692 | + for (i = 0; i < 3; i++) | |
1693 | + qemu_put_be32s(f, &s->region[i]); | |
1694 | + qemu_put_buffer(f, s->macaddr, 6); | |
1695 | + for (i = 0; i < 19; i++) | |
1696 | + qemu_put_be32s(f, &s->statcounter[i]); | |
1697 | + for (i = 0; i < 32; i++) | |
1698 | + qemu_put_be16s(f, &s->mdimem[i]); | |
1699 | + /* The eeprom should be saved and restored by its own routines */ | |
1700 | + qemu_put_be32s(f, &s->device); | |
1701 | + qemu_put_be32s(f, &s->pointer); | |
1702 | + qemu_put_be32s(f, &s->cu_base); | |
1703 | + qemu_put_be32s(f, &s->cu_offset); | |
1704 | + qemu_put_be32s(f, &s->ru_base); | |
1705 | + qemu_put_be32s(f, &s->ru_offset); | |
1706 | + qemu_put_be32s(f, &s->statsaddr); | |
1707 | + /* Save epro100_stats_t statistics */ | |
1708 | + qemu_put_be32s(f, &s->statistics.tx_good_frames); | |
1709 | + qemu_put_be32s(f, &s->statistics.tx_max_collisions); | |
1710 | + qemu_put_be32s(f, &s->statistics.tx_late_collisions); | |
1711 | + qemu_put_be32s(f, &s->statistics.tx_underruns); | |
1712 | + qemu_put_be32s(f, &s->statistics.tx_lost_crs); | |
1713 | + qemu_put_be32s(f, &s->statistics.tx_deferred); | |
1714 | + qemu_put_be32s(f, &s->statistics.tx_single_collisions); | |
1715 | + qemu_put_be32s(f, &s->statistics.tx_multiple_collisions); | |
1716 | + qemu_put_be32s(f, &s->statistics.tx_total_collisions); | |
1717 | + qemu_put_be32s(f, &s->statistics.rx_good_frames); | |
1718 | + qemu_put_be32s(f, &s->statistics.rx_crc_errors); | |
1719 | + qemu_put_be32s(f, &s->statistics.rx_alignment_errors); | |
1720 | + qemu_put_be32s(f, &s->statistics.rx_resource_errors); | |
1721 | + qemu_put_be32s(f, &s->statistics.rx_overrun_errors); | |
1722 | + qemu_put_be32s(f, &s->statistics.rx_cdt_errors); | |
1723 | + qemu_put_be32s(f, &s->statistics.rx_short_frame_errors); | |
1724 | + qemu_put_be32s(f, &s->statistics.fc_xmt_pause); | |
1725 | + qemu_put_be32s(f, &s->statistics.fc_rcv_pause); | |
1726 | + qemu_put_be32s(f, &s->statistics.fc_rcv_unsupported); | |
1727 | + qemu_put_be16s(f, &s->statistics.xmt_tco_frames); | |
1728 | + qemu_put_be16s(f, &s->statistics.rcv_tco_frames); | |
1729 | + qemu_put_be32s(f, &s->statistics.complete); | |
1730 | +#if 0 | |
1731 | + qemu_put_be16s(f, &s->status); | |
1732 | +#endif | |
1733 | + | |
1734 | + /* Configuration bytes. */ | |
1735 | + qemu_put_buffer(f, s->configuration, sizeof(s->configuration)); | |
1642 | 1736 | } |
1643 | 1737 | |
1644 | 1738 | static void nic_init(PCIBus * bus, NICInfo * nd, | ... | ... |