All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: pbonzini@redhat.com, qemu-devel@nongnu.org,
	Anthony Liguori <anthony@codemonkey.ws>
Subject: Re: [Qemu-devel] [PATCH 2/2] acpi-test: basic acpi unit-test
Date: Fri, 18 Oct 2013 14:20:50 +0300	[thread overview]
Message-ID: <20131018112050.GA23383@redhat.com> (raw)
In-Reply-To: <87k3hbcfhz.fsf@blackfin.pond.sub.org>

On Fri, Oct 18, 2013 at 07:30:48AM +0200, Markus Armbruster wrote:
> "Michael S. Tsirkin" <mst@redhat.com> writes:
> 
> > We run bios, and boot a minimal boot sector that immediately halts.
> > Then poke at memory to find ACPI tables.
> >
> > This only checks that RSDP is there.
> > More will be added later.
> >
> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> > ---
> >  tests/acpi-test.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  tests/Makefile    |   2 +
> >  2 files changed, 131 insertions(+)
> >  create mode 100644 tests/acpi-test.c
> >
> > diff --git a/tests/acpi-test.c b/tests/acpi-test.c
> > new file mode 100644
> > index 0000000..42de248
> > --- /dev/null
> > +++ b/tests/acpi-test.c
> > @@ -0,0 +1,129 @@
> > +/*
> > + * Boot order test cases.
> > + *
> > + * Copyright (c) 2013 Red Hat Inc.
> > + *
> > + * Authors:
> > + *  Markus Armbruster <armbru@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.
> > + */
> 
> Please update the file comment :)
> 
> > +
> > +#include <string.h>
> > +#include <stdio.h>
> > +#include <glib.h>
> > +#include "libqtest.h"
> > +
> > +typedef struct {
> > +    const char *args;
> > +    uint64_t expected_boot;
> > +    uint64_t expected_reboot;
> > +} boot_order_test;
> > +
> > +#define LOW(x) ((x) & 0xff)
> > +#define HIGH(x) ((x) >> 8)
> > +
> > +#define SIGNATURE 0xdead
> > +#define SIGNATURE_OFFSET 0x10
> > +#define BOOT_SECTOR_ADDRESS 0x7c00
> > +
> > +static uint8_t boot_sector[0x200] = {
> > +    /* 7c00: mov $0xdead,%ax */
> > +    [0x00] = 0xb8,
> > +    [0x01] = LOW(SIGNATURE),
> > +    [0x02] = HIGH(SIGNATURE),
> > +    /* 7c03:  mov %ax,0x7c10 */
> > +    [0x03] = 0xa3,
> > +    [0x04] = LOW(BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET),
> > +    [0x05] = HIGH(BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET),
> > +    /* 7c06: hlt */
> > +    [0x06] = 0xf4,                           
> > +    /* 7c07: jmp 0x7c06=0x7c09-3   */
> > +    [0x07] = 0xeb,
> > +    [0x08] = LOW(-3),
> > +    /* We mov 0xdead here: set value to make debugging easier */
> > +    [SIGNATURE_OFFSET] = LOW(0xface),
> > +    [SIGNATURE_OFFSET + 1] = HIGH(0xface),
> > +    /* End of boot sector marker */
> > +    [0x1FE] = 0x55,
> > +    [0x1FF] = 0xAA,
> > +};
> > +
> > +static const char *disk = "tests/acpi-test-disk.raw";
> > +
> > +static void test_acpi_one(const char *params)
> > +{
> > +    char *args;
> > +    uint8_t signature_low;
> > +    uint8_t signature_high;
> > +    uint16_t signature;
> > +    int i;
> > +    uint32_t off;
> > +
> > +
> > +    args = g_strdup_printf("-net none -display none %s %s",
> > +                           params ? params : "", disk);
> 
> Never called with null params.
> 
> > +    qtest_start(args);
> > +
> > +   /* Wait at most 1 minute */
> > +#define TEST_DELAY (1 * G_USEC_PER_SEC / 10)
> > +#define TEST_CYCLES (60 * G_USEC_PER_SEC / TEST_DELAY)
> > +
> > +    for (i = 0; i < TEST_CYCLES; ++i) {
> > +        signature_low = readb(BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET);
> > +        signature_high = readb(BOOT_SECTOR_ADDRESS + SIGNATURE_OFFSET + 1);
> > +        signature = (signature_high << 8) | signature_low;
> > +        if (signature == SIGNATURE) {
> > +            break;
> > +        }
> > +        g_usleep(TEST_DELAY);
> > +    }
> > +    g_assert_cmphex(signature, ==, SIGNATURE);
> > +
> > +    /* OK, now find RSDP */
> > +    for (off = 0xf0000; off < 0x100000; off += 0x10)
> > +    {
> > +        uint8_t sig[] = "RSD PTR ";
> > +        int i;
> > +
> > +        for (i = 0; i < sizeof sig - 1; ++i) {
> > +            sig[i] = readb(off + i);
> > +        }
> > +
> > +        if (!memcmp(sig, "RSD PTR ", sizeof sig)) {
> > +            break;
> > +        }
> > +    }
> > +
> > +    g_assert_cmphex(off, <, 0x100000);
> > +
> > +    qtest_quit(global_qtest);
> > +    g_free(args);
> > +}
> > +
> > +static void test_acpi_tcg(void)
> > +{
> > +    test_acpi_one("-machine accel=tcg");
> > +}
> 
> Since qtest_init() adds your parameters at the end, this should result
> in a command line ending with "-machine accel=qtest -machine accel=tcg",
> which should result in qtest.  How does this work?

