Windows 2000 install disk full hack (original idea from Vladimir N. Oleynik)

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1428 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
bellard 2005-04-30 16:10:35 +00:00
parent b671f9ed2d
commit a09db21f71
4 changed files with 43 additions and 3 deletions

View File

@ -1,6 +1,8 @@
version 0.7.1: version 0.7.1:
- read-only Virtual FAT support (Johannes Schindelin) - read-only Virtual FAT support (Johannes Schindelin)
- Windows 2000 install disk full hack (original idea from Vladimir
N. Oleynik)
version 0.7.0: version 0.7.0:

View File

@ -332,6 +332,7 @@ typedef struct IDEState {
uint8_t *data_ptr; uint8_t *data_ptr;
uint8_t *data_end; uint8_t *data_end;
uint8_t io_buffer[MAX_MULT_SECTORS*512 + 4]; uint8_t io_buffer[MAX_MULT_SECTORS*512 + 4];
QEMUTimer *sector_write_timer; /* only used for win2k instal hack */
} IDEState; } IDEState;
#define BM_STATUS_DMAING 0x01 #define BM_STATUS_DMAING 0x01
@ -645,6 +646,12 @@ static void ide_sector_read_dma(IDEState *s)
ide_dma_start(s, ide_read_dma_cb); ide_dma_start(s, ide_read_dma_cb);
} }
static void ide_sector_write_timer_cb(void *opaque)
{
IDEState *s = opaque;
ide_set_irq(s);
}
static void ide_sector_write(IDEState *s) static void ide_sector_write(IDEState *s)
{ {
int64_t sector_num; int64_t sector_num;
@ -670,7 +677,22 @@ static void ide_sector_write(IDEState *s)
ide_transfer_start(s, s->io_buffer, 512 * n1, ide_sector_write); ide_transfer_start(s, s->io_buffer, 512 * n1, ide_sector_write);
} }
ide_set_sector(s, sector_num + n); ide_set_sector(s, sector_num + n);
#ifdef TARGET_I386
if (win2k_install_hack) {
/* 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); ide_set_irq(s);
}
} }
static int ide_write_dma_cb(IDEState *s, static int ide_write_dma_cb(IDEState *s,
@ -1939,6 +1961,8 @@ static void ide_init2(IDEState *ide_state, int irq,
} }
s->drive_serial = drive_serial++; s->drive_serial = drive_serial++;
s->irq = irq; s->irq = irq;
s->sector_write_timer = qemu_new_timer(vm_clock,
ide_sector_write_timer_cb, s);
ide_reset(s); ide_reset(s);
} }
} }

13
vl.c
View File

@ -147,6 +147,9 @@ int full_screen = 0;
TextConsole *vga_console; TextConsole *vga_console;
CharDriverState *serial_hds[MAX_SERIAL_PORTS]; CharDriverState *serial_hds[MAX_SERIAL_PORTS];
CharDriverState *parallel_hds[MAX_PARALLEL_PORTS]; CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
#ifdef TARGET_I386
int win2k_install_hack = 0;
#endif
/***********************************************************/ /***********************************************************/
/* x86 ISA bus support */ /* x86 ISA bus support */
@ -2746,6 +2749,9 @@ void help(void)
"-enable-audio enable audio support\n" "-enable-audio enable audio support\n"
"-localtime set the real time clock to local time [default=utc]\n" "-localtime set the real time clock to local time [default=utc]\n"
"-full-screen start in full screen\n" "-full-screen start in full screen\n"
#ifdef TARGET_I386
"-win2k-hack use it when installing Windows 2000 to avoid a disk full bug\n"
#endif
#ifdef TARGET_PPC #ifdef TARGET_PPC
"-prep Simulate a PREP system (default is PowerMAC)\n" "-prep Simulate a PREP system (default is PowerMAC)\n"
#endif #endif
@ -2878,6 +2884,7 @@ enum {
QEMU_OPTION_full_screen, QEMU_OPTION_full_screen,
QEMU_OPTION_pidfile, QEMU_OPTION_pidfile,
QEMU_OPTION_no_kqemu, QEMU_OPTION_no_kqemu,
QEMU_OPTION_win2k_hack,
}; };
typedef struct QEMUOption { typedef struct QEMUOption {
@ -2946,6 +2953,7 @@ const QEMUOption qemu_options[] = {
{ "loadvm", HAS_ARG, QEMU_OPTION_loadvm }, { "loadvm", HAS_ARG, QEMU_OPTION_loadvm },
{ "full-screen", 0, QEMU_OPTION_full_screen }, { "full-screen", 0, QEMU_OPTION_full_screen },
{ "pidfile", HAS_ARG, QEMU_OPTION_pidfile }, { "pidfile", HAS_ARG, QEMU_OPTION_pidfile },
{ "win2k-hack", 0, QEMU_OPTION_win2k_hack },
/* temporary options */ /* temporary options */
{ "pci", 0, QEMU_OPTION_pci }, { "pci", 0, QEMU_OPTION_pci },
@ -3397,6 +3405,11 @@ int main(int argc, char **argv)
case QEMU_OPTION_pidfile: case QEMU_OPTION_pidfile:
create_pidfile(optarg); create_pidfile(optarg);
break; break;
#ifdef TARGET_I386
case QEMU_OPTION_win2k_hack:
win2k_install_hack = 1;
break;
#endif
#ifdef USE_KQEMU #ifdef USE_KQEMU
case QEMU_OPTION_no_kqemu: case QEMU_OPTION_no_kqemu:
kqemu_allowed = 0; kqemu_allowed = 0;

1
vl.h
View File

@ -126,6 +126,7 @@ extern int graphic_height;
extern int graphic_depth; extern int graphic_depth;
extern const char *keyboard_layout; extern const char *keyboard_layout;
extern int kqemu_allowed; extern int kqemu_allowed;
extern int win2k_install_hack;
/* XXX: make it dynamic */ /* XXX: make it dynamic */
#if defined (TARGET_PPC) #if defined (TARGET_PPC)