qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] ppc / sparc: Add a tester for checking whether


From: Mark Cave-Ayland
Subject: Re: [Qemu-devel] [PATCH] ppc / sparc: Add a tester for checking whether OpenBIOS runs successfully
Date: Tue, 14 Jun 2016 19:59:47 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Icedove/38.8.0

On 14/06/16 12:04, Thomas Huth wrote:

> Since the mac99 and g3beige PowerPC machines recently broke without
> being noticed, it would be good to have a tester for "make check"
> that detects such issues immediately. A simple way to test the firmware
> of these machines is to use the "-prom-env" parameter of QEMU. This
> parameter can be used to put some Forth code into the 'boot-command'
> firmware variable which then can signal success to the tester by
> writing a magic value to a known memory location. And since some of the
> Sparc machines are also using OpenBIOS, they are now tested with this
> prom-env-tester, too.
> 
> Signed-off-by: Thomas Huth <address@hidden>
> ---
>  tests/Makefile.include |  5 +++
>  tests/prom-env-test.c  | 93 
> ++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 98 insertions(+)
>  create mode 100644 tests/prom-env-test.c
> 
> diff --git a/tests/Makefile.include b/tests/Makefile.include
> index 7d63d16..f95a3ca 100644
> --- a/tests/Makefile.include
> +++ b/tests/Makefile.include
> @@ -258,6 +258,10 @@ check-qtest-ppc-y += tests/boot-order-test$(EXESUF)
>  check-qtest-ppc64-y += tests/boot-order-test$(EXESUF)
>  check-qtest-ppc64-y += tests/spapr-phb-test$(EXESUF)
>  gcov-files-ppc64-y += ppc64-softmmu/hw/ppc/spapr_pci.c
> +check-qtest-ppc-y = tests/prom-env-test$(EXESUF)
> +check-qtest-ppc64-y = tests/prom-env-test$(EXESUF)
> +check-qtest-sparc-y = tests/prom-env-test$(EXESUF)
> +check-qtest-sparc64-y = tests/prom-env-test$(EXESUF)
>  check-qtest-microblazeel-y = $(check-qtest-microblaze-y)
>  check-qtest-xtensaeb-y = $(check-qtest-xtensa-y)
>  
> @@ -549,6 +553,7 @@ tests/rtc-test$(EXESUF): tests/rtc-test.o
>  tests/m48t59-test$(EXESUF): tests/m48t59-test.o
>  tests/endianness-test$(EXESUF): tests/endianness-test.o
>  tests/spapr-phb-test$(EXESUF): tests/spapr-phb-test.o $(libqos-obj-y)
> +tests/prom-env-test$(EXESUF): tests/prom-env-test.o $(libqos-obj-y)
>  tests/fdc-test$(EXESUF): tests/fdc-test.o
>  tests/ide-test$(EXESUF): tests/ide-test.o $(libqos-pc-obj-y)
>  tests/ahci-test$(EXESUF): tests/ahci-test.o $(libqos-pc-obj-y)
> diff --git a/tests/prom-env-test.c b/tests/prom-env-test.c
> new file mode 100644
> index 0000000..b4d5d68
> --- /dev/null
> +++ b/tests/prom-env-test.c
> @@ -0,0 +1,93 @@
> +/*
> + * Test OpenBIOS-based machines.
> + *
> + * Copyright (c) 2016 Red Hat Inc.
> + *
> + * Author:
> + *    Thomas Huth <address@hidden>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2
> + * or later. See the COPYING file in the top-level directory.
> + *
> + * This test is used to check that some OpenBIOS machines can be started
> + * successfully in TCG mode. To do this, we first put some Forth code into
> + * the "boot-command" Open Firmware environment variable. This Forth code
> + * writes a well-known magic value to a known location in memory. Then we
> + * start the guest so that OpenBIOS can boot and finally run the Forth code.
> + * The testing code here then can finally check whether the value has been
> + * successfully written into the guest memory.
> + */
> +
> +#include "qemu/osdep.h"
> +#include "qemu/compiler.h"
> +#include <glib/gstdio.h>
> +#include "qemu-common.h"
> +#include "libqtest.h"
> +
> +#define MAGIC   0xcafec0de
> +#define ADDRESS 0x4000
> +
> +static void check_guest_memory(void)
> +{
> +    uint32_t signature;
> +    int i;
> +
> +    /* Poll until code has run and modified memory. Wait at most 30 seconds 
> */
> +    for (i = 0; i < 3000; ++i) {
> +        signature = readl(ADDRESS);
> +        if (signature == MAGIC) {
> +            break;
> +        }
> +        g_usleep(10000);
> +    }
> +
> +    g_assert_cmphex(signature, ==, MAGIC);
> +}
> +
> +static void test_machine(const void *machine)
> +{
> +    char *args;
> +
> +    args = g_strdup_printf("-M %s,accel=tcg -prom-env 'boot-command=%x %x 
> l!'",
> +                           (const char *)machine, MAGIC, ADDRESS);
> +
> +    qtest_start(args);
> +    check_guest_memory();
> +    qtest_quit(global_qtest);
> +
> +    g_free(args);
> +}
> +
> +static void add_tests(const char *machines[])
> +{
> +    int i;
> +    char *name;
> +
> +    for (i = 0; machines[i] != NULL; i++) {
> +        name = g_strdup_printf("prom-env/%s", machines[i]);
> +        qtest_add_data_func(name, machines[i], test_machine);
> +        g_free(name);
> +    }
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +    const char *sparc_machines[] = { "SPARCbook", "Voyager", "SS-20", NULL };
> +    const char *sparc64_machines[] = { "sun4u", "sun4v", NULL };
> +    const char *mac_machines[] = { "mac99", "g3beige", NULL };
> +    const char *arch = qtest_get_arch();
> +
> +    g_test_init(&argc, &argv, NULL);
> +
> +    if (!strcmp(arch, "ppc") || !strcmp(arch, "ppc64")) {
> +        add_tests(mac_machines);
> +    } else if (!strcmp(arch, "sparc")) {
> +        add_tests(sparc_machines);
> +    } else if (!strcmp(arch, "sparc64")) {
> +        add_tests(sparc64_machines);
> +    } else {
> +        g_assert_not_reached();
> +    }
> +
> +    return g_test_run();
> +}

Hi Thomas,

Thank you for doing this - such a great hack! I know it's not 100%
complete (for example one of the last regressions for SPARC64 was caused
by changes to the VGA VBE registers) but at least it will give people an
indication that nothing is fundamentally broken.


ATB,

Mark.




reply via email to

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