On Fri, 13 Jun 2014 13:24:59 +0200 Greg Kurz <gk...@linux.vnet.ibm.com> wrote:
> From: Rusty Russell <ru...@rustcorp.com.au> > > Note that st*_raw and ld*_raw are effectively replaced by st*_p and ld*_p. > > Signed-off-by: Rusty Russell <ru...@rustcorp.com.au> > Reviewed-by: Anthony Liguori <aligu...@us.ibm.com> > [ pass VirtIODevice * to memory accessors, > fix missing tswap32 in virtio_scsi_push_event() by Cédric Le Goater, > Greg Kurz <gk...@linux.vnet.ibm.com> ] > Cc: Cédric Le Goater <c...@fr.ibm.com> > Signed-off-by: Greg Kurz <gk...@linux.vnet.ibm.com> > --- > hw/scsi/virtio-scsi.c | 38 ++++++++++++++++++++------------------ > 1 file changed, 20 insertions(+), 18 deletions(-) > > diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c > index d5c37a9..e9afe00 100644 > --- a/hw/scsi/virtio-scsi.c > +++ b/hw/scsi/virtio-scsi.c > @@ -18,6 +18,7 @@ > #include <hw/scsi/scsi.h> > #include <block/scsi.h> > #include <hw/virtio/virtio-bus.h> > +#include "hw/virtio/virtio-access.h" > > typedef struct VirtIOSCSIReq { > VirtIOSCSI *dev; > @@ -315,6 +316,7 @@ static void virtio_scsi_command_complete(SCSIRequest *r, > uint32_t status, > VirtIOSCSIReq *req = r->hba_private; > VirtIOSCSI *s = req->dev; > VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(s); > + VirtIODevice *vdev = VIRTIO_DEVICE(s); > uint32_t sense_len; > > if (r->io_canceled) { > @@ -324,12 +326,12 @@ static void virtio_scsi_command_complete(SCSIRequest > *r, uint32_t status, > req->resp.cmd->response = VIRTIO_SCSI_S_OK; > req->resp.cmd->status = status; > if (req->resp.cmd->status == GOOD) { > - req->resp.cmd->resid = tswap32(resid); > + req->resp.cmd->resid = virtio_tswap32(vdev, resid); > } else { > req->resp.cmd->resid = 0; > sense_len = scsi_req_get_sense(r, req->resp.cmd->sense, > vs->sense_size); > - req->resp.cmd->sense_len = tswap32(sense_len); > + req->resp.cmd->sense_len = virtio_tswap32(vdev, sense_len); > } > virtio_scsi_complete_req(req); > } > @@ -425,16 +427,16 @@ static void virtio_scsi_get_config(VirtIODevice *vdev, > VirtIOSCSIConfig *scsiconf = (VirtIOSCSIConfig *)config; > VirtIOSCSICommon *s = VIRTIO_SCSI_COMMON(vdev); > > - stl_p(&scsiconf->num_queues, s->conf.num_queues); > - stl_p(&scsiconf->seg_max, 128 - 2); > - stl_p(&scsiconf->max_sectors, s->conf.max_sectors); > - stl_p(&scsiconf->cmd_per_lun, s->conf.cmd_per_lun); > - stl_p(&scsiconf->event_info_size, sizeof(VirtIOSCSIEvent)); > - stl_p(&scsiconf->sense_size, s->sense_size); > - stl_p(&scsiconf->cdb_size, s->cdb_size); > - stw_p(&scsiconf->max_channel, VIRTIO_SCSI_MAX_CHANNEL); > - stw_p(&scsiconf->max_target, VIRTIO_SCSI_MAX_TARGET); > - stl_p(&scsiconf->max_lun, VIRTIO_SCSI_MAX_LUN); > + virtio_stl_p(vdev, &scsiconf->num_queues, s->conf.num_queues); > + virtio_stl_p(vdev, &scsiconf->seg_max, 128 - 2); > + virtio_stl_p(vdev, &scsiconf->max_sectors, s->conf.max_sectors); > + virtio_stl_p(vdev, &scsiconf->cmd_per_lun, s->conf.cmd_per_lun); > + virtio_stl_p(vdev, &scsiconf->event_info_size, sizeof(VirtIOSCSIEvent)); > + virtio_stl_p(vdev, &scsiconf->sense_size, s->sense_size); > + virtio_stl_p(vdev, &scsiconf->cdb_size, s->cdb_size); > + virtio_stw_p(vdev, &scsiconf->max_channel, VIRTIO_SCSI_MAX_CHANNEL); > + virtio_stw_p(vdev, &scsiconf->max_target, VIRTIO_SCSI_MAX_TARGET); > + virtio_stl_p(vdev, &scsiconf->max_lun, VIRTIO_SCSI_MAX_LUN); > } > > static void virtio_scsi_set_config(VirtIODevice *vdev, > @@ -443,14 +445,14 @@ static void virtio_scsi_set_config(VirtIODevice *vdev, > VirtIOSCSIConfig *scsiconf = (VirtIOSCSIConfig *)config; > VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(vdev); > > - if ((uint32_t) ldl_p(&scsiconf->sense_size) >= 65536 || > - (uint32_t) ldl_p(&scsiconf->cdb_size) >= 256) { > + if ((uint32_t) virtio_ldl_p(vdev, &scsiconf->sense_size) >= 65536 || > + (uint32_t) virtio_ldl_p(vdev, &scsiconf->cdb_size) >= 256) { > error_report("bad data written to virtio-scsi configuration space"); > exit(1); > } > > - vs->sense_size = ldl_p(&scsiconf->sense_size); > - vs->cdb_size = ldl_p(&scsiconf->cdb_size); > + vs->sense_size = virtio_ldl_p(vdev, &scsiconf->sense_size); > + vs->cdb_size = virtio_ldl_p(vdev, &scsiconf->cdb_size); > } > > static uint32_t virtio_scsi_get_features(VirtIODevice *vdev, > @@ -529,8 +531,8 @@ static void virtio_scsi_push_event(VirtIOSCSI *s, > SCSIDevice *dev, > > evt = req->resp.event; > memset(evt, 0, sizeof(VirtIOSCSIEvent)); > - evt->event = event; > - evt->reason = reason; > + evt->event = virtio_tswap32(vdev, event); > + evt->reason = virtio_tswap32(vdev, reason); This chunk is a fix for a different issue actually... I'll send it in a separate patch. > if (!dev) { > assert(event == VIRTIO_SCSI_T_EVENTS_MISSED); > } else { > > -- Gregory Kurz kurzg...@fr.ibm.com gk...@linux.vnet.ibm.com Software Engineer @ IBM/Meiosys http://www.ibm.com Tel +33 (0)562 165 496 "Anarchy is about taking complete responsibility for yourself." Alan Moore.