At least I can testify that it works :)
>From what I saw latest value for accel overrides the former value.

> > +
> > +static void test_acpi_kvm(void)
> > +{
> > +    test_acpi_one("-enable-kvm -machine accel=kvm");
> > +}
> 
> Isn't -enable-kvm redundant?

I'm not sure - is it? Will have to check.

> > +
> > +int main(int argc, char *argv[])
> > +{
> > +    const char *arch = qtest_get_arch();
> > +    FILE *f = fopen(disk, "w");
> > +    fwrite(boot_sector, 1, sizeof boot_sector, f);
> > +    fclose(f);
> > +
> > +    g_test_init(&argc, &argv, NULL);
> > +
> > +    if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
> > +        qtest_add_func("acpi/tcg", test_acpi_tcg);
> > +        qtest_add_func("acpi/kvm", test_acpi_kvm);
> > +    }
> > +    return g_test_run();
> > +}
> > diff --git a/tests/Makefile b/tests/Makefile
> > index c13fefc..a81a005 100644
> > --- a/tests/Makefile
> > +++ b/tests/Makefile
> > @@ -64,6 +64,7 @@ check-qtest-i386-y += tests/ide-test$(EXESUF)
> >  check-qtest-i386-y += tests/hd-geo-test$(EXESUF)
> >  gcov-files-i386-y += hw/hd-geometry.c
> >  check-qtest-i386-y += tests/boot-order-test$(EXESUF)
> > +check-qtest-i386-y += tests/acpi-test$(EXESUF)
> >  check-qtest-i386-y += tests/rtc-test$(EXESUF)
> >  check-qtest-i386-y += tests/i440fx-test$(EXESUF)
> >  check-qtest-i386-y += tests/fw_cfg-test$(EXESUF)
> > @@ -171,6 +172,7 @@ tests/fdc-test$(EXESUF): tests/fdc-test.o
> >  tests/ide-test$(EXESUF): tests/ide-test.o $(libqos-pc-obj-y)
> >  tests/hd-geo-test$(EXESUF): tests/hd-geo-test.o
> >  tests/boot-order-test$(EXESUF): tests/boot-order-test.o $(libqos-obj-y)
> > +tests/acpi-test$(EXESUF): tests/acpi-test.o $(libqos-obj-y)
> >  tests/tmp105-test$(EXESUF): tests/tmp105-test.o $(libqos-omap-obj-y)
> >  tests/i440fx-test$(EXESUF): tests/i440fx-test.o $(libqos-pc-obj-y)
> >  tests/fw_cfg-test$(EXESUF): tests/fw_cfg-test.o $(libqos-pc-obj-y)

  parent reply	other threads:[~2013-10-18 11:18 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-17 21:52 [Qemu-devel] [PATCH 1/2] qtest: don't configure icount if qtest not allowed Michael S. Tsirkin
2013-10-17 21:52 ` [Qemu-devel] [PATCH 2/2] acpi-test: basic acpi unit-test Michael S. Tsirkin
2013-10-18  5:30   ` Markus Armbruster
2013-10-18  6:36     ` Paolo Bonzini
2013-10-18 11:43       ` Markus Armbruster
2013-10-18 11:20     ` Michael S. Tsirkin [this message]
2013-10-19  0:13   ` Andreas Färber
2013-10-19  1:25     ` Anthony Liguori
2013-10-19 17:27     ` Michael S. Tsirkin
2013-10-18 11:51 ` [Qemu-devel] [PATCH 1/2] qtest: don't configure icount if qtest not allowed Paolo Bonzini
2013-10-18 12:13   ` Michael S. Tsirkin

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=20131018112050.GA23383@redhat.com \
    --to=mst@redhat.com \
    --cc=anthony@codemonkey.ws \
    --cc=armbru@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@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.