[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 03/14] libqos: create libqos.c
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH 03/14] libqos: create libqos.c |
Date: |
Mon, 19 Jan 2015 18:11:45 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.3.0 |
On 13/01/2015 04:34, John Snow wrote:
> 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 <address@hidden>
> ---
> 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 77f995d..c5b3b21 100644
> --- a/tests/Makefile
> +++ b/tests/Makefile
> @@ -314,7 +314,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 fe903dd..a498cbb 100644
> --- a/tests/ahci-test.c
> +++ b/tests/ahci-test.c
> @@ -29,6 +29,7 @@
> #include <glib.h>
>
> #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 <stdio.h>
> +#include <stdlib.h>
> +#include <glib.h>
> +#include <unistd.h>
> +#include <fcntl.h>
> +#include <sys/wait.h>
> +
> +#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
>
Reviewed-by: Paolo Bonzini <address@hidden>
- [Qemu-devel] [PATCH 00/14] ahci-test preliminary refactoring, John Snow, 2015/01/12
- [Qemu-devel] [PATCH 04/14] libqos: add qtest_vboot, John Snow, 2015/01/12
- [Qemu-devel] [PATCH 05/14] libqos: add alloc_init_flags, John Snow, 2015/01/12
- [Qemu-devel] [PATCH 02/14] qtest/ahci: Create ahci.h, John Snow, 2015/01/12
- [Qemu-devel] [PATCH 03/14] libqos: create libqos.c, John Snow, 2015/01/12
- Re: [Qemu-devel] [PATCH 03/14] libqos: create libqos.c,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 01/14] libqos: Split apart pc_alloc_init, John Snow, 2015/01/12
- [Qemu-devel] [PATCH 10/14] qtest/ahci: remove guest_malloc global, John Snow, 2015/01/12
- [Qemu-devel] [PATCH 07/14] qtest/ahci: Store hba_base in AHCIQState, John Snow, 2015/01/12
- [Qemu-devel] [PATCH 06/14] libqos: add pc specific interface, John Snow, 2015/01/12