Loading hw/ide.c +37 −17 Original line number Diff line number Diff line Loading @@ -864,10 +864,44 @@ static void ide_sector_write_timer_cb(void *opaque) ide_set_irq(s); } static void ide_sector_write_aio_cb(void *opaque, int ret) { BMDMAState *bm = opaque; IDEState *s = bm->ide_if; #ifdef TARGET_I386 if (win2k_install_hack && ((++s->irq_count % 16) == 0)) { /* It seems there is a bug in the Windows 2000 installer HDD IDE driver which fills the disk with empty logs when the IDE write IRQ comes too early. This hack tries to correct that at the expense of slower write performances. Use this option _only_ to install Windows 2000. You must disable it for normal use. */ qemu_mod_timer(s->sector_write_timer, qemu_get_clock(vm_clock) + (ticks_per_sec / 1000)); } else #endif { ide_set_irq(s); } bm->aiocb = NULL; } static void ide_sector_write(IDEState *s) { BMDMAState *bm; int64_t sector_num; int ret, n, n1; int n, n1; s->io_buffer_index = 0; s->io_buffer_size = 0; bm = s->bmdma; if(bm == NULL) { bm = qemu_mallocz(sizeof(BMDMAState)); s->bmdma = bm; } bm->ide_if = s; bm->dma_cb = ide_sector_write_aio_cb; s->status = READY_STAT | SEEK_STAT; sector_num = ide_get_sector(s); Loading @@ -877,7 +911,6 @@ static void ide_sector_write(IDEState *s) n = s->nsector; if (n > s->req_nb_sectors) n = s->req_nb_sectors; ret = bdrv_write(s->bs, sector_num, s->io_buffer, n); s->nsector -= n; if (s->nsector == 0) { /* no more sectors to write */ Loading @@ -890,21 +923,8 @@ static void ide_sector_write(IDEState *s) } ide_set_sector(s, sector_num + n); #ifdef TARGET_I386 if (win2k_install_hack && ((++s->irq_count % 16) == 0)) { /* It seems there is a bug in the Windows 2000 installer HDD IDE driver which fills the disk with empty logs when the IDE write IRQ comes too early. This hack tries to correct that at the expense of slower write performances. Use this option _only_ to install Windows 2000. You must disable it for normal use. */ qemu_mod_timer(s->sector_write_timer, qemu_get_clock(vm_clock) + (ticks_per_sec / 1000)); } else #endif { ide_set_irq(s); } bm->aiocb = bdrv_aio_write(s->bs, sector_num, s->io_buffer, n, ide_sector_write_aio_cb, bm); } /* XXX: handle errors */ Loading Loading
hw/ide.c +37 −17 Original line number Diff line number Diff line Loading @@ -864,10 +864,44 @@ static void ide_sector_write_timer_cb(void *opaque) ide_set_irq(s); } static void ide_sector_write_aio_cb(void *opaque, int ret) { BMDMAState *bm = opaque; IDEState *s = bm->ide_if; #ifdef TARGET_I386 if (win2k_install_hack && ((++s->irq_count % 16) == 0)) { /* It seems there is a bug in the Windows 2000 installer HDD IDE driver which fills the disk with empty logs when the IDE write IRQ comes too early. This hack tries to correct that at the expense of slower write performances. Use this option _only_ to install Windows 2000. You must disable it for normal use. */ qemu_mod_timer(s->sector_write_timer, qemu_get_clock(vm_clock) + (ticks_per_sec / 1000)); } else #endif { ide_set_irq(s); } bm->aiocb = NULL; } static void ide_sector_write(IDEState *s) { BMDMAState *bm; int64_t sector_num; int ret, n, n1; int n, n1; s->io_buffer_index = 0; s->io_buffer_size = 0; bm = s->bmdma; if(bm == NULL) { bm = qemu_mallocz(sizeof(BMDMAState)); s->bmdma = bm; } bm->ide_if = s; bm->dma_cb = ide_sector_write_aio_cb; s->status = READY_STAT | SEEK_STAT; sector_num = ide_get_sector(s); Loading @@ -877,7 +911,6 @@ static void ide_sector_write(IDEState *s) n = s->nsector; if (n > s->req_nb_sectors) n = s->req_nb_sectors; ret = bdrv_write(s->bs, sector_num, s->io_buffer, n); s->nsector -= n; if (s->nsector == 0) { /* no more sectors to write */ Loading @@ -890,21 +923,8 @@ static void ide_sector_write(IDEState *s) } ide_set_sector(s, sector_num + n); #ifdef TARGET_I386 if (win2k_install_hack && ((++s->irq_count % 16) == 0)) { /* It seems there is a bug in the Windows 2000 installer HDD IDE driver which fills the disk with empty logs when the IDE write IRQ comes too early. This hack tries to correct that at the expense of slower write performances. Use this option _only_ to install Windows 2000. You must disable it for normal use. */ qemu_mod_timer(s->sector_write_timer, qemu_get_clock(vm_clock) + (ticks_per_sec / 1000)); } else #endif { ide_set_irq(s); } bm->aiocb = bdrv_aio_write(s->bs, sector_num, s->io_buffer, n, ide_sector_write_aio_cb, bm); } /* XXX: handle errors */ Loading