332 |
uint8_t *data_ptr; |
uint8_t *data_ptr; |
333 |
uint8_t *data_end; |
uint8_t *data_end; |
334 |
uint8_t io_buffer[MAX_MULT_SECTORS*512 + 4]; |
uint8_t io_buffer[MAX_MULT_SECTORS*512 + 4]; |
335 |
|
QEMUTimer *sector_write_timer; /* only used for win2k instal hack */ |
336 |
} IDEState; |
} IDEState; |
337 |
|
|
338 |
#define BM_STATUS_DMAING 0x01 |
#define BM_STATUS_DMAING 0x01 |
646 |
ide_dma_start(s, ide_read_dma_cb); |
ide_dma_start(s, ide_read_dma_cb); |
647 |
} |
} |
648 |
|
|
649 |
|
static void ide_sector_write_timer_cb(void *opaque) |
650 |
|
{ |
651 |
|
IDEState *s = opaque; |
652 |
|
ide_set_irq(s); |
653 |
|
} |
654 |
|
|
655 |
static void ide_sector_write(IDEState *s) |
static void ide_sector_write(IDEState *s) |
656 |
{ |
{ |
657 |
int64_t sector_num; |
int64_t sector_num; |
677 |
ide_transfer_start(s, s->io_buffer, 512 * n1, ide_sector_write); |
ide_transfer_start(s, s->io_buffer, 512 * n1, ide_sector_write); |
678 |
} |
} |
679 |
ide_set_sector(s, sector_num + n); |
ide_set_sector(s, sector_num + n); |
680 |
ide_set_irq(s); |
|
681 |
|
#ifdef TARGET_I386 |
682 |
|
if (win2k_install_hack) { |
683 |
|
/* It seems there is a bug in the Windows 2000 installer HDD |
684 |
|
IDE driver which fills the disk with empty logs when the |
685 |
|
IDE write IRQ comes too early. This hack tries to correct |
686 |
|
that at the expense of slower write performances. Use this |
687 |
|
option _only_ to install Windows 2000. You must disable it |
688 |
|
for normal use. */ |
689 |
|
qemu_mod_timer(s->sector_write_timer, |
690 |
|
qemu_get_clock(vm_clock) + (ticks_per_sec / 1000)); |
691 |
|
} else |
692 |
|
#endif |
693 |
|
{ |
694 |
|
ide_set_irq(s); |
695 |
|
} |
696 |
} |
} |
697 |
|
|
698 |
static int ide_write_dma_cb(IDEState *s, |
static int ide_write_dma_cb(IDEState *s, |
1961 |
} |
} |
1962 |
s->drive_serial = drive_serial++; |
s->drive_serial = drive_serial++; |
1963 |
s->irq = irq; |
s->irq = irq; |
1964 |
|
s->sector_write_timer = qemu_new_timer(vm_clock, |
1965 |
|
ide_sector_write_timer_cb, s); |
1966 |
ide_reset(s); |
ide_reset(s); |
1967 |
} |
} |
1968 |
} |
} |