Skip to content
  • Peter Maydell's avatar
    hw/pci-host/prep: Don't reverse IO accesses on bigendian hosts · 7dc176bc
    Peter Maydell authored
    
    
    The raven_io_read() and raven_io_write() functions pass and
    return values in little-endian format (since the IO op struct
    is marked DEVICE_LITTLE_ENDIAN); however they were storing the
    values in the buffer to pass to address_space_read/write()
    in host-endian order, which meant that on big-endian hosts
    the values were inadvertently reversed. Use the *_le_p()
    accessors instead so that we are consistent regardless of
    host endianness.
    
    Strictly speaking the byte order of the buffer for
    address_space_rw() is target byte order (which for PPC
    will be BE) but it doesn't actually matter as long as we
    are consistent about the marking on the IO op struct and
    which stl_*_p().
    
    This bug was probably introduced due to confusion caused by
    the two different versions of ldl_p() and friends:
     bswap.h defines versions meaning "host endianness access"
     cpu-all.h defines versions meaning "target endianness access"
    As a target-independent source file prep.c gets the bswap.h
    versions; the very similar looking code in ioport.c is
    compiled per-target and gets the cpu-all.h versions.
    
    Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
    Message-id: 1396972271-22660-1-git-send-email-peter.maydell@linaro.org
    Reviewed-by: default avatarRichard Henderson <rth@twiddle.net>
    7dc176bc