These functions are needed to support semihosting on CPUs that support runtime-configurable endianness. They should not be used in other contexts.
Signed-off-by: Martin Kröning <[email protected]> --- include/exec/tswap.h | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/include/exec/tswap.h b/include/exec/tswap.h index 9e94fa0021..6d9301129d 100644 --- a/include/exec/tswap.h +++ b/include/exec/tswap.h @@ -10,6 +10,7 @@ #include "qemu/bswap.h" #include "qemu/target-info.h" +#include "hw/core/cpu.h" /* * If we're in target-specific code, we can hard-code the swapping @@ -72,4 +73,39 @@ static inline void tswap64s(uint64_t *s) } #endif +/* + * If we're in semihosting code, have to swap depending on the currently + * configured endianness of the CPU. These functions should not be used in + * other contexts. + */ +#define cpu_internal_needs_bswap(cpu) \ + (HOST_BIG_ENDIAN != cpu_internal_is_big_endian(cpu)) + +static inline uint16_t cpu_internal_tswap16(CPUState *cpu, uint16_t s) +{ + if (target_needs_bswap() || cpu_internal_needs_bswap(cpu)) { + return bswap16(s); + } else { + return s; + } +} + +static inline uint32_t cpu_internal_tswap32(CPUState *cpu, uint32_t s) +{ + if (target_needs_bswap() || cpu_internal_needs_bswap(cpu)) { + return bswap32(s); + } else { + return s; + } +} + +static inline uint64_t cpu_internal_tswap64(CPUState *cpu, uint64_t s) +{ + if (target_needs_bswap() || cpu_internal_needs_bswap(cpu)) { + return bswap64(s); + } else { + return s; + } +} + #endif /* TSWAP_H */ -- Git-155)
