diff options
| author | Peter Maydell <peter.maydell@linaro.org> | 2015-03-17 16:19:12 +0000 |
|---|---|---|
| committer | Peter Maydell <peter.maydell@linaro.org> | 2015-03-17 16:19:13 +0000 |
| commit | ac738eadc409813c5fbb37dae8d254cb5664733a (patch) | |
| tree | 6fe608edd1bfb22f1d9480449db54db579c0db40 /tests/pc-cpu-test.c | |
| parent | 1a87e52770ca64f5a09e9c46d29ea3b5a5db5ffd (diff) | |
| parent | e1570d0005f29f97d4b1d603b4548591340c57e1 (diff) | |
| download | focaccia-qemu-ac738eadc409813c5fbb37dae8d254cb5664733a.tar.gz focaccia-qemu-ac738eadc409813c5fbb37dae8d254cb5664733a.zip | |
Merge remote-tracking branch 'remotes/afaerber/tags/qom-cpu-for-peter' into staging
QOM CPUState and X86CPU * QTest for PC X86CPU * Confinement of ICC bridge X86CPU parenting to PC code # gpg: Signature made Tue Mar 17 15:23:31 2015 GMT using RSA key ID 3E7E013F # gpg: Good signature from "Andreas Färber <afaerber@suse.de>" # gpg: aka "Andreas Färber <afaerber@suse.com>" * remotes/afaerber/tags/qom-cpu-for-peter: target-i386: Remove icc_bridge parameter from cpu_x86_create() tests: Add PC CPU test pc: Suppress APIC ID compatibility warning for QTest Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'tests/pc-cpu-test.c')
| -rw-r--r-- | tests/pc-cpu-test.c | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/tests/pc-cpu-test.c b/tests/pc-cpu-test.c new file mode 100644 index 0000000000..a0122d3d61 --- /dev/null +++ b/tests/pc-cpu-test.c @@ -0,0 +1,147 @@ +/* + * QTest testcase for PC CPUs + * + * Copyright (c) 2015 SUSE Linux GmbH + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include <glib.h> +#include <string.h> + +#include "qemu-common.h" +#include "libqtest.h" +#include "qemu/osdep.h" +#include "qapi/qmp/types.h" + +struct PCTestData { + const char *machine; + const char *cpu_model; + unsigned sockets; + unsigned cores; + unsigned threads; + unsigned maxcpus; +}; +typedef struct PCTestData PCTestData; + +static void test_pc_with_cpu_add(gconstpointer data) +{ + const PCTestData *s = data; + char *args; + QDict *response; + unsigned int i; + + args = g_strdup_printf("-machine %s -cpu %s " + "-smp sockets=%u,cores=%u,threads=%u,maxcpus=%u", + s->machine, s->cpu_model, + s->sockets, s->cores, s->threads, s->maxcpus); + qtest_start(args); + + for (i = s->sockets * s->cores * s->threads; i < s->maxcpus; i++) { + response = qmp("{ 'execute': 'cpu-add'," + " 'arguments': { 'id': %d } }", i); + g_assert(response); + g_assert(!qdict_haskey(response, "error")); + QDECREF(response); + } + + qtest_end(); + g_free(args); +} + +static void test_pc_without_cpu_add(gconstpointer data) +{ + const PCTestData *s = data; + char *args; + QDict *response; + + args = g_strdup_printf("-machine %s -cpu %s " + "-smp sockets=%u,cores=%u,threads=%u,maxcpus=%u", + s->machine, s->cpu_model, + s->sockets, s->cores, s->threads, s->maxcpus); + qtest_start(args); + + response = qmp("{ 'execute': 'cpu-add'," + " 'arguments': { 'id': %d } }", + s->sockets * s->cores * s->threads); + g_assert(response); + g_assert(qdict_haskey(response, "error")); + QDECREF(response); + + qtest_end(); + g_free(args); +} + +static void add_pc_test_cases(void) +{ + const char *arch = qtest_get_arch(); + QDict *response, *minfo; + QList *list; + const QListEntry *p; + QObject *qobj; + QString *qstr; + const char *mname, *path; + PCTestData *data; + + qtest_start("-machine none"); + response = qmp("{ 'execute': 'query-machines' }"); + g_assert(response); + list = qdict_get_qlist(response, "return"); + g_assert(list); + + for (p = qlist_first(list); p; p = qlist_next(p)) { + minfo = qobject_to_qdict(qlist_entry_obj(p)); + g_assert(minfo); + qobj = qdict_get(minfo, "name"); + g_assert(qobj); + qstr = qobject_to_qstring(qobj); + g_assert(qstr); + mname = qstring_get_str(qstr); + if (!g_str_has_prefix(mname, "pc-")) { + continue; + } + data = g_malloc(sizeof(PCTestData)); + data->machine = mname; + data->cpu_model = "Haswell"; /* 1.3+ theoretically */ + data->sockets = 1; + data->cores = 3; + data->threads = 2; + data->maxcpus = data->sockets * data->cores * data->threads * 2; + if (g_str_has_suffix(mname, "-1.4") || + (strcmp(mname, "pc-1.3") == 0) || + (strcmp(mname, "pc-1.2") == 0) || + (strcmp(mname, "pc-1.1") == 0) || + (strcmp(mname, "pc-1.0") == 0) || + (strcmp(mname, "pc-0.15") == 0) || + (strcmp(mname, "pc-0.14") == 0) || + (strcmp(mname, "pc-0.13") == 0) || + (strcmp(mname, "pc-0.12") == 0) || + (strcmp(mname, "pc-0.11") == 0) || + (strcmp(mname, "pc-0.10") == 0)) { + path = g_strdup_printf("/%s/cpu/%s/init/%ux%ux%u&maxcpus=%u", + arch, mname, data->sockets, data->cores, + data->threads, data->maxcpus); + g_test_add_data_func(path, data, test_pc_without_cpu_add); + } else { + path = g_strdup_printf("/%s/cpu/%s/add/%ux%ux%u&maxcpus=%u", + arch, mname, data->sockets, data->cores, + data->threads, data->maxcpus); + g_test_add_data_func(path, data, test_pc_with_cpu_add); + } + } + qtest_end(); +} + +int main(int argc, char **argv) +{ + const char *arch = qtest_get_arch(); + + g_test_init(&argc, &argv, NULL); + + if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) { + add_pc_test_cases(); + } + + return g_test_run(); +} |