📄 ioemu-save-restore-ide
字号:
Index: ioemu/hw/ide.c===================================================================--- ioemu.orig/hw/ide.c 2007-05-03 19:24:12.000000000 +0100+++ ioemu/hw/ide.c 2007-05-03 19:24:43.000000000 +0100@@ -2623,9 +2623,124 @@ ide_init_ioport(&d->ide_if[0], 0x1f0, 0x3f6); ide_init_ioport(&d->ide_if[2], 0x170, 0x376); + register_savevm("ide_pci", 0, 1, pci_device_save, pci_device_load, d); register_savevm("ide", 0, 1, pci_ide_save, pci_ide_load, d); } +static void pci_ide_save(QEMUFile* f, void *opaque)+{+ PCIIDEState *d = opaque;+ int i;++ for(i = 0; i < 2; i++) {+ BMDMAState *bm = &d->bmdma[i];+ qemu_put_8s(f, &bm->cmd);+ qemu_put_8s(f, &bm->status);+ qemu_put_be32s(f, &bm->addr);+ /* XXX: if a transfer is pending, we do not save it yet */+ }++ /* per IDE interface data */+ for(i = 0; i < 2; i++) {+ IDEState *s = &d->ide_if[i * 2];+ uint8_t drive1_selected;+ qemu_put_8s(f, &s->cmd);+ drive1_selected = (s->cur_drive != s);+ qemu_put_8s(f, &drive1_selected);+ }++ /* per IDE drive data */+ for(i = 0; i < 4; i++) {+ IDEState *s = &d->ide_if[i];+ qemu_put_be32s(f, &s->mult_sectors);+ qemu_put_be32s(f, &s->identify_set);+ if (s->identify_set) {+ qemu_put_buffer(f, (const uint8_t *)s->identify_data, 512);+ }+ qemu_put_8s(f, &s->write_cache);+ qemu_put_8s(f, &s->feature);+ qemu_put_8s(f, &s->error);+ qemu_put_be32s(f, &s->nsector);+ qemu_put_8s(f, &s->sector);+ qemu_put_8s(f, &s->lcyl);+ qemu_put_8s(f, &s->hcyl);+ qemu_put_8s(f, &s->hob_feature);+ qemu_put_8s(f, &s->hob_nsector);+ qemu_put_8s(f, &s->hob_sector);+ qemu_put_8s(f, &s->hob_lcyl);+ qemu_put_8s(f, &s->hob_hcyl);+ qemu_put_8s(f, &s->select);+ qemu_put_8s(f, &s->status);+ qemu_put_8s(f, &s->lba48);++ qemu_put_8s(f, &s->sense_key);+ qemu_put_8s(f, &s->asc);+ /* XXX: if a transfer is pending, we do not save it yet */+ }+}++static int pci_ide_load(QEMUFile* f, void *opaque, int version_id)+{+ PCIIDEState *d = opaque;+ int ret, i;++ if (version_id != 1)+ return -EINVAL;++ for(i = 0; i < 2; i++) {+ BMDMAState *bm = &d->bmdma[i];+ qemu_get_8s(f, &bm->cmd);+ qemu_get_8s(f, &bm->status);+ qemu_get_be32s(f, &bm->addr);+ /* XXX: if a transfer is pending, we do not save it yet */+ }++ /* per IDE interface data */+ for(i = 0; i < 2; i++) {+ IDEState *s = &d->ide_if[i * 2];+ uint8_t drive1_selected;+ qemu_get_8s(f, &s->cmd);+ qemu_get_8s(f, &drive1_selected);+ s->cur_drive = &d->ide_if[i * 2 + (drive1_selected != 0)];+ }++ /* per IDE drive data */+ for(i = 0; i < 4; i++) {+ IDEState *s = &d->ide_if[i];+ qemu_get_be32s(f, &s->mult_sectors);+ qemu_get_be32s(f, &s->identify_set);+ if (s->identify_set) {+ qemu_get_buffer(f, (uint8_t *)s->identify_data, 512);+ }+ qemu_get_8s(f, &s->write_cache);+ qemu_get_8s(f, &s->feature);+ qemu_get_8s(f, &s->error);+ qemu_get_be32s(f, &s->nsector);+ qemu_get_8s(f, &s->sector);+ qemu_get_8s(f, &s->lcyl);+ qemu_get_8s(f, &s->hcyl);+ qemu_get_8s(f, &s->hob_feature);+ qemu_get_8s(f, &s->hob_nsector);+ qemu_get_8s(f, &s->hob_sector);+ qemu_get_8s(f, &s->hob_lcyl);+ qemu_get_8s(f, &s->hob_hcyl);+ qemu_get_8s(f, &s->select);+ qemu_get_8s(f, &s->status);+ qemu_get_8s(f, &s->lba48);++ qemu_get_8s(f, &s->sense_key);+ qemu_get_8s(f, &s->asc);+ /* XXX: if a transfer is pending, we do not save it yet */+ if (s->status & (DRQ_STAT|BUSY_STAT)) {+ /* Tell the guest that its transfer has gone away */+ ide_abort_command(s);+ ide_set_irq(s);+ }+ }+ return 0;+}++ /* hd_table must contain 4 block drivers */ /* NOTE: for the PIIX3, the IRQs and IOports are hardcoded */ void pci_piix3_ide_init(PCIBus *bus, BlockDriverState **hd_table, int devfn)@@ -2662,6 +2777,7 @@ ide_init_ioport(&d->ide_if[0], 0x1f0, 0x3f6); ide_init_ioport(&d->ide_if[2], 0x170, 0x376); + register_savevm("ide_pci", 0, 1, pci_device_save, pci_device_load, d); register_savevm("ide", 0, 1, pci_ide_save, pci_ide_load, d); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -