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 <martin.kroening@eonerc.rwth-aachen.de>
---
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)