mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-10-15 15:32:51 +00:00
* Improve virtio-net failover test
* Some small fixes for the qtests * Misc header cleanups by Philippe -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmITejURHHRodXRoQHJl ZGhhdC5jb20ACgkQLtnXdP5wLbUFaBAAsj/mMIHbP0pIetfbimxopqg85HhryO8R P3a2k3+clN0dhIMaZKfnXKM2S03/xWDtXYATidiRpliRfaeZ8oPM9j3U1kqbsjQ9 u+IdVgYdy0ZoLINvSdLZQp+5ZdBL34KP7OYBdkJUyFV8n2CwFk9c/8tjazkqA3Il 8OwkrdMu+7E5KyhjeDByPAOyONN53vOZT4nXdD2EsQ7AbIzKfw41Bo2wJzJCOqB+ uX9JHv+mpKhhv5NZle/oaUF5lg+rqveg4LxSe8D9FIGfYiFMYG3HNq38St4NVXVc knBqzQiQZm2MLviXQQ4ym9Q3BFd1QZLJH3TB9SfvJjGEvrErb0Xylcqra1EIxseG xI34f9ER0usWSUcIe4t/WjzAjEr3ez+uDJ6ItNFRqPwsV4PGaSgP4auhNzMGlkTo zr1O5o/hJdh3otDzM6Qu8FtnNUsKLb2KerveQW+a0uJj3BDKshbn7Au7d3+6eORJ DuugBwzrtgvAKr1z/6pYFT8eXyhvI7w/rwtUJwNiBsHXvTBQ4UxEXlKpUCKqEQls oqlTK3bezKJuURnuND88L410qUAuvTABjoYx9Y9abbrSqq91F/52bpB/jY2Lke+y YoWPV13npdguG1eHB8DowF7MQRLVcULTshXLuM0A9NXkSLJfNY2gLb/I9+hXuQr0 PuLO5BfVyLE= =/azS -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/thuth-gitlab/tags/pull-request-2022-02-21' into staging * Improve virtio-net failover test * Some small fixes for the qtests * Misc header cleanups by Philippe # gpg: Signature made Mon 21 Feb 2022 11:40:37 GMT # gpg: using RSA key 27B88847EEE0250118F3EAB92ED9D774FE702DB5 # gpg: issuer "thuth@redhat.com" # gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [full] # gpg: aka "Thomas Huth <thuth@redhat.com>" [full] # gpg: aka "Thomas Huth <huth@tuxfamily.org>" [full] # gpg: aka "Thomas Huth <th.huth@posteo.de>" [unknown] # Primary key fingerprint: 27B8 8847 EEE0 2501 18F3 EAB9 2ED9 D774 FE70 2DB5 * remotes/thuth-gitlab/tags/pull-request-2022-02-21: (25 commits) hw/tricore: Remove unused and incorrect header hw/m68k/mcf: Add missing 'exec/hwaddr.h' header exec/exec-all: Move 'qemu/log.h' include in units requiring it softmmu/runstate: Clean headers linux-user: Add missing "qemu/timer.h" include target: Add missing "qemu/timer.h" include core/ptimers: Remove unnecessary 'sysemu/cpus.h' include exec/ramblock: Add missing includes qtest: Add missing 'hw/qdev-core.h' include hw/acpi/memory_hotplug: Remove unused 'hw/acpi/pc-hotplug.h' header hw/remote: Add missing include hw/tpm: Clean includes scripts: Remove the old switch-timer-api script tests/qtest: failover: migration abort test with failover off tests/qtest: failover: test migration if the guest doesn't support failover tests/qtest: failover: check migration with failover off tests/qtest: failover: check missing guest feature tests/qtest: failover: check the feature is correctly provided tests/qtest: failover: use a macro for check_one_card() tests/qtest: failover: clean up pathname of tests ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
5abccc7922
|
@ -19,6 +19,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "qemu.h"
|
#include "qemu.h"
|
||||||
#include "signal-common.h"
|
#include "signal-common.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "hw/acpi/memory_hotplug.h"
|
#include "hw/acpi/memory_hotplug.h"
|
||||||
#include "hw/acpi/pc-hotplug.h"
|
|
||||||
#include "hw/mem/pc-dimm.h"
|
#include "hw/mem/pc-dimm.h"
|
||||||
#include "hw/qdev-core.h"
|
#include "hw/qdev-core.h"
|
||||||
#include "migration/vmstate.h"
|
#include "migration/vmstate.h"
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
#include "qemu/main-loop.h"
|
#include "qemu/main-loop.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
#include "sysemu/cpu-timers.h"
|
#include "sysemu/cpu-timers.h"
|
||||||
#include "sysemu/qtest.h"
|
#include "sysemu/qtest.h"
|
||||||
#include "block/aio.h"
|
#include "block/aio.h"
|
||||||
#include "sysemu/cpus.h"
|
|
||||||
#include "hw/clock.h"
|
#include "hw/clock.h"
|
||||||
|
|
||||||
#define DELTA_ADJUST 1
|
#define DELTA_ADJUST 1
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "hw/hw.h"
|
#include "hw/hw.h"
|
||||||
#include "hw/irq.h"
|
#include "hw/irq.h"
|
||||||
#include "ui/console.h"
|
#include "ui/console.h"
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "hw/irq.h"
|
#include "hw/irq.h"
|
||||||
#include "hw/qdev-properties.h"
|
#include "hw/qdev-properties.h"
|
||||||
#include "hw/arm/omap.h"
|
#include "hw/arm/omap.h"
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "hw/hw.h"
|
#include "hw/hw.h"
|
||||||
#include "audio/audio.h"
|
#include "audio/audio.h"
|
||||||
#include "qemu/timer.h"
|
#include "qemu/timer.h"
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include "exec/cpu-common.h"
|
#include "exec/cpu-common.h"
|
||||||
#include "exec/ram_addr.h"
|
#include "exec/ram_addr.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
|
#include "qemu/error-report.h"
|
||||||
#include "hw/remote/mpqemu-link.h"
|
#include "hw/remote/mpqemu-link.h"
|
||||||
#include "hw/remote/proxy-memory-listener.h"
|
#include "hw/remote/proxy-memory-listener.h"
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#include "qemu/module.h"
|
#include "qemu/module.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
|
#include "exec/address-spaces.h"
|
||||||
#include "hw/qdev-properties.h"
|
#include "hw/qdev-properties.h"
|
||||||
#include "hw/pci/pci_ids.h"
|
#include "hw/pci/pci_ids.h"
|
||||||
#include "hw/acpi/tpm.h"
|
#include "hw/acpi/tpm.h"
|
||||||
|
|
|
@ -14,9 +14,9 @@
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "cpu.h"
|
|
||||||
#include "sysemu/memory_mapping.h"
|
#include "sysemu/memory_mapping.h"
|
||||||
#include "migration/vmstate.h"
|
#include "migration/vmstate.h"
|
||||||
|
#include "hw/qdev-core.h"
|
||||||
#include "hw/acpi/tpm.h"
|
#include "hw/acpi/tpm.h"
|
||||||
#include "tpm_ppi.h"
|
#include "tpm_ppi.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
|
@ -44,7 +44,7 @@ void tpm_ppi_reset(TPMPPI *tpmppi)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void tpm_ppi_init(TPMPPI *tpmppi, struct MemoryRegion *m,
|
void tpm_ppi_init(TPMPPI *tpmppi, MemoryRegion *m,
|
||||||
hwaddr addr, Object *obj)
|
hwaddr addr, Object *obj)
|
||||||
{
|
{
|
||||||
tpmppi->buf = qemu_memalign(qemu_real_host_page_size,
|
tpmppi->buf = qemu_memalign(qemu_real_host_page_size,
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
#ifndef TPM_TPM_PPI_H
|
#ifndef TPM_TPM_PPI_H
|
||||||
#define TPM_TPM_PPI_H
|
#define TPM_TPM_PPI_H
|
||||||
|
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/memory.h"
|
||||||
|
|
||||||
typedef struct TPMPPI {
|
typedef struct TPMPPI {
|
||||||
MemoryRegion ram;
|
MemoryRegion ram;
|
||||||
|
@ -29,7 +29,7 @@ typedef struct TPMPPI {
|
||||||
* Register the TPM PPI memory region at @addr on the given address
|
* Register the TPM PPI memory region at @addr on the given address
|
||||||
* space for the object @obj.
|
* space for the object @obj.
|
||||||
**/
|
**/
|
||||||
void tpm_ppi_init(TPMPPI *tpmppi, struct MemoryRegion *m,
|
void tpm_ppi_init(TPMPPI *tpmppi, MemoryRegion *m,
|
||||||
hwaddr addr, Object *obj);
|
hwaddr addr, Object *obj);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -40,8 +40,6 @@ typedef ram_addr_t tb_page_addr_t;
|
||||||
#define TB_PAGE_ADDR_FMT RAM_ADDR_FMT
|
#define TB_PAGE_ADDR_FMT RAM_ADDR_FMT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "qemu/log.h"
|
|
||||||
|
|
||||||
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int max_insns);
|
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int max_insns);
|
||||||
void restore_state_to_opc(CPUArchState *env, TranslationBlock *tb,
|
void restore_state_to_opc(CPUArchState *env, TranslationBlock *tb,
|
||||||
target_ulong *data);
|
target_ulong *data);
|
||||||
|
|
|
@ -21,6 +21,8 @@
|
||||||
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
#include "cpu-common.h"
|
#include "cpu-common.h"
|
||||||
|
#include "qemu/rcu.h"
|
||||||
|
#include "exec/ramlist.h"
|
||||||
|
|
||||||
struct RAMBlock {
|
struct RAMBlock {
|
||||||
struct rcu_head rcu;
|
struct rcu_head rcu;
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define HW_MCF_H
|
#define HW_MCF_H
|
||||||
/* Motorola ColdFire device prototypes. */
|
/* Motorola ColdFire device prototypes. */
|
||||||
|
|
||||||
|
#include "exec/hwaddr.h"
|
||||||
#include "target/m68k/cpu-qom.h"
|
#include "target/m68k/cpu-qom.h"
|
||||||
|
|
||||||
/* mcf_uart.c */
|
/* mcf_uart.c */
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "hw/arm/boot.h"
|
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "exec/address-spaces.h"
|
#include "exec/address-spaces.h"
|
||||||
#include "qom/object.h"
|
#include "qom/object.h"
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
#include "qemu.h"
|
#include "qemu.h"
|
||||||
|
#include "qemu/timer.h"
|
||||||
#include "user-internals.h"
|
#include "user-internals.h"
|
||||||
#include "cpu_loop-common.h"
|
#include "cpu_loop-common.h"
|
||||||
#include "signal-common.h"
|
#include "signal-common.h"
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
#include "qemu.h"
|
#include "qemu.h"
|
||||||
|
#include "qemu/timer.h"
|
||||||
#include "user-internals.h"
|
#include "user-internals.h"
|
||||||
#include "cpu_loop-common.h"
|
#include "cpu_loop-common.h"
|
||||||
#include "signal-common.h"
|
#include "signal-common.h"
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
#include "disas/disas.h"
|
#include "disas/disas.h"
|
||||||
#include "sysemu/balloon.h"
|
#include "sysemu/balloon.h"
|
||||||
#include "qemu/timer.h"
|
#include "qemu/timer.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "sysemu/hw_accel.h"
|
#include "sysemu/hw_accel.h"
|
||||||
#include "sysemu/runstate.h"
|
#include "sysemu/runstate.h"
|
||||||
#include "authz/list.h"
|
#include "authz/list.h"
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qemu/plugin.h"
|
#include "qemu/plugin.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "tcg/tcg.h"
|
#include "tcg/tcg.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
#include "exec/ram_addr.h"
|
#include "exec/ram_addr.h"
|
||||||
|
|
|
@ -1,178 +0,0 @@
|
||||||
#!/usr/bin/env perl
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
use Getopt::Long;
|
|
||||||
use FindBin;
|
|
||||||
|
|
||||||
my @legacy = qw(qemu_clock_ptr qemu_get_clock_ns qemu_get_clock_ms qemu_register_clock_reset_notifier qemu_unregister_clock_reset_notifier qemu_new_timer qemu_free_timer qemu_del_timer qemu_mod_timer_ns qemu_mod_timer qemu_run_timers qemu_new_timer_ns qemu_new_timer_us qemu_new_timer_ms);
|
|
||||||
my $legacyre = '\b('.join('|', @legacy).')\b';
|
|
||||||
my $option_git;
|
|
||||||
my $option_dryrun;
|
|
||||||
my $option_quiet;
|
|
||||||
my $option_rtc;
|
|
||||||
my $suffix=".tmp.$$";
|
|
||||||
my @files;
|
|
||||||
my $getfiles = 'git grep -l -E \'\b((host|rt|vm|rtc)_clock\b|qemu_\w*timer)\' | egrep \'\.[ch]$\' | egrep -v \'qemu-timer\.c$|include/qemu/timer\.h$\'';
|
|
||||||
|
|
||||||
sub Syntax
|
|
||||||
{
|
|
||||||
print STDERR <<STOP;
|
|
||||||
Usage: $FindBin::Script [options] FILE ...
|
|
||||||
|
|
||||||
Translate each FILE to the new QEMU timer API. If no files
|
|
||||||
are passed, a reasonable guess is taken.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-q, --quiet Do not show warnings etc
|
|
||||||
-d, --dry-run Do a dry run
|
|
||||||
-g, --git Generate a git commit for each change
|
|
||||||
-r, --rtc Only fix up rtc usage
|
|
||||||
-h, --help Print this message
|
|
||||||
|
|
||||||
STOP
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub ParseOptions
|
|
||||||
{
|
|
||||||
if (!GetOptions (
|
|
||||||
"dry-run|d" => \$option_dryrun,
|
|
||||||
"git|g" => \$option_git,
|
|
||||||
"quiet|q" => \$option_quiet,
|
|
||||||
"rtc|r" => \$option_rtc,
|
|
||||||
"help|h" => sub { Syntax(); exit(0); }
|
|
||||||
))
|
|
||||||
{
|
|
||||||
Syntax();
|
|
||||||
die "Bad options";
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($#ARGV >=0)
|
|
||||||
{
|
|
||||||
@files = @ARGV;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
@files = split(/\s+/, `$getfiles`);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach my $file (@files)
|
|
||||||
{
|
|
||||||
die "Cannot find $file" unless (-f $file && -r $file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub DoWarn
|
|
||||||
{
|
|
||||||
my $text = shift @_;
|
|
||||||
my $line = shift @_;
|
|
||||||
return if ($option_quiet);
|
|
||||||
chomp ($line);
|
|
||||||
print STDERR "$text\n";
|
|
||||||
print STDERR "$line\n\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
sub Process
|
|
||||||
{
|
|
||||||
my $ifn = shift @_;
|
|
||||||
my $ofn = $ifn.$suffix;
|
|
||||||
|
|
||||||
my $intext;
|
|
||||||
my $outtext;
|
|
||||||
my $linenum = 0;
|
|
||||||
|
|
||||||
open my $input, "<", $ifn || die "Cannot open $ifn for read: $!";
|
|
||||||
|
|
||||||
while (<$input>)
|
|
||||||
{
|
|
||||||
my $line = $_;
|
|
||||||
$intext .= $line;
|
|
||||||
$linenum++;
|
|
||||||
|
|
||||||
# fix the specific uses
|
|
||||||
unless ($option_rtc)
|
|
||||||
{
|
|
||||||
$line =~ s/\bqemu_new_timer(_[num]s)\s*\((vm_|rt_|host_)clock\b/timer_new$1(XXX_$2clock/g;
|
|
||||||
$line =~ s/\bqemu_new_timer\s*\((vm_|rt_|host_)clock\b/timer_new(XXX_$1clock/g;
|
|
||||||
$line =~ s/\bqemu_get_clock(_[num]s)\s*\((vm_|rt_|host_)clock\b/qemu_clock_get$1(XXX_$2clock/g;
|
|
||||||
}
|
|
||||||
|
|
||||||
# rtc is different
|
|
||||||
$line =~ s/\bqemu_new_timer(_[num]s)\s*\(rtc_clock\b/timer_new$1(rtc_clock/g;
|
|
||||||
$line =~ s/\bqemu_new_timer\s*\(rtc_clock\b/timer_new(rtc_clock/g;
|
|
||||||
$line =~ s/\bqemu_get_clock(_[num]s)\s*\(rtc_clock\b/qemu_clock_get$1(rtc_clock/g;
|
|
||||||
$line =~ s/\bqemu_register_clock_reset_notifier\s*\(rtc_clock\b/qemu_register_clock_reset_notifier(qemu_clock_ptr(rtc_clock)/g;
|
|
||||||
|
|
||||||
unless ($option_rtc)
|
|
||||||
{
|
|
||||||
# fix up comments
|
|
||||||
$line =~ s/\b(vm_|rt_|host_)clock\b/XXX_$1clock/g if ($line =~ m,^[/ ]+\*,);
|
|
||||||
|
|
||||||
# spurious fprintf error reporting
|
|
||||||
$line =~ s/: qemu_new_timer_ns failed/: timer_new_ns failed/g;
|
|
||||||
|
|
||||||
# these have just changed name
|
|
||||||
$line =~ s/\bqemu_mod_timer\b/timer_mod/g;
|
|
||||||
$line =~ s/\bqemu_mod_timer_(ns|us|ms)\b/timer_mod_$1/g;
|
|
||||||
$line =~ s/\bqemu_free_timer\b/timer_free/g;
|
|
||||||
$line =~ s/\bqemu_del_timer\b/timer_del/g;
|
|
||||||
}
|
|
||||||
|
|
||||||
# fix up rtc_clock
|
|
||||||
$line =~ s/QEMUClock \*rtc_clock;/QEMUClockType rtc_clock;/g;
|
|
||||||
$line =~ s/\brtc_clock = (vm_|rt_|host_)clock\b/rtc_clock = XXX_$1clock/g;
|
|
||||||
|
|
||||||
unless ($option_rtc)
|
|
||||||
{
|
|
||||||
# replace any more general uses
|
|
||||||
$line =~ s/\b(vm_|rt_|host_)clock\b/qemu_clock_ptr(XXX_$1clock)/g;
|
|
||||||
}
|
|
||||||
|
|
||||||
# fix up the place holders
|
|
||||||
$line =~ s/\bXXX_vm_clock\b/QEMU_CLOCK_VIRTUAL/g;
|
|
||||||
$line =~ s/\bXXX_rt_clock\b/QEMU_CLOCK_REALTIME/g;
|
|
||||||
$line =~ s/\bXXX_host_clock\b/QEMU_CLOCK_HOST/g;
|
|
||||||
|
|
||||||
unless ($option_rtc)
|
|
||||||
{
|
|
||||||
DoWarn("$ifn:$linenum WARNING: timer $1 not fixed up", $line) if ($line =~ /\b((vm_|rt_|host_)clock)\b/);
|
|
||||||
DoWarn("$ifn:$linenum WARNING: function $1 not fixed up", $line) if ($line =~ /\b(qemu_new_timer\w+)\b/);
|
|
||||||
DoWarn("$ifn:$linenum WARNING: legacy function $1 remains", $line) if ($line =~ /$legacyre/o);
|
|
||||||
}
|
|
||||||
|
|
||||||
$outtext .= $line;
|
|
||||||
}
|
|
||||||
|
|
||||||
close $input;
|
|
||||||
|
|
||||||
if ($intext ne $outtext)
|
|
||||||
{
|
|
||||||
print STDERR "Patching $ifn\n" unless ($option_quiet);
|
|
||||||
unless ($option_dryrun)
|
|
||||||
{
|
|
||||||
open my $output, ">", $ofn || die "Cannot open $ofn for write: $!";
|
|
||||||
print $output $outtext;
|
|
||||||
close $output;
|
|
||||||
rename ($ofn, $ifn) || die "Cannot rename temp file to $ifn: $!";
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub DoCommit
|
|
||||||
{
|
|
||||||
my $file = shift @_;
|
|
||||||
open (my $git, "| git commit -F - $file") || die "Cannot run git commit on $file: $!";
|
|
||||||
print $git "timers api: use new timer api in $file\n\nConvert $file to use new timer API.\nThis is an automated commit made by scripts/switch-timer-api\n";
|
|
||||||
close ($git);
|
|
||||||
}
|
|
||||||
|
|
||||||
ParseOptions;
|
|
||||||
|
|
||||||
foreach my $file (@files)
|
|
||||||
{
|
|
||||||
my $changed = Process ($file);
|
|
||||||
DoCommit($file) if ($changed && $option_git);
|
|
||||||
}
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include "chardev/char-fe.h"
|
#include "chardev/char-fe.h"
|
||||||
#include "exec/ioport.h"
|
#include "exec/ioport.h"
|
||||||
#include "exec/memory.h"
|
#include "exec/memory.h"
|
||||||
|
#include "hw/qdev-core.h"
|
||||||
#include "hw/irq.h"
|
#include "hw/irq.h"
|
||||||
#include "qemu/accel.h"
|
#include "qemu/accel.h"
|
||||||
#include "sysemu/cpu-timers.h"
|
#include "sysemu/cpu-timers.h"
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
#include "crypto/cipher.h"
|
#include "crypto/cipher.h"
|
||||||
#include "crypto/init.h"
|
#include "crypto/init.h"
|
||||||
#include "exec/cpu-common.h"
|
#include "exec/cpu-common.h"
|
||||||
#include "exec/exec-all.h"
|
|
||||||
#include "exec/gdbstub.h"
|
#include "exec/gdbstub.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#include "migration/misc.h"
|
#include "migration/misc.h"
|
||||||
|
@ -43,7 +42,9 @@
|
||||||
#include "qapi/qapi-events-run-state.h"
|
#include "qapi/qapi-events-run-state.h"
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "qemu/job.h"
|
#include "qemu/job.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "qemu/module.h"
|
#include "qemu/module.h"
|
||||||
#include "qemu/plugin.h"
|
#include "qemu/plugin.h"
|
||||||
#include "qemu/sockets.h"
|
#include "qemu/sockets.h"
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
#include "fpu/softfloat-types.h"
|
#include "fpu/softfloat-types.h"
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qemu/qemu-print.h"
|
#include "qemu/qemu-print.h"
|
||||||
|
#include "qemu/timer.h"
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
#include "target/arm/idau.h"
|
#include "target/arm/idau.h"
|
||||||
#include "qemu/module.h"
|
#include "qemu/module.h"
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qemu/units.h"
|
#include "qemu/units.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "target/arm/idau.h"
|
#include "target/arm/idau.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
|
@ -15,6 +16,7 @@
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
#include "qemu/host-utils.h"
|
#include "qemu/host-utils.h"
|
||||||
#include "qemu/main-loop.h"
|
#include "qemu/main-loop.h"
|
||||||
|
#include "qemu/timer.h"
|
||||||
#include "qemu/bitops.h"
|
#include "qemu/bitops.h"
|
||||||
#include "qemu/crc32c.h"
|
#include "qemu/crc32c.h"
|
||||||
#include "qemu/qemu-print.h"
|
#include "qemu/qemu-print.h"
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include "qemu/bitops.h"
|
#include "qemu/bitops.h"
|
||||||
#include "qemu/crc32c.h"
|
#include "qemu/crc32c.h"
|
||||||
#include "qemu/qemu-print.h"
|
#include "qemu/qemu-print.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
#include <zlib.h> /* For crc32 */
|
#include <zlib.h> /* For crc32 */
|
||||||
#include "semihosting/semihost.h"
|
#include "semihosting/semihost.h"
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "internals.h"
|
#include "internals.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "hw/core/tcg-cpu-ops.h"
|
#include "hw/core/tcg-cpu-ops.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "hw/core/tcg-cpu-ops.h"
|
#include "hw/core/tcg-cpu-ops.h"
|
||||||
#include "mmu.h"
|
#include "mmu.h"
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
#ifndef HEXAGON_INTERNAL_H
|
#ifndef HEXAGON_INTERNAL_H
|
||||||
#define HEXAGON_INTERNAL_H
|
#define HEXAGON_INTERNAL_H
|
||||||
|
|
||||||
|
#include "qemu/log.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Change HEX_DEBUG to 1 to turn on debugging output
|
* Change HEX_DEBUG to 1 to turn on debugging output
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#define HEXAGON_TRANSLATE_H
|
#define HEXAGON_TRANSLATE_H
|
||||||
|
|
||||||
#include "qemu/bitmap.h"
|
#include "qemu/bitmap.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/translator.h"
|
#include "exec/translator.h"
|
||||||
#include "tcg/tcg-op.h"
|
#include "tcg/tcg-op.h"
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "qemu/qemu-print.h"
|
#include "qemu/qemu-print.h"
|
||||||
|
#include "qemu/timer.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "qemu/module.h"
|
#include "qemu/module.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "fpu/softfloat.h"
|
#include "fpu/softfloat.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include "sysemu/hw_accel.h"
|
#include "sysemu/hw_accel.h"
|
||||||
#include "monitor/monitor.h"
|
#include "monitor/monitor.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include "qemu/log.h"
|
||||||
|
|
||||||
void cpu_sync_bndcs_hflags(CPUX86State *env)
|
void cpu_sync_bndcs_hflags(CPUX86State *env)
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
#include "qemu/host-utils.h"
|
#include "qemu/host-utils.h"
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
#include "exec/cpu_ldst.h"
|
#include "exec/cpu_ldst.h"
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "qemu/module.h"
|
#include "qemu/module.h"
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
#include "qemu/host-utils.h"
|
#include "qemu/host-utils.h"
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#ifndef TARGET_MIPS_TRANSLATE_H
|
#ifndef TARGET_MIPS_TRANSLATE_H
|
||||||
#define TARGET_MIPS_TRANSLATE_H
|
#define TARGET_MIPS_TRANSLATE_H
|
||||||
|
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "exec/translator.h"
|
#include "exec/translator.h"
|
||||||
|
|
||||||
#define MIPS_DEBUG_DISAS 0
|
#define MIPS_DEBUG_DISAS 0
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
#include "exec/gdbstub.h"
|
#include "exec/gdbstub.h"
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
#include "exec/gdbstub.h"
|
#include "exec/gdbstub.h"
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qemu/main-loop.h"
|
#include "qemu/main-loop.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qemu/log.h"
|
#include "qemu/log.h"
|
||||||
|
#include "qemu/timer.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "qemu/main-loop.h"
|
#include "qemu/main-loop.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "s390x-internal.h"
|
#include "s390x-internal.h"
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "s390x-internal.h"
|
#include "s390x-internal.h"
|
||||||
#include "tcg_s390x.h"
|
#include "tcg_s390x.h"
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
|
#include "qemu/timer.h"
|
||||||
#include "qemu/host-utils.h"
|
#include "qemu/host-utils.h"
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "tcg/tcg.h"
|
#include "tcg/tcg.h"
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
#include "qemu/qemu-print.h"
|
#include "qemu/qemu-print.h"
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
#include "fpu/softfloat-helpers.h"
|
#include "fpu/softfloat-helpers.h"
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "qemu/main-loop.h"
|
#include "qemu/main-loop.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "qemu/main-loop.h"
|
#include "qemu/main-loop.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "qemu/main-loop.h"
|
#include "qemu/main-loop.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
#include "exec/gdbstub.h"
|
#include "exec/gdbstub.h"
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "qemu/main-loop.h"
|
#include "qemu/main-loop.h"
|
||||||
#include "qemu/qemu-print.h"
|
#include "qemu/qemu-print.h"
|
||||||
#include "qemu/units.h"
|
#include "qemu/units.h"
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/log.h"
|
||||||
#include "qemu/main-loop.h"
|
#include "qemu/main-loop.h"
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
|
|
|
@ -63,7 +63,15 @@ static void wait_device_deleted_event(QTestState *qtest, const char *id)
|
||||||
|
|
||||||
static void test_pci_unplug_request(void)
|
static void test_pci_unplug_request(void)
|
||||||
{
|
{
|
||||||
QTestState *qtest = qtest_initf("-device virtio-mouse-pci,id=dev0");
|
const char *arch = qtest_get_arch();
|
||||||
|
const char *machine_addition = "";
|
||||||
|
|
||||||
|
if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
|
||||||
|
machine_addition = "-machine pc";
|
||||||
|
}
|
||||||
|
|
||||||
|
QTestState *qtest = qtest_initf("%s -device virtio-mouse-pci,id=dev0",
|
||||||
|
machine_addition);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Request device removal. As the guest is not running, the request won't
|
* Request device removal. As the guest is not running, the request won't
|
||||||
|
@ -79,8 +87,16 @@ static void test_pci_unplug_request(void)
|
||||||
|
|
||||||
static void test_pci_unplug_json_request(void)
|
static void test_pci_unplug_json_request(void)
|
||||||
{
|
{
|
||||||
|
const char *arch = qtest_get_arch();
|
||||||
|
const char *machine_addition = "";
|
||||||
|
|
||||||
|
if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
|
||||||
|
machine_addition = "-machine pc";
|
||||||
|
}
|
||||||
|
|
||||||
QTestState *qtest = qtest_initf(
|
QTestState *qtest = qtest_initf(
|
||||||
"-device '{\"driver\": \"virtio-mouse-pci\", \"id\": \"dev0\"}'");
|
"%s -device '{\"driver\": \"virtio-mouse-pci\", \"id\": \"dev0\"}'",
|
||||||
|
machine_addition);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Request device removal. As the guest is not running, the request won't
|
* Request device removal. As the guest is not running, the request won't
|
||||||
|
|
|
@ -235,14 +235,21 @@ static void test_drive_del_device_del(void)
|
||||||
static void test_cli_device_del(void)
|
static void test_cli_device_del(void)
|
||||||
{
|
{
|
||||||
QTestState *qts;
|
QTestState *qts;
|
||||||
|
const char *arch = qtest_get_arch();
|
||||||
|
const char *machine_addition = "";
|
||||||
|
|
||||||
|
if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
|
||||||
|
machine_addition = "-machine pc";
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* -drive/-device and device_del. Start with a drive used by a
|
* -drive/-device and device_del. Start with a drive used by a
|
||||||
* device that unplugs after reset.
|
* device that unplugs after reset.
|
||||||
*/
|
*/
|
||||||
qts = qtest_initf("-drive if=none,id=drive0,file=null-co://,"
|
qts = qtest_initf("%s -drive if=none,id=drive0,file=null-co://,"
|
||||||
"file.read-zeroes=on,format=raw"
|
"file.read-zeroes=on,format=raw"
|
||||||
" -device virtio-blk-%s,drive=drive0,id=dev0",
|
" -device virtio-blk-%s,drive=drive0,id=dev0",
|
||||||
|
machine_addition,
|
||||||
qvirtio_get_dev_type());
|
qvirtio_get_dev_type());
|
||||||
|
|
||||||
device_del(qts, true);
|
device_del(qts, true);
|
||||||
|
@ -266,13 +273,19 @@ static void test_empty_device_del(void)
|
||||||
static void test_device_add_and_del(void)
|
static void test_device_add_and_del(void)
|
||||||
{
|
{
|
||||||
QTestState *qts;
|
QTestState *qts;
|
||||||
|
const char *arch = qtest_get_arch();
|
||||||
|
const char *machine_addition = "";
|
||||||
|
|
||||||
|
if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
|
||||||
|
machine_addition = "-machine pc";
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* -drive/device_add and device_del. Start with a drive used by a
|
* -drive/device_add and device_del. Start with a drive used by a
|
||||||
* device that unplugs after reset.
|
* device that unplugs after reset.
|
||||||
*/
|
*/
|
||||||
qts = qtest_init("-drive if=none,id=drive0,file=null-co://,"
|
qts = qtest_initf("%s -drive if=none,id=drive0,file=null-co://,"
|
||||||
"file.read-zeroes=on,format=raw");
|
"file.read-zeroes=on,format=raw", machine_addition);
|
||||||
|
|
||||||
device_add(qts);
|
device_add(qts);
|
||||||
device_del(qts, true);
|
device_del(qts, true);
|
||||||
|
@ -284,8 +297,14 @@ static void test_device_add_and_del(void)
|
||||||
static void test_drive_add_device_add_and_del(void)
|
static void test_drive_add_device_add_and_del(void)
|
||||||
{
|
{
|
||||||
QTestState *qts;
|
QTestState *qts;
|
||||||
|
const char *arch = qtest_get_arch();
|
||||||
|
const char *machine_addition = "";
|
||||||
|
|
||||||
qts = qtest_init("");
|
if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
|
||||||
|
machine_addition = "-machine pc";
|
||||||
|
}
|
||||||
|
|
||||||
|
qts = qtest_init(machine_addition);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* drive_add/device_add and device_del. The drive is used by a
|
* drive_add/device_add and device_del. The drive is used by a
|
||||||
|
@ -302,8 +321,14 @@ static void test_drive_add_device_add_and_del(void)
|
||||||
static void test_blockdev_add_device_add_and_del(void)
|
static void test_blockdev_add_device_add_and_del(void)
|
||||||
{
|
{
|
||||||
QTestState *qts;
|
QTestState *qts;
|
||||||
|
const char *arch = qtest_get_arch();
|
||||||
|
const char *machine_addition = "";
|
||||||
|
|
||||||
qts = qtest_init("");
|
if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
|
||||||
|
machine_addition = "-machine pc";
|
||||||
|
}
|
||||||
|
|
||||||
|
qts = qtest_init(machine_addition);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* blockdev_add/device_add and device_del. The it drive is used by a
|
* blockdev_add/device_add and device_del. The it drive is used by a
|
||||||
|
|
|
@ -75,7 +75,7 @@ static inline uint64_t in_reg64(ERSTState *s, unsigned reg)
|
||||||
uint64_t res;
|
uint64_t res;
|
||||||
|
|
||||||
res = qpci_io_readq(s->dev, s->reg_bar, reg);
|
res = qpci_io_readq(s->dev, s->reg_bar, reg);
|
||||||
g_test_message("*%s -> %016llx", name, (unsigned long long)res);
|
g_test_message("*%s -> %016" PRIx64, name, res);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
@ -598,7 +598,7 @@ int main(int argc, char **argv)
|
||||||
/* Run the tests */
|
/* Run the tests */
|
||||||
g_test_init(&argc, &argv, NULL);
|
g_test_init(&argc, &argv, NULL);
|
||||||
|
|
||||||
qtest_start("-device floppy,id=floppy0");
|
qtest_start("-machine pc -device floppy,id=floppy0");
|
||||||
qtest_irq_intercept_in(global_qtest, "ioapic");
|
qtest_irq_intercept_in(global_qtest, "ioapic");
|
||||||
qtest_add_func("/fdc/cmos", test_cmos);
|
qtest_add_func("/fdc/cmos", test_cmos);
|
||||||
qtest_add_func("/fdc/no_media_on_start", test_no_media_on_start);
|
qtest_add_func("/fdc/no_media_on_start", test_no_media_on_start);
|
||||||
|
|
|
@ -178,9 +178,15 @@ static int append_arg(int argc, char *argv[], int argv_sz, char *arg)
|
||||||
|
|
||||||
static int setup_common(char *argv[], int argv_sz)
|
static int setup_common(char *argv[], int argv_sz)
|
||||||
{
|
{
|
||||||
|
int new_argc;
|
||||||
memset(cur_ide, 0, sizeof(cur_ide));
|
memset(cur_ide, 0, sizeof(cur_ide));
|
||||||
return append_arg(0, argv, argv_sz,
|
new_argc = append_arg(0, argv, argv_sz,
|
||||||
g_strdup("-nodefaults"));
|
g_strdup("-nodefaults"));
|
||||||
|
new_argc = append_arg(new_argc, argv, argv_sz,
|
||||||
|
g_strdup("-machine"));
|
||||||
|
new_argc = append_arg(new_argc, argv, argv_sz,
|
||||||
|
g_strdup("pc"));
|
||||||
|
return new_argc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setup_mbr(int img_idx, MBRcontents mbr)
|
static void setup_mbr(int img_idx, MBRcontents mbr)
|
||||||
|
@ -697,7 +703,7 @@ static void test_override(TestArgs *args, CHSResult expected[])
|
||||||
|
|
||||||
joined_args = g_strjoinv(" ", args->argv);
|
joined_args = g_strjoinv(" ", args->argv);
|
||||||
|
|
||||||
qts = qtest_init(joined_args);
|
qts = qtest_initf("-machine pc %s", joined_args);
|
||||||
fw_cfg = pc_fw_cfg_init(qts);
|
fw_cfg = pc_fw_cfg_init(qts);
|
||||||
|
|
||||||
read_bootdevices(fw_cfg, expected);
|
read_bootdevices(fw_cfg, expected);
|
||||||
|
@ -833,7 +839,7 @@ static void test_override_scsi_hot_unplug(void)
|
||||||
|
|
||||||
joined_args = g_strjoinv(" ", args->argv);
|
joined_args = g_strjoinv(" ", args->argv);
|
||||||
|
|
||||||
qts = qtest_init(joined_args);
|
qts = qtest_initf("-machine pc %s", joined_args);
|
||||||
fw_cfg = pc_fw_cfg_init(qts);
|
fw_cfg = pc_fw_cfg_init(qts);
|
||||||
|
|
||||||
read_bootdevices(fw_cfg, expected);
|
read_bootdevices(fw_cfg, expected);
|
||||||
|
@ -893,7 +899,7 @@ static void test_override_virtio_hot_unplug(void)
|
||||||
|
|
||||||
joined_args = g_strjoinv(" ", args->argv);
|
joined_args = g_strjoinv(" ", args->argv);
|
||||||
|
|
||||||
qts = qtest_init(joined_args);
|
qts = qtest_initf("-machine pc %s", joined_args);
|
||||||
fw_cfg = pc_fw_cfg_init(qts);
|
fw_cfg = pc_fw_cfg_init(qts);
|
||||||
|
|
||||||
read_bootdevices(fw_cfg, expected);
|
read_bootdevices(fw_cfg, expected);
|
||||||
|
|
|
@ -35,7 +35,7 @@ static QPCIBus *test_start_get_bus(const TestData *s)
|
||||||
{
|
{
|
||||||
char *cmdline;
|
char *cmdline;
|
||||||
|
|
||||||
cmdline = g_strdup_printf("-smp %d", s->num_cpus);
|
cmdline = g_strdup_printf("-machine pc -smp %d", s->num_cpus);
|
||||||
qtest_start(cmdline);
|
qtest_start(cmdline);
|
||||||
g_free(cmdline);
|
g_free(cmdline);
|
||||||
return qpci_new_pc(global_qtest, NULL);
|
return qpci_new_pc(global_qtest, NULL);
|
||||||
|
|
|
@ -128,10 +128,11 @@ static char debug_path[] = "/tmp/qtest-blkdebug.XXXXXX";
|
||||||
static QTestState *ide_test_start(const char *cmdline_fmt, ...)
|
static QTestState *ide_test_start(const char *cmdline_fmt, ...)
|
||||||
{
|
{
|
||||||
QTestState *qts;
|
QTestState *qts;
|
||||||
|
g_autofree char *full_fmt = g_strdup_printf("-machine pc %s", cmdline_fmt);
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start(ap, cmdline_fmt);
|
va_start(ap, cmdline_fmt);
|
||||||
qts = qtest_vinitf(cmdline_fmt, ap);
|
qts = qtest_vinitf(full_fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
pc_alloc_init(&guest_malloc, qts, 0);
|
pc_alloc_init(&guest_malloc, qts, 0);
|
||||||
|
@ -701,7 +702,7 @@ static void test_flush(void)
|
||||||
free_pci_device(dev);
|
free_pci_device(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_retry_flush(const char *machine)
|
static void test_pci_retry_flush(void)
|
||||||
{
|
{
|
||||||
QTestState *qts;
|
QTestState *qts;
|
||||||
QPCIDevice *dev;
|
QPCIDevice *dev;
|
||||||
|
@ -790,16 +791,6 @@ static void test_flush_empty_drive(void)
|
||||||
ide_test_quit(qts);
|
ide_test_quit(qts);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_pci_retry_flush(void)
|
|
||||||
{
|
|
||||||
test_retry_flush("pc");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void test_isa_retry_flush(void)
|
|
||||||
{
|
|
||||||
test_retry_flush("isapc");
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct Read10CDB {
|
typedef struct Read10CDB {
|
||||||
uint8_t opcode;
|
uint8_t opcode;
|
||||||
uint8_t flags;
|
uint8_t flags;
|
||||||
|
@ -1050,7 +1041,6 @@ int main(int argc, char **argv)
|
||||||
qtest_add_func("/ide/flush/nodev", test_flush_nodev);
|
qtest_add_func("/ide/flush/nodev", test_flush_nodev);
|
||||||
qtest_add_func("/ide/flush/empty_drive", test_flush_empty_drive);
|
qtest_add_func("/ide/flush/empty_drive", test_flush_empty_drive);
|
||||||
qtest_add_func("/ide/flush/retry_pci", test_pci_retry_flush);
|
qtest_add_func("/ide/flush/retry_pci", test_pci_retry_flush);
|
||||||
qtest_add_func("/ide/flush/retry_isa", test_isa_retry_flush);
|
|
||||||
|
|
||||||
qtest_add_func("/ide/cdrom/pio", test_cdrom_pio);
|
qtest_add_func("/ide/cdrom/pio", test_cdrom_pio);
|
||||||
qtest_add_func("/ide/cdrom/pio_large", test_cdrom_pio_large);
|
qtest_add_func("/ide/cdrom/pio_large", test_cdrom_pio_large);
|
||||||
|
|
|
@ -385,7 +385,12 @@ static void test_ivshmem_hotplug(void)
|
||||||
QTestState *qts;
|
QTestState *qts;
|
||||||
const char *arch = qtest_get_arch();
|
const char *arch = qtest_get_arch();
|
||||||
|
|
||||||
qts = qtest_init("-object memory-backend-ram,size=1M,id=mb1");
|
if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
|
||||||
|
qts = qtest_init("-object memory-backend-ram,size=1M,id=mb1"
|
||||||
|
" -machine pc");
|
||||||
|
} else {
|
||||||
|
qts = qtest_init("-object memory-backend-ram,size=1M,id=mb1");
|
||||||
|
}
|
||||||
|
|
||||||
qtest_qmp_device_add(qts, "ivshmem-plain", "iv1",
|
qtest_qmp_device_add(qts, "ivshmem-plain", "iv1",
|
||||||
"{'addr': %s, 'memdev': 'mb1'}",
|
"{'addr': %s, 'memdev': 'mb1'}",
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
#define QEMU_CMD_MEMFD " -m %d -object memory-backend-memfd,id=mem,size=%dM," \
|
#define QEMU_CMD_MEMFD " -m %d -object memory-backend-memfd,id=mem,size=%dM," \
|
||||||
" -numa node,memdev=mem"
|
" -numa node,memdev=mem"
|
||||||
#define QEMU_CMD_CHR " -chardev socket,id=%s,path=%s%s"
|
#define QEMU_CMD_CHR " -chardev socket,id=%s,path=%s%s"
|
||||||
#define QEMU_CMD_NETDEV " -netdev vhost-user,id=hs0,chardev=%s,vhostforce"
|
#define QEMU_CMD_NETDEV " -netdev vhost-user,id=hs0,chardev=%s,vhostforce=on"
|
||||||
|
|
||||||
#define HUGETLBFS_MAGIC 0x958458f6
|
#define HUGETLBFS_MAGIC 0x958458f6
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
#include "libqos/virtio-pci.h"
|
#include "libqos/virtio-pci.h"
|
||||||
#include "hw/pci/pci.h"
|
#include "hw/pci/pci.h"
|
||||||
|
|
||||||
|
#define VIRTIO_NET_F_STANDBY 62
|
||||||
|
|
||||||
#define ACPI_PCIHP_ADDR_ICH9 0x0cc0
|
#define ACPI_PCIHP_ADDR_ICH9 0x0cc0
|
||||||
#define PCI_EJ_BASE 0x0008
|
#define PCI_EJ_BASE 0x0008
|
||||||
#define PCI_SEL_BASE 0x0010
|
#define PCI_SEL_BASE 0x0010
|
||||||
|
@ -224,88 +226,27 @@ static char *get_mac(QTestState *qts, const char *name)
|
||||||
return mac;
|
return mac;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_one_card(QTestState *qts, bool present,
|
#define check_one_card(qts, present, id, mac) \
|
||||||
const char *id, const char *mac)
|
do { \
|
||||||
{
|
QDict *device; \
|
||||||
QDict *device;
|
QDict *bus; \
|
||||||
QDict *bus;
|
char *addr; \
|
||||||
char *addr;
|
bus = get_bus(qts, 0); \
|
||||||
|
device = find_device(bus, id); \
|
||||||
bus = get_bus(qts, 0);
|
if (present) { \
|
||||||
device = find_device(bus, id);
|
char *path; \
|
||||||
if (present) {
|
g_assert_nonnull(device); \
|
||||||
char *path;
|
qobject_unref(device); \
|
||||||
|
path = g_strdup_printf("/machine/peripheral/%s", id); \
|
||||||
g_assert_nonnull(device);
|
addr = get_mac(qts, path); \
|
||||||
qobject_unref(device);
|
g_free(path); \
|
||||||
|
g_assert_cmpstr(mac, ==, addr); \
|
||||||
path = g_strdup_printf("/machine/peripheral/%s", id);
|
g_free(addr); \
|
||||||
addr = get_mac(qts, path);
|
} else { \
|
||||||
g_free(path);
|
g_assert_null(device); \
|
||||||
g_assert_cmpstr(mac, ==, addr);
|
} \
|
||||||
g_free(addr);
|
qobject_unref(bus); \
|
||||||
} else {
|
} while (0)
|
||||||
g_assert_null(device);
|
|
||||||
}
|
|
||||||
|
|
||||||
qobject_unref(bus);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void test_on(void)
|
|
||||||
{
|
|
||||||
QTestState *qts;
|
|
||||||
|
|
||||||
qts = machine_start(BASE_MACHINE
|
|
||||||
"-netdev user,id=hs0 "
|
|
||||||
"-device virtio-net,bus=root0,id=standby0,"
|
|
||||||
"failover=on,netdev=hs0,mac="MAC_STANDBY0" "
|
|
||||||
"-device virtio-net,bus=root1,id=primary0,"
|
|
||||||
"failover_pair_id=standby0,netdev=hs1,mac="MAC_PRIMARY0,
|
|
||||||
2);
|
|
||||||
|
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
|
||||||
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
|
||||||
|
|
||||||
machine_stop(qts);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void test_on_mismatch(void)
|
|
||||||
{
|
|
||||||
QTestState *qts;
|
|
||||||
|
|
||||||
qts = machine_start(BASE_MACHINE
|
|
||||||
"-netdev user,id=hs0 "
|
|
||||||
"-device virtio-net,bus=root0,id=standby0,"
|
|
||||||
"failover=on,netdev=hs0,mac="MAC_STANDBY0" "
|
|
||||||
"-netdev user,id=hs1 "
|
|
||||||
"-device virtio-net,bus=root1,id=primary0,"
|
|
||||||
"failover_pair_id=standby1,netdev=hs1,mac="MAC_PRIMARY0,
|
|
||||||
2);
|
|
||||||
|
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
|
||||||
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
|
||||||
|
|
||||||
machine_stop(qts);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void test_off(void)
|
|
||||||
{
|
|
||||||
QTestState *qts;
|
|
||||||
|
|
||||||
qts = machine_start(BASE_MACHINE
|
|
||||||
"-netdev user,id=hs0 "
|
|
||||||
"-device virtio-net,bus=root0,id=standby0,"
|
|
||||||
"failover=off,netdev=hs0,mac="MAC_STANDBY0" "
|
|
||||||
"-netdev user,id=hs1 "
|
|
||||||
"-device virtio-net,bus=root1,id=primary0,"
|
|
||||||
"failover_pair_id=standby0,netdev=hs1,mac="MAC_PRIMARY0,
|
|
||||||
2);
|
|
||||||
|
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
|
||||||
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
|
||||||
|
|
||||||
machine_stop(qts);
|
|
||||||
}
|
|
||||||
|
|
||||||
static QDict *get_failover_negociated_event(QTestState *qts)
|
static QDict *get_failover_negociated_event(QTestState *qts)
|
||||||
{
|
{
|
||||||
|
@ -323,33 +264,120 @@ static QDict *get_failover_negociated_event(QTestState *qts)
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QVirtioPCIDevice *start_virtio_net(QTestState *qts, int bus, int slot,
|
static QVirtioPCIDevice *start_virtio_net_internal(QTestState *qts,
|
||||||
const char *id)
|
int bus, int slot,
|
||||||
|
uint64_t *features)
|
||||||
{
|
{
|
||||||
QVirtioPCIDevice *dev;
|
QVirtioPCIDevice *dev;
|
||||||
uint64_t features;
|
|
||||||
QPCIAddress addr;
|
QPCIAddress addr;
|
||||||
QDict *resp;
|
|
||||||
|
|
||||||
addr.devfn = QPCI_DEVFN((bus << 5) + slot, 0);
|
addr.devfn = QPCI_DEVFN((bus << 5) + slot, 0);
|
||||||
dev = virtio_pci_new(pcibus, &addr);
|
dev = virtio_pci_new(pcibus, &addr);
|
||||||
g_assert_nonnull(dev);
|
g_assert_nonnull(dev);
|
||||||
qvirtio_pci_device_enable(dev);
|
qvirtio_pci_device_enable(dev);
|
||||||
qvirtio_start_device(&dev->vdev);
|
qvirtio_start_device(&dev->vdev);
|
||||||
features = qvirtio_get_features(&dev->vdev);
|
*features &= qvirtio_get_features(&dev->vdev);
|
||||||
features = features & ~(QVIRTIO_F_BAD_FEATURE |
|
qvirtio_set_features(&dev->vdev, *features);
|
||||||
(1ull << VIRTIO_RING_F_INDIRECT_DESC) |
|
|
||||||
(1ull << VIRTIO_RING_F_EVENT_IDX));
|
|
||||||
qvirtio_set_features(&dev->vdev, features);
|
|
||||||
qvirtio_set_driver_ok(&dev->vdev);
|
qvirtio_set_driver_ok(&dev->vdev);
|
||||||
|
return dev;
|
||||||
|
}
|
||||||
|
|
||||||
resp = get_failover_negociated_event(qts);
|
static QVirtioPCIDevice *start_virtio_net(QTestState *qts, int bus, int slot,
|
||||||
g_assert_cmpstr(qdict_get_str(resp, "device-id"), ==, id);
|
const char *id, bool failover)
|
||||||
qobject_unref(resp);
|
{
|
||||||
|
QVirtioPCIDevice *dev;
|
||||||
|
uint64_t features;
|
||||||
|
|
||||||
|
features = ~(QVIRTIO_F_BAD_FEATURE |
|
||||||
|
(1ull << VIRTIO_RING_F_INDIRECT_DESC) |
|
||||||
|
(1ull << VIRTIO_RING_F_EVENT_IDX));
|
||||||
|
|
||||||
|
dev = start_virtio_net_internal(qts, bus, slot, &features);
|
||||||
|
|
||||||
|
g_assert(!!(features & (1ull << VIRTIO_NET_F_STANDBY)) == failover);
|
||||||
|
|
||||||
|
if (failover) {
|
||||||
|
QDict *resp;
|
||||||
|
|
||||||
|
resp = get_failover_negociated_event(qts);
|
||||||
|
g_assert_cmpstr(qdict_get_str(resp, "device-id"), ==, id);
|
||||||
|
qobject_unref(resp);
|
||||||
|
}
|
||||||
|
|
||||||
return dev;
|
return dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_on(void)
|
||||||
|
{
|
||||||
|
QTestState *qts;
|
||||||
|
|
||||||
|
qts = machine_start(BASE_MACHINE
|
||||||
|
"-netdev user,id=hs0 "
|
||||||
|
"-device virtio-net,bus=root0,id=standby0,"
|
||||||
|
"failover=on,netdev=hs0,mac="MAC_STANDBY0" "
|
||||||
|
"-netdev user,id=hs1 "
|
||||||
|
"-device virtio-net,bus=root1,id=primary0,"
|
||||||
|
"failover_pair_id=standby0,netdev=hs1,mac="MAC_PRIMARY0,
|
||||||
|
2);
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
machine_stop(qts);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_on_mismatch(void)
|
||||||
|
{
|
||||||
|
QTestState *qts;
|
||||||
|
QVirtioPCIDevice *vdev;
|
||||||
|
|
||||||
|
qts = machine_start(BASE_MACHINE
|
||||||
|
"-netdev user,id=hs0 "
|
||||||
|
"-device virtio-net,bus=root0,id=standby0,"
|
||||||
|
"failover=on,netdev=hs0,mac="MAC_STANDBY0" "
|
||||||
|
"-netdev user,id=hs1 "
|
||||||
|
"-device virtio-net,bus=root1,id=primary0,"
|
||||||
|
"failover_pair_id=standby1,netdev=hs1,mac="MAC_PRIMARY0,
|
||||||
|
2);
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
vdev = start_virtio_net(qts, 1, 0, "standby0", true);
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qos_object_destroy((QOSGraphObject *)vdev);
|
||||||
|
machine_stop(qts);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_off(void)
|
||||||
|
{
|
||||||
|
QTestState *qts;
|
||||||
|
QVirtioPCIDevice *vdev;
|
||||||
|
|
||||||
|
qts = machine_start(BASE_MACHINE
|
||||||
|
"-netdev user,id=hs0 "
|
||||||
|
"-device virtio-net,bus=root0,id=standby0,"
|
||||||
|
"failover=off,netdev=hs0,mac="MAC_STANDBY0" "
|
||||||
|
"-netdev user,id=hs1 "
|
||||||
|
"-device virtio-net,bus=root1,id=primary0,"
|
||||||
|
"failover_pair_id=standby0,netdev=hs1,mac="MAC_PRIMARY0,
|
||||||
|
2);
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
vdev = start_virtio_net(qts, 1, 0, "standby0", false);
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qos_object_destroy((QOSGraphObject *)vdev);
|
||||||
|
machine_stop(qts);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_enabled(void)
|
static void test_enabled(void)
|
||||||
{
|
{
|
||||||
QTestState *qts;
|
QTestState *qts;
|
||||||
|
@ -367,7 +395,7 @@ static void test_enabled(void)
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
vdev = start_virtio_net(qts, 1, 0, "standby0");
|
vdev = start_virtio_net(qts, 1, 0, "standby0", true);
|
||||||
|
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
||||||
|
@ -376,6 +404,38 @@ static void test_enabled(void)
|
||||||
machine_stop(qts);
|
machine_stop(qts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_guest_off(void)
|
||||||
|
{
|
||||||
|
QTestState *qts;
|
||||||
|
QVirtioPCIDevice *vdev;
|
||||||
|
uint64_t features;
|
||||||
|
|
||||||
|
qts = machine_start(BASE_MACHINE
|
||||||
|
"-netdev user,id=hs0 "
|
||||||
|
"-device virtio-net,bus=root0,id=standby0,"
|
||||||
|
"failover=on,netdev=hs0,mac="MAC_STANDBY0" "
|
||||||
|
"-netdev user,id=hs1 "
|
||||||
|
"-device virtio-net,bus=root1,id=primary0,"
|
||||||
|
"failover_pair_id=standby0,netdev=hs1,mac="MAC_PRIMARY0" ",
|
||||||
|
2);
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
features = ~(QVIRTIO_F_BAD_FEATURE |
|
||||||
|
(1ull << VIRTIO_RING_F_INDIRECT_DESC) |
|
||||||
|
(1ull << VIRTIO_RING_F_EVENT_IDX) |
|
||||||
|
(1ull << VIRTIO_NET_F_STANDBY));
|
||||||
|
|
||||||
|
vdev = start_virtio_net_internal(qts, 1, 0, &features);
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qos_object_destroy((QOSGraphObject *)vdev);
|
||||||
|
machine_stop(qts);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_hotplug_1(void)
|
static void test_hotplug_1(void)
|
||||||
{
|
{
|
||||||
QTestState *qts;
|
QTestState *qts;
|
||||||
|
@ -390,7 +450,7 @@ static void test_hotplug_1(void)
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
vdev = start_virtio_net(qts, 1, 0, "standby0");
|
vdev = start_virtio_net(qts, 1, 0, "standby0", true);
|
||||||
|
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
@ -432,7 +492,7 @@ static void test_hotplug_1_reverse(void)
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
vdev = start_virtio_net(qts, 1, 0, "standby0");
|
vdev = start_virtio_net(qts, 1, 0, "standby0", true);
|
||||||
|
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
||||||
|
@ -463,7 +523,7 @@ static void test_hotplug_2(void)
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
vdev = start_virtio_net(qts, 1, 0, "standby0");
|
vdev = start_virtio_net(qts, 1, 0, "standby0", true);
|
||||||
|
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
@ -519,7 +579,7 @@ static void test_hotplug_2_reverse(void)
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
vdev = start_virtio_net(qts, 1, 0, "standby0");
|
vdev = start_virtio_net(qts, 1, 0, "standby0", true);
|
||||||
|
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
||||||
|
@ -584,7 +644,7 @@ static void test_migrate_out(gconstpointer opaque)
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
vdev = start_virtio_net(qts, 1, 0, "standby0");
|
vdev = start_virtio_net(qts, 1, 0, "standby0", true);
|
||||||
|
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
@ -755,6 +815,364 @@ static void test_migrate_in(gconstpointer opaque)
|
||||||
machine_stop(qts);
|
machine_stop(qts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_off_migrate_out(gconstpointer opaque)
|
||||||
|
{
|
||||||
|
QTestState *qts;
|
||||||
|
QDict *resp, *args, *ret;
|
||||||
|
g_autofree gchar *uri = g_strdup_printf("exec: cat > %s", (gchar *)opaque);
|
||||||
|
const gchar *status;
|
||||||
|
QVirtioPCIDevice *vdev;
|
||||||
|
|
||||||
|
qts = machine_start(BASE_MACHINE
|
||||||
|
"-netdev user,id=hs0 "
|
||||||
|
"-netdev user,id=hs1 ",
|
||||||
|
2);
|
||||||
|
|
||||||
|
check_one_card(qts, false, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qtest_qmp_device_add(qts, "virtio-net", "standby0",
|
||||||
|
"{'bus': 'root0',"
|
||||||
|
"'failover': 'off',"
|
||||||
|
"'netdev': 'hs0',"
|
||||||
|
"'mac': '"MAC_STANDBY0"'}");
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qtest_qmp_device_add(qts, "virtio-net", "primary0",
|
||||||
|
"{'bus': 'root1',"
|
||||||
|
"'failover_pair_id': 'standby0',"
|
||||||
|
"'netdev': 'hs1',"
|
||||||
|
"'rombar': 0,"
|
||||||
|
"'romfile': '',"
|
||||||
|
"'mac': '"MAC_PRIMARY0"'}");
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
vdev = start_virtio_net(qts, 1, 0, "standby0", false);
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
args = qdict_from_jsonf_nofail("{}");
|
||||||
|
g_assert_nonnull(args);
|
||||||
|
qdict_put_str(args, "uri", uri);
|
||||||
|
|
||||||
|
resp = qtest_qmp(qts, "{ 'execute': 'migrate', 'arguments': %p}", args);
|
||||||
|
g_assert(qdict_haskey(resp, "return"));
|
||||||
|
qobject_unref(resp);
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
ret = migrate_status(qts);
|
||||||
|
|
||||||
|
status = qdict_get_str(ret, "status");
|
||||||
|
if (strcmp(status, "completed") == 0) {
|
||||||
|
qobject_unref(ret);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
g_assert_cmpstr(status, !=, "failed");
|
||||||
|
g_assert_cmpstr(status, !=, "cancelling");
|
||||||
|
g_assert_cmpstr(status, !=, "cancelled");
|
||||||
|
qobject_unref(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
qtest_qmp_eventwait(qts, "STOP");
|
||||||
|
|
||||||
|
qos_object_destroy((QOSGraphObject *)vdev);
|
||||||
|
machine_stop(qts);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_off_migrate_in(gconstpointer opaque)
|
||||||
|
{
|
||||||
|
QTestState *qts;
|
||||||
|
QDict *resp, *args, *ret;
|
||||||
|
g_autofree gchar *uri = g_strdup_printf("exec: cat %s", (gchar *)opaque);
|
||||||
|
|
||||||
|
qts = machine_start(BASE_MACHINE
|
||||||
|
"-netdev user,id=hs0 "
|
||||||
|
"-netdev user,id=hs1 "
|
||||||
|
"-incoming defer ",
|
||||||
|
2);
|
||||||
|
|
||||||
|
check_one_card(qts, false, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qtest_qmp_device_add(qts, "virtio-net", "standby0",
|
||||||
|
"{'bus': 'root0',"
|
||||||
|
"'failover': 'off',"
|
||||||
|
"'netdev': 'hs0',"
|
||||||
|
"'mac': '"MAC_STANDBY0"'}");
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qtest_qmp_device_add(qts, "virtio-net", "primary0",
|
||||||
|
"{'bus': 'root1',"
|
||||||
|
"'failover_pair_id': 'standby0',"
|
||||||
|
"'netdev': 'hs1',"
|
||||||
|
"'rombar': 0,"
|
||||||
|
"'romfile': '',"
|
||||||
|
"'mac': '"MAC_PRIMARY0"'}");
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
args = qdict_from_jsonf_nofail("{}");
|
||||||
|
g_assert_nonnull(args);
|
||||||
|
qdict_put_str(args, "uri", uri);
|
||||||
|
|
||||||
|
resp = qtest_qmp(qts, "{ 'execute': 'migrate-incoming', 'arguments': %p}",
|
||||||
|
args);
|
||||||
|
g_assert(qdict_haskey(resp, "return"));
|
||||||
|
qobject_unref(resp);
|
||||||
|
|
||||||
|
resp = get_migration_event(qts);
|
||||||
|
g_assert_cmpstr(qdict_get_str(resp, "status"), ==, "setup");
|
||||||
|
qobject_unref(resp);
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qtest_qmp_eventwait(qts, "RESUME");
|
||||||
|
|
||||||
|
ret = migrate_status(qts);
|
||||||
|
g_assert_cmpstr(qdict_get_str(ret, "status"), ==, "completed");
|
||||||
|
qobject_unref(ret);
|
||||||
|
|
||||||
|
machine_stop(qts);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_guest_off_migrate_out(gconstpointer opaque)
|
||||||
|
{
|
||||||
|
QTestState *qts;
|
||||||
|
QDict *resp, *args, *ret;
|
||||||
|
g_autofree gchar *uri = g_strdup_printf("exec: cat > %s", (gchar *)opaque);
|
||||||
|
const gchar *status;
|
||||||
|
QVirtioPCIDevice *vdev;
|
||||||
|
uint64_t features;
|
||||||
|
|
||||||
|
qts = machine_start(BASE_MACHINE
|
||||||
|
"-netdev user,id=hs0 "
|
||||||
|
"-netdev user,id=hs1 ",
|
||||||
|
2);
|
||||||
|
|
||||||
|
check_one_card(qts, false, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qtest_qmp_device_add(qts, "virtio-net", "standby0",
|
||||||
|
"{'bus': 'root0',"
|
||||||
|
"'failover': 'on',"
|
||||||
|
"'netdev': 'hs0',"
|
||||||
|
"'mac': '"MAC_STANDBY0"'}");
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qtest_qmp_device_add(qts, "virtio-net", "primary0",
|
||||||
|
"{'bus': 'root1',"
|
||||||
|
"'failover_pair_id': 'standby0',"
|
||||||
|
"'netdev': 'hs1',"
|
||||||
|
"'rombar': 0,"
|
||||||
|
"'romfile': '',"
|
||||||
|
"'mac': '"MAC_PRIMARY0"'}");
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
features = ~(QVIRTIO_F_BAD_FEATURE |
|
||||||
|
(1ull << VIRTIO_RING_F_INDIRECT_DESC) |
|
||||||
|
(1ull << VIRTIO_RING_F_EVENT_IDX) |
|
||||||
|
(1ull << VIRTIO_NET_F_STANDBY));
|
||||||
|
|
||||||
|
vdev = start_virtio_net_internal(qts, 1, 0, &features);
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
args = qdict_from_jsonf_nofail("{}");
|
||||||
|
g_assert_nonnull(args);
|
||||||
|
qdict_put_str(args, "uri", uri);
|
||||||
|
|
||||||
|
resp = qtest_qmp(qts, "{ 'execute': 'migrate', 'arguments': %p}", args);
|
||||||
|
g_assert(qdict_haskey(resp, "return"));
|
||||||
|
qobject_unref(resp);
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
ret = migrate_status(qts);
|
||||||
|
|
||||||
|
status = qdict_get_str(ret, "status");
|
||||||
|
if (strcmp(status, "completed") == 0) {
|
||||||
|
qobject_unref(ret);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
g_assert_cmpstr(status, !=, "failed");
|
||||||
|
g_assert_cmpstr(status, !=, "cancelling");
|
||||||
|
g_assert_cmpstr(status, !=, "cancelled");
|
||||||
|
qobject_unref(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
qtest_qmp_eventwait(qts, "STOP");
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qos_object_destroy((QOSGraphObject *)vdev);
|
||||||
|
machine_stop(qts);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_guest_off_migrate_in(gconstpointer opaque)
|
||||||
|
{
|
||||||
|
QTestState *qts;
|
||||||
|
QDict *resp, *args, *ret;
|
||||||
|
g_autofree gchar *uri = g_strdup_printf("exec: cat %s", (gchar *)opaque);
|
||||||
|
|
||||||
|
qts = machine_start(BASE_MACHINE
|
||||||
|
"-netdev user,id=hs0 "
|
||||||
|
"-netdev user,id=hs1 "
|
||||||
|
"-incoming defer ",
|
||||||
|
2);
|
||||||
|
|
||||||
|
check_one_card(qts, false, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qtest_qmp_device_add(qts, "virtio-net", "standby0",
|
||||||
|
"{'bus': 'root0',"
|
||||||
|
"'failover': 'on',"
|
||||||
|
"'netdev': 'hs0',"
|
||||||
|
"'mac': '"MAC_STANDBY0"'}");
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qtest_qmp_device_add(qts, "virtio-net", "primary0",
|
||||||
|
"{'bus': 'root1',"
|
||||||
|
"'failover_pair_id': 'standby0',"
|
||||||
|
"'netdev': 'hs1',"
|
||||||
|
"'rombar': 0,"
|
||||||
|
"'romfile': '',"
|
||||||
|
"'mac': '"MAC_PRIMARY0"'}");
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
args = qdict_from_jsonf_nofail("{}");
|
||||||
|
g_assert_nonnull(args);
|
||||||
|
qdict_put_str(args, "uri", uri);
|
||||||
|
|
||||||
|
resp = qtest_qmp(qts, "{ 'execute': 'migrate-incoming', 'arguments': %p}",
|
||||||
|
args);
|
||||||
|
g_assert(qdict_haskey(resp, "return"));
|
||||||
|
qobject_unref(resp);
|
||||||
|
|
||||||
|
resp = get_migration_event(qts);
|
||||||
|
g_assert_cmpstr(qdict_get_str(resp, "status"), ==, "setup");
|
||||||
|
qobject_unref(resp);
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qtest_qmp_eventwait(qts, "RESUME");
|
||||||
|
|
||||||
|
ret = migrate_status(qts);
|
||||||
|
g_assert_cmpstr(qdict_get_str(ret, "status"), ==, "completed");
|
||||||
|
qobject_unref(ret);
|
||||||
|
|
||||||
|
machine_stop(qts);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_migrate_guest_off_abort(gconstpointer opaque)
|
||||||
|
{
|
||||||
|
QTestState *qts;
|
||||||
|
QDict *resp, *args, *ret;
|
||||||
|
g_autofree gchar *uri = g_strdup_printf("exec: cat > %s", (gchar *)opaque);
|
||||||
|
const gchar *status;
|
||||||
|
QVirtioPCIDevice *vdev;
|
||||||
|
uint64_t features;
|
||||||
|
|
||||||
|
qts = machine_start(BASE_MACHINE
|
||||||
|
"-netdev user,id=hs0 "
|
||||||
|
"-netdev user,id=hs1 ",
|
||||||
|
2);
|
||||||
|
|
||||||
|
check_one_card(qts, false, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qtest_qmp_device_add(qts, "virtio-net", "standby0",
|
||||||
|
"{'bus': 'root0',"
|
||||||
|
"'failover': 'on',"
|
||||||
|
"'netdev': 'hs0',"
|
||||||
|
"'mac': '"MAC_STANDBY0"'}");
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qtest_qmp_device_add(qts, "virtio-net", "primary0",
|
||||||
|
"{'bus': 'root1',"
|
||||||
|
"'failover_pair_id': 'standby0',"
|
||||||
|
"'netdev': 'hs1',"
|
||||||
|
"'rombar': 0,"
|
||||||
|
"'romfile': '',"
|
||||||
|
"'mac': '"MAC_PRIMARY0"'}");
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
features = ~(QVIRTIO_F_BAD_FEATURE |
|
||||||
|
(1ull << VIRTIO_RING_F_INDIRECT_DESC) |
|
||||||
|
(1ull << VIRTIO_RING_F_EVENT_IDX) |
|
||||||
|
(1ull << VIRTIO_NET_F_STANDBY));
|
||||||
|
|
||||||
|
vdev = start_virtio_net_internal(qts, 1, 0, &features);
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
args = qdict_from_jsonf_nofail("{}");
|
||||||
|
g_assert_nonnull(args);
|
||||||
|
qdict_put_str(args, "uri", uri);
|
||||||
|
|
||||||
|
resp = qtest_qmp(qts, "{ 'execute': 'migrate', 'arguments': %p}", args);
|
||||||
|
g_assert(qdict_haskey(resp, "return"));
|
||||||
|
qobject_unref(resp);
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
ret = migrate_status(qts);
|
||||||
|
|
||||||
|
status = qdict_get_str(ret, "status");
|
||||||
|
if (strcmp(status, "active") == 0) {
|
||||||
|
qobject_unref(ret);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
g_assert_cmpstr(status, !=, "failed");
|
||||||
|
qobject_unref(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = qtest_qmp(qts, "{ 'execute': 'migrate_cancel' }");
|
||||||
|
g_assert(qdict_haskey(resp, "return"));
|
||||||
|
qobject_unref(resp);
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
ret = migrate_status(qts);
|
||||||
|
|
||||||
|
status = qdict_get_str(ret, "status");
|
||||||
|
if (strcmp(status, "cancelled") == 0) {
|
||||||
|
qobject_unref(ret);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
g_assert_cmpstr(status, !=, "failed");
|
||||||
|
g_assert_cmpstr(status, !=, "active");
|
||||||
|
qobject_unref(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qos_object_destroy((QOSGraphObject *)vdev);
|
||||||
|
machine_stop(qts);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_migrate_abort_wait_unplug(gconstpointer opaque)
|
static void test_migrate_abort_wait_unplug(gconstpointer opaque)
|
||||||
{
|
{
|
||||||
QTestState *qts;
|
QTestState *qts;
|
||||||
|
@ -780,7 +1198,7 @@ static void test_migrate_abort_wait_unplug(gconstpointer opaque)
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
vdev = start_virtio_net(qts, 1, 0, "standby0");
|
vdev = start_virtio_net(qts, 1, 0, "standby0", true);
|
||||||
|
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
@ -870,7 +1288,7 @@ static void test_migrate_abort_active(gconstpointer opaque)
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
vdev = start_virtio_net(qts, 1, 0, "standby0");
|
vdev = start_virtio_net(qts, 1, 0, "standby0", true);
|
||||||
|
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
@ -938,6 +1356,91 @@ static void test_migrate_abort_active(gconstpointer opaque)
|
||||||
machine_stop(qts);
|
machine_stop(qts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_migrate_off_abort(gconstpointer opaque)
|
||||||
|
{
|
||||||
|
QTestState *qts;
|
||||||
|
QDict *resp, *args, *ret;
|
||||||
|
g_autofree gchar *uri = g_strdup_printf("exec: cat > %s", (gchar *)opaque);
|
||||||
|
const gchar *status;
|
||||||
|
QVirtioPCIDevice *vdev;
|
||||||
|
|
||||||
|
qts = machine_start(BASE_MACHINE
|
||||||
|
"-netdev user,id=hs0 "
|
||||||
|
"-netdev user,id=hs1 ",
|
||||||
|
2);
|
||||||
|
|
||||||
|
check_one_card(qts, false, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qtest_qmp_device_add(qts, "virtio-net", "standby0",
|
||||||
|
"{'bus': 'root0',"
|
||||||
|
"'failover': 'off',"
|
||||||
|
"'netdev': 'hs0',"
|
||||||
|
"'mac': '"MAC_STANDBY0"'}");
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
vdev = start_virtio_net(qts, 1, 0, "standby0", false);
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qtest_qmp_device_add(qts, "virtio-net", "primary0",
|
||||||
|
"{'bus': 'root1',"
|
||||||
|
"'failover_pair_id': 'standby0',"
|
||||||
|
"'netdev': 'hs1',"
|
||||||
|
"'rombar': 0,"
|
||||||
|
"'romfile': '',"
|
||||||
|
"'mac': '"MAC_PRIMARY0"'}");
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
args = qdict_from_jsonf_nofail("{}");
|
||||||
|
g_assert_nonnull(args);
|
||||||
|
qdict_put_str(args, "uri", uri);
|
||||||
|
|
||||||
|
resp = qtest_qmp(qts, "{ 'execute': 'migrate', 'arguments': %p}", args);
|
||||||
|
g_assert(qdict_haskey(resp, "return"));
|
||||||
|
qobject_unref(resp);
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
ret = migrate_status(qts);
|
||||||
|
|
||||||
|
status = qdict_get_str(ret, "status");
|
||||||
|
if (strcmp(status, "active") == 0) {
|
||||||
|
qobject_unref(ret);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
g_assert_cmpstr(status, !=, "failed");
|
||||||
|
qobject_unref(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = qtest_qmp(qts, "{ 'execute': 'migrate_cancel' }");
|
||||||
|
g_assert(qdict_haskey(resp, "return"));
|
||||||
|
qobject_unref(resp);
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
ret = migrate_status(qts);
|
||||||
|
|
||||||
|
status = qdict_get_str(ret, "status");
|
||||||
|
if (strcmp(status, "cancelled") == 0) {
|
||||||
|
qobject_unref(ret);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
g_assert_cmpstr(status, !=, "failed");
|
||||||
|
g_assert_cmpstr(status, !=, "active");
|
||||||
|
qobject_unref(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
|
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
|
qos_object_destroy((QOSGraphObject *)vdev);
|
||||||
|
machine_stop(qts);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_migrate_abort_timeout(gconstpointer opaque)
|
static void test_migrate_abort_timeout(gconstpointer opaque)
|
||||||
{
|
{
|
||||||
QTestState *qts;
|
QTestState *qts;
|
||||||
|
@ -964,7 +1467,7 @@ static void test_migrate_abort_timeout(gconstpointer opaque)
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
|
||||||
vdev = start_virtio_net(qts, 1, 0, "standby0");
|
vdev = start_virtio_net(qts, 1, 0, "standby0", true);
|
||||||
|
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, false, "primary0", MAC_PRIMARY0);
|
||||||
|
@ -1075,7 +1578,7 @@ static void test_multi_out(gconstpointer opaque)
|
||||||
check_one_card(qts, false, "standby1", MAC_STANDBY1);
|
check_one_card(qts, false, "standby1", MAC_STANDBY1);
|
||||||
check_one_card(qts, false, "primary1", MAC_PRIMARY1);
|
check_one_card(qts, false, "primary1", MAC_PRIMARY1);
|
||||||
|
|
||||||
vdev0 = start_virtio_net(qts, 1, 0, "standby0");
|
vdev0 = start_virtio_net(qts, 1, 0, "standby0", true);
|
||||||
|
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
||||||
|
@ -1106,7 +1609,7 @@ static void test_multi_out(gconstpointer opaque)
|
||||||
check_one_card(qts, true, "standby1", MAC_STANDBY1);
|
check_one_card(qts, true, "standby1", MAC_STANDBY1);
|
||||||
check_one_card(qts, false, "primary1", MAC_PRIMARY1);
|
check_one_card(qts, false, "primary1", MAC_PRIMARY1);
|
||||||
|
|
||||||
vdev1 = start_virtio_net(qts, 3, 0, "standby1");
|
vdev1 = start_virtio_net(qts, 3, 0, "standby1", true);
|
||||||
|
|
||||||
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
check_one_card(qts, true, "standby0", MAC_STANDBY0);
|
||||||
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
check_one_card(qts, true, "primary0", MAC_PRIMARY0);
|
||||||
|
@ -1315,6 +1818,7 @@ int main(int argc, char **argv)
|
||||||
g_assert_true(ret >= 0);
|
g_assert_true(ret >= 0);
|
||||||
close(ret);
|
close(ret);
|
||||||
|
|
||||||
|
/* parameters tests */
|
||||||
qtest_add_func("failover-virtio-net/params/error/id", test_error_id);
|
qtest_add_func("failover-virtio-net/params/error/id", test_error_id);
|
||||||
qtest_add_func("failover-virtio-net/params/error/pcie", test_error_pcie);
|
qtest_add_func("failover-virtio-net/params/error/pcie", test_error_pcie);
|
||||||
qtest_add_func("failover-virtio-net/params/on", test_on);
|
qtest_add_func("failover-virtio-net/params/on", test_on);
|
||||||
|
@ -1322,16 +1826,33 @@ int main(int argc, char **argv)
|
||||||
test_on_mismatch);
|
test_on_mismatch);
|
||||||
qtest_add_func("failover-virtio-net/params/off", test_off);
|
qtest_add_func("failover-virtio-net/params/off", test_off);
|
||||||
qtest_add_func("failover-virtio-net/params/enabled", test_enabled);
|
qtest_add_func("failover-virtio-net/params/enabled", test_enabled);
|
||||||
qtest_add_func("failover-virtio-net/hotplug_1", test_hotplug_1);
|
qtest_add_func("failover-virtio-net/params/guest_off", test_guest_off);
|
||||||
qtest_add_func("failover-virtio-net/hotplug_1_reverse",
|
|
||||||
|
/* hotplug tests */
|
||||||
|
qtest_add_func("failover-virtio-net/hotplug/1", test_hotplug_1);
|
||||||
|
qtest_add_func("failover-virtio-net/hotplug/1_reverse",
|
||||||
test_hotplug_1_reverse);
|
test_hotplug_1_reverse);
|
||||||
qtest_add_func("failover-virtio-net/hotplug_2", test_hotplug_2);
|
qtest_add_func("failover-virtio-net/hotplug/2", test_hotplug_2);
|
||||||
qtest_add_func("failover-virtio-net/hotplug_2_reverse",
|
qtest_add_func("failover-virtio-net/hotplug/2_reverse",
|
||||||
test_hotplug_2_reverse);
|
test_hotplug_2_reverse);
|
||||||
qtest_add_data_func("failover-virtio-net/migrate/out", tmpfile,
|
|
||||||
|
/* migration tests */
|
||||||
|
qtest_add_data_func("failover-virtio-net/migrate/on/out", tmpfile,
|
||||||
test_migrate_out);
|
test_migrate_out);
|
||||||
qtest_add_data_func("failover-virtio-net/migrate/in", tmpfile,
|
qtest_add_data_func("failover-virtio-net/migrate/on/in", tmpfile,
|
||||||
test_migrate_in);
|
test_migrate_in);
|
||||||
|
qtest_add_data_func("failover-virtio-net/migrate/off/out", tmpfile,
|
||||||
|
test_off_migrate_out);
|
||||||
|
qtest_add_data_func("failover-virtio-net/migrate/off/in", tmpfile,
|
||||||
|
test_off_migrate_in);
|
||||||
|
qtest_add_data_func("failover-virtio-net/migrate/off/abort", tmpfile,
|
||||||
|
test_migrate_off_abort);
|
||||||
|
qtest_add_data_func("failover-virtio-net/migrate/guest_off/out", tmpfile,
|
||||||
|
test_guest_off_migrate_out);
|
||||||
|
qtest_add_data_func("failover-virtio-net/migrate/guest_off/in", tmpfile,
|
||||||
|
test_guest_off_migrate_in);
|
||||||
|
qtest_add_data_func("failover-virtio-net/migrate/guest_off/abort", tmpfile,
|
||||||
|
test_migrate_guest_off_abort);
|
||||||
qtest_add_data_func("failover-virtio-net/migrate/abort/wait-unplug",
|
qtest_add_data_func("failover-virtio-net/migrate/abort/wait-unplug",
|
||||||
tmpfile, test_migrate_abort_wait_unplug);
|
tmpfile, test_migrate_abort_wait_unplug);
|
||||||
qtest_add_data_func("failover-virtio-net/migrate/abort/active", tmpfile,
|
qtest_add_data_func("failover-virtio-net/migrate/abort/active", tmpfile,
|
||||||
|
@ -1340,9 +1861,9 @@ int main(int argc, char **argv)
|
||||||
qtest_add_data_func("failover-virtio-net/migrate/abort/timeout",
|
qtest_add_data_func("failover-virtio-net/migrate/abort/timeout",
|
||||||
tmpfile, test_migrate_abort_timeout);
|
tmpfile, test_migrate_abort_timeout);
|
||||||
}
|
}
|
||||||
qtest_add_data_func("failover-virtio-net/multi/out",
|
qtest_add_data_func("failover-virtio-net/migrate/multi/out",
|
||||||
tmpfile, test_multi_out);
|
tmpfile, test_multi_out);
|
||||||
qtest_add_data_func("failover-virtio-net/multi/in",
|
qtest_add_data_func("failover-virtio-net/migrate/multi/in",
|
||||||
tmpfile, test_multi_in);
|
tmpfile, test_multi_in);
|
||||||
|
|
||||||
ret = g_test_run();
|
ret = g_test_run();
|
||||||
|
|
Loading…
Reference in a new issue