qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] cdrom disc type - is this patch correct? (unbreaks recent FreeBSD guest's -cdrom access)
@ 2007-11-13 21:22 Juergen Lock
  2007-11-14 12:02 ` Jens Axboe
  0 siblings, 1 reply; 4+ messages in thread
From: Juergen Lock @ 2007-11-13 21:22 UTC (permalink / raw)
  To: qemu-devel

Hi!

 Yesterday I learned that FreeBSD 7.0-BETA2 guests will no longer
read from the emulated cd drive, apparently because of this commit:
	http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/ata/atapi-cd.c.diff?r1=1.193;r2=1.193.2.1
The following patch file added to the qemu-devel port fixes the issue
for me, is it also correct?   (making the guest see a dvd in the drive
when it is inserted, previously it saw the drive as empty.)

 The second hunk is already in qemu cvs so remove it if you want to
test on that.  ISO used for testing:
	ftp://ftp.freebsd.org:/pub/FreeBSD/ISO-IMAGES-i386/7.0/7.0-BETA2-i386-disc1.iso
(test by either selecting fixit->cdrom or by trying to install, just
booting it will always work because that goes thru the bios.)

Index: qemu/hw/ide.c
@@ -1339,6 +1341,8 @@
                 case 0x2a:
                     cpu_to_ube16(&buf[0], 28 + 6);
                     buf[2] = 0x70;
+                    if (bdrv_is_inserted(s->bs))
+                        buf[2] = 0x40;
                     buf[3] = 0;
                     buf[4] = 0;
                     buf[5] = 0;
@@ -1347,7 +1351,7 @@
 
                     buf[8] = 0x2a;
                     buf[9] = 0x12;
-                    buf[10] = 0x00;
+                    buf[10] = 0x08;
                     buf[11] = 0x00;
                     
                     buf[12] = 0x70;

 Thanx,
	Juergen

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] cdrom disc type - is this patch correct? (unbreaks  recent FreeBSD guest's -cdrom access)
  2007-11-13 21:22 [Qemu-devel] cdrom disc type - is this patch correct? (unbreaks recent FreeBSD guest's -cdrom access) Juergen Lock
@ 2007-11-14 12:02 ` Jens Axboe
  2007-11-18 23:37   ` Juergen Lock
  0 siblings, 1 reply; 4+ messages in thread
From: Jens Axboe @ 2007-11-14 12:02 UTC (permalink / raw)
  To: qemu-devel

On Tue, Nov 13 2007, Juergen Lock wrote:
> Hi!
> 
>  Yesterday I learned that FreeBSD 7.0-BETA2 guests will no longer
> read from the emulated cd drive, apparently because of this commit:
> 	http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/ata/atapi-cd.c.diff?r1=1.193;r2=1.193.2.1
> The following patch file added to the qemu-devel port fixes the issue
> for me, is it also correct?   (making the guest see a dvd in the drive
> when it is inserted, previously it saw the drive as empty.)
> 
>  The second hunk is already in qemu cvs so remove it if you want to
> test on that.  ISO used for testing:
> 	ftp://ftp.freebsd.org:/pub/FreeBSD/ISO-IMAGES-i386/7.0/7.0-BETA2-i386-disc1.iso
> (test by either selecting fixit->cdrom or by trying to install, just
> booting it will always work because that goes thru the bios.)
> 
> Index: qemu/hw/ide.c
> @@ -1339,6 +1341,8 @@
>                  case 0x2a:
>                      cpu_to_ube16(&buf[0], 28 + 6);
>                      buf[2] = 0x70;
> +                    if (bdrv_is_inserted(s->bs))
> +                        buf[2] = 0x40;

medium type code has been obsoleted since at least 1999. Looking back at
even older docs, 0x70 is 'door closed, no disc present'. 0x40 is a
reserved value though, I would not suggest using that. Given that
freebsd breaks, my suggest change would be the below - keep the 0x70 for
when no disc is really inserted, but don't set anything if there is.

diff --git a/hw/ide.c b/hw/ide.c
index 5f76c27..52d4c78 100644
--- a/hw/ide.c
+++ b/hw/ide.c
@@ -1344,7 +1344,10 @@ static void ide_atapi_cmd(IDEState *s)
                     break;
                 case 0x2a:
                     cpu_to_ube16(&buf[0], 28 + 6);
-                    buf[2] = 0x70;
+		    if (!bdrv_is_inserted(s->bs))
+			buf[2] = 0x70;
+		    else
+			buf[2] = 0;
                     buf[3] = 0;
                     buf[4] = 0;
                     buf[5] = 0;

-- 
Jens Axboe

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] cdrom disc type - is this patch correct? (unbreaks  recent FreeBSD guest's -cdrom access)
  2007-11-14 12:02 ` Jens Axboe
@ 2007-11-18 23:37   ` Juergen Lock
  2007-11-19  9:21     ` Jens Axboe
  0 siblings, 1 reply; 4+ messages in thread
From: Juergen Lock @ 2007-11-18 23:37 UTC (permalink / raw)
  To: qemu; +Cc: qemu-devel

Oops, I seem to have missed this post, sorry for not answering earlier...

In article <20071114120203.GD5064@kernel.dk> you write:
>On Tue, Nov 13 2007, Juergen Lock wrote:
>> Hi!
>> 
>>  Yesterday I learned that FreeBSD 7.0-BETA2 guests will no longer
>> read from the emulated cd drive, apparently because of this commit:
>> 
>http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/ata/atapi-cd.c.diff?r1=1.193;r2=1.193.2.1
>> The following patch file added to the qemu-devel port fixes the issue
>> for me, is it also correct?   (making the guest see a dvd in the drive
>> when it is inserted, previously it saw the drive as empty.)
>> 
>>  The second hunk is already in qemu cvs so remove it if you want to
>> test on that.  ISO used for testing:
>> 
>ftp://ftp.freebsd.org:/pub/FreeBSD/ISO-IMAGES-i386/7.0/7.0-BETA2-i386-disc1.iso
>> (test by either selecting fixit->cdrom or by trying to install, just
>> booting it will always work because that goes thru the bios.)
>> 
>> Index: qemu/hw/ide.c
>> @@ -1339,6 +1341,8 @@
>>                  case 0x2a:
>>                      cpu_to_ube16(&buf[0], 28 + 6);
>>                      buf[2] = 0x70;
>> +                    if (bdrv_is_inserted(s->bs))
>> +                        buf[2] = 0x40;
>
>medium type code has been obsoleted since at least 1999. Looking back at
>even older docs, 0x70 is 'door closed, no disc present'. 0x40 is a
>reserved value though, I would not suggest using that. Given that
>freebsd breaks, my suggest change would be the below - keep the 0x70 for
>when no disc is really inserted, but don't set anything if there is.
>
>diff --git a/hw/ide.c b/hw/ide.c
>index 5f76c27..52d4c78 100644
>--- a/hw/ide.c
>+++ b/hw/ide.c
>@@ -1344,7 +1344,10 @@ static void ide_atapi_cmd(IDEState *s)
>                     break;
>                 case 0x2a:
>                     cpu_to_ube16(&buf[0], 28 + 6);
>-                    buf[2] = 0x70;
>+		    if (!bdrv_is_inserted(s->bs))
>+			buf[2] = 0x70;
>+		    else
>+			buf[2] = 0;
>                     buf[3] = 0;
>                     buf[4] = 0;
>                     buf[5] = 0;
>

 Well that (0) doesn't work.  The relevant FreeBSD header,
	http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/ata/atapi-cd.h?rev=1.46.2.1;content-type=text%2Fx-cvsweb-markup
, defines the following:

[...]
/* CDROM Capabilities and Mechanical Status Page */
struct cappage {
    /* mode page data header */
    u_int16_t   data_length;
    u_int8_t    medium_type;
#define MST_TYPE_MASK_LOW       0x0f
#define MST_FMT_NONE            0x00
#define MST_DATA_120            0x01
#define MST_AUDIO_120           0x02
#define MST_COMB_120            0x03
#define MST_PHOTO_120           0x04
#define MST_DATA_80             0x05
#define MST_AUDIO_80            0x06
#define MST_COMB_80             0x07
#define MST_PHOTO_80            0x08

#define MST_TYPE_MASK_HIGH      0x70
#define MST_CDROM               0x00
#define MST_CDR                 0x10
#define MST_CDRW                0x20
#define MST_DVD                 0x40

#define MST_NO_DISC             0x70
#define MST_DOOR_OPEN           0x71
#define MST_FMT_ERROR           0x72

    u_int8_t    dev_spec;
    u_int16_t   unused;
    u_int16_t   blk_desc_len;

    /* capabilities page */
    u_int8_t    page_code;
#define ATAPI_CDROM_CAP_PAGE    0x2a

    u_int8_t    param_len;

    u_int16_t   media;
#define MST_READ_CDR            0x0001
#define MST_READ_CDRW           0x0002
#define MST_READ_PACKET         0x0004
#define MST_READ_DVDROM         0x0008
#define MST_READ_DVDR           0x0010
#define MST_READ_DVDRAM         0x0020
#define MST_WRITE_CDR           0x0100
#define MST_WRITE_CDRW          0x0200
#define MST_WRITE_TEST          0x0400
#define MST_WRITE_DVDR          0x1000
#define MST_WRITE_DVDRAM        0x2000

    u_int16_t   capabilities;
#define MST_AUDIO_PLAY          0x0001
#define MST_COMPOSITE           0x0002
#define MST_AUDIO_P1            0x0004
#define MST_AUDIO_P2            0x0008
#define MST_MODE2_f1            0x0010
#define MST_MODE2_f2            0x0020
#define MST_MULTISESSION        0x0040
#define MST_BURNPROOF           0x0080
#define MST_READ_CDDA           0x0100
#define MST_CDDA_STREAM         0x0200
#define MST_COMBINED_RW         0x0400
#define MST_CORRECTED_RW        0x0800
#define MST_SUPPORT_C2          0x1000
#define MST_ISRC                0x2000
#define MST_UPC                 0x4000

    u_int8_t    mechanism;
#define MST_LOCKABLE            0x01
#define MST_LOCKED              0x02
#define MST_PREVENT             0x04
#define MST_EJECT               0x08
#define MST_MECH_MASK           0xe0
#define MST_MECH_CADDY          0x00
#define MST_MECH_TRAY           0x20
#define MST_MECH_POPUP          0x40
#define MST_MECH_CHANGER        0x80
#define MST_MECH_CARTRIDGE      0xa0

    uint8_t     audio;
#define MST_SEP_VOL             0x01
#define MST_SEP_MUTE            0x02

    u_int16_t   max_read_speed;         /* max raw data rate in bytes/1000 */
    u_int16_t   max_vol_levels;         /* number of discrete volume levels */
    u_int16_t   buf_size;               /* internal buffer size in bytes/1024 */
    u_int16_t   cur_read_speed;         /* current data rate in bytes/1000  */

    u_int8_t    reserved3;
    u_int8_t    misc;

    u_int16_t   max_write_speed;        /* max raw data rate in bytes/1000 */
    u_int16_t   cur_write_speed;        /* current data rate in bytes/1000  */
    u_int16_t   copy_protect_rev;
    u_int16_t   reserved4;
};

[...]

 and in
	http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/ata/atapi-cd.c?rev=1.193.2.1;content-type=text%2Fx-cvsweb-markup
a check is done like this:

[...]
static int
acd_geom_access(struct g_provider *pp, int dr, int dw, int de)
{
    device_t dev = pp->geom->softc;
    struct acd_softc *cdp = device_get_ivars(dev);
    int timeout = 60, track;

    /* check for media present, waiting for loading medium just in case */
    while (timeout--) {
	if (!acd_mode_sense(dev, ATAPI_CDROM_CAP_PAGE,
			    (caddr_t)&cdp->cap, sizeof(cdp->cap)) &&
			    cdp->cap.page_code == ATAPI_CDROM_CAP_PAGE) {
	    if ((cdp->cap.medium_type == MST_FMT_NONE) ||
		(cdp->cap.medium_type == MST_NO_DISC) ||
		(cdp->cap.medium_type == MST_DOOR_OPEN) ||
		(cdp->cap.medium_type == MST_FMT_ERROR))
		return EIO;
	    else
		break;
	}
	pause("acdld", hz / 2);
    }
[...]

 There have been reports of this also being broken on real hw tho, like,
	http://lists.freebsd.org/pipermail/freebsd-current/2007-November/079760.html
so I'm not sure what to make of this...

 Thanx,
	Juergen

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] cdrom disc type - is this patch correct? (unbreaks  recent FreeBSD guest's -cdrom access)
  2007-11-18 23:37   ` Juergen Lock
@ 2007-11-19  9:21     ` Jens Axboe
  0 siblings, 0 replies; 4+ messages in thread
From: Jens Axboe @ 2007-11-19  9:21 UTC (permalink / raw)
  To: Juergen Lock; +Cc: qemu-devel

On Mon, Nov 19 2007, Juergen Lock wrote:
> Oops, I seem to have missed this post, sorry for not answering earlier...
> 
> In article <20071114120203.GD5064@kernel.dk> you write:
> >On Tue, Nov 13 2007, Juergen Lock wrote:
> >> Hi!
> >> 
> >>  Yesterday I learned that FreeBSD 7.0-BETA2 guests will no longer
> >> read from the emulated cd drive, apparently because of this commit:
> >> 
> >http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/ata/atapi-cd.c.diff?r1=1.193;r2=1.193.2.1
> >> The following patch file added to the qemu-devel port fixes the issue
> >> for me, is it also correct?   (making the guest see a dvd in the drive
> >> when it is inserted, previously it saw the drive as empty.)
> >> 
> >>  The second hunk is already in qemu cvs so remove it if you want to
> >> test on that.  ISO used for testing:
> >> 
> >ftp://ftp.freebsd.org:/pub/FreeBSD/ISO-IMAGES-i386/7.0/7.0-BETA2-i386-disc1.iso
> >> (test by either selecting fixit->cdrom or by trying to install, just
> >> booting it will always work because that goes thru the bios.)
> >> 
> >> Index: qemu/hw/ide.c
> >> @@ -1339,6 +1341,8 @@
> >>                  case 0x2a:
> >>                      cpu_to_ube16(&buf[0], 28 + 6);
> >>                      buf[2] = 0x70;
> >> +                    if (bdrv_is_inserted(s->bs))
> >> +                        buf[2] = 0x40;
> >
> >medium type code has been obsoleted since at least 1999. Looking back at
> >even older docs, 0x70 is 'door closed, no disc present'. 0x40 is a
> >reserved value though, I would not suggest using that. Given that
> >freebsd breaks, my suggest change would be the below - keep the 0x70 for
> >when no disc is really inserted, but don't set anything if there is.
> >
> >diff --git a/hw/ide.c b/hw/ide.c
> >index 5f76c27..52d4c78 100644
> >--- a/hw/ide.c
> >+++ b/hw/ide.c
> >@@ -1344,7 +1344,10 @@ static void ide_atapi_cmd(IDEState *s)
> >                     break;
> >                 case 0x2a:
> >                     cpu_to_ube16(&buf[0], 28 + 6);
> >-                    buf[2] = 0x70;
> >+		    if (!bdrv_is_inserted(s->bs))
> >+			buf[2] = 0x70;
> >+		    else
> >+			buf[2] = 0;
> >                     buf[3] = 0;
> >                     buf[4] = 0;
> >                     buf[5] = 0;
> >
> 
>  Well that (0) doesn't work.  The relevant FreeBSD header,
> 	http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/ata/atapi-cd.h?rev=1.46.2.1;content-type=text%2Fx-cvsweb-markup
> , defines the following:
> 
> [...]
> /* CDROM Capabilities and Mechanical Status Page */
> struct cappage {
>     /* mode page data header */
>     u_int16_t   data_length;
>     u_int8_t    medium_type;
> #define MST_TYPE_MASK_LOW       0x0f
> #define MST_FMT_NONE            0x00
> #define MST_DATA_120            0x01
> #define MST_AUDIO_120           0x02
> #define MST_COMB_120            0x03
> #define MST_PHOTO_120           0x04
> #define MST_DATA_80             0x05
> #define MST_AUDIO_80            0x06
> #define MST_COMB_80             0x07
> #define MST_PHOTO_80            0x08
> 
> #define MST_TYPE_MASK_HIGH      0x70
> #define MST_CDROM               0x00
> #define MST_CDR                 0x10
> #define MST_CDRW                0x20
> #define MST_DVD                 0x40
> 
> #define MST_NO_DISC             0x70
> #define MST_DOOR_OPEN           0x71
> #define MST_FMT_ERROR           0x72
> 
>     u_int8_t    dev_spec;
>     u_int16_t   unused;
>     u_int16_t   blk_desc_len;
> 
>     /* capabilities page */
>     u_int8_t    page_code;
> #define ATAPI_CDROM_CAP_PAGE    0x2a
> 
>     u_int8_t    param_len;
> 
>     u_int16_t   media;
> #define MST_READ_CDR            0x0001
> #define MST_READ_CDRW           0x0002
> #define MST_READ_PACKET         0x0004
> #define MST_READ_DVDROM         0x0008
> #define MST_READ_DVDR           0x0010
> #define MST_READ_DVDRAM         0x0020
> #define MST_WRITE_CDR           0x0100
> #define MST_WRITE_CDRW          0x0200
> #define MST_WRITE_TEST          0x0400
> #define MST_WRITE_DVDR          0x1000
> #define MST_WRITE_DVDRAM        0x2000
> 
>     u_int16_t   capabilities;
> #define MST_AUDIO_PLAY          0x0001
> #define MST_COMPOSITE           0x0002
> #define MST_AUDIO_P1            0x0004
> #define MST_AUDIO_P2            0x0008
> #define MST_MODE2_f1            0x0010
> #define MST_MODE2_f2            0x0020
> #define MST_MULTISESSION        0x0040
> #define MST_BURNPROOF           0x0080
> #define MST_READ_CDDA           0x0100
> #define MST_CDDA_STREAM         0x0200
> #define MST_COMBINED_RW         0x0400
> #define MST_CORRECTED_RW        0x0800
> #define MST_SUPPORT_C2          0x1000
> #define MST_ISRC                0x2000
> #define MST_UPC                 0x4000
> 
>     u_int8_t    mechanism;
> #define MST_LOCKABLE            0x01
> #define MST_LOCKED              0x02
> #define MST_PREVENT             0x04
> #define MST_EJECT               0x08
> #define MST_MECH_MASK           0xe0
> #define MST_MECH_CADDY          0x00
> #define MST_MECH_TRAY           0x20
> #define MST_MECH_POPUP          0x40
> #define MST_MECH_CHANGER        0x80
> #define MST_MECH_CARTRIDGE      0xa0
> 
>     uint8_t     audio;
> #define MST_SEP_VOL             0x01
> #define MST_SEP_MUTE            0x02
> 
>     u_int16_t   max_read_speed;         /* max raw data rate in bytes/1000 */
>     u_int16_t   max_vol_levels;         /* number of discrete volume levels */
>     u_int16_t   buf_size;               /* internal buffer size in bytes/1024 */
>     u_int16_t   cur_read_speed;         /* current data rate in bytes/1000  */
> 
>     u_int8_t    reserved3;
>     u_int8_t    misc;
> 
>     u_int16_t   max_write_speed;        /* max raw data rate in bytes/1000 */
>     u_int16_t   cur_write_speed;        /* current data rate in bytes/1000  */
>     u_int16_t   copy_protect_rev;
>     u_int16_t   reserved4;
> };
> 
> [...]
> 
>  and in
> 	http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/ata/atapi-cd.c?rev=1.193.2.1;content-type=text%2Fx-cvsweb-markup
> a check is done like this:
> 
> [...]
> static int
> acd_geom_access(struct g_provider *pp, int dr, int dw, int de)
> {
>     device_t dev = pp->geom->softc;
>     struct acd_softc *cdp = device_get_ivars(dev);
>     int timeout = 60, track;
> 
>     /* check for media present, waiting for loading medium just in case */
>     while (timeout--) {
> 	if (!acd_mode_sense(dev, ATAPI_CDROM_CAP_PAGE,
> 			    (caddr_t)&cdp->cap, sizeof(cdp->cap)) &&
> 			    cdp->cap.page_code == ATAPI_CDROM_CAP_PAGE) {
> 	    if ((cdp->cap.medium_type == MST_FMT_NONE) ||
> 		(cdp->cap.medium_type == MST_NO_DISC) ||
> 		(cdp->cap.medium_type == MST_DOOR_OPEN) ||
> 		(cdp->cap.medium_type == MST_FMT_ERROR))
> 		return EIO;
> 	    else
> 		break;
> 	}
> 	pause("acdld", hz / 2);
>     }
> [...]
> 
>  There have been reports of this also being broken on real hw tho,
>  like,
>  http://lists.freebsd.org/pipermail/freebsd-current/2007-November/079760.html
>  so I'm not sure what to make of this...

Well if you ask me (I used to maintain the linux atapi driver), the
freebsd driver suffers from a classic case of 'but the specs says so!'
syndrome. In this case it's even ancient documentation. Drivers should
never try to be 100% spec oriented, they also need a bit of real life
sensibility. The code you quote right above this text is clearly too
anal.

-- 
Jens Axboe

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2007-11-19  9:23 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-11-13 21:22 [Qemu-devel] cdrom disc type - is this patch correct? (unbreaks recent FreeBSD guest's -cdrom access) Juergen Lock
2007-11-14 12:02 ` Jens Axboe
2007-11-18 23:37   ` Juergen Lock
2007-11-19  9:21     ` Jens Axboe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).