diff mbox

arm: explicitly mark loads as little-endian

Message ID 1449232131-17317-2-git-send-email-pbonzini@redhat.com
State New
Headers show

Commit Message

Paolo Bonzini Dec. 4, 2015, 12:28 p.m. UTC
ARM softmmu is always compiled as little endian; BE8/BE32 can be
done as part of CPU emulation.  Thus, devices need not use the
endian-dependent loads and swaps.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 hw/display/omap_lcd_template.h | 4 ++--
 hw/display/pxa2xx_lcd.c        | 8 ++++----
 2 files changed, 6 insertions(+), 6 deletions(-)

Comments

Peter Maydell Dec. 4, 2015, 12:51 p.m. UTC | #1
On 4 December 2015 at 12:28, Paolo Bonzini <pbonzini@redhat.com> wrote:
> ARM softmmu is always compiled as little endian; BE8/BE32 can be
> done as part of CPU emulation.  Thus, devices need not use the
> endian-dependent loads and swaps.

The patch code is right, but I think the more significant point
here is that the behaviour of the PXA2xx and OMAP devices being
emulated here doesn't (shouldn't) depend on the CPU endianness
anyway, and these devices are little endian when they do DMA
accesses.

> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  hw/display/omap_lcd_template.h | 4 ++--
>  hw/display/pxa2xx_lcd.c        | 8 ++++----
>  2 files changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/hw/display/omap_lcd_template.h b/hw/display/omap_lcd_template.h
> index e5dd447..f0ce71f 100644
> --- a/hw/display/omap_lcd_template.h
> +++ b/hw/display/omap_lcd_template.h
> @@ -136,7 +136,7 @@ static void glue(draw_line12_, DEPTH)(void *opaque,
>      uint8_t r, g, b;
>
>      do {
> -        v = lduw_p((void *) s);
> +        v = lduw_le_p((void *) s);
>          r = (v >> 4) & 0xf0;
>          g = v & 0xf0;
>          b = (v << 4) & 0xf0;
> @@ -159,7 +159,7 @@ static void glue(draw_line16_, DEPTH)(void *opaque,
>      uint8_t r, g, b;
>
>      do {
> -        v = lduw_p((void *) s);
> +        v = lduw_le_p((void *) s);
>          r = (v >> 8) & 0xf8;
>          g = (v >> 3) & 0xfc;
>          b = (v << 3) & 0xf8;
> diff --git a/hw/display/pxa2xx_lcd.c b/hw/display/pxa2xx_lcd.c
> index 494700d..4d36c94 100644
> --- a/hw/display/pxa2xx_lcd.c
> +++ b/hw/display/pxa2xx_lcd.c
> @@ -309,10 +309,10 @@ static void pxa2xx_descriptor_load(PXA2xxLCDState *s)
>          }
>
>          cpu_physical_memory_read(descptr, &desc, sizeof(desc));
> -        s->dma_ch[i].descriptor = tswap32(desc.fdaddr);
> -        s->dma_ch[i].source = tswap32(desc.fsaddr);
> -        s->dma_ch[i].id = tswap32(desc.fidr);
> -        s->dma_ch[i].command = tswap32(desc.ldcmd);
> +        s->dma_ch[i].descriptor = le32_to_cpu(desc.fdaddr);
> +        s->dma_ch[i].source = le32_to_cpu(desc.fsaddr);
> +        s->dma_ch[i].id = le32_to_cpu(desc.fidr);
> +        s->dma_ch[i].command = le32_to_cpu(desc.ldcmd);
>      }
>  }
>
> --
> 1.8.3.1

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM
Peter Maydell Dec. 15, 2015, 11:24 a.m. UTC | #2
On 4 December 2015 at 12:28, Paolo Bonzini <pbonzini@redhat.com> wrote:
> ARM softmmu is always compiled as little endian; BE8/BE32 can be
> done as part of CPU emulation.  Thus, devices need not use the
> endian-dependent loads and swaps.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

I have applied this to target-arm.next with a tweaked
commit message:

arm: explicitly mark device loads as little-endian

Behaviour of emulated devices should not depend on the endianness
of the CPU, so avoid using the endian-dependent load and store
functions in the PXA2xx and OMAP display devices. These devices
are little endian when they do DMA access.

(Since ARM softmmu is always compiled as little endian, this means
that the endian-dependent load and store functions are always little
endian, so this commit makes no functionally visible change.)

thanks
-- PMM
diff mbox

Patch

diff --git a/hw/display/omap_lcd_template.h b/hw/display/omap_lcd_template.h
index e5dd447..f0ce71f 100644
--- a/hw/display/omap_lcd_template.h
+++ b/hw/display/omap_lcd_template.h
@@ -136,7 +136,7 @@  static void glue(draw_line12_, DEPTH)(void *opaque,
     uint8_t r, g, b;
 
     do {
-        v = lduw_p((void *) s);
+        v = lduw_le_p((void *) s);
         r = (v >> 4) & 0xf0;
         g = v & 0xf0;
         b = (v << 4) & 0xf0;
@@ -159,7 +159,7 @@  static void glue(draw_line16_, DEPTH)(void *opaque,
     uint8_t r, g, b;
 
     do {
-        v = lduw_p((void *) s);
+        v = lduw_le_p((void *) s);
         r = (v >> 8) & 0xf8;
         g = (v >> 3) & 0xfc;
         b = (v << 3) & 0xf8;
diff --git a/hw/display/pxa2xx_lcd.c b/hw/display/pxa2xx_lcd.c
index 494700d..4d36c94 100644
--- a/hw/display/pxa2xx_lcd.c
+++ b/hw/display/pxa2xx_lcd.c
@@ -309,10 +309,10 @@  static void pxa2xx_descriptor_load(PXA2xxLCDState *s)
         }
 
         cpu_physical_memory_read(descptr, &desc, sizeof(desc));
-        s->dma_ch[i].descriptor = tswap32(desc.fdaddr);
-        s->dma_ch[i].source = tswap32(desc.fsaddr);
-        s->dma_ch[i].id = tswap32(desc.fidr);
-        s->dma_ch[i].command = tswap32(desc.ldcmd);
+        s->dma_ch[i].descriptor = le32_to_cpu(desc.fdaddr);
+        s->dma_ch[i].source = le32_to_cpu(desc.fsaddr);
+        s->dma_ch[i].id = le32_to_cpu(desc.fidr);
+        s->dma_ch[i].command = le32_to_cpu(desc.ldcmd);
     }
 }