Commit 1941d19c657a8084603e88d7860786baa40c0e80
1 parent
89b6b508
PCI save/restore changes
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2115 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
50 additions
and
20 deletions
hw/ne2000.c
@@ -648,6 +648,9 @@ static void ne2000_save(QEMUFile* f,void* opaque) | @@ -648,6 +648,9 @@ static void ne2000_save(QEMUFile* f,void* opaque) | ||
648 | { | 648 | { |
649 | NE2000State* s=(NE2000State*)opaque; | 649 | NE2000State* s=(NE2000State*)opaque; |
650 | 650 | ||
651 | + if (s->pci_dev) | ||
652 | + pci_device_save(s->pci_dev, f); | ||
653 | + | ||
651 | qemu_put_8s(f, &s->rxcr); | 654 | qemu_put_8s(f, &s->rxcr); |
652 | 655 | ||
653 | qemu_put_8s(f, &s->cmd); | 656 | qemu_put_8s(f, &s->cmd); |
@@ -673,13 +676,21 @@ static void ne2000_save(QEMUFile* f,void* opaque) | @@ -673,13 +676,21 @@ static void ne2000_save(QEMUFile* f,void* opaque) | ||
673 | static int ne2000_load(QEMUFile* f,void* opaque,int version_id) | 676 | static int ne2000_load(QEMUFile* f,void* opaque,int version_id) |
674 | { | 677 | { |
675 | NE2000State* s=(NE2000State*)opaque; | 678 | NE2000State* s=(NE2000State*)opaque; |
679 | + int ret; | ||
680 | + | ||
681 | + if (version_id > 3) | ||
682 | + return -EINVAL; | ||
683 | + | ||
684 | + if (s->pci_dev && version_id >= 3) { | ||
685 | + ret = pci_device_load(s->pci_dev, f); | ||
686 | + if (ret < 0) | ||
687 | + return ret; | ||
688 | + } | ||
676 | 689 | ||
677 | - if (version_id == 2) { | 690 | + if (version_id >= 2) { |
678 | qemu_get_8s(f, &s->rxcr); | 691 | qemu_get_8s(f, &s->rxcr); |
679 | - } else if (version_id == 1) { | ||
680 | - s->rxcr = 0x0c; | ||
681 | } else { | 692 | } else { |
682 | - return -EINVAL; | 693 | + s->rxcr = 0x0c; |
683 | } | 694 | } |
684 | 695 | ||
685 | qemu_get_8s(f, &s->cmd); | 696 | qemu_get_8s(f, &s->cmd); |
@@ -810,7 +821,5 @@ void pci_ne2000_init(PCIBus *bus, NICInfo *nd) | @@ -810,7 +821,5 @@ void pci_ne2000_init(PCIBus *bus, NICInfo *nd) | ||
810 | s->macaddr[5]); | 821 | s->macaddr[5]); |
811 | 822 | ||
812 | /* XXX: instance number ? */ | 823 | /* XXX: instance number ? */ |
813 | - register_savevm("ne2000", 0, 2, ne2000_save, ne2000_load, s); | ||
814 | - register_savevm("ne2000_pci", 0, 1, generic_pci_save, generic_pci_load, | ||
815 | - &d->dev); | 824 | + register_savevm("ne2000", 0, 3, ne2000_save, ne2000_load, s); |
816 | } | 825 | } |
hw/pci.c
@@ -36,6 +36,8 @@ struct PCIBus { | @@ -36,6 +36,8 @@ struct PCIBus { | ||
36 | PCIDevice *devices[256]; | 36 | PCIDevice *devices[256]; |
37 | }; | 37 | }; |
38 | 38 | ||
39 | +static void pci_update_mappings(PCIDevice *d); | ||
40 | + | ||
39 | target_phys_addr_t pci_mem_base; | 41 | target_phys_addr_t pci_mem_base; |
40 | static int pci_irq_index; | 42 | static int pci_irq_index; |
41 | static PCIBus *first_bus; | 43 | static PCIBus *first_bus; |
@@ -56,21 +58,20 @@ int pci_bus_num(PCIBus *s) | @@ -56,21 +58,20 @@ int pci_bus_num(PCIBus *s) | ||
56 | return s->bus_num; | 58 | return s->bus_num; |
57 | } | 59 | } |
58 | 60 | ||
59 | -void generic_pci_save(QEMUFile* f, void *opaque) | 61 | +void pci_device_save(PCIDevice *s, QEMUFile *f) |
60 | { | 62 | { |
61 | - PCIDevice* s=(PCIDevice*)opaque; | ||
62 | - | 63 | + qemu_put_be32(f, 1); /* PCI device version */ |
63 | qemu_put_buffer(f, s->config, 256); | 64 | qemu_put_buffer(f, s->config, 256); |
64 | } | 65 | } |
65 | 66 | ||
66 | -int generic_pci_load(QEMUFile* f, void *opaque, int version_id) | 67 | +int pci_device_load(PCIDevice *s, QEMUFile *f) |
67 | { | 68 | { |
68 | - PCIDevice* s=(PCIDevice*)opaque; | ||
69 | - | 69 | + uint32_t version_id; |
70 | + version_id = qemu_get_be32(f); | ||
70 | if (version_id != 1) | 71 | if (version_id != 1) |
71 | return -EINVAL; | 72 | return -EINVAL; |
72 | - | ||
73 | qemu_get_buffer(f, s->config, 256); | 73 | qemu_get_buffer(f, s->config, 256); |
74 | + pci_update_mappings(s); | ||
74 | return 0; | 75 | return 0; |
75 | } | 76 | } |
76 | 77 |
hw/piix_pci.c
@@ -181,6 +181,20 @@ static void piix3_reset(PCIDevice *d) | @@ -181,6 +181,20 @@ static void piix3_reset(PCIDevice *d) | ||
181 | pci_conf[0xae] = 0x00; | 181 | pci_conf[0xae] = 0x00; |
182 | } | 182 | } |
183 | 183 | ||
184 | +static void piix_save(QEMUFile* f, void *opaque) | ||
185 | +{ | ||
186 | + PCIDevice *d = opaque; | ||
187 | + pci_device_save(d, f); | ||
188 | +} | ||
189 | + | ||
190 | +static int piix_load(QEMUFile* f, void *opaque, int version_id) | ||
191 | +{ | ||
192 | + PCIDevice *d = opaque; | ||
193 | + if (version_id != 2) | ||
194 | + return -EINVAL; | ||
195 | + return pci_device_load(d, f); | ||
196 | +} | ||
197 | + | ||
184 | int piix3_init(PCIBus *bus) | 198 | int piix3_init(PCIBus *bus) |
185 | { | 199 | { |
186 | PCIDevice *d; | 200 | PCIDevice *d; |
@@ -188,7 +202,7 @@ int piix3_init(PCIBus *bus) | @@ -188,7 +202,7 @@ int piix3_init(PCIBus *bus) | ||
188 | 202 | ||
189 | d = pci_register_device(bus, "PIIX3", sizeof(PCIDevice), | 203 | d = pci_register_device(bus, "PIIX3", sizeof(PCIDevice), |
190 | -1, NULL, NULL); | 204 | -1, NULL, NULL); |
191 | - register_savevm("PIIX3", 0, 1, generic_pci_save, generic_pci_load, d); | 205 | + register_savevm("PIIX3", 0, 2, piix_save, piix_load, d); |
192 | 206 | ||
193 | piix3_dev = d; | 207 | piix3_dev = d; |
194 | pci_conf = d->config; | 208 | pci_conf = d->config; |
hw/rtl8139.c
@@ -3122,6 +3122,8 @@ static void rtl8139_save(QEMUFile* f,void* opaque) | @@ -3122,6 +3122,8 @@ static void rtl8139_save(QEMUFile* f,void* opaque) | ||
3122 | RTL8139State* s=(RTL8139State*)opaque; | 3122 | RTL8139State* s=(RTL8139State*)opaque; |
3123 | int i; | 3123 | int i; |
3124 | 3124 | ||
3125 | + pci_device_save(s->pci_dev, f); | ||
3126 | + | ||
3125 | qemu_put_buffer(f, s->phys, 6); | 3127 | qemu_put_buffer(f, s->phys, 6); |
3126 | qemu_put_buffer(f, s->mult, 8); | 3128 | qemu_put_buffer(f, s->mult, 8); |
3127 | 3129 | ||
@@ -3203,12 +3205,18 @@ static void rtl8139_save(QEMUFile* f,void* opaque) | @@ -3203,12 +3205,18 @@ static void rtl8139_save(QEMUFile* f,void* opaque) | ||
3203 | static int rtl8139_load(QEMUFile* f,void* opaque,int version_id) | 3205 | static int rtl8139_load(QEMUFile* f,void* opaque,int version_id) |
3204 | { | 3206 | { |
3205 | RTL8139State* s=(RTL8139State*)opaque; | 3207 | RTL8139State* s=(RTL8139State*)opaque; |
3206 | - int i; | 3208 | + int i, ret; |
3207 | 3209 | ||
3208 | /* just 2 versions for now */ | 3210 | /* just 2 versions for now */ |
3209 | - if (version_id > 2) | 3211 | + if (version_id > 3) |
3210 | return -EINVAL; | 3212 | return -EINVAL; |
3211 | 3213 | ||
3214 | + if (version_id >= 3) { | ||
3215 | + ret = pci_device_load(s->pci_dev, f); | ||
3216 | + if (ret < 0) | ||
3217 | + return ret; | ||
3218 | + } | ||
3219 | + | ||
3212 | /* saved since version 1 */ | 3220 | /* saved since version 1 */ |
3213 | qemu_get_buffer(f, s->phys, 6); | 3221 | qemu_get_buffer(f, s->phys, 6); |
3214 | qemu_get_buffer(f, s->mult, 8); | 3222 | qemu_get_buffer(f, s->mult, 8); |
@@ -3457,9 +3465,7 @@ void pci_rtl8139_init(PCIBus *bus, NICInfo *nd) | @@ -3457,9 +3465,7 @@ void pci_rtl8139_init(PCIBus *bus, NICInfo *nd) | ||
3457 | s->cplus_txbuffer_offset = 0; | 3465 | s->cplus_txbuffer_offset = 0; |
3458 | 3466 | ||
3459 | /* XXX: instance number ? */ | 3467 | /* XXX: instance number ? */ |
3460 | - register_savevm("rtl8139", 0, 2, rtl8139_save, rtl8139_load, s); | ||
3461 | - register_savevm("rtl8139_pci", 0, 1, generic_pci_save, generic_pci_load, | ||
3462 | - &d->dev); | 3468 | + register_savevm("rtl8139", 0, 3, rtl8139_save, rtl8139_load, s); |
3463 | 3469 | ||
3464 | #if RTL8139_ONBOARD_TIMER | 3470 | #if RTL8139_ONBOARD_TIMER |
3465 | s->timer = qemu_new_timer(vm_clock, rtl8139_timer, s); | 3471 | s->timer = qemu_new_timer(vm_clock, rtl8139_timer, s); |