On Mon, Feb 27, 2017 at 12:52:44PM +0800, Yongji Xie wrote: > At the moment ram device's memory regions are DEVICE_NATIVE_ENDIAN. It's > incorrect. This memory region is backed by a MMIO area in host, so the > uint64_t data that MemoryRegionOps read from/write to this area should be > host-endian rather than target-endian. Hence, current code does not work > when target and host endianness are different which is the most common case > on PPC64. To fix it, this introduces DEVICE_HOST_ENDIAN for the ram device. > > This has been tested on PPC64 BE/LE host/guest in all possible combinations > including TCG. > > Suggested-by: Paolo Bonzini <[email protected]> > Signed-off-by: Yongji Xie <[email protected]>
Reviewed-by: David Gibson <[email protected]> The effect of the patch is certainly correct. I remain a little concerned that the name "host endian" might cause more confusion than it resolves, but a better term isn't immediately obvious to me. > --- > include/exec/cpu-common.h | 6 ++++++ > memory.c | 2 +- > 2 files changed, 7 insertions(+), 1 deletions(-) > > diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h > index bd15853..eef74df 100644 > --- a/include/exec/cpu-common.h > +++ b/include/exec/cpu-common.h > @@ -36,6 +36,12 @@ enum device_endian { > DEVICE_LITTLE_ENDIAN, > }; > > +#if defined(HOST_WORDS_BIGENDIAN) > +#define DEVICE_HOST_ENDIAN DEVICE_BIG_ENDIAN > +#else > +#define DEVICE_HOST_ENDIAN DEVICE_LITTLE_ENDIAN > +#endif > + > /* address in the RAM (different from a physical address) */ > #if defined(CONFIG_XEN_BACKEND) > typedef uint64_t ram_addr_t; > diff --git a/memory.c b/memory.c > index ed8b5aa..17cfada 100644 > --- a/memory.c > +++ b/memory.c > @@ -1180,7 +1180,7 @@ static void memory_region_ram_device_write(void > *opaque, hwaddr addr, > static const MemoryRegionOps ram_device_mem_ops = { > .read = memory_region_ram_device_read, > .write = memory_region_ram_device_write, > - .endianness = DEVICE_NATIVE_ENDIAN, > + .endianness = DEVICE_HOST_ENDIAN, > .valid = { > .min_access_size = 1, > .max_access_size = 8, -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
signature.asc
Description: PGP signature
