qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 1/2] virtio-net: fix cross-endianness support


From: Aurelien Jarno
Subject: Re: [Qemu-devel] [PATCH 1/2] virtio-net: fix cross-endianness support
Date: Tue, 25 Jan 2011 09:07:38 +0100
User-agent: Mutt/1.5.18 (2008-05-17)

On Sat, Jan 15, 2011 at 08:27:43PM +0100, Aurelien Jarno wrote:
> virtio-net used to work on cross-endianness configurations, but doesn't
> anymore with recent guest kernels, as the new features don't handle
> endianness correctly.
> 
> This patch fixes wrong conversion, and add missing ones to make
> virtio-net working. Tested on the following configurations:
> - i386 guest on x86_64 host
> - ppc guest on x86_64 host
> - i386 guest on mips host
> - ppc guest on mips host
> 
> Cc: Anthony Liguori <address@hidden>
> Signed-off-by: Aurelien Jarno <address@hidden>
> ---
>  hw/virtio-net.c |   13 +++++++------
>  1 files changed, 7 insertions(+), 6 deletions(-)
> 
> diff --git a/hw/virtio-net.c b/hw/virtio-net.c
> index ec1bf8d..515fb19 100644
> --- a/hw/virtio-net.c
> +++ b/hw/virtio-net.c
> @@ -81,7 +81,7 @@ static void virtio_net_get_config(VirtIODevice *vdev, 
> uint8_t *config)
>      VirtIONet *n = to_virtio_net(vdev);
>      struct virtio_net_config netcfg;
>  
> -    netcfg.status = n->status;
> +    netcfg.status = lduw_p(&n->status);
>      memcpy(netcfg.mac, n->mac, ETH_ALEN);
>      memcpy(config, &netcfg, sizeof(netcfg));
>  }
> @@ -340,7 +340,7 @@ static int virtio_net_handle_mac(VirtIONet *n, uint8_t 
> cmd,
>      n->mac_table.multi_overflow = 0;
>      memset(n->mac_table.macs, 0, MAC_TABLE_ENTRIES * ETH_ALEN);
>  
> -    mac_data.entries = ldl_le_p(elem->out_sg[1].iov_base);
> +    mac_data.entries = ldl_p(elem->out_sg[1].iov_base);
>  
>      if (sizeof(mac_data.entries) +
>          (mac_data.entries * ETH_ALEN) > elem->out_sg[1].iov_len)
> @@ -356,7 +356,7 @@ static int virtio_net_handle_mac(VirtIONet *n, uint8_t 
> cmd,
>  
>      n->mac_table.first_multi = n->mac_table.in_use;
>  
> -    mac_data.entries = ldl_le_p(elem->out_sg[2].iov_base);
> +    mac_data.entries = ldl_p(elem->out_sg[2].iov_base);
>  
>      if (sizeof(mac_data.entries) +
>          (mac_data.entries * ETH_ALEN) > elem->out_sg[2].iov_len)
> @@ -386,7 +386,7 @@ static int virtio_net_handle_vlan_table(VirtIONet *n, 
> uint8_t cmd,
>          return VIRTIO_NET_ERR;
>      }
>  
> -    vid = lduw_le_p(elem->out_sg[1].iov_base);
> +    vid = lduw_p(elem->out_sg[1].iov_base);
>  
>      if (vid >= MAX_VLAN)
>          return VIRTIO_NET_ERR;
> @@ -675,8 +675,9 @@ static ssize_t virtio_net_receive(VLANClientState *nc, 
> const uint8_t *buf, size_
>          virtqueue_fill(n->rx_vq, &elem, total, i++);
>      }
>  
> -    if (mhdr)
> -        mhdr->num_buffers = i;
> +    if (mhdr) {
> +        mhdr->num_buffers = lduw_p(&i);
> +    }
>  
>      virtqueue_flush(n->rx_vq, i);
>      virtio_notify(&n->vdev, n->rx_vq);
> -- 
> 1.7.2.3
> 

Ping?

-- 
Aurelien Jarno                          GPG: 1024D/F1BCDB73
address@hidden                 http://www.aurel32.net



reply via email to

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