* [Qemu-devel] [PATCH] virtio-scsi Fix some endian bugs with virtio-scsi
@ 2012-11-23 5:08 David Gibson
2012-11-23 7:11 ` Stefan Hajnoczi
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: David Gibson @ 2012-11-23 5:08 UTC (permalink / raw)
To: pbonzini, aliguori; +Cc: Paul 'Rusty' Russell, qemu-devel, David Gibson
The virtio-scsi specification does not specify the correct endianness for
fields in the request structure. It's therefore best to assume that it is
"guest native" endian since that's the (stupid and poorly defined) norm in
virtio.
However, the qemu device for virtio-scsi has no byteswaps at all, and so
will break if the guest has different endianness from the host. This patch
fixes it by adding tswap() calls for the sense_len and resid fields in
the request structure. In theory status_qualifier needs swaps as well,
but that field is never actually touched. The tag field is a uint64_t, but
since its value is completely arbitrary, it might as well be uint8_t[8]
and so it does not need swapping.
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Paul 'Rusty' Russell <rusty@rustcorp.com.au>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
hw/virtio-scsi.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/hw/virtio-scsi.c b/hw/virtio-scsi.c
index 7d546f6..9d27d1d 100644
--- a/hw/virtio-scsi.c
+++ b/hw/virtio-scsi.c
@@ -428,11 +428,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 = resid;
+ req->resp.cmd->resid = tswap32(resid);
} else {
req->resp.cmd->resid = 0;
req->resp.cmd->sense_len =
- scsi_req_get_sense(r, req->resp.cmd->sense, VIRTIO_SCSI_SENSE_SIZE);
+ tswap32(scsi_req_get_sense(r, req->resp.cmd->sense,
+ VIRTIO_SCSI_SENSE_SIZE));
}
virtio_scsi_complete_req(req);
}
--
1.7.10.4
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH] virtio-scsi Fix some endian bugs with virtio-scsi
2012-11-23 5:08 [Qemu-devel] [PATCH] virtio-scsi Fix some endian bugs with virtio-scsi David Gibson
@ 2012-11-23 7:11 ` Stefan Hajnoczi
2012-11-23 7:29 ` Paolo Bonzini
2012-12-02 22:08 ` Rusty Russell
2 siblings, 0 replies; 4+ messages in thread
From: Stefan Hajnoczi @ 2012-11-23 7:11 UTC (permalink / raw)
To: David Gibson; +Cc: pbonzini, aliguori, Paul 'Rusty' Russell, qemu-devel
On Fri, Nov 23, 2012 at 04:08:44PM +1100, David Gibson wrote:
> The virtio-scsi specification does not specify the correct endianness for
> fields in the request structure. It's therefore best to assume that it is
> "guest native" endian since that's the (stupid and poorly defined) norm in
> virtio.
>
> However, the qemu device for virtio-scsi has no byteswaps at all, and so
> will break if the guest has different endianness from the host. This patch
> fixes it by adding tswap() calls for the sense_len and resid fields in
> the request structure. In theory status_qualifier needs swaps as well,
> but that field is never actually touched. The tag field is a uint64_t, but
> since its value is completely arbitrary, it might as well be uint8_t[8]
> and so it does not need swapping.
>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: Paul 'Rusty' Russell <rusty@rustcorp.com.au>
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> ---
> hw/virtio-scsi.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH] virtio-scsi Fix some endian bugs with virtio-scsi
2012-11-23 5:08 [Qemu-devel] [PATCH] virtio-scsi Fix some endian bugs with virtio-scsi David Gibson
2012-11-23 7:11 ` Stefan Hajnoczi
@ 2012-11-23 7:29 ` Paolo Bonzini
2012-12-02 22:08 ` Rusty Russell
2 siblings, 0 replies; 4+ messages in thread
From: Paolo Bonzini @ 2012-11-23 7:29 UTC (permalink / raw)
To: David Gibson; +Cc: aliguori, Paul 'Rusty' Russell, qemu-devel
Il 23/11/2012 06:08, David Gibson ha scritto:
> The virtio-scsi specification does not specify the correct endianness for
> fields in the request structure. It's therefore best to assume that it is
> "guest native" endian since that's the (stupid and poorly defined) norm in
> virtio.
Indeed.
> However, the qemu device for virtio-scsi has no byteswaps at all, and so
> will break if the guest has different endianness from the host. This patch
> fixes it by adding tswap() calls for the sense_len and resid fields in
> the request structure. In theory status_qualifier needs swaps as well,
> but that field is never actually touched. The tag field is a uint64_t, but
> since its value is completely arbitrary, it might as well be uint8_t[8]
> and so it does not need swapping.
Thanks, I adjusted the patch to use a separate variable for the argument
of tswap32 and pushed to the scsi branch.
Paolo
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: Paul 'Rusty' Russell <rusty@rustcorp.com.au>
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> ---
> hw/virtio-scsi.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/hw/virtio-scsi.c b/hw/virtio-scsi.c
> index 7d546f6..9d27d1d 100644
> --- a/hw/virtio-scsi.c
> +++ b/hw/virtio-scsi.c
> @@ -428,11 +428,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 = resid;
> + req->resp.cmd->resid = tswap32(resid);
> } else {
> req->resp.cmd->resid = 0;
> req->resp.cmd->sense_len =
> - scsi_req_get_sense(r, req->resp.cmd->sense, VIRTIO_SCSI_SENSE_SIZE);
> + tswap32(scsi_req_get_sense(r, req->resp.cmd->sense,
> + VIRTIO_SCSI_SENSE_SIZE));
> }
> virtio_scsi_complete_req(req);
> }
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH] virtio-scsi Fix some endian bugs with virtio-scsi
2012-11-23 5:08 [Qemu-devel] [PATCH] virtio-scsi Fix some endian bugs with virtio-scsi David Gibson
2012-11-23 7:11 ` Stefan Hajnoczi
2012-11-23 7:29 ` Paolo Bonzini
@ 2012-12-02 22:08 ` Rusty Russell
2 siblings, 0 replies; 4+ messages in thread
From: Rusty Russell @ 2012-12-02 22:08 UTC (permalink / raw)
To: David Gibson, pbonzini, aliguori; +Cc: qemu-devel
David Gibson <david@gibson.dropbear.id.au> writes:
> The virtio-scsi specification does not specify the correct endianness for
> fields in the request structure. It's therefore best to assume that it is
> "guest native" endian since that's the (stupid and poorly defined) norm in
> virtio.
>
> However, the qemu device for virtio-scsi has no byteswaps at all, and so
> will break if the guest has different endianness from the host. This patch
> fixes it by adding tswap() calls for the sense_len and resid fields in
> the request structure. In theory status_qualifier needs swaps as well,
> but that field is never actually touched. The tag field is a uint64_t, but
> since its value is completely arbitrary, it might as well be uint8_t[8]
> and so it does not need swapping.
>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: Paul 'Rusty' Russell <rusty@rustcorp.com.au>
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Good catch, thanks for this David.
Cheers,
Rusty.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2012-12-02 23:13 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-11-23 5:08 [Qemu-devel] [PATCH] virtio-scsi Fix some endian bugs with virtio-scsi David Gibson
2012-11-23 7:11 ` Stefan Hajnoczi
2012-11-23 7:29 ` Paolo Bonzini
2012-12-02 22:08 ` Rusty Russell
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).