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,10 +1571,9 @@ static void nic_receive(void *opaque, const uint8_t * buf, int size) | ||
1571 | static int nic_load(QEMUFile * f, void *opaque, int version_id) | 1571 | static int nic_load(QEMUFile * f, void *opaque, int version_id) |
1572 | { | 1572 | { |
1573 | EEPRO100State *s = (EEPRO100State *) opaque; | 1573 | EEPRO100State *s = (EEPRO100State *) opaque; |
1574 | + int i; | ||
1574 | int ret; | 1575 | int ret; |
1575 | 1576 | ||
1576 | - missing("NIC load"); | ||
1577 | - | ||
1578 | if (version_id > 3) | 1577 | if (version_id > 3) |
1579 | return -EINVAL; | 1578 | return -EINVAL; |
1580 | 1579 | ||
@@ -1608,14 +1607,61 @@ static int nic_load(QEMUFile * f, void *opaque, int version_id) | @@ -1608,14 +1607,61 @@ static int nic_load(QEMUFile * f, void *opaque, int version_id) | ||
1608 | qemu_get_buffer(f, s->mult, 8); | 1607 | qemu_get_buffer(f, s->mult, 8); |
1609 | qemu_get_buffer(f, s->mem, sizeof(s->mem)); | 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 | return 0; | 1658 | return 0; |
1612 | } | 1659 | } |
1613 | 1660 | ||
1614 | static void nic_save(QEMUFile * f, void *opaque) | 1661 | static void nic_save(QEMUFile * f, void *opaque) |
1615 | { | 1662 | { |
1616 | EEPRO100State *s = (EEPRO100State *) opaque; | 1663 | EEPRO100State *s = (EEPRO100State *) opaque; |
1617 | - | ||
1618 | - missing("NIC save"); | 1664 | + int i; |
1619 | 1665 | ||
1620 | if (s->pci_dev) | 1666 | if (s->pci_dev) |
1621 | pci_device_save(s->pci_dev, f); | 1667 | pci_device_save(s->pci_dev, f); |
@@ -1639,6 +1685,54 @@ static void nic_save(QEMUFile * f, void *opaque) | @@ -1639,6 +1685,54 @@ static void nic_save(QEMUFile * f, void *opaque) | ||
1639 | qemu_put_8s(f, &s->curpag); | 1685 | qemu_put_8s(f, &s->curpag); |
1640 | qemu_put_buffer(f, s->mult, 8); | 1686 | qemu_put_buffer(f, s->mult, 8); |
1641 | qemu_put_buffer(f, s->mem, sizeof(s->mem)); | 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 | static void nic_init(PCIBus * bus, NICInfo * nd, | 1738 | static void nic_init(PCIBus * bus, NICInfo * nd, |