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 <aligu...@us.ibm.com> > Signed-off-by: Aurelien Jarno <aurel...@aurel32.net> > --- > 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 aurel...@aurel32.net http://www.aurel32.net