From 2657c6633280f6ed9b1b5e75a6c60f069b39f702 Mon Sep 17 00:00:00 2001 From: balrog Date: Mon, 2 Jul 2007 13:38:46 +0000 Subject: [PATCH] E100 savevm/loadvm support, patch by Jason Wessel. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3041 c046a42c-6fe2-441c-8c8c-71466251a162 --- hw/eepro100.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 98 insertions(+), 4 deletions(-) diff --git a/hw/eepro100.c b/hw/eepro100.c index bb570675a8..c39d36483d 100644 --- a/hw/eepro100.c +++ b/hw/eepro100.c @@ -1571,10 +1571,9 @@ static void nic_receive(void *opaque, const uint8_t * buf, int size) static int nic_load(QEMUFile * f, void *opaque, int version_id) { EEPRO100State *s = (EEPRO100State *) opaque; + int i; int ret; - missing("NIC load"); - if (version_id > 3) return -EINVAL; @@ -1608,14 +1607,61 @@ static int nic_load(QEMUFile * f, void *opaque, int version_id) qemu_get_buffer(f, s->mult, 8); qemu_get_buffer(f, s->mem, sizeof(s->mem)); + /* Restore all members of struct between scv_stat and mem */ + qemu_get_8s(f, &s->scb_stat); + qemu_get_8s(f, &s->int_stat); + for (i = 0; i < 3; i++) + qemu_get_be32s(f, &s->region[i]); + qemu_get_buffer(f, s->macaddr, 6); + for (i = 0; i < 19; i++) + qemu_get_be32s(f, &s->statcounter[i]); + for (i = 0; i < 32; i++) + qemu_get_be16s(f, &s->mdimem[i]); + /* The eeprom should be saved and restored by its own routines */ + qemu_get_be32s(f, &s->device); + qemu_get_be32s(f, &s->pointer); + qemu_get_be32s(f, &s->cu_base); + qemu_get_be32s(f, &s->cu_offset); + qemu_get_be32s(f, &s->ru_base); + qemu_get_be32s(f, &s->ru_offset); + qemu_get_be32s(f, &s->statsaddr); + /* Restore epro100_stats_t statistics */ + qemu_get_be32s(f, &s->statistics.tx_good_frames); + qemu_get_be32s(f, &s->statistics.tx_max_collisions); + qemu_get_be32s(f, &s->statistics.tx_late_collisions); + qemu_get_be32s(f, &s->statistics.tx_underruns); + qemu_get_be32s(f, &s->statistics.tx_lost_crs); + qemu_get_be32s(f, &s->statistics.tx_deferred); + qemu_get_be32s(f, &s->statistics.tx_single_collisions); + qemu_get_be32s(f, &s->statistics.tx_multiple_collisions); + qemu_get_be32s(f, &s->statistics.tx_total_collisions); + qemu_get_be32s(f, &s->statistics.rx_good_frames); + qemu_get_be32s(f, &s->statistics.rx_crc_errors); + qemu_get_be32s(f, &s->statistics.rx_alignment_errors); + qemu_get_be32s(f, &s->statistics.rx_resource_errors); + qemu_get_be32s(f, &s->statistics.rx_overrun_errors); + qemu_get_be32s(f, &s->statistics.rx_cdt_errors); + qemu_get_be32s(f, &s->statistics.rx_short_frame_errors); + qemu_get_be32s(f, &s->statistics.fc_xmt_pause); + qemu_get_be32s(f, &s->statistics.fc_rcv_pause); + qemu_get_be32s(f, &s->statistics.fc_rcv_unsupported); + qemu_get_be16s(f, &s->statistics.xmt_tco_frames); + qemu_get_be16s(f, &s->statistics.rcv_tco_frames); + qemu_get_be32s(f, &s->statistics.complete); +#if 0 + qemu_get_be16s(f, &s->status); +#endif + + /* Configuration bytes. */ + qemu_get_buffer(f, s->configuration, sizeof(s->configuration)); + return 0; } static void nic_save(QEMUFile * f, void *opaque) { EEPRO100State *s = (EEPRO100State *) opaque; - - missing("NIC save"); + int i; if (s->pci_dev) pci_device_save(s->pci_dev, f); @@ -1639,6 +1685,54 @@ static void nic_save(QEMUFile * f, void *opaque) qemu_put_8s(f, &s->curpag); qemu_put_buffer(f, s->mult, 8); qemu_put_buffer(f, s->mem, sizeof(s->mem)); + + /* Save all members of struct between scv_stat and mem */ + qemu_put_8s(f, &s->scb_stat); + qemu_put_8s(f, &s->int_stat); + for (i = 0; i < 3; i++) + qemu_put_be32s(f, &s->region[i]); + qemu_put_buffer(f, s->macaddr, 6); + for (i = 0; i < 19; i++) + qemu_put_be32s(f, &s->statcounter[i]); + for (i = 0; i < 32; i++) + qemu_put_be16s(f, &s->mdimem[i]); + /* The eeprom should be saved and restored by its own routines */ + qemu_put_be32s(f, &s->device); + qemu_put_be32s(f, &s->pointer); + qemu_put_be32s(f, &s->cu_base); + qemu_put_be32s(f, &s->cu_offset); + qemu_put_be32s(f, &s->ru_base); + qemu_put_be32s(f, &s->ru_offset); + qemu_put_be32s(f, &s->statsaddr); + /* Save epro100_stats_t statistics */ + qemu_put_be32s(f, &s->statistics.tx_good_frames); + qemu_put_be32s(f, &s->statistics.tx_max_collisions); + qemu_put_be32s(f, &s->statistics.tx_late_collisions); + qemu_put_be32s(f, &s->statistics.tx_underruns); + qemu_put_be32s(f, &s->statistics.tx_lost_crs); + qemu_put_be32s(f, &s->statistics.tx_deferred); + qemu_put_be32s(f, &s->statistics.tx_single_collisions); + qemu_put_be32s(f, &s->statistics.tx_multiple_collisions); + qemu_put_be32s(f, &s->statistics.tx_total_collisions); + qemu_put_be32s(f, &s->statistics.rx_good_frames); + qemu_put_be32s(f, &s->statistics.rx_crc_errors); + qemu_put_be32s(f, &s->statistics.rx_alignment_errors); + qemu_put_be32s(f, &s->statistics.rx_resource_errors); + qemu_put_be32s(f, &s->statistics.rx_overrun_errors); + qemu_put_be32s(f, &s->statistics.rx_cdt_errors); + qemu_put_be32s(f, &s->statistics.rx_short_frame_errors); + qemu_put_be32s(f, &s->statistics.fc_xmt_pause); + qemu_put_be32s(f, &s->statistics.fc_rcv_pause); + qemu_put_be32s(f, &s->statistics.fc_rcv_unsupported); + qemu_put_be16s(f, &s->statistics.xmt_tco_frames); + qemu_put_be16s(f, &s->statistics.rcv_tco_frames); + qemu_put_be32s(f, &s->statistics.complete); +#if 0 + qemu_put_be16s(f, &s->status); +#endif + + /* Configuration bytes. */ + qemu_put_buffer(f, s->configuration, sizeof(s->configuration)); } static void nic_init(PCIBus * bus, NICInfo * nd, -- GitLab