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, |