提交 dd0029c0 编写于 作者: J John Snow 提交者: Stefan Hajnoczi

libqos: create libqos.c

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: NJohn Snow <jsnow@redhat.com>
Reviewed-by: NPaolo Bonzini <pbonzini@redhat.com>
Message-id: 1421698563-6977-4-git-send-email-jsnow@redhat.com
Signed-off-by: NStefan Hajnoczi <stefanha@redhat.com>
上级 90fc5e09
......@@ -320,7 +320,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)
......
......@@ -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.
* Start a Q35 machine and bookmark a handle to the AHCI device.
*/
static void qtest_boot(const char *cmdline_fmt, ...)
static AHCIQState *ahci_boot(void)
{
va_list ap;
char *cmdline;
va_start(ap, cmdline_fmt);
cmdline = g_strdup_vprintf(cmdline_fmt, ap);
va_end(ap);
AHCIQState *s;
const char *cli;
qtest_start(cmdline);
qtest_irq_intercept_in(global_qtest, "ioapic");
guest_malloc = pc_alloc_init();
s = g_malloc0(sizeof(AHCIQState));
g_free(cmdline);
}
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");
/**
* Tear down the QEMU instance.
*/
static void qtest_shutdown(void)
{
g_free(guest_malloc);
guest_malloc = NULL;
qtest_end();
}
/* Verify that we have an AHCI device present. */
s->dev = get_ahci_device();
/**
* Start a Q35 machine and bookmark a handle to the AHCI device.
*/
static QPCIDevice *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");
/* Stopgap: Copy the allocator reference */
guest_malloc = s->parent->alloc;
/* Verify that we have an AHCI device present. */
return get_ahci_device();
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);
}
......
......@@ -245,6 +245,11 @@
/*** Structures ***/
typedef struct AHCIQState {
QOSState *parent;
QPCIDevice *dev;
} AHCIQState;
/**
* Generic FIS structure.
*/
......
#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);
}
#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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册