2017-04-25 07:16:47 +02:00
|
|
|
/*
|
|
|
|
* Test HMP commands.
|
|
|
|
*
|
|
|
|
* Copyright (c) 2017 Red Hat Inc.
|
|
|
|
*
|
|
|
|
* Author:
|
|
|
|
* Thomas Huth <thuth@redhat.com>
|
|
|
|
*
|
|
|
|
* This work is licensed under the terms of the GNU GPL, version 2
|
|
|
|
* or later. See the COPYING file in the top-level directory.
|
|
|
|
*
|
|
|
|
* This test calls some HMP commands for all machines that the current
|
|
|
|
* QEMU binary provides, to check whether they terminate successfully
|
|
|
|
* (i.e. do not crash QEMU).
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "qemu/osdep.h"
|
|
|
|
#include "libqtest.h"
|
|
|
|
|
|
|
|
static int verbose;
|
|
|
|
|
|
|
|
static const char *hmp_cmds[] = {
|
2019-02-27 14:24:12 +01:00
|
|
|
"announce_self",
|
2017-04-25 07:16:47 +02:00
|
|
|
"boot_set ndc",
|
|
|
|
"chardev-add null,id=testchardev1",
|
2017-07-27 11:51:37 +02:00
|
|
|
"chardev-send-break testchardev1",
|
2017-07-06 14:08:57 +02:00
|
|
|
"chardev-change testchardev1 ringbuf",
|
2017-04-25 07:16:47 +02:00
|
|
|
"chardev-remove testchardev1",
|
|
|
|
"commit all",
|
|
|
|
"cpu-add 1",
|
|
|
|
"cpu 0",
|
|
|
|
"device_add ?",
|
|
|
|
"device_add usb-mouse,id=mouse1",
|
2019-04-08 17:30:03 +02:00
|
|
|
"drive_add ignored format=help",
|
2017-04-25 07:16:47 +02:00
|
|
|
"mouse_button 7",
|
|
|
|
"mouse_move 10 10",
|
|
|
|
"mouse_button 0",
|
|
|
|
"device_del mouse1",
|
|
|
|
"dump-guest-memory /dev/null 0 4096",
|
2017-09-13 16:20:36 +02:00
|
|
|
"dump-guest-memory /dev/null",
|
2017-04-25 07:16:47 +02:00
|
|
|
"gdbserver",
|
2019-04-12 17:26:52 +02:00
|
|
|
"gva2gpa 0",
|
2017-04-25 07:16:47 +02:00
|
|
|
"hostfwd_add tcp::43210-:43210",
|
|
|
|
"hostfwd_remove tcp::43210-:43210",
|
|
|
|
"i /w 0",
|
|
|
|
"log all",
|
|
|
|
"log none",
|
|
|
|
"memsave 0 4096 \"/dev/null\"",
|
|
|
|
"migrate_set_cache_size 1",
|
|
|
|
"migrate_set_downtime 1",
|
|
|
|
"migrate_set_speed 1",
|
|
|
|
"netdev_add user,id=net1",
|
|
|
|
"set_link net1 off",
|
|
|
|
"set_link net1 on",
|
|
|
|
"netdev_del net1",
|
|
|
|
"nmi",
|
|
|
|
"o /w 0 0x1234",
|
|
|
|
"object_add memory-backend-ram,id=mem1,size=256M",
|
|
|
|
"object_del mem1",
|
|
|
|
"pmemsave 0 4096 \"/dev/null\"",
|
|
|
|
"p $pc + 8",
|
|
|
|
"qom-list /",
|
|
|
|
"qom-set /machine initrd test",
|
2020-05-20 17:11:07 +02:00
|
|
|
"qom-get /machine initrd",
|
2017-04-25 07:16:47 +02:00
|
|
|
"screendump /dev/null",
|
|
|
|
"sendkey x",
|
|
|
|
"singlestep on",
|
|
|
|
"wavcapture /dev/null",
|
|
|
|
"stopcapture 0",
|
|
|
|
"sum 0 512",
|
|
|
|
"x /8i 0x100",
|
|
|
|
"xp /16x 0",
|
|
|
|
NULL
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Run through the list of pre-defined commands */
|
2019-04-09 10:52:44 +02:00
|
|
|
static void test_commands(QTestState *qts)
|
2017-04-25 07:16:47 +02:00
|
|
|
{
|
|
|
|
char *response;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; hmp_cmds[i] != NULL; i++) {
|
2019-04-09 10:52:44 +02:00
|
|
|
response = qtest_hmp(qts, "%s", hmp_cmds[i]);
|
2017-04-25 07:16:47 +02:00
|
|
|
if (verbose) {
|
2017-10-23 17:13:10 +02:00
|
|
|
fprintf(stderr,
|
|
|
|
"\texecute HMP command: %s\n"
|
|
|
|
"\tresult : %s\n",
|
|
|
|
hmp_cmds[i], response);
|
2017-04-25 07:16:47 +02:00
|
|
|
}
|
|
|
|
g_free(response);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Run through all info commands and call them blindly (without arguments) */
|
2019-04-09 10:52:44 +02:00
|
|
|
static void test_info_commands(QTestState *qts)
|
2017-04-25 07:16:47 +02:00
|
|
|
{
|
|
|
|
char *resp, *info, *info_buf, *endp;
|
|
|
|
|
2019-04-09 10:52:44 +02:00
|
|
|
info_buf = info = qtest_hmp(qts, "help info");
|
2017-04-25 07:16:47 +02:00
|
|
|
|
|
|
|
while (*info) {
|
|
|
|
/* Extract the info command, ignore parameters and description */
|
|
|
|
g_assert(strncmp(info, "info ", 5) == 0);
|
|
|
|
endp = strchr(&info[5], ' ');
|
|
|
|
g_assert(endp != NULL);
|
|
|
|
*endp = '\0';
|
|
|
|
/* Now run the info command */
|
|
|
|
if (verbose) {
|
|
|
|
fprintf(stderr, "\t%s\n", info);
|
|
|
|
}
|
2019-04-09 10:52:44 +02:00
|
|
|
resp = qtest_hmp(qts, "%s", info);
|
2017-04-25 07:16:47 +02:00
|
|
|
g_free(resp);
|
|
|
|
/* And move forward to the next line */
|
|
|
|
info = strchr(endp + 1, '\n');
|
|
|
|
if (!info) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
info += 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
g_free(info_buf);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void test_machine(gconstpointer data)
|
|
|
|
{
|
|
|
|
const char *machine = data;
|
|
|
|
char *args;
|
2019-04-09 10:52:44 +02:00
|
|
|
QTestState *qts;
|
2017-04-25 07:16:47 +02:00
|
|
|
|
|
|
|
args = g_strdup_printf("-S -M %s", machine);
|
2019-04-09 10:52:44 +02:00
|
|
|
qts = qtest_init(args);
|
2017-04-25 07:16:47 +02:00
|
|
|
|
2019-04-09 10:52:44 +02:00
|
|
|
test_info_commands(qts);
|
|
|
|
test_commands(qts);
|
2017-04-25 07:16:47 +02:00
|
|
|
|
2019-04-09 10:52:44 +02:00
|
|
|
qtest_quit(qts);
|
2017-04-25 07:16:47 +02:00
|
|
|
g_free(args);
|
|
|
|
g_free((void *)data);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void add_machine_test_case(const char *mname)
|
|
|
|
{
|
|
|
|
char *path;
|
|
|
|
|
|
|
|
/* Ignore blacklisted machines that have known problems */
|
piix: fix xenfv regression, add compat machine xenfv-4.2
With QEMU 4.0 an incompatible change was added to pc_piix, which makes it
practical impossible to migrate domUs started with qemu2 or qemu3 to
newer qemu versions. Commit 7fccf2a06890e3bc3b30e29827ad3fb93fe88fea
added and enabled a new member "smbus_no_migration_support". In commit
4ab2f2a8aabfea95cc53c64e13b3f67960b27fdf the vmstate_acpi got new
elements, which are conditionally filled. As a result, an incoming
migration expected smbus related data unless smbus migration was
disabled for a given MachineClass. Since first commit forgot to handle
'xenfv', domUs started with QEMU 4.x are incompatible with their QEMU
siblings.
Using other existing machine types, such as 'pc-i440fx-3.1', is not
possible because 'xenfv' creates the 'xen-platform' PCI device at
00:02.0, while all other variants to run a domU would create it at
00:04.0.
To cover both the existing and the broken case of 'xenfv' in a single
qemu binary, a new compatibility variant of 'xenfv-4.2' must be added
which targets domUs started with qemu 4.2. The existing 'xenfv' restores
compatibility of QEMU 5.x with qemu 3.1.
Host admins who started domUs with QEMU 4.x (preferrable QEMU 4.2)
have to use a wrapper script which appends '-machine xenfv-4.2' to
the device-model command line. This is only required if there is no
maintenance window which allows to temporary shutdown the domU and
restart it with a fixed device-model.
The wrapper script is as simple as this:
#!/bin/sh
exec /usr/bin/qemu-system-i386 "$@" -machine xenfv-4.2
With xl this script will be enabled with device_model_override=, see
xl.cfg(5). To live migrate a domU, adjust the existing domU.cfg and pass
it to xl migrate or xl save/restore:
xl migrate -C new-domU.cfg domU remote-host
xl save domU CheckpointFile new-domU.cfg
xl restore new-domU.cfg CheckpointFile
With libvirt this script will be enabled with the <emulator> element in
domU.xml. Use 'virsh edit' prior 'virsh migrate' to replace the existing
<emulator> element to point it to the wrapper script.
Signed-off-by: Olaf Hering <olaf@aepfle.de>
Message-Id: <20200327151841.13877-1-olaf@aepfle.de>
[Adjust tests for blacklisted machine types, simplifying the one in
qom-test. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2020-03-27 16:18:40 +01:00
|
|
|
if (!memcmp("xenfv", mname, 5) || g_str_equal("xenpv", mname)) {
|
2017-04-25 07:16:47 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
path = g_strdup_printf("hmp/%s", mname);
|
|
|
|
qtest_add_data_func(path, g_strdup(mname), test_machine);
|
|
|
|
g_free(path);
|
|
|
|
}
|
|
|
|
|
|
|
|
int main(int argc, char **argv)
|
|
|
|
{
|
|
|
|
char *v_env = getenv("V");
|
|
|
|
|
|
|
|
if (v_env && *v_env >= '2') {
|
|
|
|
verbose = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
g_test_init(&argc, &argv, NULL);
|
|
|
|
|
2018-08-16 13:35:55 +02:00
|
|
|
qtest_cb_for_every_machine(add_machine_test_case, g_test_quick());
|
2017-04-25 07:16:47 +02:00
|
|
|
|
2017-09-13 16:20:36 +02:00
|
|
|
/* as none machine has no memory by default, add a test case with memory */
|
|
|
|
qtest_add_data_func("hmp/none+2MB", g_strdup("none -m 2"), test_machine);
|
|
|
|
|
2017-04-25 07:16:47 +02:00
|
|
|
return g_test_run();
|
|
|
|
}
|