Skip to content
  • Peter Maydell's avatar
    d565f58b
    hw/net/msf2-emac: Don't modify descriptor in-place in emac_store_desc() · d565f58b
    Peter Maydell authored
    
    
    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: default avatarPeter Maydell <peter.maydell@linaro.org>
    Reviewed-by: default avatarThomas Huth <thuth@redhat.com>
    Message-id: 20230424151919.1333299-1-peter.maydell@linaro.org
    d565f58b
    hw/net/msf2-emac: Don't modify descriptor in-place in emac_store_desc()
    Peter Maydell authored
    
    
    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: default avatarPeter Maydell <peter.maydell@linaro.org>
    Reviewed-by: default avatarThomas Huth <thuth@redhat.com>
    Message-id: 20230424151919.1333299-1-peter.maydell@linaro.org
Loading