Skip to contentSkip to conversation

qemu: IDE/ATAPI emulation fixes

PATCH Applied Carlo Marcelo Arenas Belon 2 participants 4 messages Dec 19, 2007 KVM

lore
Share & tools
lore
#0 lore raw

cover qemu: IDE/ATAPI emulation fixes

The following patch series implements fixes to the IDE/ATAPI emulation in qemu which affects access to the CD-ROM device preventing installation of OpenSolaris guests because of an incorrect implementation of the MMC6 GET_CONFIGURATION command when it was extended to also support a DVD-ROM profile.

Patch 1/2 : fixes GET_CONFIGURATION to allow OpenSolaris CD-ROM access Patch 2/2 : uses DVD-ROM as model name for INQUIRY and IDENTIFY DEVICE

They had been tested in Gentoo Linux 2007.0 amd64 using an Intel Core 2 6320 host and several different versions of Linux, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, OpenSolaris and Windows 2000 guests and to match exact responses when compared with real SATA and ATAPI DVD-ROM hardware.

This is a partial RESEND as the original version of patch 2 will conflict with the recently merged qemu due to changes on the type signedness of some variables to avoid warnings when building with gcc4.

Carlo

-------------------------------------------------------------------------
SF.Net email is sponsored by:
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services
for just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace

#1 lore raw

PATCH 1/2 GET_CONFIGURATION fixes to allow OpenSolaris CD-ROM access

This patch complements "Partial IDE DVD emulation" (revision 1.66 for ide.c in qemu's cvs) that is generating the following timeouts for OpenSolaris guests when trying to access the ATAPI cdrom (ex: during installation):

  WARNING: /pci@0,0/pci-ide@1,1/ide@1 (ata1);
          timeout: abort request, target=0 lun=0
  WARNING: /pci@0,0/pci-ide@1,1/ide@1 (ata1):
          timeout: abort device, target=0 lun=0
  WARNING: /pci@0,0/pci-ide@1,1/ide@1 (ata1):
          timeout: reset target, target=0 lun=0
  WARNING: /pci@0,0/pci-ide@1,1/ide@1 (ata1):
          timeout: reset bus, target=0 lun=0

The changes required to the "GET CONFIGURATION" implementation are :

* recognize and honor "Allocation Length" input parameter
* only set "current profile" for the response if a profile is current (either CD or DVD loaded)
* calculate "data length" including all headers
* refactor code and add comments to help document references to all implemented standards (ATAPI-4, SPC-3 and MMC-6)

---
 qemu/hw/ide.c |   27 +++++++++++++++++++--------
 1 files changed, 19 insertions(+), 8 deletions(-)
qemu/hw/ide.c +19 -8
index 18431e7..3289964 100644
@@ -1636,6 +1636,7 @@ static void ide_atapi_cmd(IDEState *s)
         break;
     case GPCMD_GET_CONFIGURATION:
         {
+            uint32_t len;
             int64_t total_sectors;
 
             /* only feature 0 is supported */
@@ -1644,17 +1645,27 @@ static void ide_atapi_cmd(IDEState *s)
                                     ASC_INV_FIELD_IN_CMD_PACKET);
                 break;
             }
-            memset(buf, 0, 32);
+            max_len = ube16_to_cpu(packet + 7);
             bdrv_get_geometry(s->bs, &total_sectors);
-            buf[3] = 16;
-            buf[7] = total_sectors <= 1433600 ? 0x08 : 0x10; /* current profile */
-            buf[10] = 0x10 | 0x1;
-            buf[11] = 0x08; /* size of profile list */
+            memset(buf, 0, 32);
+            if (total_sectors) {
+                if (total_sectors > 1433600) {
+                    buf[7] = 0x10; /* DVD-ROM */
+                } else {
+                    buf[7] = 0x08; /* CD-ROM */
+                }
+            } else {
+                buf[7] = 0x00; /* no current profile */
+            }
+            buf[10] = 0x02 | 0x01; /* persistent and current */
+            buf[11] = 0x08; /* size of profile list = 4 bytes per profile */
             buf[13] = 0x10; /* DVD-ROM profile */
-            buf[14] = buf[7] == 0x10; /* (in)active */
+            buf[14] = buf[13] == buf[7]; /* (in)active */
             buf[17] = 0x08; /* CD-ROM profile */
-            buf[18] = buf[7] == 0x08; /* (in)active */
-            ide_atapi_cmd_reply(s, 32, 32);
+            buf[18] = buf[17] == buf[7]; /* (in)active */
+            len = 8 + 4 + buf[11]; /* headers + size of profile list */
+            cpu_to_ube32(buf, len - 4); /* data length */
+            ide_atapi_cmd_reply(s, len, max_len);
             break;
         }
     default:
Signature · 9 lines
1.5.2.5


-------------------------------------------------------------------------
SF.Net email is sponsored by:
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services
for just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
#2 lore raw

PATCH 2/2 use DVD-ROM as model name for INQUIRY and IDENTIFY DEVICE

In reply to Carlo Marcelo Arenas Belon

The following patch report model as DVD-ROM for INQUIRY and IDENTIFY DEVICE commands instead of CD-ROM to reflect that the device is now able to support DVDs

---
 qemu/hw/ide.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
qemu/hw/ide.c +2 -2
index 3289964..bd579f8 100644
@@ -541,7 +541,7 @@ static void ide_atapi_identify(IDEState *s)
     put_le16(p + 21, 512); /* cache size in sectors */
     put_le16(p + 22, 4); /* ecc bytes */
     padstr((char *)(p + 23), QEMU_VERSION, 8); /* firmware version */
-    padstr((char *)(p + 27), "QEMU CD-ROM", 40); /* model */
+    padstr((char *)(p + 27), "QEMU DVD-ROM", 40); /* model */
     put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
 #ifdef USE_DMA_CDROM
     put_le16(p + 49, 1 << 9 | 1 << 8); /* DMA and LBA supported */
@@ -1630,7 +1630,7 @@ static void ide_atapi_cmd(IDEState *s)
         buf[6] = 0; /* reserved */
         buf[7] = 0; /* reserved */
         padstr8(buf + 8, 8, "QEMU");
-        padstr8(buf + 16, 16, "QEMU CD-ROM");
+        padstr8(buf + 16, 16, "QEMU DVD-ROM");
         padstr8(buf + 32, 4, QEMU_VERSION);
         ide_atapi_cmd_reply(s, 36, max_len);
         break;
Signature · 9 lines
1.5.2.5


-------------------------------------------------------------------------
SF.Net email is sponsored by:
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services
for just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
Applied
#3 lore raw
In reply to Carlo Marcelo Arenas Belon
Quoted 6 lines · Carlo Marcelo Arenas Belon

The following patch series implements fixes to the IDE/ATAPI emulation in qemu which affects access to the CD-ROM device preventing installation of OpenSolaris guests because of an incorrect implementation of the MMC6 GET_CONFIGURATION command when it was extended to also support a DVD-ROM profile.

Quoted 9 lines

Patch 1/2 : fixes GET_CONFIGURATION to allow OpenSolaris CD-ROM access Patch 2/2 : uses DVD-ROM as model name for INQUIRY and IDENTIFY DEVICE

They had been tested in Gentoo Linux 2007.0 amd64 using an Intel Core 2 6320 host and several different versions of Linux, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, OpenSolaris and Windows 2000 guests and to match exact responses when compared with real SATA and ATAPI DVD-ROM hardware.

Applied, thanks.

Signature · 9 lines
Any sufficiently difficult bug is indistinguishable from a feature.


-------------------------------------------------------------------------
SF.Net email is sponsored by:
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services
for just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace