All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Laszlo Ersek <lersek@redhat.com>
Subject: [Qemu-devel] [PULL 07/19] i440fx-test: verify firmware under 4G and 1M, both -bios and -pflash
Date: Mon, 23 Dec 2013 18:11:52 +0200	[thread overview]
Message-ID: <1387815007-1272-8-git-send-email-mst@redhat.com> (raw)
In-Reply-To: <1387815007-1272-1-git-send-email-mst@redhat.com>

From: Laszlo Ersek <lersek@redhat.com>

Check whether the firmware is not hidden by other memory regions.

Qemu is started in paused mode: it shouldn't try to interpret generated
garbage.

Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 tests/i440fx-test.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 75 insertions(+), 6 deletions(-)

diff --git a/tests/i440fx-test.c b/tests/i440fx-test.c
index b6e0cd3..fa3e3d6 100644
--- a/tests/i440fx-test.c
+++ b/tests/i440fx-test.c
@@ -35,6 +35,11 @@ typedef struct TestData
     int num_cpus;
 } TestData;
 
+typedef struct FirmwareTestFixture {
+    /* decides whether we're testing -bios or -pflash */
+    bool is_bios;
+} FirmwareTestFixture;
+
 static QPCIBus *test_start_get_bus(const TestData *s)
 {
     char *cmdline;
@@ -278,6 +283,7 @@ static void test_i440fx_pam(gconstpointer opaque)
 }
 
 #define BLOB_SIZE ((size_t)65536)
+#define ISA_BIOS_MAXSZ ((size_t)(128 * 1024))
 
 /* Create a blob file, and return its absolute pathname as a dynamically
  * allocated string.
@@ -326,23 +332,86 @@ static char *create_blob_file(void)
     return ret == -1 ? NULL : pathname;
 }
 
-int main(int argc, char **argv)
+static void test_i440fx_firmware(FirmwareTestFixture *fixture,
+                                 gconstpointer user_data)
 {
-    char *fw_pathname;
-    TestData data;
-    int ret;
-
-    g_test_init(&argc, &argv, NULL);
+    char *fw_pathname, *cmdline;
+    uint8_t *buf;
+    size_t i, isa_bios_size;
 
     fw_pathname = create_blob_file();
     g_assert(fw_pathname != NULL);
+
+    /* Better hope the user didn't put metacharacters in TMPDIR and co. */
+    cmdline = g_strdup_printf("-S %s %s",
+                              fixture->is_bios ? "-bios" : "-pflash",
+                              fw_pathname);
+    g_test_message("qemu cmdline: %s", cmdline);
+    qtest_start(cmdline);
+    g_free(cmdline);
+
+    /* Qemu has loaded the firmware (because qtest_start() only returns after
+     * the QMP handshake completes). We must unlink the firmware blob right
+     * here, because any assertion firing below would leak it in the
+     * filesystem. This is also the reason why we recreate the blob every time
+     * this function is invoked.
+     */
     unlink(fw_pathname);
     g_free(fw_pathname);
 
