Commit e774a278d82c9391c9fb6c9af42cd08bb9364b9f
1 parent
fa7cf687
-win2k-hack performance+DMA support (Leonardo E. Reiter)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1841 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
15 additions
and
2 deletions
hw/ide.c
| ... | ... | @@ -336,6 +336,7 @@ typedef struct IDEState { |
| 336 | 336 | uint8_t *data_end; |
| 337 | 337 | uint8_t io_buffer[MAX_MULT_SECTORS*512 + 4]; |
| 338 | 338 | QEMUTimer *sector_write_timer; /* only used for win2k instal hack */ |
| 339 | + uint32_t irq_count; /* counts IRQs when using win2k install hack */ | |
| 339 | 340 | } IDEState; |
| 340 | 341 | |
| 341 | 342 | #define BM_STATUS_DMAING 0x01 |
| ... | ... | @@ -712,7 +713,7 @@ static void ide_sector_write(IDEState *s) |
| 712 | 713 | ide_set_sector(s, sector_num + n); |
| 713 | 714 | |
| 714 | 715 | #ifdef TARGET_I386 |
| 715 | - if (win2k_install_hack) { | |
| 716 | + if (win2k_install_hack && ((++s->irq_count % 16) == 0)) { | |
| 716 | 717 | /* It seems there is a bug in the Windows 2000 installer HDD |
| 717 | 718 | IDE driver which fills the disk with empty logs when the |
| 718 | 719 | IDE write IRQ comes too early. This hack tries to correct |
| ... | ... | @@ -750,7 +751,19 @@ static int ide_write_dma_cb(IDEState *s, |
| 750 | 751 | if (n == 0) { |
| 751 | 752 | /* end of transfer */ |
| 752 | 753 | s->status = READY_STAT | SEEK_STAT; |
| 753 | - ide_set_irq(s); | |
| 754 | +#ifdef TARGET_I386 | |
| 755 | + if (win2k_install_hack && ((++s->irq_count % 16) == 0)) { | |
| 756 | + /* It seems there is a bug in the Windows 2000 installer | |
| 757 | + HDD IDE driver which fills the disk with empty logs | |
| 758 | + when the IDE write IRQ comes too early. This hack tries | |
| 759 | + to correct that at the expense of slower write | |
| 760 | + performances. Use this option _only_ to install Windows | |
| 761 | + 2000. You must disable it for normal use. */ | |
| 762 | + qemu_mod_timer(s->sector_write_timer, | |
| 763 | + qemu_get_clock(vm_clock) + (ticks_per_sec / 1000)); | |
| 764 | + } else | |
| 765 | +#endif | |
| 766 | + ide_set_irq(s); | |
| 754 | 767 | return 0; |
| 755 | 768 | } |
| 756 | 769 | if (n > MAX_MULT_SECTORS) | ... | ... |