From patchwork Mon Jan 19 20:15:51 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Snow X-Patchwork-Id: 430665 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4E34014017F for ; Tue, 20 Jan 2015 07:19:01 +1100 (AEDT) Received: from localhost ([::1]:39563 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YDImp-0005nk-BQ for incoming@patchwork.ozlabs.org; Mon, 19 Jan 2015 15:18:59 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59034) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YDIkC-0000v6-BH for qemu-devel@nongnu.org; Mon, 19 Jan 2015 15:16:18 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YDIkA-0006ju-J8 for qemu-devel@nongnu.org; Mon, 19 Jan 2015 15:16:16 -0500 Received: from mx1.redhat.com ([209.132.183.28]:43076) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YDIkA-0006jn-C6 for qemu-devel@nongnu.org; Mon, 19 Jan 2015 15:16:14 -0500 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t0JKGAQQ018002 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 19 Jan 2015 15:16:10 -0500 Received: from scv.usersys.redhat.com ([10.18.17.38]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t0JKG5ZJ016803; Mon, 19 Jan 2015 15:16:09 -0500 From: John Snow To: qemu-devel@nongnu.org Date: Mon, 19 Jan 2015 15:15:51 -0500 Message-Id: <1421698563-6977-4-git-send-email-jsnow@redhat.com> In-Reply-To: <1421698563-6977-1-git-send-email-jsnow@redhat.com> References: <1421698563-6977-1-git-send-email-jsnow@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: kwolf@redhat.com, marc.mari.barcelo@gmail.com, armbru@redhat.com, mreitz@redhat.com, stefanha@redhat.com, pbonzini@redhat.com, jsnow@redhat.com Subject: [Qemu-devel] [PATCH v2 03/15] libqos: create libqos.c X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org The intent of this file is to serve as a misc. utilities file to be shared amongst tests that are utilizing libqos facilities. In a later patch, migration test helpers will be added to libqos.c that will allow simplified testing of migration cases where libqos is "Just Enough OS" for migrations testing. The addition of the AHCIQState structure will also allow us to eliminate global variables inside of qtests to manage allocators and test instances in a better, more functional way. libqos.c: - Add qtest_boot - Add qtest_shutdown libqos.h: - Create QOSState structure for allocator and QTestState. ahci-test.c: - Move qtest_boot and qtest_shutdown to libqos.c/h - Create AHCIQState to interface with new qtest_boot/shutdown prototypes - Modify tests slightly to use new types. For now, the new object file is only linked to ahci-test, because it still relies on pc architecture specific code in libqos. The next two patches will reorganize the code to be more general. Signed-off-by: John Snow Reviewed-by: Paolo Bonzini --- tests/Makefile | 2 +- tests/ahci-test.c | 95 +++++++++++++++++++++------------------------------ tests/libqos/ahci.h | 5 +++ tests/libqos/libqos.c | 48 ++++++++++++++++++++++++++ tests/libqos/libqos.h | 26 ++++++++++++++ 5 files changed, 119 insertions(+), 57 deletions(-) create mode 100644 tests/libqos/libqos.c create mode 100644 tests/libqos/libqos.h diff --git a/tests/Makefile b/tests/Makefile index c2e2e52..c07d840 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -312,7 +312,7 @@ tests/endianness-test$(EXESUF): tests/endianness-test.o tests/spapr-phb-test$(EXESUF): tests/spapr-phb-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) +tests/ahci-test$(EXESUF): tests/ahci-test.o $(libqos-pc-obj-y) tests/libqos/libqos.o tests/hd-geo-test$(EXESUF): tests/hd-geo-test.o tests/boot-order-test$(EXESUF): tests/boot-order-test.o $(libqos-obj-y) tests/bios-tables-test$(EXESUF): tests/bios-tables-test.o $(libqos-obj-y) diff --git a/tests/ahci-test.c b/tests/ahci-test.c index 5c9da12..15542b9 100644 --- a/tests/ahci-test.c +++ b/tests/ahci-test.c @@ -29,6 +29,7 @@ #include #include "libqtest.h" +#include "libqos/libqos.h" #include "libqos/ahci.h" #include "libqos/pci-pc.h" #include "libqos/malloc-pc.h" @@ -136,58 +137,40 @@ static void free_ahci_device(QPCIDevice *ahci) /*** Test Setup & Teardown ***/ /** - * Launch QEMU with the given command line, - * and then set up interrupts and our guest malloc interface. - */ -static void qtest_boot(const char *cmdline_fmt, ...) -{ - va_list ap; - char *cmdline; - - va_start(ap, cmdline_fmt); - cmdline = g_strdup_vprintf(cmdline_fmt, ap); - va_end(ap); - - qtest_start(cmdline); - qtest_irq_intercept_in(global_qtest, "ioapic"); - guest_malloc = pc_alloc_init(); - - g_free(cmdline); -} - -/** - * Tear down the QEMU instance. - */ -static void qtest_shutdown(void) -{ - g_free(guest_malloc); - guest_malloc = NULL; - qtest_end(); -} - -/** * Start a Q35 machine and bookmark a handle to the AHCI device. */ -static QPCIDevice *ahci_boot(void) +static AHCIQState *ahci_boot(void) { - qtest_boot("-drive if=none,id=drive0,file=%s,cache=writeback,serial=%s," - "format=raw" - " -M q35 " - "-device ide-hd,drive=drive0 " - "-global ide-hd.ver=%s", - tmp_path, "testdisk", "version"); + AHCIQState *s; + const char *cli; + + s = g_malloc0(sizeof(AHCIQState)); + + cli = "-drive if=none,id=drive0,file=%s,cache=writeback,serial=%s" + ",format=raw" + " -M q35 " + "-device ide-hd,drive=drive0 " + "-global ide-hd.ver=%s"; + s->parent = qtest_boot(cli, tmp_path, "testdisk", "version"); /* Verify that we have an AHCI device present. */ - return get_ahci_device(); + s->dev = get_ahci_device(); + + /* Stopgap: Copy the allocator reference */ + guest_malloc = s->parent->alloc; + + return s; } /** * Clean up the PCI device, then terminate the QEMU instance. */ -static void ahci_shutdown(QPCIDevice *ahci) +static void ahci_shutdown(AHCIQState *ahci) { - free_ahci_device(ahci); - qtest_shutdown(); + QOSState *qs = ahci->parent; + free_ahci_device(ahci->dev); + g_free(ahci); + qtest_shutdown(qs); } /*** Logical Device Initialization ***/ @@ -1104,7 +1087,7 @@ static void ahci_test_identify(QPCIDevice *ahci, void *hba_base) */ static void test_sanity(void) { - QPCIDevice *ahci; + AHCIQState *ahci; ahci = ahci_boot(); ahci_shutdown(ahci); } @@ -1115,9 +1098,9 @@ static void test_sanity(void) */ static void test_pci_spec(void) { - QPCIDevice *ahci; + AHCIQState *ahci; ahci = ahci_boot(); - ahci_test_pci_spec(ahci); + ahci_test_pci_spec(ahci->dev); ahci_shutdown(ahci); } @@ -1127,10 +1110,10 @@ static void test_pci_spec(void) */ static void test_pci_enable(void) { - QPCIDevice *ahci; + AHCIQState *ahci; void *hba_base; ahci = ahci_boot(); - ahci_pci_enable(ahci, &hba_base); + ahci_pci_enable(ahci->dev, &hba_base); ahci_shutdown(ahci); } @@ -1140,12 +1123,12 @@ static void test_pci_enable(void) */ static void test_hba_spec(void) { - QPCIDevice *ahci; + AHCIQState *ahci; void *hba_base; ahci = ahci_boot(); - ahci_pci_enable(ahci, &hba_base); - ahci_test_hba_spec(ahci, hba_base); + ahci_pci_enable(ahci->dev, &hba_base); + ahci_test_hba_spec(ahci->dev, hba_base); ahci_shutdown(ahci); } @@ -1155,12 +1138,12 @@ static void test_hba_spec(void) */ static void test_hba_enable(void) { - QPCIDevice *ahci; + AHCIQState *ahci; void *hba_base; ahci = ahci_boot(); - ahci_pci_enable(ahci, &hba_base); - ahci_hba_enable(ahci, hba_base); + ahci_pci_enable(ahci->dev, &hba_base); + ahci_hba_enable(ahci->dev, hba_base); ahci_shutdown(ahci); } @@ -1170,13 +1153,13 @@ static void test_hba_enable(void) */ static void test_identify(void) { - QPCIDevice *ahci; + AHCIQState *ahci; void *hba_base; ahci = ahci_boot(); - ahci_pci_enable(ahci, &hba_base); - ahci_hba_enable(ahci, hba_base); - ahci_test_identify(ahci, hba_base); + ahci_pci_enable(ahci->dev, &hba_base); + ahci_hba_enable(ahci->dev, hba_base); + ahci_test_identify(ahci->dev, hba_base); ahci_shutdown(ahci); } diff --git a/tests/libqos/ahci.h b/tests/libqos/ahci.h index 6564c5a..bc5f45d 100644 --- a/tests/libqos/ahci.h +++ b/tests/libqos/ahci.h @@ -245,6 +245,11 @@ /*** Structures ***/ +typedef struct AHCIQState { + QOSState *parent; + QPCIDevice *dev; +} AHCIQState; + /** * Generic FIS structure. */ diff --git a/tests/libqos/libqos.c b/tests/libqos/libqos.c new file mode 100644 index 0000000..c478bc9 --- /dev/null +++ b/tests/libqos/libqos.c @@ -0,0 +1,48 @@ +#include +#include +#include +#include +#include +#include + +#include "libqtest.h" +#include "libqos/libqos.h" +#include "libqos/pci.h" +#include "libqos/malloc-pc.h" + +/*** Test Setup & Teardown ***/ + +/** + * Launch QEMU with the given command line, + * and then set up interrupts and our guest malloc interface. + */ +QOSState *qtest_boot(const char *cmdline_fmt, ...) +{ + QOSState *qs = g_malloc(sizeof(QOSState)); + char *cmdline; + va_list ap; + + va_start(ap, cmdline_fmt); + cmdline = g_strdup_vprintf(cmdline_fmt, ap); + va_end(ap); + + qs->qts = qtest_start(cmdline); + qtest_irq_intercept_in(global_qtest, "ioapic"); + qs->alloc = pc_alloc_init(); + + g_free(cmdline); + return qs; +} + +/** + * Tear down the QEMU instance. + */ +void qtest_shutdown(QOSState *qs) +{ + if (qs->alloc) { + pc_alloc_uninit(qs->alloc); + qs->alloc = NULL; + } + qtest_quit(qs->qts); + g_free(qs); +} diff --git a/tests/libqos/libqos.h b/tests/libqos/libqos.h new file mode 100644 index 0000000..7a106f2 --- /dev/null +++ b/tests/libqos/libqos.h @@ -0,0 +1,26 @@ +#ifndef __libqos_h +#define __libqos_h + +#include "libqtest.h" +#include "libqos/pci.h" +#include "libqos/malloc-pc.h" + +typedef struct QOSState { + QTestState *qts; + QGuestAllocator *alloc; +} QOSState; + +QOSState *qtest_boot(const char *cmdline_fmt, ...); +void qtest_shutdown(QOSState *qs); + +static inline uint64_t qmalloc(QOSState *q, size_t bytes) +{ + return guest_alloc(q->alloc, bytes); +} + +static inline void qfree(QOSState *q, uint64_t addr) +{ + guest_free(q->alloc, addr); +} + +#endif