+    /* check below 4G */
+    buf = g_malloc0(BLOB_SIZE);
+    memread(0x100000000ULL - BLOB_SIZE, buf, BLOB_SIZE);
+    for (i = 0; i < BLOB_SIZE; ++i) {
+        g_assert_cmphex(buf[i], ==, (uint8_t)i);
+    }
+
+    /* check in ISA space too */
+    memset(buf, 0, BLOB_SIZE);
+    isa_bios_size = ISA_BIOS_MAXSZ < BLOB_SIZE ? ISA_BIOS_MAXSZ : BLOB_SIZE;
+    memread(0x100000 - isa_bios_size, buf, isa_bios_size);
+    for (i = 0; i < isa_bios_size; ++i) {
+        g_assert_cmphex(buf[i], ==,
+                        (uint8_t)((BLOB_SIZE - isa_bios_size) + i));
+    }
+
+    g_free(buf);
+    qtest_end();
+}
+
+static void add_firmware_test(const char *testpath,
+                              void (*setup_fixture)(FirmwareTestFixture *f,
+                                                    gconstpointer test_data))
+{
+    g_test_add(testpath, FirmwareTestFixture, NULL, setup_fixture,
+               test_i440fx_firmware, NULL);
+}
+
+static void request_bios(FirmwareTestFixture *fixture,
+                         gconstpointer user_data)
+{
+    fixture->is_bios = true;
+}
+
+static void request_pflash(FirmwareTestFixture *fixture,
+                           gconstpointer user_data)
+{
+    fixture->is_bios = false;
+}
+
+int main(int argc, char **argv)
+{
+    TestData data;
+    int ret;
+
+    g_test_init(&argc, &argv, NULL);
+
     data.num_cpus = 1;
 
     g_test_add_data_func("/i440fx/defaults", &data, test_i440fx_defaults);
     g_test_add_data_func("/i440fx/pam", &data, test_i440fx_pam);
+    add_firmware_test("/i440fx/firmware/bios", request_bios);
+    add_firmware_test("/i440fx/firmware/pflash", request_pflash);
 
     ret = g_test_run();
     return ret;
-- 
MST

  parent reply	other threads:[~2013-12-23 16:08 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-23 16:11 [Qemu-devel] [PULL 00/19] acpi, pci, pc, fedora, virtio fixes and enhancements Michael S. Tsirkin
2013-12-23 16:11 ` [Qemu-devel] [PULL 01/19] piix: gigabyte alignment for ram Michael S. Tsirkin
2013-12-23 16:11 ` [Qemu-devel] [PULL 02/19] pc_piix: document gigabyte_align Michael S. Tsirkin
2013-12-23 16:11 ` [Qemu-devel] [PULL 03/19] hw/i386/pc_sysfw: support two flash drives Michael S. Tsirkin
2013-12-23 16:11 ` [Qemu-devel] [PULL 04/19] i440fx-test: qtest_start() should be paired with qtest_end() Michael S. Tsirkin
2013-12-23 16:11 ` [Qemu-devel] [PULL 05/19] i440fx-test: give each GTest case its own qtest Michael S. Tsirkin
2013-12-23 16:11 ` [Qemu-devel] [PULL 06/19] i440fx-test: generate temporary firmware blob Michael S. Tsirkin
2013-12-23 16:11 ` Michael S. Tsirkin [this message]
2013-12-23 16:11 ` [Qemu-devel] [PULL 08/19] acpi: piix4: remove not needed GPE0 mask Michael S. Tsirkin
2013-12-23 16:11 ` [Qemu-devel] [PULL 09/19] acpi: factor out common pm_update_sci() into acpi core Michael S. Tsirkin
2013-12-23 16:12 ` [Qemu-devel] [PULL 10/19] acpi: ich9: allow guest to clear SCI rised by GPE Michael S. Tsirkin
2013-12-23 16:12 ` [Qemu-devel] [PULL 11/19] ACPI: Q35 DSDT: fix CPU hotplug GPE0.2 handler Michael S. Tsirkin
2013-12-23 16:12 ` [Qemu-devel] [PULL 12/19] ACPI/DSDT-CPU: cleanup bogus comment Michael S. Tsirkin
2013-12-23 16:12 ` [Qemu-devel] [PULL 13/19] pci: do not export pci_bus_reset Michael S. Tsirkin
2013-12-23 16:12 ` [Qemu-devel] [PULL 14/19] pci: clean up resetting of IRQs Michael S. Tsirkin
2013-12-23 16:12 ` [Qemu-devel] [PULL 15/19] qdev: allow both pre- and post-order vists in qdev walking functions Michael S. Tsirkin
2013-12-23 16:12 ` [Qemu-devel] [PULL 16/19] qdev: switch reset to post-order Michael S. Tsirkin
2013-12-23 16:12 ` [Qemu-devel] [PULL 17/19] piix: fix 32bit pci hole Michael S. Tsirkin
2013-12-23 16:12 ` [Qemu-devel] [PULL 18/19] virtio: add back call to virtio_bus_device_unplugged Michael S. Tsirkin
2013-12-23 16:12 ` [Qemu-devel] [PULL 19/19] target-arm: fix build with gcc 4.8.2 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=1387815007-1272-8-git-send-email-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=lersek@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.