ne2000 savevm support (Johannes Schindelin)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1092 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
8a8a608f6e
commit
30ca2aab8e
63
hw/ne2000.c
63
hw/ne2000.c
@ -538,6 +538,59 @@ static uint32_t ne2000_reset_ioport_read(void *opaque, uint32_t addr)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ne2000_save(QEMUFile* f,void* opaque)
|
||||||
|
{
|
||||||
|
NE2000State* s=(NE2000State*)opaque;
|
||||||
|
|
||||||
|
qemu_put_8s(f, &s->cmd);
|
||||||
|
qemu_put_be32s(f, &s->start);
|
||||||
|
qemu_put_be32s(f, &s->stop);
|
||||||
|
qemu_put_8s(f, &s->boundary);
|
||||||
|
qemu_put_8s(f, &s->tsr);
|
||||||
|
qemu_put_8s(f, &s->tpsr);
|
||||||
|
qemu_put_be16s(f, &s->tcnt);
|
||||||
|
qemu_put_be16s(f, &s->rcnt);
|
||||||
|
qemu_put_be32s(f, &s->rsar);
|
||||||
|
qemu_put_8s(f, &s->rsr);
|
||||||
|
qemu_put_8s(f, &s->isr);
|
||||||
|
qemu_put_8s(f, &s->dcfg);
|
||||||
|
qemu_put_8s(f, &s->imr);
|
||||||
|
qemu_put_buffer(f, s->phys, 6);
|
||||||
|
qemu_put_8s(f, &s->curpag);
|
||||||
|
qemu_put_buffer(f, s->mult, 8);
|
||||||
|
qemu_put_be32s(f, &s->irq);
|
||||||
|
qemu_put_buffer(f, s->mem, NE2000_MEM_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ne2000_load(QEMUFile* f,void* opaque,int version_id)
|
||||||
|
{
|
||||||
|
NE2000State* s=(NE2000State*)opaque;
|
||||||
|
|
||||||
|
if (version_id != 1)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
qemu_get_8s(f, &s->cmd);
|
||||||
|
qemu_get_be32s(f, &s->start);
|
||||||
|
qemu_get_be32s(f, &s->stop);
|
||||||
|
qemu_get_8s(f, &s->boundary);
|
||||||
|
qemu_get_8s(f, &s->tsr);
|
||||||
|
qemu_get_8s(f, &s->tpsr);
|
||||||
|
qemu_get_be16s(f, &s->tcnt);
|
||||||
|
qemu_get_be16s(f, &s->rcnt);
|
||||||
|
qemu_get_be32s(f, &s->rsar);
|
||||||
|
qemu_get_8s(f, &s->rsr);
|
||||||
|
qemu_get_8s(f, &s->isr);
|
||||||
|
qemu_get_8s(f, &s->dcfg);
|
||||||
|
qemu_get_8s(f, &s->imr);
|
||||||
|
qemu_get_buffer(f, s->phys, 6);
|
||||||
|
qemu_get_8s(f, &s->curpag);
|
||||||
|
qemu_get_buffer(f, s->mult, 8);
|
||||||
|
qemu_get_be32s(f, &s->irq);
|
||||||
|
qemu_get_buffer(f, s->mem, NE2000_MEM_SIZE);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void isa_ne2000_init(int base, int irq, NetDriverState *nd)
|
void isa_ne2000_init(int base, int irq, NetDriverState *nd)
|
||||||
{
|
{
|
||||||
NE2000State *s;
|
NE2000State *s;
|
||||||
@ -562,6 +615,9 @@ void isa_ne2000_init(int base, int irq, NetDriverState *nd)
|
|||||||
ne2000_reset(s);
|
ne2000_reset(s);
|
||||||
|
|
||||||
qemu_add_read_packet(nd, ne2000_can_receive, ne2000_receive, s);
|
qemu_add_read_packet(nd, ne2000_can_receive, ne2000_receive, s);
|
||||||
|
|
||||||
|
register_savevm("ne2000", 0, 1, ne2000_save, ne2000_load, s);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************/
|
/***********************************************************/
|
||||||
@ -612,7 +668,7 @@ void pci_ne2000_init(PCIBus *bus, NetDriverState *nd)
|
|||||||
pci_conf[0x0e] = 0x00; // header_type
|
pci_conf[0x0e] = 0x00; // header_type
|
||||||
pci_conf[0x3d] = 1; // interrupt pin 0
|
pci_conf[0x3d] = 1; // interrupt pin 0
|
||||||
|
|
||||||
pci_register_io_region((PCIDevice *)d, 0, 0x100,
|
pci_register_io_region(&d->dev, 0, 0x100,
|
||||||
PCI_ADDRESS_SPACE_IO, ne2000_map);
|
PCI_ADDRESS_SPACE_IO, ne2000_map);
|
||||||
s = &d->ne2000;
|
s = &d->ne2000;
|
||||||
s->irq = 16; // PCI interrupt
|
s->irq = 16; // PCI interrupt
|
||||||
@ -620,4 +676,9 @@ void pci_ne2000_init(PCIBus *bus, NetDriverState *nd)
|
|||||||
s->nd = nd;
|
s->nd = nd;
|
||||||
ne2000_reset(s);
|
ne2000_reset(s);
|
||||||
qemu_add_read_packet(nd, ne2000_can_receive, ne2000_receive, s);
|
qemu_add_read_packet(nd, ne2000_can_receive, ne2000_receive, s);
|
||||||
|
|
||||||
|
/* XXX: instance number ? */
|
||||||
|
register_savevm("ne2000", 0, 1, ne2000_save, ne2000_load, s);
|
||||||
|
register_savevm("ne2000_pci", 0, 1, generic_pci_save, generic_pci_load,
|
||||||
|
&d->dev);
|
||||||
}
|
}
|
||||||
|
20
hw/pci.c
20
hw/pci.c
@ -62,6 +62,24 @@ static PCIBus *pci_register_bus(void)
|
|||||||
return bus;
|
return bus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void generic_pci_save(QEMUFile* f, void *opaque)
|
||||||
|
{
|
||||||
|
PCIDevice* s=(PCIDevice*)opaque;
|
||||||
|
|
||||||
|
qemu_put_buffer(f, s->config, 256);
|
||||||
|
}
|
||||||
|
|
||||||
|
int generic_pci_load(QEMUFile* f, void *opaque, int version_id)
|
||||||
|
{
|
||||||
|
PCIDevice* s=(PCIDevice*)opaque;
|
||||||
|
|
||||||
|
if (version_id != 1)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
qemu_get_buffer(f, s->config, 256);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* -1 for devfn means auto assign */
|
/* -1 for devfn means auto assign */
|
||||||
PCIDevice *pci_register_device(PCIBus *bus, const char *name,
|
PCIDevice *pci_register_device(PCIBus *bus, const char *name,
|
||||||
int instance_size, int devfn,
|
int instance_size, int devfn,
|
||||||
@ -558,6 +576,8 @@ void piix3_init(PCIBus *bus)
|
|||||||
|
|
||||||
d = (PIIX3State *)pci_register_device(bus, "PIIX3", sizeof(PIIX3State),
|
d = (PIIX3State *)pci_register_device(bus, "PIIX3", sizeof(PIIX3State),
|
||||||
-1, NULL, NULL);
|
-1, NULL, NULL);
|
||||||
|
register_savevm("PIIX3", 0, 1, generic_pci_save, generic_pci_load, d);
|
||||||
|
|
||||||
piix3_state = d;
|
piix3_state = d;
|
||||||
pci_conf = d->dev.config;
|
pci_conf = d->dev.config;
|
||||||
|
|
||||||
|
2
vl.h
2
vl.h
@ -480,6 +480,8 @@ uint32_t pci_default_read_config(PCIDevice *d,
|
|||||||
uint32_t address, int len);
|
uint32_t address, int len);
|
||||||
void pci_default_write_config(PCIDevice *d,
|
void pci_default_write_config(PCIDevice *d,
|
||||||
uint32_t address, uint32_t val, int len);
|
uint32_t address, uint32_t val, int len);
|
||||||
|
void generic_pci_save(QEMUFile* f, void *opaque);
|
||||||
|
int generic_pci_load(QEMUFile* f, void *opaque, int version_id);
|
||||||
|
|
||||||
extern struct PIIX3State *piix3_state;
|
extern struct PIIX3State *piix3_state;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user