From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52470) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bCmZ5-0005AX-Nj for qemu-devel@nongnu.org; Tue, 14 Jun 2016 07:31:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bCmZ1-0001VW-G9 for qemu-devel@nongnu.org; Tue, 14 Jun 2016 07:31:26 -0400 From: Markus Armbruster References: <1465902267-32527-1-git-send-email-thuth@redhat.com> Date: Tue, 14 Jun 2016 13:31:18 +0200 In-Reply-To: <1465902267-32527-1-git-send-email-thuth@redhat.com> (Thomas Huth's message of "Tue, 14 Jun 2016 13:04:27 +0200") Message-ID: <87h9cwf1mh.fsf@dusky.pond.sub.org> MIME-Version: 1.0 Content-Type: text/plain Subject: Re: [Qemu-devel] [PATCH] ppc / sparc: Add a tester for checking whether OpenBIOS runs successfully List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Thomas Huth Cc: qemu-ppc@nongnu.org, qemu-devel@nongnu.org, david@gibson.dropbear.id.au, Mark Cave-Ayland , blauwirbel@gmail.com, agraf@suse.de, Artyom Tarasenko Thomas Huth writes: > 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. Clever! > Signed-off-by: Thomas Huth > --- > 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 > + * > + * 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 > +#include "qemu-common.h" These three includes seem redundant. > +#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); > +} I guess there's no way around waiting and an arbitrary time limit here. 30s is perhaps a bit long. Dunno... > + > +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(); > +} With redundant includes dropped: Reviewed-by: Markus Armbruster