All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas Huth <thuth@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: qemu-ppc@nongnu.org, qemu-devel@nongnu.org,
	david@gibson.dropbear.id.au,
	Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>,
	blauwirbel@gmail.com, agraf@suse.de,
	Artyom Tarasenko <atar4qemu@gmail.com>
Subject: Re: [Qemu-devel] [PATCH] ppc / sparc: Add a tester for checking whether OpenBIOS runs successfully
Date: Tue, 14 Jun 2016 15:46:45 +0200	[thread overview]
Message-ID: <57600AC5.8080007@redhat.com> (raw)
In-Reply-To: <87h9cwf1mh.fsf@dusky.pond.sub.org>

On 14.06.2016 13:31, Markus Armbruster wrote:
> Thomas Huth <thuth@redhat.com> writes:
>[...]
>> 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 <thuth@redhat.com>
>> + *
>> + * 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"
> 
> 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(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...

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 <armbru@redhat.com>

Thanks for the review!

 Thomas

  reply	other threads:[~2016-06-14 13:47 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-14 11:04 [Qemu-devel] [PATCH] ppc / sparc: Add a tester for checking whether OpenBIOS runs successfully Thomas Huth
2016-06-14 11:31 ` Markus Armbruster
2016-06-14 13:46   ` Thomas Huth [this message]
2016-06-14 18:59 ` Mark Cave-Ayland

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=57600AC5.8080007@redhat.com \
    --to=thuth@redhat.com \
    --cc=agraf@suse.de \
    --cc=armbru@redhat.com \
    --cc=atar4qemu@gmail.com \
    --cc=blauwirbel@gmail.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=mark.cave-ayland@ilande.co.uk \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.