[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 0/6] hw/arm: Fix smpboot[] on big-endian hosts and remove tsw
From: |
Peter Maydell |
Subject: |
Re: [PATCH 0/6] hw/arm: Fix smpboot[] on big-endian hosts and remove tswap32() |
Date: |
Tue, 3 Jan 2023 17:43:16 +0000 |
On Thu, 22 Dec 2022 at 21:55, Philippe Mathieu-Daudé <philmd@linaro.org> wrote:
>
> ARM CPUs fetch instructions in little-endian.
>
> smpboot[] encoded instructions are written in little-endian.
>
> We call tswap32() on the array. tswap32 function swap a 32-bit
> value if the target endianness doesn't match the host one.
> Otherwise it is a NOP.
>
> * On a little-endian host, the array is stored as it. tswap32()
> is a NOP, and the vCPU fetches the instructions as it, in
> little-endian.
>
> * On a big-endian host, the array is stored as it. tswap32()
> swap the instructions to little-endian, and the vCPU fetches
> the instructions as it, in little-endian.
>
> Using tswap() on system emulation is a bit odd: while the target
> particularities might change the system emulation, the host ones
> (such its endianness) shouldn't interfere.
>
> We can simplify by using const_le32() to always store the
> instructions in the array in little-endian, removing the need
> for the dubious tswap().
The tswap() in boot.c is not dubious at all. We start
with a 32-bit value in host order (i.e. a C constant),
and we want a value in guest order so we can write it
into memory as a byte array. The correct function for that
task is tswap()...
-- PMM
- Re: [PATCH 0/6] hw/arm: Fix smpboot[] on big-endian hosts and remove tswap32(),
Peter Maydell <=