On Fri, Nov 26, 2010 at 11:47 PM, Paul Brook <p...@codesourcery.com> wrote:
>> > diff --git a/exec.c b/exec.c
>> > index db9ff55..f54a360 100644
>> > --- a/exec.c
>> > +++ b/exec.c
>> >
>> > @@ -3370,6 +3474,22 @@ static int cpu_register_io_memory_fixed(int
>> > io_index,
>> >
>> >     }
>> >     io_mem_opaque[io_index] = opaque;
>> >
>> > +    switch (endian) {
>> > +    case DEVICE_BIG_ENDIAN:
>> > +#ifndef TARGET_WORDS_BIGENDIAN
>> > +        swapendian_init(io_index);
>> > +#endif
>> > +        break;
>>
>> So basically, you just moved the #ifdefs to another place. :)
>
> Many #ifdefs inconsistently scattered through all the device code have been
> replaced by a single #ifdef.
>
>> Shouldn't this be dependent on the CPU state and determined at
>> runtime? Thinking of MSR LE bit on ppc. I guess QEMU doesn't support
>> bi-endian ppc today, as does the 970, but it would be nice to keep it
>> in mind.
>
> Switching endianness of a CPU generally does not effect the endianness of the
> CPU/peripheral busses.  It makes the CPU byteswap accesses before they are
> seen by either memory or devices.
>
> In theory it might be possible to avoid redundant byteswaps if you're really
> clever.  In practice you still have to handle the fact that your devices are a
> different endianness to RAM, so it probably doesn't gain you a whole lot.

Sparc64 MMU can also perform byte swapping, there is also a byte
swapping CPU mode and byte swapping access instructions. I think only
the instructions are used (for PCI).

Reply via email to