Re: [Qemu-devel] [PATCH] ppc / sparc: Add a tester for checking whether OpenBIOS runs successfully
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 > --- > 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 000..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" > +#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(1); > +} > + > +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_n
Re: [Qemu-devel] [PATCH] ppc / sparc: Add a tester for checking whether OpenBIOS runs successfully
On 14.06.2016 13:31, Markus Armbruster wrote: > Thomas Huth writes: >[...] >> diff --git a/tests/prom-env-test.c b/tests/prom-env-test.c >> new file mode 100644 >> index 000..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. True. That's a copy-n-paste error from when I was creating the file using another test as a template ;-) I'll send a v2 with these lines removed. >> +#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(1); >> +} >> + >> +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... Currently, the test takes 1 - 2 seconds on my idle laptop, and 4 to 6 seconds when I'm doing a lot of GCC compilation task in the background. Now imagine somebody tries to run this test on a very old host machine that is already loaded with a lot of other background tasks ... I guess that could easily take more than 10 or even 20 seconds. So 30 seconds should be a realistic value for a timeout here, I think. >> + >> +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 Thanks for the review! Thomas
Re: [Qemu-devel] [PATCH] ppc / sparc: Add a tester for checking whether OpenBIOS runs successfully
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 000..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(1); > +} > + > +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(s
[Qemu-devel] [PATCH] ppc / sparc: Add a tester for checking whether OpenBIOS runs successfully
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 --- 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 000..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" +#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(1); +} + +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(); +} -- 1.8.3.1