[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensi
From: |
David Gibson |
Subject: |
Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive |
Date: |
Fri, 24 Feb 2017 14:28:29 +1100 |
User-agent: |
Mutt/1.7.1 (2016-10-04) |
On Fri, Feb 24, 2017 at 01:14:09AM +0800, Yongji Xie wrote:
> on 2017/2/24 0:15, Paolo Bonzini wrote:
>
> >
> > On 23/02/2017 17:08, Peter Maydell wrote:
> > > On 23 February 2017 at 15:58, Paolo Bonzini <address@hidden> wrote:
> > > > However, DEVICE_NATIVE_ENDIAN would have to be paired with tswap, which
> > > > the current code does not do, hence the bug. To have no swap at all,
> > > > you'd need DEVICE_HOST_ENDIAN.
> > > Yes, I agree that the current ramdevice code has this bug (and
> > > that we can fix it by any of the various options).
> > Good. :)
> >
> > > > > AIUI what we want for this VFIO case is "when the guest does
> > > > > a 32-bit write of 0x12345678 then the bytes are 0x12 0x34 0x56 0x78
> > > > > regardless of whether TARGET_BIG_ENDIAN or not".
> > > > No, I don't think so. This is not specific to VFIO. You can do it with
> > > > any device, albeit VFIO is currently the only one using ramd regions.
> > > The commit message in the patch that started this thread off
> > > says specifically that "VFIO PCI device is little endian".
> > > Is that wrong?
> > Yes, I think it's a red herring. Hence my initial confusion, when I
> > asked "would Yongji's patch just work if it used DEVICE_BIG_ENDIAN and
> > beNN_to_cpu/cpu_to_beNN".
> >
>
> Thank you for the great discussion. I have a better understanding of the
> endianness now.:-)
>
> And for the commit message, I was wrong to assume the same endianness
> as vfio. That's my fault. This bug should happen when target and host
> endianness are different regardless of the device endianness.
>
> To fix it, introducing DEVICE_HOST_ENDIAN for the ram device seems to be
> more reasonable than other ways. I think I'll update the patch with this
> way.
I think this is basically the right approach, with the only caveat
being whether we want to call it "host endian" or something else.
> 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,
>
> Thanks,
> Yongji
>
--
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
- Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive, (continued)
- Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive, Paolo Bonzini, 2017/02/23
- Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive, Peter Maydell, 2017/02/23
- Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive, Paolo Bonzini, 2017/02/23
- Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive, Peter Maydell, 2017/02/23
- Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive, Paolo Bonzini, 2017/02/23
- Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive, Peter Maydell, 2017/02/23
- Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive, Paolo Bonzini, 2017/02/23
- Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive, Peter Maydell, 2017/02/23
- Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive, Paolo Bonzini, 2017/02/23
- Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive, Yongji Xie, 2017/02/23
- Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive,
David Gibson <=
- Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive, Paul Mackerras, 2017/02/23
- Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive, Alex Williamson, 2017/02/23
- Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive, Paolo Bonzini, 2017/02/23
- Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive, Alex Williamson, 2017/02/23
- Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive, David Gibson, 2017/02/23
- Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive, Alexey Kardashevskiy, 2017/02/23
Re: [Qemu-devel] [PATCH] memory: make ram device read/write endian sensitive, Michael Roth, 2017/02/26