| Line | |
|---|
| 1 | Index: ioemu/hw/ide.c |
|---|
| 2 | =================================================================== |
|---|
| 3 | --- ioemu.orig/hw/ide.c 2007-05-03 15:07:15.000000000 +0100 |
|---|
| 4 | +++ ioemu/hw/ide.c 2007-05-03 15:07:16.000000000 +0100 |
|---|
| 5 | @@ -305,6 +305,7 @@ |
|---|
| 6 | PCIDevice *pci_dev; |
|---|
| 7 | struct BMDMAState *bmdma; |
|---|
| 8 | int drive_serial; |
|---|
| 9 | + int write_cache; |
|---|
| 10 | /* ide regs */ |
|---|
| 11 | uint8_t feature; |
|---|
| 12 | uint8_t error; |
|---|
| 13 | @@ -947,6 +948,9 @@ |
|---|
| 14 | } |
|---|
| 15 | ide_set_sector(s, sector_num + n); |
|---|
| 16 | |
|---|
| 17 | + if (!s->write_cache) |
|---|
| 18 | + bdrv_flush(s->bs); |
|---|
| 19 | + |
|---|
| 20 | #ifdef TARGET_I386 |
|---|
| 21 | if (win2k_install_hack && ((++s->irq_count % 16) == 0)) { |
|---|
| 22 | /* It seems there is a bug in the Windows 2000 installer HDD |
|---|
| 23 | @@ -1021,6 +1025,10 @@ |
|---|
| 24 | transfer_size -= len; |
|---|
| 25 | phys_addr += len; |
|---|
| 26 | } |
|---|
| 27 | + /* Ensure the data hit disk before telling the guest OS so. */ |
|---|
| 28 | + if (!s->write_cache) |
|---|
| 29 | + bdrv_flush(s->bs); |
|---|
| 30 | + |
|---|
| 31 | return transfer_size1 - transfer_size; |
|---|
| 32 | } |
|---|
| 33 | |
|---|
| 34 | @@ -1831,7 +1839,15 @@ |
|---|
| 35 | /* XXX: valid for CDROM ? */ |
|---|
| 36 | switch(s->feature) { |
|---|
| 37 | case 0x02: /* write cache enable */ |
|---|
| 38 | + s->write_cache = 1; |
|---|
| 39 | + s->status = READY_STAT | SEEK_STAT; |
|---|
| 40 | + ide_set_irq(s); |
|---|
| 41 | + break; |
|---|
| 42 | case 0x82: /* write cache disable */ |
|---|
| 43 | + s->write_cache = 0; |
|---|
| 44 | + s->status = READY_STAT | SEEK_STAT; |
|---|
| 45 | + ide_set_irq(s); |
|---|
| 46 | + break; |
|---|
| 47 | case 0xaa: /* read look-ahead enable */ |
|---|
| 48 | case 0x55: /* read look-ahead disable */ |
|---|
| 49 | s->status = READY_STAT | SEEK_STAT; |
|---|
| 50 | @@ -2254,6 +2270,7 @@ |
|---|
| 51 | s->irq = irq; |
|---|
| 52 | s->sector_write_timer = qemu_new_timer(vm_clock, |
|---|
| 53 | ide_sector_write_timer_cb, s); |
|---|
| 54 | + s->write_cache = 0; |
|---|
| 55 | ide_reset(s); |
|---|
| 56 | } |
|---|
| 57 | } |
|---|
Note: See
TracBrowser
for help on using the repository browser.