qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2 11/33] scsi-disk: support DVD profile in GET


From: Artyom Tarasenko
Subject: Re: [Qemu-devel] [PATCH v2 11/33] scsi-disk: support DVD profile in GET CONFIGURATION
Date: Wed, 25 Jan 2012 17:34:08 +0100

This patch produces the following error when booting Solaris/SPARC:

WARNING: 
/address@hidden,10000000/address@hidden,10001000/address@hidden,8400000/address@hidden,8800000
(esp0):
        data transfer overrun: current esp state:
esp:            State=DATA Last State=DATA_DONE
esp:            Latched stat=0x91<IPND,XZERO,IO> intr=0x10<BUS> fifo 0x0
esp:            last msg out: IDENTIFY; last msg in: COMMAND COMPLETE
esp:            DMA csr=0xa4240030<FLSH,INTEN>
esp:            addr=fc005860 dmacnt=0 last=fc005858 last_cnt=8
esp:            Cmd dump for Target 6 Lun 0:
esp:            cdblen=10, cdb=[ 0x46 0x2 0x0 0x0 0x0 0x0 0x0 0x0 0x8 0x0 ]
esp:            pkt_state=0xf<XFER,CMD,SEL,ARB> pkt_flags=0x10000
pkt_statistics=0x0
esp:            cmd_flags=0x462 cmd_timeout=60

Particularly it seems that Solaris is not happy with respose length
>8. Any idea, why?

$ sparc-softmmu/qemu-system-sparc -bios ~/ss5-170.bin -m 32 -nographic
-drive if=scsi,unit=6,media=cdrom,file=~/Solaris9cd1.iso

On 10/25/11, Paolo Bonzini <address@hidden> wrote:
> Signed-off-by: Paolo Bonzini <address@hidden>
> ---
>         v1->v2: fix comment for outbuf[8]-outbuf[19]
>
>  hw/scsi-disk.c |   50 ++++++++++++++++++++++++++++++++++++++++++--------
>  1 files changed, 42 insertions(+), 8 deletions(-)
>
> diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
> index 8f25e29..69af2e3 100644
> --- a/hw/scsi-disk.c
> +++ b/hw/scsi-disk.c
> @@ -567,6 +567,19 @@ static int scsi_disk_emulate_inquiry(SCSIRequest *req,
> uint8_t *outbuf)
>      return buflen;
>  }
>
> +static inline bool media_is_dvd(SCSIDiskState *s)
> +{
> +    uint64_t nb_sectors;
> +    if (s->qdev.type != TYPE_ROM) {
> +        return false;
> +    }
> +    if (!bdrv_is_inserted(s->bs)) {
> +        return false;
> +    }
> +    bdrv_get_geometry(s->bs, &nb_sectors);
> +    return nb_sectors > CD_MAX_SECTORS;
> +}
> +
>  static int scsi_read_dvd_structure(SCSIDiskState *s, SCSIDiskReq *r,
>                                     uint8_t *outbuf)
>  {
> @@ -581,17 +594,38 @@ static int
> scsi_get_event_status_notification(SCSIDiskState *s,
>      return -1;
>  }
>
> -static int scsi_get_configuration(SCSIDiskState *s, SCSIDiskReq *r,
> -                                  uint8_t *outbuf)
> +static int scsi_get_configuration(SCSIDiskState *s, uint8_t *outbuf)
>  {
> +    int current;
> +
>      if (s->qdev.type != TYPE_ROM) {
>          return -1;
>      }
> -    memset(outbuf, 0, 8);
> -    /* ??? This should probably return much more information.  For now
> -       just return the basic header indicating the CD-ROM profile.  */
> -    outbuf[7] = 8; /* CD-ROM */
> -    return 8;
> +    current = media_is_dvd(s) ? MMC_PROFILE_DVD_ROM : MMC_PROFILE_CD_ROM;
> +    memset(outbuf, 0, 40);
> +    stl_be_p(&outbuf[0], 36); /* Bytes after the data length field */
> +    stw_be_p(&outbuf[6], current);
> +    /* outbuf[8] - outbuf[19]: Feature 0 - Profile list */
> +    outbuf[10] = 0x03; /* persistent, current */
> +    outbuf[11] = 8; /* two profiles */
> +    stw_be_p(&outbuf[12], MMC_PROFILE_DVD_ROM);
> +    outbuf[14] = (current == MMC_PROFILE_DVD_ROM);
> +    stw_be_p(&outbuf[16], MMC_PROFILE_CD_ROM);
> +    outbuf[18] = (current == MMC_PROFILE_CD_ROM);
> +    /* outbuf[20] - outbuf[31]: Feature 1 - Core feature */
> +    stw_be_p(&outbuf[20], 1);
> +    outbuf[22] = 0x08 | 0x03; /* version 2, persistent, current */
> +    outbuf[23] = 8;
> +    stl_be_p(&outbuf[24], 1); /* SCSI */
> +    outbuf[28] = 1; /* DBE = 1, mandatory */
> +    /* outbuf[32] - outbuf[39]: Feature 3 - Removable media feature */
> +    stw_be_p(&outbuf[32], 3);
> +    outbuf[34] = 0x08 | 0x03; /* version 2, persistent, current */
> +    outbuf[35] = 4;
> +    outbuf[36] = 0x39; /* tray, load=1, eject=1, unlocked at powerup,
> lock=1 */
> +    /* TODO: Random readable, CD read, DVD read, drive serial number,
> +       power management */
> +    return 40;
>  }
>
>  static int scsi_emulate_mechanism_status(SCSIDiskState *s, uint8_t *outbuf)
> @@ -1024,7 +1058,7 @@ static int scsi_disk_emulate_command(SCSIDiskReq *r)
>          }
>          break;
>      case GET_CONFIGURATION:
> -        buflen = scsi_get_configuration(s, r, outbuf);
> +        buflen = scsi_get_configuration(s, outbuf);
>          if (buflen < 0) {
>              goto illegal_request;
>          }
> --
> 1.7.6
>
>
>
>


-- 
Regards,
Artyom Tarasenko

solaris/sparc under qemu blog: http://tyom.blogspot.com/search/label/qemu



reply via email to

[Prev in Thread] Current Thread [Next in Thread]