public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Avi Kivity <avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
To: "Richard W.M. Jones" <rjones-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Subject: Re: KVM-58 -- existing VM just hangs with black screen
Date: Wed, 02 Jan 2008 14:49:43 +0200	[thread overview]
Message-ID: <477B8867.10702@qumranet.com> (raw)
In-Reply-To: <477B86AC.6060404-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>

[-- Attachment #1: Type: text/plain, Size: 569 bytes --]

Richard W.M. Jones wrote:
> Avi Kivity wrote:
>> Can you identify which version of kvm introduced the regression?
>
> Some more data points:
>
>   kvm-56 from [1]   ==> works OK
>
>   kvm-57 from [2]   ==> works OK
>
>   kvm-58 from [1]   ==> hangs with black screen at boot
>
>   kvm-58 from [2]   ==> hangs with black screen at boot
>

Please try reverting the attached patch (or applying it to a working 
version).

If that doesn't work, try bios.bin from a working version with a 
non-working qemu.

-- 
error compiling committee.c: too many arguments to function


[-- Attachment #2: chs.patch --]
[-- Type: text/x-patch, Size: 10307 bytes --]

commit 7c4f3ce4aad409377adc0389da1805152a30dafd
Author: Anthony Liguori <aliguori-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
Date:   Thu Dec 20 13:37:56 2007 +0200

    kvm: qemu: refactor disk CHS guessing for reuse in non-IDE drives
    
    Signed-off-by: Avi Kivity <avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org>

diff --git a/qemu/block.c b/qemu/block.c
index 24d78fc..b1650c0 100644
--- a/qemu/block.c
+++ b/qemu/block.c
@@ -738,6 +738,122 @@ void bdrv_set_boot_sector(BlockDriverState *bs, const uint8_t *data, int size)
     memset(bs->boot_sector_data + size, 0, 512 - size);
 }
 
+struct partition {
+	uint8_t boot_ind;		/* 0x80 - active */
+	uint8_t head;		/* starting head */
+	uint8_t sector;		/* starting sector */
+	uint8_t cyl;		/* starting cylinder */
+	uint8_t sys_ind;		/* What partition type */
+	uint8_t end_head;		/* end head */
+	uint8_t end_sector;	/* end sector */
+	uint8_t end_cyl;		/* end cylinder */
+	uint32_t start_sect;	/* starting sector counting from 0 */
+	uint32_t nr_sects;		/* nr of sectors in partition */
+} __attribute__((packed));
+
+/* try to guess the disk logical geometry from the MSDOS partition table. Return 0 if OK, -1 if could not guess */
+static int guess_disk_lchs(BlockDriverState *bs,
+                           int *pcylinders, int *pheads, int *psectors)
+{
+    uint8_t buf[512];
+    int ret, i, heads, sectors, cylinders;
+    struct partition *p;
+    uint32_t nr_sects;
+    int64_t nb_sectors;
+
+    bdrv_get_geometry(bs, &nb_sectors);
+
+    ret = bdrv_read(bs, 0, buf, 1);
+    if (ret < 0)
+        return -1;
+    /* test msdos magic */
+    if (buf[510] != 0x55 || buf[511] != 0xaa)
+        return -1;
+    for(i = 0; i < 4; i++) {
+        p = ((struct partition *)(buf + 0x1be)) + i;
+        nr_sects = le32_to_cpu(p->nr_sects);
+        if (nr_sects && p->end_head) {
+            /* We make the assumption that the partition terminates on
+               a cylinder boundary */
+            heads = p->end_head + 1;
+            sectors = p->end_sector & 63;
+            if (sectors == 0)
+                continue;
+            cylinders = nb_sectors / (heads * sectors);
+            if (cylinders < 1 || cylinders > 16383)
+                continue;
+            *pheads = heads;
+            *psectors = sectors;
+            *pcylinders = cylinders;
+#if 0
+            printf("guessed geometry: LCHS=%d %d %d\n",
+                   cylinders, heads, sectors);
+#endif
+            return 0;
+        }
+    }
+    return -1;
+}
+
+void bdrv_guess_geometry(BlockDriverState *bs, int *pcyls, int *pheads, int *psecs)
+{
+    int translation, lba_detected = 0;
+    int cylinders, heads, secs;
+    int64_t nb_sectors;
+
+    /* if a geometry hint is available, use it */
+    bdrv_get_geometry(bs, &nb_sectors);
+    bdrv_get_geometry_hint(bs, &cylinders, &heads, &secs);
+    translation = bdrv_get_translation_hint(bs);
+    if (cylinders != 0) {
+	*pcyls = cylinders;
+	*pheads = heads;
+	*psecs = secs;
+    } else {
+	if (guess_disk_lchs(bs, &cylinders, &heads, &secs) == 0) {
+	    if (heads > 16) {
+		/* if heads > 16, it means that a BIOS LBA
+		   translation was active, so the default
+		   hardware geometry is OK */
+		lba_detected = 1;
+		goto default_geometry;
+	    } else {
+		*pcyls = cylinders;
+		*pheads = heads;
+		*psecs = secs;
+		/* disable any translation to be in sync with
+		   the logical geometry */
+		if (translation == BIOS_ATA_TRANSLATION_AUTO) {
+		    bdrv_set_translation_hint(bs,
+					      BIOS_ATA_TRANSLATION_NONE);
+		}
+	    }
+	} else {
+	default_geometry:
+	    /* if no geometry, use a standard physical disk geometry */
+	    cylinders = nb_sectors / (16 * 63);
+
+	    if (cylinders > 16383)
+	        cylinders = 16383;
+	    else if (cylinders < 2)
+	        cylinders = 2;
+	    *pcyls = cylinders;
+	    *pheads = 16;
+	    *psecs = 63;
+	    if ((lba_detected == 1) && (translation == BIOS_ATA_TRANSLATION_AUTO)) {
+		if ((*pcyls * *pheads) <= 131072) {
+		    bdrv_set_translation_hint(bs,
+					      BIOS_ATA_TRANSLATION_LARGE);
+		} else {
+		    bdrv_set_translation_hint(bs,
+					      BIOS_ATA_TRANSLATION_LBA);
+		}
+	    }
+	}
+	bdrv_set_geometry_hint(bs, *pcyls, *pheads, *psecs);
+    }
+}
+
 void bdrv_set_geometry_hint(BlockDriverState *bs,
                             int cyls, int heads, int secs)
 {
diff --git a/qemu/block.h b/qemu/block.h
index f98639a..839be90 100644
--- a/qemu/block.h
+++ b/qemu/block.h
@@ -73,6 +73,7 @@ int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
 int bdrv_truncate(BlockDriverState *bs, int64_t offset);
 int64_t bdrv_getlength(BlockDriverState *bs);
 void bdrv_get_geometry(BlockDriverState *bs, int64_t *nb_sectors_ptr);
+void bdrv_guess_geometry(BlockDriverState *bs, int *pcyls, int *pheads, int *psecs);
 int bdrv_commit(BlockDriverState *bs);
 void bdrv_set_boot_sector(BlockDriverState *bs, const uint8_t *data, int size);
 /* async block I/O */
diff --git a/qemu/hw/ide.c b/qemu/hw/ide.c
index bd579f8..f43e6f1 100644
--- a/qemu/hw/ide.c
+++ b/qemu/hw/ide.c
@@ -2367,67 +2367,13 @@ static void ide_reset(IDEState *s)
     s->media_changed = 0;
 }
 
-struct partition {
-	uint8_t boot_ind;		/* 0x80 - active */
-	uint8_t head;		/* starting head */
-	uint8_t sector;		/* starting sector */
-	uint8_t cyl;		/* starting cylinder */
-	uint8_t sys_ind;		/* What partition type */
-	uint8_t end_head;		/* end head */
-	uint8_t end_sector;	/* end sector */
-	uint8_t end_cyl;		/* end cylinder */
-	uint32_t start_sect;	/* starting sector counting from 0 */
-	uint32_t nr_sects;		/* nr of sectors in partition */
-} __attribute__((packed));
-
-/* try to guess the disk logical geometry from the MSDOS partition table. Return 0 if OK, -1 if could not guess */
-static int guess_disk_lchs(IDEState *s,
-                           int *pcylinders, int *pheads, int *psectors)
-{
-    uint8_t buf[512];
-    int ret, i, heads, sectors, cylinders;
-    struct partition *p;
-    uint32_t nr_sects;
-
-    ret = bdrv_read(s->bs, 0, buf, 1);
-    if (ret < 0)
-        return -1;
-    /* test msdos magic */
-    if (buf[510] != 0x55 || buf[511] != 0xaa)
-        return -1;
-    for(i = 0; i < 4; i++) {
-        p = ((struct partition *)(buf + 0x1be)) + i;
-        nr_sects = le32_to_cpu(p->nr_sects);
-        if (nr_sects && p->end_head) {
-            /* We make the assumption that the partition terminates on
-               a cylinder boundary */
-            heads = p->end_head + 1;
-            sectors = p->end_sector & 63;
-            if (sectors == 0)
-                continue;
-            cylinders = s->nb_sectors / (heads * sectors);
-            if (cylinders < 1 || cylinders > 16383)
-                continue;
-            *pheads = heads;
-            *psectors = sectors;
-            *pcylinders = cylinders;
-#if 0
-            printf("guessed geometry: LCHS=%d %d %d\n",
-                   cylinders, heads, sectors);
-#endif
-            return 0;
-        }
-    }
-    return -1;
-}
-
 static void ide_init2(IDEState *ide_state,
                       BlockDriverState *hd0, BlockDriverState *hd1,
                       qemu_irq irq)
 {
     IDEState *s;
     static int drive_serial = 1;
-    int i, cylinders, heads, secs, translation, lba_detected = 0;
+    int i, cylinders, heads, secs;
     int64_t nb_sectors;
 
     for(i = 0; i < 2; i++) {
@@ -2438,56 +2384,12 @@ static void ide_init2(IDEState *ide_state,
             s->bs = hd1;
         if (s->bs) {
             bdrv_get_geometry(s->bs, &nb_sectors);
+	    bdrv_guess_geometry(s->bs, &cylinders, &heads, &secs);
+	    s->cylinders = cylinders;
+	    s->heads = heads;
+	    s->sectors = secs;
             s->nb_sectors = nb_sectors;
-            /* if a geometry hint is available, use it */
-            bdrv_get_geometry_hint(s->bs, &cylinders, &heads, &secs);
-            translation = bdrv_get_translation_hint(s->bs);
-            if (cylinders != 0) {
-                s->cylinders = cylinders;
-                s->heads = heads;
-                s->sectors = secs;
-            } else {
-                if (guess_disk_lchs(s, &cylinders, &heads, &secs) == 0) {
-                    if (heads > 16) {
-                        /* if heads > 16, it means that a BIOS LBA
-                           translation was active, so the default
-                           hardware geometry is OK */
-                        lba_detected = 1;
-                        goto default_geometry;
-                    } else {
-                        s->cylinders = cylinders;
-                        s->heads = heads;
-                        s->sectors = secs;
-                        /* disable any translation to be in sync with
-                           the logical geometry */
-                        if (translation == BIOS_ATA_TRANSLATION_AUTO) {
-                            bdrv_set_translation_hint(s->bs,
-                                                      BIOS_ATA_TRANSLATION_NONE);
-                        }
-                    }
-                } else {
-                default_geometry:
-                    /* if no geometry, use a standard physical disk geometry */
-                    cylinders = nb_sectors / (16 * 63);
-                    if (cylinders > 16383)
-                        cylinders = 16383;
-                    else if (cylinders < 2)
-                        cylinders = 2;
-                    s->cylinders = cylinders;
-                    s->heads = 16;
-                    s->sectors = 63;
-                    if ((lba_detected == 1) && (translation == BIOS_ATA_TRANSLATION_AUTO)) {
-                      if ((s->cylinders * s->heads) <= 131072) {
-                        bdrv_set_translation_hint(s->bs,
-                                                  BIOS_ATA_TRANSLATION_LARGE);
-                      } else {
-                        bdrv_set_translation_hint(s->bs,
-                                                  BIOS_ATA_TRANSLATION_LBA);
-                      }
-                    }
-                }
-                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;
 		bdrv_set_change_cb(s->bs, cdrom_change_cb, s);

[-- Attachment #3: Type: text/plain, Size: 228 bytes --]

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/

[-- Attachment #4: Type: text/plain, Size: 186 bytes --]

_______________________________________________
kvm-devel mailing list
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
https://lists.sourceforge.net/lists/listinfo/kvm-devel

  parent reply	other threads:[~2008-01-02 12:49 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-02 12:08 KVM-58 -- existing VM just hangs with black screen Richard W.M. Jones
     [not found] ` <477B7EAC.8060807-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2008-01-02 12:11   ` Avi Kivity
     [not found]     ` <477B7F82.6090705-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2008-01-02 12:20       ` Richard W.M. Jones
2008-01-02 12:42       ` Richard W.M. Jones
     [not found]         ` <477B86AC.6060404-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2008-01-02 12:49           ` Avi Kivity [this message]
     [not found]             ` <477B8867.10702-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2008-01-02 13:04               ` Richard W.M. Jones
     [not found]                 ` <477B8BCD.4020006-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2008-01-02 13:08                   ` Avi Kivity
2008-01-02 13:10               ` Richard W.M. Jones
     [not found]                 ` <477B8D51.30108-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2008-01-02 15:57                   ` Avi Kivity
     [not found]                     ` <477BB44D.9020301-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2008-01-02 16:00                       ` Richard W.M. Jones
     [not found]                         ` <477BB507.50008-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2008-01-02 17:13                           ` Avi Kivity
     [not found]                             ` <477BC62B.2080708-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2008-01-02 18:29                               ` Jeremy Katz
     [not found]                                 ` <1199298599.6402.18.camel-SFI/tHjZhb0EMMbVNdFDoACJwEvxM/w9@public.gmane.org>
2008-01-03 10:22                                   ` Avi Kivity
     [not found] ` <20080102122709.GA11855@karma.qumranet.com>
     [not found]   ` <20080102122709.GA11855-iWbx9bcAnq+Hk9JtIoIkgNBPR1lH4CV8@public.gmane.org>
2008-01-02 12:32     ` Richard W.M. Jones

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=477B8867.10702@qumranet.com \
    --to=avi-atkuwr5tajbwk0htik3j/w@public.gmane.org \
    --cc=kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    --cc=rjones-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox