diff mbox

[4/4] qtest: add ivshmem-test for ppc64

Message ID 1481585316-31612-5-git-send-email-lvivier@redhat.com
State New
Headers show

Commit Message

Laurent Vivier Dec. 12, 2016, 11:28 p.m. UTC
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
---
 tests/Makefile.include |  3 ++-
 tests/ivshmem-test.c   | 46 +++++++++++++++++++++++++++++-----------------
 2 files changed, 31 insertions(+), 18 deletions(-)

Comments

Markus Armbruster Dec. 13, 2016, 7:55 a.m. UTC | #1
Laurent Vivier <lvivier@redhat.com> writes:

> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
> ---
>  tests/Makefile.include |  3 ++-
>  tests/ivshmem-test.c   | 46 +++++++++++++++++++++++++++++-----------------
>  2 files changed, 31 insertions(+), 18 deletions(-)
>
> diff --git a/tests/Makefile.include b/tests/Makefile.include
> index b574964..09fe5b6 100644
> --- a/tests/Makefile.include
> +++ b/tests/Makefile.include
> @@ -287,6 +287,7 @@ check-qtest-ppc64-y += tests/test-netfilter$(EXESUF)
>  check-qtest-ppc64-y += tests/test-filter-mirror$(EXESUF)
>  check-qtest-ppc64-y += tests/test-filter-redirector$(EXESUF)
>  check-qtest-ppc64-y += tests/display-vga-test$(EXESUF)
> +check-qtest-ppc64-y += tests/ivshmem-test$(EXESUF)
>  
>  check-qtest-sh4-y = tests/endianness-test$(EXESUF)
>  
> @@ -690,7 +691,7 @@ tests/test-netfilter$(EXESUF): tests/test-netfilter.o $(qtest-obj-y)
>  tests/test-filter-mirror$(EXESUF): tests/test-filter-mirror.o $(qtest-obj-y)
>  tests/test-filter-redirector$(EXESUF): tests/test-filter-redirector.o $(qtest-obj-y)
>  tests/test-x86-cpuid-compat$(EXESUF): tests/test-x86-cpuid-compat.o $(qtest-obj-y)
> -tests/ivshmem-test$(EXESUF): tests/ivshmem-test.o contrib/ivshmem-server/ivshmem-server.o $(libqos-pc-obj-y)
> +tests/ivshmem-test$(EXESUF): tests/ivshmem-test.o contrib/ivshmem-server/ivshmem-server.o $(libqos-pc-obj-y) $(libqos-spapr-obj-y)
>  tests/vhost-user-bridge$(EXESUF): tests/vhost-user-bridge.o
>  tests/test-uuid$(EXESUF): tests/test-uuid.o $(test-util-obj-y)
>  tests/test-arm-mptimer$(EXESUF): tests/test-arm-mptimer.o
> diff --git a/tests/ivshmem-test.c b/tests/ivshmem-test.c
> index 04a5c5d..5c6dc38 100644
> --- a/tests/ivshmem-test.c
> +++ b/tests/ivshmem-test.c
> @@ -11,8 +11,9 @@
>  #include "qemu/osdep.h"
>  #include <glib/gstdio.h>
>  #include "contrib/ivshmem-server/ivshmem-server.h"
> -#include "libqos/pci-pc.h"
>  #include "libqtest.h"
> +#include "libqos/libqos-pc.h"
> +#include "libqos/libqos-spapr.h"
>  #include "qemu-common.h"
>  
>  #define TMPSHMSIZE (1 << 20)
> @@ -40,9 +41,8 @@ static QPCIDevice *get_device(QPCIBus *pcibus)
>  }
>  
>  typedef struct _IVState {
> -    QTestState *qtest;
> +    QOSState *qs;
>      QPCIBar reg_bar, mem_bar;
> -    QPCIBus *pcibus;
>      QPCIDevice *dev;
>  } IVState;
>  
> @@ -74,7 +74,7 @@ static inline unsigned in_reg(IVState *s, enum Reg reg)
>      QTestState *qtest = global_qtest;
>      unsigned res;
>  
> -    global_qtest = s->qtest;
> +    global_qtest = s->qs->qts;
>      res = qpci_io_readl(s->dev, s->reg_bar, reg);
>      g_test_message("*%s -> %x\n", name, res);
>      global_qtest = qtest;
> @@ -87,7 +87,7 @@ static inline void out_reg(IVState *s, enum Reg reg, unsigned v)
>      const char *name = reg2str(reg);
>      QTestState *qtest = global_qtest;
>  
> -    global_qtest = s->qtest;
> +    global_qtest = s->qs->qts;
>      g_test_message("%x -> *%s\n", v, name);
>      qpci_io_writel(s->dev, s->reg_bar, reg, v);
>      global_qtest = qtest;
> @@ -97,7 +97,7 @@ static inline void read_mem(IVState *s, uint64_t off, void *buf, size_t len)
>  {
>      QTestState *qtest = global_qtest;
>  
> -    global_qtest = s->qtest;
> +    global_qtest = s->qs->qts;
>      qpci_memread(s->dev, s->mem_bar, off, buf, len);
>      global_qtest = qtest;
>  }
> @@ -107,7 +107,7 @@ static inline void write_mem(IVState *s, uint64_t off,
>  {
>      QTestState *qtest = global_qtest;
>  
> -    global_qtest = s->qtest;
> +    global_qtest = s->qs->qts;
>      qpci_memwrite(s->dev, s->mem_bar, off, buf, len);
>      global_qtest = qtest;
>  }
> @@ -115,17 +115,23 @@ static inline void write_mem(IVState *s, uint64_t off,
>  static void cleanup_vm(IVState *s)
>  {
>      g_free(s->dev);
> -    qpci_free_pc(s->pcibus);
> -    qtest_quit(s->qtest);
> +    qtest_shutdown(s->qs);
>  }
>  
>  static void setup_vm_cmd(IVState *s, const char *cmd, bool msix)
>  {
>      uint64_t barsize;
> +    const char *arch = qtest_get_arch();
>  
> -    s->qtest = qtest_start(cmd);
> -    s->pcibus = qpci_init_pc(NULL);
> -    s->dev = get_device(s->pcibus);
> +    if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
> +        s->qs = qtest_pc_boot(cmd);
> +    } else if (strcmp(arch, "ppc64") == 0) {
> +        s->qs = qtest_spapr_boot(cmd);
> +    } else {
> +        g_printerr("vshmem-test tests are only available on x86 or ppc64\n");

Typo: s/vshmem/ivshmem

To get here, you need to build and run this manually, as make check only
builds and runs this for targets that work.  But the check doesn't hurt,
and documents expectations.

> +        exit(EXIT_FAILURE);
> +    }
> +    s->dev = get_device(s->qs->pcibus);
>  
>      s->reg_bar = qpci_iomap(s->dev, 0, &barsize);
>      g_assert_cmpuint(barsize, ==, 256);
> @@ -347,7 +353,7 @@ static void test_ivshmem_server(bool msi)
>      g_assert_cmpint(vm1, !=, vm2);
>  
>      /* check number of MSI-X vectors */
> -    global_qtest = s1->qtest;
> +    global_qtest = s1->qs->qts;
>      if (msi) {
>          ret = qpci_msix_table_size(s1->dev);
>          g_assert_cmpuint(ret, ==, nvectors);
> @@ -370,7 +376,7 @@ static void test_ivshmem_server(bool msi)
>      g_assert_cmpuint(ret, !=, 0);
>  
>      /* ping vm1 -> vm2 on vector 1 */
> -    global_qtest = s2->qtest;
> +    global_qtest = s2->qs->qts;
>      if (msi) {
>          ret = qpci_msix_pending(s2->dev, 1);
>          g_assert_cmpuint(ret, ==, 0);
> @@ -412,6 +418,7 @@ static void test_ivshmem_server_irq(void)
>  
>  static void test_ivshmem_hotplug(void)
>  {
> +    const char *arch = qtest_get_arch();
>      gchar *opts;
>  
>      qtest_start("");

Unlike the other tests, this one doesn't refuse to run on unexpected
targets.  Intentional?

> @@ -419,7 +426,9 @@ static void test_ivshmem_hotplug(void)
>      opts = g_strdup_printf("'shm': '%s', 'size': '1M'", tmpshm);
>  
>      qpci_plug_device_test("ivshmem", "iv1", PCI_SLOT_HP, opts);
> -    qpci_unplug_acpi_device_test("iv1", PCI_SLOT_HP);
> +    if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
> +        qpci_unplug_acpi_device_test("iv1", PCI_SLOT_HP);
> +    }

Disables unplug test for ppc64.

>  
>      qtest_end();
>      g_free(opts);
> @@ -491,6 +500,7 @@ static gchar *mktempshm(int size, int *fd)
>  int main(int argc, char **argv)
>  {
>      int ret, fd;
> +    const char *arch = qtest_get_arch();
>      gchar dir[] = "/tmp/ivshmem-test.XXXXXX";
>  
>  #if !GLIB_CHECK_VERSION(2, 31, 0)
> @@ -521,8 +531,10 @@ int main(int argc, char **argv)
>      qtest_add_func("/ivshmem/memdev", test_ivshmem_memdev);
>      if (g_test_slow()) {
>          qtest_add_func("/ivshmem/pair", test_ivshmem_pair);
> -        qtest_add_func("/ivshmem/server-msi", test_ivshmem_server_msi);
> -        qtest_add_func("/ivshmem/server-irq", test_ivshmem_server_irq);
> +        if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
> +            qtest_add_func("/ivshmem/server-msi", test_ivshmem_server_msi);
> +            qtest_add_func("/ivshmem/server-irq", test_ivshmem_server_irq);
> +        }
>      }
>  
>      ret = g_test_run();

The commit message should explain things in a bit more detail: the test
works only for x86, and is only compiled and executed for x86.  The
patch converts it to libqos, adds ppc64, and makes the test fail for
targets that don't work.  It also disables the unplug part of test
/ivshmem/hotplug for ppc64; please explain why.

Please make the conversion to libqos a separate patch, for easier
review.
Laurent Vivier Dec. 13, 2016, 8:18 a.m. UTC | #2
On 13/12/2016 08:55, Markus Armbruster wrote:
> Laurent Vivier <lvivier@redhat.com> writes:
> 
>> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
>> ---
>>  tests/Makefile.include |  3 ++-
>>  tests/ivshmem-test.c   | 46 +++++++++++++++++++++++++++++-----------------
>>  2 files changed, 31 insertions(+), 18 deletions(-)
>>
>> diff --git a/tests/Makefile.include b/tests/Makefile.include
>> index b574964..09fe5b6 100644
>> --- a/tests/Makefile.include
>> +++ b/tests/Makefile.include
>> @@ -287,6 +287,7 @@ check-qtest-ppc64-y += tests/test-netfilter$(EXESUF)
>>  check-qtest-ppc64-y += tests/test-filter-mirror$(EXESUF)
>>  check-qtest-ppc64-y += tests/test-filter-redirector$(EXESUF)
>>  check-qtest-ppc64-y += tests/display-vga-test$(EXESUF)
>> +check-qtest-ppc64-y += tests/ivshmem-test$(EXESUF)
>>  
>>  check-qtest-sh4-y = tests/endianness-test$(EXESUF)
>>  
>> @@ -690,7 +691,7 @@ tests/test-netfilter$(EXESUF): tests/test-netfilter.o $(qtest-obj-y)
>>  tests/test-filter-mirror$(EXESUF): tests/test-filter-mirror.o $(qtest-obj-y)
>>  tests/test-filter-redirector$(EXESUF): tests/test-filter-redirector.o $(qtest-obj-y)
>>  tests/test-x86-cpuid-compat$(EXESUF): tests/test-x86-cpuid-compat.o $(qtest-obj-y)
>> -tests/ivshmem-test$(EXESUF): tests/ivshmem-test.o contrib/ivshmem-server/ivshmem-server.o $(libqos-pc-obj-y)
>> +tests/ivshmem-test$(EXESUF): tests/ivshmem-test.o contrib/ivshmem-server/ivshmem-server.o $(libqos-pc-obj-y) $(libqos-spapr-obj-y)
>>  tests/vhost-user-bridge$(EXESUF): tests/vhost-user-bridge.o
>>  tests/test-uuid$(EXESUF): tests/test-uuid.o $(test-util-obj-y)
>>  tests/test-arm-mptimer$(EXESUF): tests/test-arm-mptimer.o
>> diff --git a/tests/ivshmem-test.c b/tests/ivshmem-test.c
>> index 04a5c5d..5c6dc38 100644
>> --- a/tests/ivshmem-test.c
>> +++ b/tests/ivshmem-test.c
>> @@ -11,8 +11,9 @@
>>  #include "qemu/osdep.h"
>>  #include <glib/gstdio.h>
>>  #include "contrib/ivshmem-server/ivshmem-server.h"
>> -#include "libqos/pci-pc.h"
>>  #include "libqtest.h"
>> +#include "libqos/libqos-pc.h"
>> +#include "libqos/libqos-spapr.h"
>>  #include "qemu-common.h"
>>  
>>  #define TMPSHMSIZE (1 << 20)
>> @@ -40,9 +41,8 @@ static QPCIDevice *get_device(QPCIBus *pcibus)
>>  }
>>  
>>  typedef struct _IVState {
>> -    QTestState *qtest;
>> +    QOSState *qs;
>>      QPCIBar reg_bar, mem_bar;
>> -    QPCIBus *pcibus;
>>      QPCIDevice *dev;
>>  } IVState;
>>  
>> @@ -74,7 +74,7 @@ static inline unsigned in_reg(IVState *s, enum Reg reg)
>>      QTestState *qtest = global_qtest;
>>      unsigned res;
>>  
>> -    global_qtest = s->qtest;
>> +    global_qtest = s->qs->qts;
>>      res = qpci_io_readl(s->dev, s->reg_bar, reg);
>>      g_test_message("*%s -> %x\n", name, res);
>>      global_qtest = qtest;
>> @@ -87,7 +87,7 @@ static inline void out_reg(IVState *s, enum Reg reg, unsigned v)
>>      const char *name = reg2str(reg);
>>      QTestState *qtest = global_qtest;
>>  
>> -    global_qtest = s->qtest;
>> +    global_qtest = s->qs->qts;
>>      g_test_message("%x -> *%s\n", v, name);
>>      qpci_io_writel(s->dev, s->reg_bar, reg, v);
>>      global_qtest = qtest;
>> @@ -97,7 +97,7 @@ static inline void read_mem(IVState *s, uint64_t off, void *buf, size_t len)
>>  {
>>      QTestState *qtest = global_qtest;
>>  
>> -    global_qtest = s->qtest;
>> +    global_qtest = s->qs->qts;
>>      qpci_memread(s->dev, s->mem_bar, off, buf, len);
>>      global_qtest = qtest;
>>  }
>> @@ -107,7 +107,7 @@ static inline void write_mem(IVState *s, uint64_t off,
>>  {
>>      QTestState *qtest = global_qtest;
>>  
>> -    global_qtest = s->qtest;
>> +    global_qtest = s->qs->qts;
>>      qpci_memwrite(s->dev, s->mem_bar, off, buf, len);
>>      global_qtest = qtest;
>>  }
>> @@ -115,17 +115,23 @@ static inline void write_mem(IVState *s, uint64_t off,
>>  static void cleanup_vm(IVState *s)
>>  {
>>      g_free(s->dev);
>> -    qpci_free_pc(s->pcibus);
>> -    qtest_quit(s->qtest);
>> +    qtest_shutdown(s->qs);
>>  }
>>  
>>  static void setup_vm_cmd(IVState *s, const char *cmd, bool msix)
>>  {
>>      uint64_t barsize;
>> +    const char *arch = qtest_get_arch();
>>  
>> -    s->qtest = qtest_start(cmd);
>> -    s->pcibus = qpci_init_pc(NULL);
>> -    s->dev = get_device(s->pcibus);
>> +    if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
>> +        s->qs = qtest_pc_boot(cmd);
>> +    } else if (strcmp(arch, "ppc64") == 0) {
>> +        s->qs = qtest_spapr_boot(cmd);
>> +    } else {
>> +        g_printerr("vshmem-test tests are only available on x86 or ppc64\n");
> 
> Typo: s/vshmem/ivshmem
> 
> To get here, you need to build and run this manually, as make check only
> builds and runs this for targets that work.  But the check doesn't hurt,
> and documents expectations.
> 
>> +        exit(EXIT_FAILURE);
>> +    }
>> +    s->dev = get_device(s->qs->pcibus);
>>  
>>      s->reg_bar = qpci_iomap(s->dev, 0, &barsize);
>>      g_assert_cmpuint(barsize, ==, 256);
>> @@ -347,7 +353,7 @@ static void test_ivshmem_server(bool msi)
>>      g_assert_cmpint(vm1, !=, vm2);
>>  
>>      /* check number of MSI-X vectors */
>> -    global_qtest = s1->qtest;
>> +    global_qtest = s1->qs->qts;
>>      if (msi) {
>>          ret = qpci_msix_table_size(s1->dev);
>>          g_assert_cmpuint(ret, ==, nvectors);
>> @@ -370,7 +376,7 @@ static void test_ivshmem_server(bool msi)
>>      g_assert_cmpuint(ret, !=, 0);
>>  
>>      /* ping vm1 -> vm2 on vector 1 */
>> -    global_qtest = s2->qtest;
>> +    global_qtest = s2->qs->qts;
>>      if (msi) {
>>          ret = qpci_msix_pending(s2->dev, 1);
>>          g_assert_cmpuint(ret, ==, 0);
>> @@ -412,6 +418,7 @@ static void test_ivshmem_server_irq(void)
>>  
>>  static void test_ivshmem_hotplug(void)
>>  {
>> +    const char *arch = qtest_get_arch();
>>      gchar *opts;
>>  
>>      qtest_start("");
> 
> Unlike the other tests, this one doesn't refuse to run on unexpected
> targets.  Intentional?

Yes, because there is no dependencies on libqos PCI implementation, so
it should always work.

>> @@ -419,7 +426,9 @@ static void test_ivshmem_hotplug(void)
>>      opts = g_strdup_printf("'shm': '%s', 'size': '1M'", tmpshm);
>>  
>>      qpci_plug_device_test("ivshmem", "iv1", PCI_SLOT_HP, opts);
>> -    qpci_unplug_acpi_device_test("iv1", PCI_SLOT_HP);
>> +    if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
>> +        qpci_unplug_acpi_device_test("iv1", PCI_SLOT_HP);
>> +    }
> 
> Disables unplug test for ppc64.
> 
>>  
>>      qtest_end();
>>      g_free(opts);
>> @@ -491,6 +500,7 @@ static gchar *mktempshm(int size, int *fd)
>>  int main(int argc, char **argv)
>>  {
>>      int ret, fd;
>> +    const char *arch = qtest_get_arch();
>>      gchar dir[] = "/tmp/ivshmem-test.XXXXXX";
>>  
>>  #if !GLIB_CHECK_VERSION(2, 31, 0)
>> @@ -521,8 +531,10 @@ int main(int argc, char **argv)
>>      qtest_add_func("/ivshmem/memdev", test_ivshmem_memdev);
>>      if (g_test_slow()) {
>>          qtest_add_func("/ivshmem/pair", test_ivshmem_pair);
>> -        qtest_add_func("/ivshmem/server-msi", test_ivshmem_server_msi);
>> -        qtest_add_func("/ivshmem/server-irq", test_ivshmem_server_irq);
>> +        if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
>> +            qtest_add_func("/ivshmem/server-msi", test_ivshmem_server_msi);
>> +            qtest_add_func("/ivshmem/server-irq", test_ivshmem_server_irq);
>> +        }
>>      }
>>  
>>      ret = g_test_run();
> 
> The commit message should explain things in a bit more detail: the test
> works only for x86, and is only compiled and executed for x86.  The
> patch converts it to libqos, adds ppc64, and makes the test fail for
> targets that don't work.  It also disables the unplug part of test
> /ivshmem/hotplug for ppc64; please explain why.
> 
> Please make the conversion to libqos a separate patch, for easier
> review.
> 

Thank you for the review.

I'm going to change this patch according to your comments.

Laurent
Thomas Huth Dec. 13, 2016, 8:55 a.m. UTC | #3
On 13.12.2016 09:18, Laurent Vivier wrote:
> 
> 
> On 13/12/2016 08:55, Markus Armbruster wrote:
>> Laurent Vivier <lvivier@redhat.com> writes:
...
>>> @@ -419,7 +426,9 @@ static void test_ivshmem_hotplug(void)
>>>      opts = g_strdup_printf("'shm': '%s', 'size': '1M'", tmpshm);
>>>  
>>>      qpci_plug_device_test("ivshmem", "iv1", PCI_SLOT_HP, opts);
>>> -    qpci_unplug_acpi_device_test("iv1", PCI_SLOT_HP);
>>> +    if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
>>> +        qpci_unplug_acpi_device_test("iv1", PCI_SLOT_HP);
>>> +    }
>>
>> Disables unplug test for ppc64.

We don't have acpi on POWER ... but PCI unplug should be possible
without ACPI, too, shouldn't it? So maybe you could add a PCI unplug
function for ppc64, too?

 Thomas
Laurent Vivier Dec. 13, 2016, 12:25 p.m. UTC | #4
On 13/12/2016 09:55, Thomas Huth wrote:
> On 13.12.2016 09:18, Laurent Vivier wrote:
>>
>>
>> On 13/12/2016 08:55, Markus Armbruster wrote:
>>> Laurent Vivier <lvivier@redhat.com> writes:
> ...
>>>> @@ -419,7 +426,9 @@ static void test_ivshmem_hotplug(void)
>>>>      opts = g_strdup_printf("'shm': '%s', 'size': '1M'", tmpshm);
>>>>  
>>>>      qpci_plug_device_test("ivshmem", "iv1", PCI_SLOT_HP, opts);
>>>> -    qpci_unplug_acpi_device_test("iv1", PCI_SLOT_HP);
>>>> +    if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
>>>> +        qpci_unplug_acpi_device_test("iv1", PCI_SLOT_HP);
>>>> +    }
>>>
>>> Disables unplug test for ppc64.
> 
> We don't have acpi on POWER ... but PCI unplug should be possible
> without ACPI, too, shouldn't it? So maybe you could add a PCI unplug
> function for ppc64, too?

Good idea, I will check if we can implement this.

Thanks,
Laurent
diff mbox

Patch

diff --git a/tests/Makefile.include b/tests/Makefile.include
index b574964..09fe5b6 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -287,6 +287,7 @@  check-qtest-ppc64-y += tests/test-netfilter$(EXESUF)
 check-qtest-ppc64-y += tests/test-filter-mirror$(EXESUF)
 check-qtest-ppc64-y += tests/test-filter-redirector$(EXESUF)
 check-qtest-ppc64-y += tests/display-vga-test$(EXESUF)
+check-qtest-ppc64-y += tests/ivshmem-test$(EXESUF)
 
 check-qtest-sh4-y = tests/endianness-test$(EXESUF)
 
@@ -690,7 +691,7 @@  tests/test-netfilter$(EXESUF): tests/test-netfilter.o $(qtest-obj-y)
 tests/test-filter-mirror$(EXESUF): tests/test-filter-mirror.o $(qtest-obj-y)
 tests/test-filter-redirector$(EXESUF): tests/test-filter-redirector.o $(qtest-obj-y)
 tests/test-x86-cpuid-compat$(EXESUF): tests/test-x86-cpuid-compat.o $(qtest-obj-y)
-tests/ivshmem-test$(EXESUF): tests/ivshmem-test.o contrib/ivshmem-server/ivshmem-server.o $(libqos-pc-obj-y)
+tests/ivshmem-test$(EXESUF): tests/ivshmem-test.o contrib/ivshmem-server/ivshmem-server.o $(libqos-pc-obj-y) $(libqos-spapr-obj-y)
 tests/vhost-user-bridge$(EXESUF): tests/vhost-user-bridge.o
 tests/test-uuid$(EXESUF): tests/test-uuid.o $(test-util-obj-y)
 tests/test-arm-mptimer$(EXESUF): tests/test-arm-mptimer.o
diff --git a/tests/ivshmem-test.c b/tests/ivshmem-test.c
index 04a5c5d..5c6dc38 100644
--- a/tests/ivshmem-test.c
+++ b/tests/ivshmem-test.c
@@ -11,8 +11,9 @@ 
 #include "qemu/osdep.h"
 #include <glib/gstdio.h>
 #include "contrib/ivshmem-server/ivshmem-server.h"
-#include "libqos/pci-pc.h"
 #include "libqtest.h"
+#include "libqos/libqos-pc.h"
+#include "libqos/libqos-spapr.h"
 #include "qemu-common.h"
 
 #define TMPSHMSIZE (1 << 20)
@@ -40,9 +41,8 @@  static QPCIDevice *get_device(QPCIBus *pcibus)
 }
 
 typedef struct _IVState {
-    QTestState *qtest;
+    QOSState *qs;
     QPCIBar reg_bar, mem_bar;
-    QPCIBus *pcibus;
     QPCIDevice *dev;
 } IVState;
 
@@ -74,7 +74,7 @@  static inline unsigned in_reg(IVState *s, enum Reg reg)
     QTestState *qtest = global_qtest;
     unsigned res;
 
-    global_qtest = s->qtest;
+    global_qtest = s->qs->qts;
     res = qpci_io_readl(s->dev, s->reg_bar, reg);
     g_test_message("*%s -> %x\n", name, res);
     global_qtest = qtest;
@@ -87,7 +87,7 @@  static inline void out_reg(IVState *s, enum Reg reg, unsigned v)
     const char *name = reg2str(reg);
     QTestState *qtest = global_qtest;
 
-    global_qtest = s->qtest;
+    global_qtest = s->qs->qts;
     g_test_message("%x -> *%s\n", v, name);
     qpci_io_writel(s->dev, s->reg_bar, reg, v);
     global_qtest = qtest;
@@ -97,7 +97,7 @@  static inline void read_mem(IVState *s, uint64_t off, void *buf, size_t len)
 {
     QTestState *qtest = global_qtest;
 
-    global_qtest = s->qtest;
+    global_qtest = s->qs->qts;
     qpci_memread(s->dev, s->mem_bar, off, buf, len);
     global_qtest = qtest;
 }
@@ -107,7 +107,7 @@  static inline void write_mem(IVState *s, uint64_t off,
 {
     QTestState *qtest = global_qtest;
 
-    global_qtest = s->qtest;
+    global_qtest = s->qs->qts;
     qpci_memwrite(s->dev, s->mem_bar, off, buf, len);
     global_qtest = qtest;
 }
@@ -115,17 +115,23 @@  static inline void write_mem(IVState *s, uint64_t off,
 static void cleanup_vm(IVState *s)
 {
     g_free(s->dev);
-    qpci_free_pc(s->pcibus);
-    qtest_quit(s->qtest);
+    qtest_shutdown(s->qs);
 }
 
 static void setup_vm_cmd(IVState *s, const char *cmd, bool msix)
 {
     uint64_t barsize;
+    const char *arch = qtest_get_arch();
 
-    s->qtest = qtest_start(cmd);
-    s->pcibus = qpci_init_pc(NULL);
-    s->dev = get_device(s->pcibus);
+    if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
+        s->qs = qtest_pc_boot(cmd);
+    } else if (strcmp(arch, "ppc64") == 0) {
+        s->qs = qtest_spapr_boot(cmd);
+    } else {
+        g_printerr("vshmem-test tests are only available on x86 or ppc64\n");
+        exit(EXIT_FAILURE);
+    }
+    s->dev = get_device(s->qs->pcibus);
 
     s->reg_bar = qpci_iomap(s->dev, 0, &barsize);
     g_assert_cmpuint(barsize, ==, 256);
@@ -347,7 +353,7 @@  static void test_ivshmem_server(bool msi)
     g_assert_cmpint(vm1, !=, vm2);
 
     /* check number of MSI-X vectors */
-    global_qtest = s1->qtest;
+    global_qtest = s1->qs->qts;
     if (msi) {
         ret = qpci_msix_table_size(s1->dev);
         g_assert_cmpuint(ret, ==, nvectors);
@@ -370,7 +376,7 @@  static void test_ivshmem_server(bool msi)
     g_assert_cmpuint(ret, !=, 0);
 
     /* ping vm1 -> vm2 on vector 1 */
-    global_qtest = s2->qtest;
+    global_qtest = s2->qs->qts;
     if (msi) {
         ret = qpci_msix_pending(s2->dev, 1);
         g_assert_cmpuint(ret, ==, 0);
@@ -412,6 +418,7 @@  static void test_ivshmem_server_irq(void)
 
 static void test_ivshmem_hotplug(void)
 {
+    const char *arch = qtest_get_arch();
     gchar *opts;
 
     qtest_start("");
@@ -419,7 +426,9 @@  static void test_ivshmem_hotplug(void)
     opts = g_strdup_printf("'shm': '%s', 'size': '1M'", tmpshm);
 
     qpci_plug_device_test("ivshmem", "iv1", PCI_SLOT_HP, opts);
-    qpci_unplug_acpi_device_test("iv1", PCI_SLOT_HP);
+    if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
+        qpci_unplug_acpi_device_test("iv1", PCI_SLOT_HP);
+    }
 
     qtest_end();
     g_free(opts);
@@ -491,6 +500,7 @@  static gchar *mktempshm(int size, int *fd)
 int main(int argc, char **argv)
 {
     int ret, fd;
+    const char *arch = qtest_get_arch();
     gchar dir[] = "/tmp/ivshmem-test.XXXXXX";
 
 #if !GLIB_CHECK_VERSION(2, 31, 0)
@@ -521,8 +531,10 @@  int main(int argc, char **argv)
     qtest_add_func("/ivshmem/memdev", test_ivshmem_memdev);
     if (g_test_slow()) {
         qtest_add_func("/ivshmem/pair", test_ivshmem_pair);
-        qtest_add_func("/ivshmem/server-msi", test_ivshmem_server_msi);
-        qtest_add_func("/ivshmem/server-irq", test_ivshmem_server_irq);
+        if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
+            qtest_add_func("/ivshmem/server-msi", test_ivshmem_server_msi);
+            qtest_add_func("/ivshmem/server-irq", test_ivshmem_server_irq);
+        }
     }
 
     ret = g_test_run();