qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 1/6] qtest: add test framework


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH 1/6] qtest: add test framework
Date: Mon, 16 Jan 2012 11:08:58 -0600
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.23) Gecko/20110922 Lightning/1.0b2 Thunderbird/3.1.15

On 01/16/2012 10:59 AM, Stefan Hajnoczi wrote:
On Fri, Jan 13, 2012 at 6:32 PM, Anthony Liguori<address@hidden>  wrote:
+    if (strcmp(words[0], "outb") == 0 ||
+        strcmp(words[0], "outw") == 0 ||
+        strcmp(words[0], "outl") == 0) {
+        uint16_t addr;
+        uint32_t value;
+
+        g_assert(words[1]&&  words[2]);
+        addr = strtol(words[1], NULL, 0);
+        value = strtol(words[2], NULL, 0);
+
+        if (words[0][3] == 'b') {
+            cpu_outb(addr, value);
+        } else if (words[0][3] == 'w') {
+            cpu_outw(addr, value);
+        } else if (words[0][3] == 'l') {
+            cpu_outl(addr, value);
+        }
+        qtest_send_prefix(chr);
+        qtest_send(chr, "OK\n");
+    } else if (strcmp(words[0], "inb") == 0 ||
+        strcmp(words[0], "inw") == 0 ||
+        strcmp(words[0], "inl") == 0) {
+        uint16_t addr;
+        uint32_t value = -1U;
+
+        g_assert(words[1]);
+        addr = strtol(words[1], NULL, 0);
+
+        if (words[0][2] == 'b') {
+            value = cpu_inb(addr);
+        } else if (words[0][2] == 'w') {
+            value = cpu_inw(addr);
+        } else if (words[0][2] == 'l') {
+            value = cpu_inl(addr);
+        }
+        qtest_send_prefix(chr);
+        qtest_send(chr, "OK 0x%04x\n", value);

Endianness is a little weird here.  memory.c will byteswap if target
and device endianness differ.

Imagine the case where we're on an x86 host, running a ppc guest,
reading from PCI configuration space (little-endian).

These functions expect to get host native endian. The qtest wire protocol is a string (which has no endianness) and converts it to host native endian.

 Since ppc
(target endian) is big-endian and the device is little-endian the
value read/written will be byteswapped.  However, our qtest runs on
the host and therefore we don't want that automatic swap (or we need
to neutralize it by performing another byteswap on top).

ppc wouldn't use outb/inb. It would do mmio to the PIO region which would send it through the host controller (which would do byte swapping as necessary).

So a qtest test case would have to do little endian MMIO to interact with the PCI bus.

Regards,

Anthony Liguori


Stefan





reply via email to

[Prev in Thread] Current Thread [Next in Thread]