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:
parent
b671f9ed2d
commit
a09db21f71
@ -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:
|
||||||
|
|
||||||
|
24
hw/ide.c
24
hw/ide.c
@ -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
13
vl.c
@ -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
1
vl.h
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user