mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'qtest-20250509-pull-request' of https://gitlab.com/farosas/qemu into staging
Qtest pull request - Fix migration-test invocation of qtest_init - Simplify byte-swapping for virtio in libqos - New cpu hotplug test for loongarch64 # -----BEGIN PGP SIGNATURE----- # # iQJEBAABCAAuFiEEqhtIsKIjJqWkw2TPx5jcdBvsMZ0FAmgecLgQHGZhcm9zYXNA # c3VzZS5kZQAKCRDHmNx0G+wxnaiLD/9pW1eU9we/KDm3wJg9zRS37h5OmSF+ogIN # ziXG1XmyXKK+QAybInZ1d3oaGqZoR+hhJ6RWmf6+E57ZyJ2EPtasJhekOulAZYZI # yWXtbWzKnaCc+AhohM+xJGC1XObAvvfz+8wjMFHnuJn0BBiBBWXkiHljG02KdkT6 # Ca+83+NSn/6OJYENTgaXiXkviNELbzDBTFgtWKkW0+bniCsbfrnuGqWbf43/cDbr # vnfiIt4o6jgjvEaBMid3cAtFUzI9gRtB7tk/sGvdPWGPkyjxTt5rnVxe6CBqh1SA # j5CbrcgPt7HxgdBEZC38o2tj5YxAjUZ5TXziouoxom0vzHSTep/NJih+XIhtXM8f # ABL9YZCBGvb3ja8NvXZwsLkcbSDbfTG8CNtHCTx3S3qagENxd6mUj4GMaOQxNQ1y # DUPGQetOzBIsYQOjt9fITN2S7oprXjpHwgV6TD/VOkJ+YVML1mRNsDi2sUkzH8jF # IUmjHWqJvyTvPY8dfVyYWLLhPUgJJdEfjgyT2qG6nbEcgd5seuB/3Rm/+VbqST+e # JUjbBOJStPdCQLtvlcDv+r/u2VwRta6f8ZU+DTlUnBboRSoHBrD3vzAa4uDLTufC # K01SC/xxzIMXR0Ji9qB9uKA6FJmbDdJhzBOzCFm7q7UCrRCNcgfhWO/OXuOqTg7j # bPDmCKA+dw== # =MZlp # -----END PGP SIGNATURE----- # gpg: Signature made Fri 09 May 2025 17:16:40 EDT # gpg: using RSA key AA1B48B0A22326A5A4C364CFC798DC741BEC319D # gpg: issuer "farosas@suse.de" # gpg: Good signature from "Fabiano Rosas <farosas@suse.de>" [unknown] # gpg: aka "Fabiano Almeida Rosas <fabiano.rosas@suse.com>" [unknown] # gpg: WARNING: The key's User ID is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: AA1B 48B0 A223 26A5 A4C3 64CF C798 DC74 1BEC 319D * tag 'qtest-20250509-pull-request' of https://gitlab.com/farosas/qemu: tests/qtest/cpu-plug-test: Add cpu hotplug support for LoongArch tests/qtest/libqos: Avoid double swapping when using modern virtio qtest: introduce qtest_init_ext Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
@@ -156,6 +156,28 @@ static void add_s390x_test_case(const char *mname)
|
||||
g_free(path);
|
||||
}
|
||||
|
||||
static void add_loongarch_test_case(const char *mname)
|
||||
{
|
||||
char *path;
|
||||
PlugTestData *data;
|
||||
|
||||
data = g_new(PlugTestData, 1);
|
||||
data->machine = g_strdup(mname);
|
||||
data->cpu_model = "la464";
|
||||
data->device_model = g_strdup("la464-loongarch-cpu");
|
||||
data->sockets = 1;
|
||||
data->cores = 3;
|
||||
data->threads = 1;
|
||||
data->maxcpus = data->sockets * data->cores * data->threads;
|
||||
|
||||
path = g_strdup_printf("cpu-plug/%s/device-add/%ux%ux%u&maxcpus=%u",
|
||||
mname, data->sockets, data->cores,
|
||||
data->threads, data->maxcpus);
|
||||
qtest_add_data_func_full(path, data, test_plug_with_device_add,
|
||||
test_data_free);
|
||||
g_free(path);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
const char *arch = qtest_get_arch();
|
||||
@@ -168,6 +190,8 @@ int main(int argc, char **argv)
|
||||
qtest_cb_for_every_machine(add_pseries_test_case, g_test_quick());
|
||||
} else if (g_str_equal(arch, "s390x")) {
|
||||
qtest_cb_for_every_machine(add_s390x_test_case, g_test_quick());
|
||||
} else if (g_str_equal(arch, "loongarch64")) {
|
||||
add_loongarch_test_case("virt");
|
||||
}
|
||||
|
||||
return g_test_run();
|
||||
|
||||
+29
-15
@@ -25,49 +25,63 @@
|
||||
*/
|
||||
static uint16_t qvirtio_readw(QVirtioDevice *d, QTestState *qts, uint64_t addr)
|
||||
{
|
||||
uint16_t val = qtest_readw(qts, addr);
|
||||
uint16_t val;
|
||||
|
||||
if (d->features & (1ull << VIRTIO_F_VERSION_1) && qtest_big_endian(qts)) {
|
||||
val = bswap16(val);
|
||||
if (d->features & (1ull << VIRTIO_F_VERSION_1)) {
|
||||
qtest_memread(qts, addr, &val, sizeof(val));
|
||||
val = le16_to_cpu(val);
|
||||
} else {
|
||||
val = qtest_readw(qts, addr);
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static uint32_t qvirtio_readl(QVirtioDevice *d, QTestState *qts, uint64_t addr)
|
||||
{
|
||||
uint32_t val = qtest_readl(qts, addr);
|
||||
uint32_t val;
|
||||
|
||||
if (d->features & (1ull << VIRTIO_F_VERSION_1) && qtest_big_endian(qts)) {
|
||||
val = bswap32(val);
|
||||
if (d->features & (1ull << VIRTIO_F_VERSION_1)) {
|
||||
qtest_memread(qts, addr, &val, sizeof(val));
|
||||
val = le32_to_cpu(val);
|
||||
} else {
|
||||
val = qtest_readl(qts, addr);
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static void qvirtio_writew(QVirtioDevice *d, QTestState *qts,
|
||||
uint64_t addr, uint16_t val)
|
||||
{
|
||||
if (d->features & (1ull << VIRTIO_F_VERSION_1) && qtest_big_endian(qts)) {
|
||||
val = bswap16(val);
|
||||
if (d->features & (1ull << VIRTIO_F_VERSION_1)) {
|
||||
val = cpu_to_le16(val);
|
||||
qtest_memwrite(qts, addr, &val, sizeof(val));
|
||||
} else {
|
||||
qtest_writew(qts, addr, val);
|
||||
}
|
||||
qtest_writew(qts, addr, val);
|
||||
}
|
||||
|
||||
static void qvirtio_writel(QVirtioDevice *d, QTestState *qts,
|
||||
uint64_t addr, uint32_t val)
|
||||
{
|
||||
if (d->features & (1ull << VIRTIO_F_VERSION_1) && qtest_big_endian(qts)) {
|
||||
val = bswap32(val);
|
||||
if (d->features & (1ull << VIRTIO_F_VERSION_1)) {
|
||||
val = cpu_to_le32(val);
|
||||
qtest_memwrite(qts, addr, &val, sizeof(val));
|
||||
} else {
|
||||
qtest_writel(qts, addr, val);
|
||||
}
|
||||
qtest_writel(qts, addr, val);
|
||||
}
|
||||
|
||||
static void qvirtio_writeq(QVirtioDevice *d, QTestState *qts,
|
||||
uint64_t addr, uint64_t val)
|
||||
{
|
||||
if (d->features & (1ull << VIRTIO_F_VERSION_1) && qtest_big_endian(qts)) {
|
||||
val = bswap64(val);
|
||||
if (d->features & (1ull << VIRTIO_F_VERSION_1)) {
|
||||
val = cpu_to_le64(val);
|
||||
qtest_memwrite(qts, addr, &val, sizeof(val));
|
||||
} else {
|
||||
qtest_writeq(qts, addr, val);
|
||||
}
|
||||
qtest_writeq(qts, addr, val);
|
||||
}
|
||||
|
||||
uint8_t qvirtio_config_readb(QVirtioDevice *d, uint64_t addr)
|
||||
|
||||
+5
-13
@@ -574,10 +574,8 @@ void qtest_qmp_handshake(QTestState *s, QList *capabilities)
|
||||
}
|
||||
}
|
||||
|
||||
QTestState *qtest_init_with_env_and_capabilities(const char *var,
|
||||
const char *extra_args,
|
||||
QList *capabilities,
|
||||
bool do_connect)
|
||||
QTestState *qtest_init_ext(const char *var, const char *extra_args,
|
||||
QList *capabilities, bool do_connect)
|
||||
{
|
||||
QTestState *s = qtest_init_internal(qtest_qemu_binary(var), extra_args,
|
||||
do_connect);
|
||||
@@ -594,15 +592,9 @@ QTestState *qtest_init_with_env_and_capabilities(const char *var,
|
||||
return s;
|
||||
}
|
||||
|
||||
QTestState *qtest_init_with_env(const char *var, const char *extra_args,
|
||||
bool do_connect)
|
||||
{
|
||||
return qtest_init_with_env_and_capabilities(var, extra_args, NULL, true);
|
||||
}
|
||||
|
||||
QTestState *qtest_init(const char *extra_args)
|
||||
{
|
||||
return qtest_init_with_env(NULL, extra_args, true);
|
||||
return qtest_init_ext(NULL, extra_args, NULL, true);
|
||||
}
|
||||
|
||||
QTestState *qtest_vinitf(const char *fmt, va_list ap)
|
||||
@@ -1662,7 +1654,7 @@ static struct MachInfo *qtest_get_machines(const char *var)
|
||||
|
||||
silence_spawn_log = !g_test_verbose();
|
||||
|
||||
qts = qtest_init_with_env(qemu_var, "-machine none", true);
|
||||
qts = qtest_init_ext(qemu_var, "-machine none", NULL, true);
|
||||
response = qtest_qmp(qts, "{ 'execute': 'query-machines' }");
|
||||
g_assert(response);
|
||||
list = qdict_get_qlist(response, "return");
|
||||
@@ -1717,7 +1709,7 @@ static struct CpuModel *qtest_get_cpu_models(void)
|
||||
|
||||
silence_spawn_log = !g_test_verbose();
|
||||
|
||||
qts = qtest_init_with_env(NULL, "-machine none", true);
|
||||
qts = qtest_init_ext(NULL, "-machine none", NULL, true);
|
||||
response = qtest_qmp(qts, "{ 'execute': 'query-cpu-definitions' }");
|
||||
g_assert(response);
|
||||
list = qdict_get_qlist(response, "return");
|
||||
|
||||
+7
-23
@@ -57,37 +57,21 @@ QTestState *qtest_vinitf(const char *fmt, va_list ap) G_GNUC_PRINTF(1, 0);
|
||||
QTestState *qtest_init(const char *extra_args);
|
||||
|
||||
/**
|
||||
* qtest_init_with_env:
|
||||
* @var: Environment variable from where to take the QEMU binary
|
||||
* @extra_args: Other arguments to pass to QEMU. CAUTION: these
|
||||
* arguments are subject to word splitting and shell evaluation.
|
||||
* @do_connect: connect to qemu monitor and qtest socket.
|
||||
*
|
||||
* Like qtest_init(), but use a different environment variable for the
|
||||
* QEMU binary.
|
||||
*
|
||||
* Returns: #QTestState instance.
|
||||
*/
|
||||
QTestState *qtest_init_with_env(const char *var, const char *extra_args,
|
||||
bool do_connect);
|
||||
|
||||
/**
|
||||
* qtest_init_with_env_and_capabilities:
|
||||
* qtest_init_ext:
|
||||
* @var: Environment variable from where to take the QEMU binary
|
||||
* @extra_args: Other arguments to pass to QEMU. CAUTION: these
|
||||
* arguments are subject to word splitting and shell evaluation.
|
||||
* @capabilities: list of QMP capabilities (strings) to enable
|
||||
* @do_connect: connect to qemu monitor and qtest socket.
|
||||
*
|
||||
* Like qtest_init_with_env(), but enable specified capabilities during
|
||||
* hadshake.
|
||||
* Like qtest_init(), but use a different environment variable for the
|
||||
* QEMU binary, allow specify capabilities and skip connecting
|
||||
* to QEMU monitor.
|
||||
*
|
||||
* Returns: #QTestState instance.
|
||||
*/
|
||||
QTestState *qtest_init_with_env_and_capabilities(const char *var,
|
||||
const char *extra_args,
|
||||
QList *capabilities,
|
||||
bool do_connect);
|
||||
QTestState *qtest_init_ext(const char *var, const char *extra_args,
|
||||
QList *capabilities, bool do_connect);
|
||||
|
||||
/**
|
||||
* qtest_init_without_qmp_handshake:
|
||||
@@ -102,7 +86,7 @@ QTestState *qtest_init_without_qmp_handshake(const char *extra_args);
|
||||
* qtest_connect
|
||||
* @s: #QTestState instance to connect
|
||||
* Connect to qemu monitor and qtest socket, after skipping them in
|
||||
* qtest_init_with_env. Does not handshake with the monitor.
|
||||
* qtest_init_ext. Does not handshake with the monitor.
|
||||
*/
|
||||
void qtest_connect(QTestState *s);
|
||||
|
||||
|
||||
@@ -148,7 +148,8 @@ qtests_hppa = \
|
||||
|
||||
qtests_loongarch64 = qtests_filter + \
|
||||
(config_all_devices.has_key('CONFIG_LOONGARCH_VIRT') ? ['numa-test'] : []) + \
|
||||
['boot-serial-test']
|
||||
['boot-serial-test',
|
||||
'cpu-plug-test']
|
||||
|
||||
qtests_m68k = ['boot-serial-test'] + \
|
||||
qtests_filter
|
||||
|
||||
@@ -382,8 +382,7 @@ int migrate_start(QTestState **from, QTestState **to, const char *uri,
|
||||
args->opts_source ? args->opts_source : "",
|
||||
ignore_stderr);
|
||||
if (!args->only_target) {
|
||||
*from = qtest_init_with_env_and_capabilities(QEMU_ENV_SRC, cmd_source,
|
||||
capabilities, true);
|
||||
*from = qtest_init_ext(QEMU_ENV_SRC, cmd_source, capabilities, true);
|
||||
qtest_qmp_set_event_callback(*from,
|
||||
migrate_watch_for_events,
|
||||
&src_state);
|
||||
@@ -411,8 +410,8 @@ int migrate_start(QTestState **from, QTestState **to, const char *uri,
|
||||
shmem_opts ? shmem_opts : "",
|
||||
args->opts_target ? args->opts_target : "",
|
||||
ignore_stderr);
|
||||
*to = qtest_init_with_env_and_capabilities(QEMU_ENV_DST, cmd_target,
|
||||
capabilities, !args->defer_target_connect);
|
||||
*to = qtest_init_ext(QEMU_ENV_DST, cmd_target, capabilities,
|
||||
!args->defer_target_connect);
|
||||
qtest_qmp_set_event_callback(*to,
|
||||
migrate_watch_for_events,
|
||||
&dst_state);
|
||||
|
||||
Reference in New Issue
Block a user