===================================================================
@@ -888,4 +888,72 @@ void qmp_fd_send(int fd, const char *fmt
QDict *qmp_fdv(int fd, const char *fmt, va_list ap);
QDict *qmp_fd(int fd, const char *fmt, ...);
+uint16_t qtest_readw_be(QTestState *s, uint64_t addr);
+uint32_t qtest_readl_be(QTestState *s, uint64_t addr);
+uint64_t qtest_readq_be(QTestState *s, uint64_t addr);
+
+static inline uint16_t readw_be(uint64_t addr)
+{
+ return qtest_readw_be(global_qtest, addr);
+}
+static inline uint32_t readl_be(uint64_t addr)
+{
+ return qtest_readl_be(global_qtest, addr);
+}
+static inline uint64_t readq_be(uint64_t addr)
+{
+ return qtest_readq_be(global_qtest, addr);
+}
+
+void qtest_writew_be(QTestState *s, uint64_t addr, uint16_t value);
+void qtest_writel_be(QTestState *s, uint64_t addr, uint32_t value);
+void qtest_writeq_be(QTestState *s, uint64_t addr, uint64_t value);
+
+static inline void writew_be(uint64_t addr, uint16_t value)
+{
+ qtest_writew_be(global_qtest, addr, value);
+}
+static inline void writel_be(uint64_t addr, uint32_t value)
+{
+ qtest_writel_be(global_qtest, addr, value);
+}
+static inline void writeq_be(uint64_t addr, uint64_t value)
+{
+ qtest_writeq_be(global_qtest, addr, value);
+}
+
+uint16_t qtest_readw_le(QTestState *s, uint64_t addr);
+uint32_t qtest_readl_le(QTestState *s, uint64_t addr);
+uint64_t qtest_readq_le(QTestState *s, uint64_t addr);
+
+static inline uint16_t readw_le(uint64_t addr)
+{
+ return qtest_readw_le(global_qtest, addr);
+}
+static inline uint32_t readl_le(uint64_t addr)
+{
+ return qtest_readl_le(global_qtest, addr);
+}
+static inline uint64_t readq_le(uint64_t addr)
+{
+ return qtest_readq_le(global_qtest, addr);
+}
+
+void qtest_writew_le(QTestState *s, uint64_t addr, uint16_t value);
+void qtest_writel_le(QTestState *s, uint64_t addr, uint32_t value);
+void qtest_writeq_le(QTestState *s, uint64_t addr, uint64_t value);
+
+static inline void writew_le(uint64_t addr, uint16_t value)
+{
+ qtest_writew_le(global_qtest, addr, value);
+}
+static inline void writel_le(uint64_t addr, uint32_t value)
+{
+ qtest_writel_le(global_qtest, addr, value);
+}
+static inline void writeq_le(uint64_t addr, uint64_t value)
+{
+ qtest_writeq_le(global_qtest, addr, value);
+}
+
#endif
===================================================================
@@ -257,6 +257,63 @@ static void qtest_irq_handler(void *opaq
}
}
+static inline bool is_target_big_endian(void)
+{
+#if defined(TARGET_WORDS_BIGENDIAN)
+ return true;
+#else
+ return false;
+#endif
+}
+
+static void qtest_tswap16s(uint16_t *s, gchar *endianness)
+{
+ if (endianness[0] != 'n') {
+ bool big_endian = (endianness[0] == 'b');
+
+ if (is_target_big_endian() != big_endian) {
+ bswap16s(s);
+ }
+ }
+ tswap16s(s);
+}
+
+static uint16_t qtest_tswap16(uint16_t s, gchar *endianness)
+{
+ qtest_tswap16s(&s, endianness);
+ return s;
+}
+
+static void qtest_tswap32s(uint32_t *s, gchar *endianness)
+{
+ if (endianness[0] != 'n') {
+ bool big_endian = (endianness[0] == 'b');
+
+ if (is_target_big_endian() != big_endian) {
+ bswap32s(s);
+ }
+ }
+ tswap32s(s);
+}
+
+static uint32_t qtest_tswap32(uint32_t s, gchar *endianness)
+{
+ qtest_tswap32s(&s, endianness);
+ return s;
+}
+
+static void qtest_tswap64s(uint64_t *s, gchar *endianness)
+{
+ if (endianness[0] != 'n') {
+ bool big_endian = (endianness[0] == 'b');
+
+ if (is_target_big_endian() != big_endian) {
+ bswap64s(s);
+ }
+ }
+ tswap64s(s);
+}
+
static void qtest_process_command(CharDriverState *chr, gchar **words)
{
const gchar *command;
@@ -372,7 +429,7 @@ static void qtest_process_command(CharDr
uint64_t addr;
uint64_t value;
- g_assert(words[1] && words[2]);
+ g_assert(words[1] && words[2] && words[3]);
g_assert(qemu_strtoull(words[1], NULL, 0, &addr) == 0);
g_assert(qemu_strtoull(words[2], NULL, 0, &value) == 0);
@@ -381,15 +438,15 @@ static void qtest_process_command(CharDr
cpu_physical_memory_write(addr, &data, 1);
} else if (words[0][5] == 'w') {
uint16_t data = value;
- tswap16s(&data);
+ qtest_tswap16s(&data, words[3]);
cpu_physical_memory_write(addr, &data, 2);
} else if (words[0][5] == 'l') {
uint32_t data = value;
- tswap32s(&data);
+ qtest_tswap32s(&data, words[3]);
cpu_physical_memory_write(addr, &data, 4);
} else if (words[0][5] == 'q') {
uint64_t data = value;
- tswap64s(&data);
+ qtest_tswap64s(&data, words[3]);
cpu_physical_memory_write(addr, &data, 8);
}
qtest_send_prefix(chr);
@@ -401,7 +458,7 @@ static void qtest_process_command(CharDr
uint64_t addr;
uint64_t value = UINT64_C(-1);
- g_assert(words[1]);
+ g_assert(words[1] && words[2]);
g_assert(qemu_strtoull(words[1], NULL, 0, &addr) == 0);
if (words[0][4] == 'b') {
@@ -411,14 +468,14 @@ static void qtest_process_command(CharDr
} else if (words[0][4] == 'w') {
uint16_t data;
cpu_physical_memory_read(addr, &data, 2);
- value = tswap16(data);
+ value = qtest_tswap16(data, words[2]);
} else if (words[0][4] == 'l') {
uint32_t data;
cpu_physical_memory_read(addr, &data, 4);
- value = tswap32(data);
+ value = qtest_tswap32(data, words[2]);
} else if (words[0][4] == 'q') {
cpu_physical_memory_read(addr, &value, 8);
- tswap64s(&value);
+ qtest_tswap64s(&value, words[2]);
}
qtest_send_prefix(chr);
qtest_sendf(chr, "OK 0x%016" PRIx64 "\n", value);
===================================================================
@@ -663,38 +663,70 @@ uint32_t qtest_inl(QTestState *s, uint16
}
static void qtest_write(QTestState *s, const char *cmd, uint64_t addr,
- uint64_t value)
+ uint64_t value, const char *endianness)
{
- qtest_sendf(s, "%s 0x%" PRIx64 " 0x%" PRIx64 "\n", cmd, addr, value);
+ qtest_sendf(s, "%s 0x%" PRIx64 " 0x%" PRIx64 " %s\n", cmd, addr, value,
+ endianness);
qtest_rsp(s, 0);
}
void qtest_writeb(QTestState *s, uint64_t addr, uint8_t value)
{
- qtest_write(s, "writeb", addr, value);
+ qtest_write(s, "writeb", addr, value, "native");
}
void qtest_writew(QTestState *s, uint64_t addr, uint16_t value)
{
- qtest_write(s, "writew", addr, value);
+ qtest_write(s, "writew", addr, value, "native");
}
void qtest_writel(QTestState *s, uint64_t addr, uint32_t value)
{
- qtest_write(s, "writel", addr, value);
+ qtest_write(s, "writel", addr, value, "native");
}
void qtest_writeq(QTestState *s, uint64_t addr, uint64_t value)
{
- qtest_write(s, "writeq", addr, value);
+ qtest_write(s, "writeq", addr, value, "native");
}
-static uint64_t qtest_read(QTestState *s, const char *cmd, uint64_t addr)
+void qtest_writew_be(QTestState *s, uint64_t addr, uint16_t value)
+{
+ qtest_write(s, "writew", addr, value, "be");
+}
+
+void qtest_writel_be(QTestState *s, uint64_t addr, uint32_t value)
+{
+ qtest_write(s, "writel", addr, value, "be");
+}
+
+void qtest_writeq_be(QTestState *s, uint64_t addr, uint64_t value)
+{
+ qtest_write(s, "writeq", addr, value, "be");
+}
+
+void qtest_writew_le(QTestState *s, uint64_t addr, uint16_t value)
+{
+ qtest_write(s, "writew", addr, value, "le");
+}
+
+void qtest_writel_le(QTestState *s, uint64_t addr, uint32_t value)
+{
+ qtest_write(s, "writel", addr, value, "le");
+}
+
+void qtest_writeq_le(QTestState *s, uint64_t addr, uint64_t value)
+{
+ qtest_write(s, "writeq", addr, value, "le");
+}
+
+static uint64_t qtest_read(QTestState *s, const char *cmd, uint64_t addr,
+ const char *endianness)
{
gchar **args;
uint64_t value;
- qtest_sendf(s, "%s 0x%" PRIx64 "\n", cmd, addr);
+ qtest_sendf(s, "%s 0x%" PRIx64 " %s\n", cmd, addr, endianness);
args = qtest_rsp(s, 2);
value = strtoull(args[1], NULL, 0);
g_strfreev(args);
@@ -704,22 +736,52 @@ static uint64_t qtest_read(QTestState *s
uint8_t qtest_readb(QTestState *s, uint64_t addr)
{
- return qtest_read(s, "readb", addr);
+ return qtest_read(s, "readb", addr, "native");
}
uint16_t qtest_readw(QTestState *s, uint64_t addr)
{
- return qtest_read(s, "readw", addr);
+ return qtest_read(s, "readw", addr, "native");
}
uint32_t qtest_readl(QTestState *s, uint64_t addr)
{
- return qtest_read(s, "readl", addr);
+ return qtest_read(s, "readl", addr, "native");
}
uint64_t qtest_readq(QTestState *s, uint64_t addr)
{
- return qtest_read(s, "readq", addr);
+ return qtest_read(s, "readq", addr, "native");
+}
+
+uint16_t qtest_readw_be(QTestState *s, uint64_t addr)
+{
+ return qtest_read(s, "readw", addr, "be");
+}
+
+uint32_t qtest_readl_be(QTestState *s, uint64_t addr)
+{
+ return qtest_read(s, "readl", addr, "be");
+}
+
+uint64_t qtest_readq_be(QTestState *s, uint64_t addr)
+{
+ return qtest_read(s, "readq", addr, "be");
+}
+
+uint16_t qtest_readw_le(QTestState *s, uint64_t addr)
+{
+ return qtest_read(s, "readw", addr, "le");
+}
+
+uint32_t qtest_readl_le(QTestState *s, uint64_t addr)
+{
+ return qtest_read(s, "readl", addr, "le");
+}
+
+uint64_t qtest_readq_le(QTestState *s, uint64_t addr)
+{
+ return qtest_read(s, "readq", addr, "le");
}
static int hex2nib(char ch)