All of lore.kernel.org
 help / color / mirror / Atom feed
From: Fabrice Bellard <fabrice@bellard.org>
To: blp@cs.stanford.edu, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [patch] Support Windows NT 4
Date: Sat, 09 Oct 2004 18:50:05 +0200	[thread overview]
Message-ID: <416816BD.6040508@bellard.org> (raw)
In-Reply-To: <87n023lkw6.fsf@benpfaff.org>

Applied.

Fabrice.

Ben Pfaff wrote:
> The following patch allows the CVS version of qemu to install and
> boot Windows NT 4, as long as the `-isa' flag is used.  Without
> the patch, trying to install NT 4 will fail because no hard disk
> will be detected.  Almost unbelievably, NT 4 won't detect a hard
> drive unless the CMOS RAM says that it is there.
> 
> Even with this fix, WNT4 can't see the hard drives if PCI support
> is turned on.  There must be something else to track down too.
> 
> Index: hw/ide.c
> ===================================================================
> RCS file: /cvsroot/qemu/qemu/hw/ide.c,v
> retrieving revision 1.26
> diff -u -p -u -r1.26 ide.c
> --- hw/ide.c	25 Jun 2004 14:54:19 -0000	1.26
> +++ hw/ide.c	13 Jul 2004 20:13:33 -0000
> @@ -1875,6 +1875,7 @@ static void ide_init2(IDEState *ide_stat
>                      s->heads = 16;
>                      s->sectors = 63;
>                  }
> +                bdrv_set_geometry_hint(s->bs, s->cylinders, s->heads, s->sectors);
>              }
>              if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM) {
>                  s->is_cdrom = 1;
> Index: hw/pc.c
> ===================================================================
> RCS file: /cvsroot/qemu/qemu/hw/pc.c,v
> retrieving revision 1.25
> diff -u -p -u -r1.25 pc.c
> --- hw/pc.c	26 Jun 2004 15:53:17 -0000	1.25
> +++ hw/pc.c	13 Jul 2004 20:13:33 -0000
> @@ -101,13 +101,32 @@ static int cmos_get_fd_drive_type(int fd
>      return val;
>  }
>  
> -static void cmos_init(int ram_size, int boot_device)
> +static void cmos_init_hd(int type_ofs, int info_ofs, BlockDriverState *hd) 
> +{
> +    RTCState *s = rtc_state;
> +    int cylinders, heads, sectors;
> +    bdrv_get_geometry_hint(hd, &cylinders, &heads, &sectors);
> +    rtc_set_memory(s, type_ofs, 47);
> +    rtc_set_memory(s, info_ofs, cylinders);
> +    rtc_set_memory(s, info_ofs + 1, cylinders >> 8);
> +    rtc_set_memory(s, info_ofs + 2, heads);
> +    rtc_set_memory(s, info_ofs + 3, 0xff);
> +    rtc_set_memory(s, info_ofs + 4, 0xff);
> +    rtc_set_memory(s, info_ofs + 5, 0xc0 | ((heads > 8) << 3));
> +    rtc_set_memory(s, info_ofs + 6, cylinders);
> +    rtc_set_memory(s, info_ofs + 7, cylinders >> 8);
> +    rtc_set_memory(s, info_ofs + 8, sectors);
> +}
> +
> +/* hd_table must contain 4 block drivers */
> +static void cmos_init(int ram_size, int boot_device, BlockDriverState **hd_table)
>  {
>      RTCState *s = rtc_state;
>      int val;
>      int fd0, fd1, nb;
>      time_t ti;
>      struct tm *tm;
> +    int i;
>  
>      /* set the CMOS date */
>      time(&ti);
> @@ -187,6 +206,35 @@ static void cmos_init(int ram_size, int 
>      val |= 0x04; /* PS/2 mouse installed */
>      rtc_set_memory(s, REG_EQUIPMENT_BYTE, val);
>  
> +    /* hard drives */
> +
> +    rtc_set_memory(s, 0x12, (hd_table[0] ? 0xf0 : 0) | (hd_table[1] ? 0x0f : 0));
> +    if (hd_table[0])
> +        cmos_init_hd(0x19, 0x1b, hd_table[0]);
> +    if (hd_table[1]) 
> +        cmos_init_hd(0x1a, 0x24, hd_table[1]);
> +
> +    val = 0;
> +    for (i = 0; i < 4; i++)
> +        if (hd_table[i]) {
> +            int cylinders, heads, sectors;
> +            uint8_t translation;
> +            
> +            bdrv_get_geometry_hint(hd_table[i], &cylinders, &heads, &sectors);
> +            if (cylinders <= 1024 && cylinders <= 16 && sectors <= 63) {
> +                /* No translation. */
> +                translation = 0;
> +            } else if (cylinders * heads > 131072) {
> +                /* LBA translation. */
> +                translation = 1;
> +            } else {
> +                /* LARGE translation. */
> +                translation = 2;
> +            }
> +
> +            val |= translation << (i * 2);
> +        }
> +    rtc_set_memory(s, 0x39, val);
>  }
>  
>  static void speaker_ioport_write(void *opaque, uint32_t addr, uint32_t val)
> @@ -506,7 +554,7 @@ void pc_init(int ram_size, int vga_ram_s
>  
>      floppy_controller = fdctrl_init(6, 2, 0, 0x3f0, fd_table);
>  
> -    cmos_init(ram_size, boot_device);
> +    cmos_init(ram_size, boot_device, bs_table);
>  
>      /* must be done after all PCI devices are instanciated */
>      /* XXX: should be done in the Bochs BIOS */
> 
> 

      parent reply	other threads:[~2004-10-09 16:56 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-07-13 20:20 [Qemu-devel] [patch] Support Windows NT 4 Ben Pfaff
2004-07-14 23:41 ` [Qemu-devel] " Ben Pfaff
2004-07-17 20:17 ` [Qemu-devel] " Sylvain Petreolle
2004-07-17 21:22   ` [Qemu-devel] " Ben Pfaff
2004-07-19 14:40   ` [Qemu-devel] " Paul Jakma
2004-10-09 16:50 ` Fabrice Bellard [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=416816BD.6040508@bellard.org \
    --to=fabrice@bellard.org \
    --cc=blp@cs.stanford.edu \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.