Revision 1941d19c
b/hw/ne2000.c | ||
---|---|---|
648 | 648 |
{ |
649 | 649 |
NE2000State* s=(NE2000State*)opaque; |
650 | 650 |
|
651 |
if (s->pci_dev) |
|
652 |
pci_device_save(s->pci_dev, f); |
|
653 |
|
|
651 | 654 |
qemu_put_8s(f, &s->rxcr); |
652 | 655 |
|
653 | 656 |
qemu_put_8s(f, &s->cmd); |
... | ... | |
673 | 676 |
static int ne2000_load(QEMUFile* f,void* opaque,int version_id) |
674 | 677 |
{ |
675 | 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 | 691 |
qemu_get_8s(f, &s->rxcr); |
679 |
} else if (version_id == 1) { |
|
680 |
s->rxcr = 0x0c; |
|
681 | 692 |
} else { |
682 |
return -EINVAL;
|
|
693 |
s->rxcr = 0x0c;
|
|
683 | 694 |
} |
684 | 695 |
|
685 | 696 |
qemu_get_8s(f, &s->cmd); |
... | ... | |
810 | 821 |
s->macaddr[5]); |
811 | 822 |
|
812 | 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 |
} |
b/hw/pci.c | ||
---|---|---|
36 | 36 |
PCIDevice *devices[256]; |
37 | 37 |
}; |
38 | 38 |
|
39 |
static void pci_update_mappings(PCIDevice *d); |
|
40 |
|
|
39 | 41 |
target_phys_addr_t pci_mem_base; |
40 | 42 |
static int pci_irq_index; |
41 | 43 |
static PCIBus *first_bus; |
... | ... | |
56 | 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 | 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 | 71 |
if (version_id != 1) |
71 | 72 |
return -EINVAL; |
72 |
|
|
73 | 73 |
qemu_get_buffer(f, s->config, 256); |
74 |
pci_update_mappings(s); |
|
74 | 75 |
return 0; |
75 | 76 |
} |
76 | 77 |
|
b/hw/piix_pci.c | ||
---|---|---|
181 | 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 | 198 |
int piix3_init(PCIBus *bus) |
185 | 199 |
{ |
186 | 200 |
PCIDevice *d; |
... | ... | |
188 | 202 |
|
189 | 203 |
d = pci_register_device(bus, "PIIX3", sizeof(PCIDevice), |
190 | 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 | 207 |
piix3_dev = d; |
194 | 208 |
pci_conf = d->config; |
b/hw/rtl8139.c | ||
---|---|---|
3122 | 3122 |
RTL8139State* s=(RTL8139State*)opaque; |
3123 | 3123 |
int i; |
3124 | 3124 |
|
3125 |
pci_device_save(s->pci_dev, f); |
|
3126 |
|
|
3125 | 3127 |
qemu_put_buffer(f, s->phys, 6); |
3126 | 3128 |
qemu_put_buffer(f, s->mult, 8); |
3127 | 3129 |
|
... | ... | |
3203 | 3205 |
static int rtl8139_load(QEMUFile* f,void* opaque,int version_id) |
3204 | 3206 |
{ |
3205 | 3207 |
RTL8139State* s=(RTL8139State*)opaque; |
3206 |
int i; |
|
3208 |
int i, ret;
|
|
3207 | 3209 |
|
3208 | 3210 |
/* just 2 versions for now */ |
3209 |
if (version_id > 2)
|
|
3211 |
if (version_id > 3)
|
|
3210 | 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 | 3220 |
/* saved since version 1 */ |
3213 | 3221 |
qemu_get_buffer(f, s->phys, 6); |
3214 | 3222 |
qemu_get_buffer(f, s->mult, 8); |
... | ... | |
3457 | 3465 |
s->cplus_txbuffer_offset = 0; |
3458 | 3466 |
|
3459 | 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 | 3470 |
#if RTL8139_ONBOARD_TIMER |
3465 | 3471 |
s->timer = qemu_new_timer(vm_clock, rtl8139_timer, s); |
Also available in: Unified diff