qemu-stable
[Top][All Lists]
Advanced

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

Re: [PATCH] hw/net/msf2-emac: Don't modify descriptor in-place in emac_s


From: Peter Maydell
Subject: Re: [PATCH] hw/net/msf2-emac: Don't modify descriptor in-place in emac_store_desc()
Date: Tue, 2 May 2023 11:25:33 +0100

On Mon, 24 Apr 2023 at 17:27, Thomas Huth <thuth@redhat.com> wrote:
>
> On 24/04/2023 17.19, Peter Maydell wrote:
> > The msf2-emac ethernet controller has functions emac_load_desc() and
> > emac_store_desc() which read and write the in-memory descriptor
> > blocks and handle conversion between guest and host endianness.
> >
> > As currently written, emac_store_desc() does the endianness
> > conversion in-place; this means that it effectively consumes the
> > input EmacDesc struct, because on a big-endian host the fields will
> > be overwritten with the little-endian versions of their values.
> > Unfortunately, in all the callsites the code continues to access
> > fields in the EmacDesc struct after it has called emac_store_desc()
> > -- specifically, it looks at the d.next field.
> >
> > The effect of this is that on a big-endian host networking doesn't
> > work because the address of the next descriptor is corrupted.
> >
> > We could fix this by making the callsite avoid using the struct; but
> > it's more robust to have emac_store_desc() leave its input alone.
> >
> > (emac_load_desc() also does an in-place conversion, but here this is
> > fine, because the function is supposed to be initializing the
> > struct.)
> >
> > Cc: qemu-stable@nongnu.org
> > Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> > ---
> > This is one of a number of issues that prevent 'make check-avocado'
> > working for arm targets on a big-endian host...
> >
> >   hw/net/msf2-emac.c | 14 +++++++++-----
> >   1 file changed, 9 insertions(+), 5 deletions(-)
> >
> > diff --git a/hw/net/msf2-emac.c b/hw/net/msf2-emac.c
> > index 7ccd3e51427..34c1f768db0 100644
> > --- a/hw/net/msf2-emac.c
> > +++ b/hw/net/msf2-emac.c
> > @@ -120,12 +120,16 @@ static void emac_load_desc(MSF2EmacState *s, EmacDesc 
> > *d, hwaddr desc)
> >
> >   static void emac_store_desc(MSF2EmacState *s, EmacDesc *d, hwaddr desc)
>
> You could likely also add a "const" to "EmacDesc *d" now.

Yep; applied to target-arm.next with that change added.

-- PMM



reply via email to

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