2008-01-29 21:15:54 +03:00
# include <config.h>
2007-11-26 15:03:34 +03:00
# include <unistd.h>
2007-07-19 01:34:22 +04:00
# include <sys/types.h>
# include <fcntl.h>
2013-04-16 17:41:44 +04:00
# include "testutils.h"
2007-11-26 15:03:34 +03:00
# ifdef WITH_QEMU
2010-03-09 21:22:22 +03:00
# include "internal.h"
2012-12-12 22:06:53 +04:00
# include "viralloc.h"
2021-05-07 18:53:40 +03:00
# include "viridentity.h"
2010-12-17 19:41:51 +03:00
# include "qemu / qemu_capabilities.h"
2011-07-11 21:29:09 +04:00
# include "qemu / qemu_domain.h"
2015-10-20 16:48:33 +03:00
# include "qemu / qemu_migration.h"
2016-02-04 17:29:49 +03:00
# include "qemu / qemu_process.h"
2019-08-08 17:55:14 +03:00
# include "qemu / qemu_slirp.h"
2010-03-09 21:22:22 +03:00
# include "datatypes.h"
2013-11-20 19:04:10 +04:00
# include "conf / storage_conf.h"
2019-02-25 16:15:28 +03:00
# include "virfilewrapper.h"
# include "configmake.h"
2020-05-15 15:33:10 +03:00
# include "testutilsqemuschema.h"
2007-07-19 01:34:22 +04:00
2018-12-13 17:53:50 +03:00
# define LIBVIRT_QEMU_CAPSPRIV_H_ALLOW
2016-08-03 13:26:41 +03:00
# include "qemu / qemu_capspriv.h"
2010-03-09 21:22:22 +03:00
# include "testutilsqemu.h"
2008-05-16 20:51:30 +04:00
2013-05-03 16:52:21 +04:00
# define VIR_FROM_THIS VIR_FROM_QEMU
2012-11-28 20:43:10 +04:00
static virQEMUDriver driver ;
2022-01-06 14:32:33 +03:00
static virCaps * linuxCaps ;
static virCaps * macOSCaps ;
2007-07-19 01:34:22 +04:00
2011-11-01 05:29:07 +04:00
static unsigned char *
2019-10-14 15:45:03 +03:00
fakeSecretGetValue ( virSecretPtr obj G_GNUC_UNUSED ,
2011-11-01 05:29:07 +04:00
size_t * value_size ,
2020-09-16 17:47:13 +03:00
unsigned int fakeflags G_GNUC_UNUSED )
2011-11-01 05:29:07 +04:00
{
2013-05-03 16:52:21 +04:00
char * secret ;
2019-10-20 14:49:46 +03:00
secret = g_strdup ( " AQCVn5hO6HzFAhAAq0NCv8jtJcIcE+HOBlMQ1A " ) ;
2011-11-01 05:29:07 +04:00
* value_size = strlen ( secret ) ;
return ( unsigned char * ) secret ;
}
static virSecretPtr
fakeSecretLookupByUsage ( virConnectPtr conn ,
2016-06-02 23:28:28 +03:00
int usageType ,
2011-11-01 05:29:07 +04:00
const char * usageID )
{
Convert public datatypes to inherit from virObject
This converts the following public API datatypes to use the
virObject infrastructure:
virConnectPtr
virDomainPtr
virDomainSnapshotPtr
virInterfacePtr
virNetworkPtr
virNodeDevicePtr
virNWFilterPtr
virSecretPtr
virStreamPtr
virStorageVolPtr
virStoragePoolPtr
The code is significantly simplified, since the mutex in the
virConnectPtr object now only needs to be held when accessing
the per-connection virError object instance. All other operations
are completely lock free.
* src/datatypes.c, src/datatypes.h, src/libvirt.c: Convert
public datatypes to use virObject
* src/conf/domain_event.c, src/phyp/phyp_driver.c,
src/qemu/qemu_command.c, src/qemu/qemu_migration.c,
src/qemu/qemu_process.c, src/storage/storage_driver.c,
src/vbox/vbox_tmpl.c, src/xen/xend_internal.c,
tests/qemuxml2argvtest.c, tests/qemuxmlnstest.c,
tests/sexpr2xmltest.c, tests/xmconfigtest.c: Convert
to use virObjectUnref/virObjectRef
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2012-07-31 20:55:36 +04:00
unsigned char uuid [ VIR_UUID_BUFLEN ] ;
2016-06-02 23:28:28 +03:00
if ( usageType = = VIR_SECRET_USAGE_TYPE_VOLUME ) {
if ( ! STRPREFIX ( usageID , " /storage/guest_disks/ " ) ) {
virReportError ( VIR_ERR_INTERNAL_ERROR ,
" test provided invalid volume storage prefix '%s' " ,
usageID ) ;
return NULL ;
}
2021-01-06 19:19:03 +03:00
} else if ( STRNEQ ( usageID , " mycluster_myname " ) & &
STRNEQ ( usageID , " client.admin secret " ) ) {
2016-06-02 23:28:28 +03:00
virReportError ( VIR_ERR_INTERNAL_ERROR ,
" test provided incorrect usage '%s' " , usageID ) ;
2011-11-01 05:29:07 +04:00
return NULL ;
2016-06-02 23:28:28 +03:00
}
Convert public datatypes to inherit from virObject
This converts the following public API datatypes to use the
virObject infrastructure:
virConnectPtr
virDomainPtr
virDomainSnapshotPtr
virInterfacePtr
virNetworkPtr
virNodeDevicePtr
virNWFilterPtr
virSecretPtr
virStreamPtr
virStorageVolPtr
virStoragePoolPtr
The code is significantly simplified, since the mutex in the
virConnectPtr object now only needs to be held when accessing
the per-connection virError object instance. All other operations
are completely lock free.
* src/datatypes.c, src/datatypes.h, src/libvirt.c: Convert
public datatypes to use virObject
* src/conf/domain_event.c, src/phyp/phyp_driver.c,
src/qemu/qemu_command.c, src/qemu/qemu_migration.c,
src/qemu/qemu_process.c, src/storage/storage_driver.c,
src/vbox/vbox_tmpl.c, src/xen/xend_internal.c,
tests/qemuxml2argvtest.c, tests/qemuxmlnstest.c,
tests/sexpr2xmltest.c, tests/xmconfigtest.c: Convert
to use virObjectUnref/virObjectRef
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2012-07-31 20:55:36 +04:00
2014-06-11 13:40:44 +04:00
if ( virUUIDGenerate ( uuid ) < 0 )
return NULL ;
Convert public datatypes to inherit from virObject
This converts the following public API datatypes to use the
virObject infrastructure:
virConnectPtr
virDomainPtr
virDomainSnapshotPtr
virInterfacePtr
virNetworkPtr
virNodeDevicePtr
virNWFilterPtr
virSecretPtr
virStreamPtr
virStorageVolPtr
virStoragePoolPtr
The code is significantly simplified, since the mutex in the
virConnectPtr object now only needs to be held when accessing
the per-connection virError object instance. All other operations
are completely lock free.
* src/datatypes.c, src/datatypes.h, src/libvirt.c: Convert
public datatypes to use virObject
* src/conf/domain_event.c, src/phyp/phyp_driver.c,
src/qemu/qemu_command.c, src/qemu/qemu_migration.c,
src/qemu/qemu_process.c, src/storage/storage_driver.c,
src/vbox/vbox_tmpl.c, src/xen/xend_internal.c,
tests/qemuxml2argvtest.c, tests/qemuxmlnstest.c,
tests/sexpr2xmltest.c, tests/xmconfigtest.c: Convert
to use virObjectUnref/virObjectRef
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2012-07-31 20:55:36 +04:00
return virGetSecret ( conn , uuid , usageType , usageID ) ;
2011-11-01 05:29:07 +04:00
}
2016-06-02 23:28:28 +03:00
static virSecretPtr
fakeSecretLookupByUUID ( virConnectPtr conn ,
const unsigned char * uuid )
{
2018-12-04 23:15:22 +03:00
/* NB: This mocked value could be "tls" or "volume" depending on
* which test is being run , we ' ll leave at NONE ( or 0 ) */
return virGetSecret ( conn , uuid , VIR_SECRET_USAGE_TYPE_NONE , " " ) ;
2016-06-02 23:28:28 +03:00
}
2011-11-01 05:29:07 +04:00
static virSecretDriver fakeSecretDriver = {
2013-04-22 21:26:01 +04:00
. connectNumOfSecrets = NULL ,
. connectListSecrets = NULL ,
2016-06-02 23:28:28 +03:00
. secretLookupByUUID = fakeSecretLookupByUUID ,
2013-04-22 21:26:01 +04:00
. secretLookupByUsage = fakeSecretLookupByUsage ,
. secretDefineXML = NULL ,
. secretGetXMLDesc = NULL ,
. secretSetValue = NULL ,
. secretGetValue = fakeSecretGetValue ,
. secretUndefine = NULL ,
2011-11-01 05:29:07 +04:00
} ;
2013-11-20 19:04:10 +04:00
# define STORAGE_POOL_XML_PATH "storagepoolxml2xmlout / "
static const unsigned char fakeUUID [ VIR_UUID_BUFLEN ] = " fakeuuid " ;
static virStoragePoolPtr
fakeStoragePoolLookupByName ( virConnectPtr conn ,
const char * name )
{
2020-07-28 22:57:28 +03:00
g_autofree char * xmlpath = NULL ;
2013-11-20 19:04:10 +04:00
if ( STRNEQ ( name , " inactive " ) ) {
2019-10-22 16:26:14 +03:00
xmlpath = g_strdup_printf ( " %s/%s%s.xml " , abs_srcdir ,
STORAGE_POOL_XML_PATH , name ) ;
2013-11-20 19:04:10 +04:00
if ( ! virFileExists ( xmlpath ) ) {
virReportError ( VIR_ERR_NO_STORAGE_POOL ,
" File '%s' not found " , xmlpath ) ;
2021-09-04 23:38:39 +03:00
return NULL ;
2013-11-20 19:04:10 +04:00
}
}
2021-09-04 23:38:39 +03:00
return virGetStoragePool ( conn , name , fakeUUID , NULL , NULL ) ;
2013-11-20 19:04:10 +04:00
}
static virStorageVolPtr
fakeStorageVolLookupByName ( virStoragePoolPtr pool ,
const char * name )
{
2020-12-01 11:21:32 +03:00
g_auto ( GStrv ) volinfo = NULL ;
2013-11-20 19:04:10 +04:00
if ( STREQ ( pool - > name , " inactive " ) ) {
virReportError ( VIR_ERR_OPERATION_INVALID ,
" storage pool '%s' is not active " , pool - > name ) ;
return NULL ;
}
if ( STREQ ( name , " nonexistent " ) ) {
virReportError ( VIR_ERR_NO_STORAGE_VOL ,
" no storage vol with matching name '%s' " , name ) ;
return NULL ;
}
2021-02-05 20:35:07 +03:00
if ( ! ( volinfo = g_strsplit ( name , " + " , 2 ) ) )
2013-11-20 19:04:10 +04:00
return NULL ;
2021-11-04 17:26:07 +03:00
if ( ! volinfo [ 1 ] ) {
return virGetStorageVol ( pool - > conn , pool - > name , name , " block " , NULL , NULL ) ;
}
2013-11-20 19:04:10 +04:00
2021-09-04 23:38:39 +03:00
return virGetStorageVol ( pool - > conn , pool - > name , volinfo [ 1 ] , volinfo [ 0 ] ,
2013-11-20 19:04:10 +04:00
NULL , NULL ) ;
}
static int
fakeStorageVolGetInfo ( virStorageVolPtr vol ,
virStorageVolInfoPtr info )
{
memset ( info , 0 , sizeof ( * info ) ) ;
info - > type = virStorageVolTypeFromString ( vol - > key ) ;
if ( info - > type < 0 ) {
virReportError ( VIR_ERR_INTERNAL_ERROR ,
" Invalid volume type '%s' " , vol - > key ) ;
return - 1 ;
}
return 0 ;
}
static char *
fakeStorageVolGetPath ( virStorageVolPtr vol )
{
2020-05-04 18:03:42 +03:00
return g_strdup_printf ( " /some/%s/device/%s " , vol - > key , vol - > name ) ;
2013-11-20 19:04:10 +04:00
}
static char *
fakeStoragePoolGetXMLDesc ( virStoragePoolPtr pool ,
2019-10-14 15:45:03 +03:00
unsigned int flags_unused G_GNUC_UNUSED )
2013-11-20 19:04:10 +04:00
{
2020-07-28 22:57:28 +03:00
g_autofree char * xmlpath = NULL ;
2013-11-20 19:04:10 +04:00
char * xmlbuf = NULL ;
if ( STREQ ( pool - > name , " inactive " ) ) {
virReportError ( VIR_ERR_NO_STORAGE_POOL , NULL ) ;
return NULL ;
}
2019-10-22 16:26:14 +03:00
xmlpath = g_strdup_printf ( " %s/%s%s.xml " , abs_srcdir , STORAGE_POOL_XML_PATH ,
pool - > name ) ;
2013-11-20 19:04:10 +04:00
2016-05-26 18:01:52 +03:00
if ( virTestLoadFile ( xmlpath , & xmlbuf ) < 0 ) {
2013-11-20 19:04:10 +04:00
virReportError ( VIR_ERR_INTERNAL_ERROR ,
" failed to load XML file '%s' " ,
xmlpath ) ;
2021-09-04 23:38:39 +03:00
return NULL ;
2013-11-20 19:04:10 +04:00
}
return xmlbuf ;
}
static int
fakeStoragePoolIsActive ( virStoragePoolPtr pool )
{
if ( STREQ ( pool - > name , " inactive " ) )
return 0 ;
return 1 ;
}
/* Test storage pool implementation
*
* These functions aid testing of storage pool related stuff when creating a
2013-12-02 16:25:01 +04:00
* qemu command line .
2013-11-20 19:04:10 +04:00
*
* There are a few " magic " values to pass to these functions :
*
2013-12-02 16:25:01 +04:00
* 1 ) " inactive " as a pool name to create an inactive pool . All other names are
* interpreted as file names in storagepoolxml2xmlout / and are used as the
2013-11-20 19:04:10 +04:00
* definition for the pool . If the file doesn ' t exist the pool doesn ' t exist .
*
* 2 ) " nonexistent " returns an error while looking up a volume . Otherwise
2013-12-02 16:25:01 +04:00
* pattern VOLUME_TYPE + VOLUME_PATH can be used to simulate a volume in a pool .
2013-11-20 19:04:10 +04:00
* This creates a fake path for this volume . If the ' + ' sign is omitted , block
* type is assumed .
*/
static virStorageDriver fakeStorageDriver = {
. storagePoolLookupByName = fakeStoragePoolLookupByName ,
. storageVolLookupByName = fakeStorageVolLookupByName ,
. storagePoolGetXMLDesc = fakeStoragePoolGetXMLDesc ,
. storageVolGetPath = fakeStorageVolGetPath ,
. storageVolGetInfo = fakeStorageVolGetInfo ,
. storagePoolIsActive = fakeStoragePoolIsActive ,
} ;
2018-07-12 10:08:04 +03:00
/* virNetDevOpenvswitchGetVhostuserIfname mocks a portdev name - handle that */
static virNWFilterBindingPtr
fakeNWFilterBindingLookupByPortDev ( virConnectPtr conn ,
const char * portdev )
{
if ( STREQ ( portdev , " vhost-user0 " ) )
return virGetNWFilterBinding ( conn , " fake_vnet0 " , " fakeFilterName " ) ;
virReportError ( VIR_ERR_NO_NWFILTER_BINDING ,
" no nwfilter binding for port dev '%s' " , portdev ) ;
return NULL ;
}
static int
2019-10-14 15:45:03 +03:00
fakeNWFilterBindingDelete ( virNWFilterBindingPtr binding G_GNUC_UNUSED )
2018-07-12 10:08:04 +03:00
{
return 0 ;
}
static virNWFilterDriver fakeNWFilterDriver = {
. nwfilterBindingLookupByPortDev = fakeNWFilterBindingLookupByPortDev ,
. nwfilterBindingDelete = fakeNWFilterBindingDelete ,
} ;
2016-08-03 11:47:00 +03:00
static int
2021-03-11 10:16:13 +03:00
testAddCPUModels ( virQEMUCaps * caps , bool skipLegacy )
2016-08-03 11:47:00 +03:00
{
2016-08-04 14:25:02 +03:00
virArch arch = virQEMUCapsGetArch ( caps ) ;
const char * x86Models [ ] = {
2016-08-03 11:47:00 +03:00
" Opteron_G3 " , " Opteron_G2 " , " Opteron_G1 " ,
" Nehalem " , " Penryn " , " Conroe " ,
" Haswell-noTSX " , " Haswell " ,
} ;
2016-08-04 14:25:02 +03:00
const char * x86LegacyModels [ ] = {
2016-08-03 11:47:00 +03:00
" n270 " , " athlon " , " pentium3 " , " pentium2 " , " pentium " ,
" 486 " , " coreduo " , " kvm32 " , " qemu32 " , " kvm64 " ,
" core2duo " , " phenom " , " qemu64 " ,
} ;
2016-08-04 14:25:02 +03:00
const char * armModels [ ] = {
" cortex-a9 " , " cortex-a8 " , " cortex-a57 " , " cortex-a53 " ,
} ;
const char * ppc64Models [ ] = {
" POWER8 " , " POWER7 " ,
} ;
2016-12-18 22:22:28 +03:00
const char * s390xModels [ ] = {
" z990 " , " zEC12 " , " z13 " ,
} ;
2016-08-03 11:47:00 +03:00
2016-08-04 14:25:02 +03:00
if ( ARCH_IS_X86 ( arch ) ) {
2016-11-14 19:21:30 +03:00
if ( virQEMUCapsAddCPUDefinitions ( caps , VIR_DOMAIN_VIRT_KVM , x86Models ,
2019-10-15 14:55:26 +03:00
G_N_ELEMENTS ( x86Models ) ,
2016-04-21 14:08:12 +03:00
VIR_DOMCAPS_CPU_USABLE_UNKNOWN ) < 0 | |
2016-11-14 19:21:30 +03:00
virQEMUCapsAddCPUDefinitions ( caps , VIR_DOMAIN_VIRT_QEMU , x86Models ,
2019-10-15 14:55:26 +03:00
G_N_ELEMENTS ( x86Models ) ,
2016-04-21 14:08:12 +03:00
VIR_DOMCAPS_CPU_USABLE_UNKNOWN ) < 0 )
2016-08-04 14:25:02 +03:00
return - 1 ;
2016-11-14 19:21:30 +03:00
if ( ! skipLegacy ) {
if ( virQEMUCapsAddCPUDefinitions ( caps , VIR_DOMAIN_VIRT_KVM ,
x86LegacyModels ,
2019-10-15 14:55:26 +03:00
G_N_ELEMENTS ( x86LegacyModels ) ,
2016-04-21 14:08:12 +03:00
VIR_DOMCAPS_CPU_USABLE_UNKNOWN ) < 0 | |
2016-11-14 19:21:30 +03:00
virQEMUCapsAddCPUDefinitions ( caps , VIR_DOMAIN_VIRT_QEMU ,
x86LegacyModels ,
2019-10-15 14:55:26 +03:00
G_N_ELEMENTS ( x86LegacyModels ) ,
2016-04-21 14:08:12 +03:00
VIR_DOMCAPS_CPU_USABLE_UNKNOWN ) < 0 )
2016-11-14 19:21:30 +03:00
return - 1 ;
}
2016-08-04 14:25:02 +03:00
} else if ( ARCH_IS_ARM ( arch ) ) {
2016-11-14 19:21:30 +03:00
if ( virQEMUCapsAddCPUDefinitions ( caps , VIR_DOMAIN_VIRT_KVM , armModels ,
2019-10-15 14:55:26 +03:00
G_N_ELEMENTS ( armModels ) ,
2016-04-21 14:08:12 +03:00
VIR_DOMCAPS_CPU_USABLE_UNKNOWN ) < 0 | |
2016-11-14 19:21:30 +03:00
virQEMUCapsAddCPUDefinitions ( caps , VIR_DOMAIN_VIRT_QEMU , armModels ,
2019-10-15 14:55:26 +03:00
G_N_ELEMENTS ( armModels ) ,
2016-04-21 14:08:12 +03:00
VIR_DOMCAPS_CPU_USABLE_UNKNOWN ) < 0 )
2016-08-04 14:25:02 +03:00
return - 1 ;
} else if ( ARCH_IS_PPC64 ( arch ) ) {
2016-11-14 19:21:30 +03:00
if ( virQEMUCapsAddCPUDefinitions ( caps , VIR_DOMAIN_VIRT_KVM , ppc64Models ,
2019-10-15 14:55:26 +03:00
G_N_ELEMENTS ( ppc64Models ) ,
2016-04-21 14:08:12 +03:00
VIR_DOMCAPS_CPU_USABLE_UNKNOWN ) < 0 | |
2016-11-14 19:21:30 +03:00
virQEMUCapsAddCPUDefinitions ( caps , VIR_DOMAIN_VIRT_QEMU , ppc64Models ,
2019-10-15 14:55:26 +03:00
G_N_ELEMENTS ( ppc64Models ) ,
2016-04-21 14:08:12 +03:00
VIR_DOMCAPS_CPU_USABLE_UNKNOWN ) < 0 )
2016-08-04 14:25:02 +03:00
return - 1 ;
2016-12-18 22:22:28 +03:00
} else if ( ARCH_IS_S390 ( arch ) ) {
if ( virQEMUCapsAddCPUDefinitions ( caps , VIR_DOMAIN_VIRT_KVM , s390xModels ,
2019-10-15 14:55:26 +03:00
G_N_ELEMENTS ( s390xModels ) ,
2016-12-18 22:22:28 +03:00
VIR_DOMCAPS_CPU_USABLE_UNKNOWN ) < 0 )
return - 1 ;
2016-08-04 14:25:02 +03:00
}
2016-08-03 11:47:00 +03:00
return 0 ;
}
testutilsqemu: introduce ARG_CAPS_HOST_CPU_MODEL
When loading a latest caps for an arch for the first time the following
occurs in testQemuInfoInitArgs():
- the caps file is located. It's not in the cache since it's the first time
it's being read;
- the cachecaps are retrieved using qemuTestParseCapabilitiesArch() and
stored in the capscache;
- FLAG_REAL_CAPS is set and regular flow continues.
Loading the same latest caps for the second time the caps are loaded from the
cache, skipping qemuTestParseCapabilitiesArch(). By skipping this function it
means that it also skips virQEMUCapsLoadCache() and, more relevant to
our case, virQEMUCapsInitHostCPUModel(). This function will use the
current arch and cpuModel settings to write the qemuCaps that are being
stored in the cache. And we're also setting FLAG_REAL_CAPS, meaning that
we won't be updating the qemucaps host model via testUpdateQEMUCaps() as
well.
This has side-effects such as:
- the first time the latest caps for an arch is loaded determines the
cpuModel it'll use during the current qemuxml2argvtest run. For
example, when running all tests, the first time the latest ppc64 caps
are read is on "disk-floppy-pseries" test. Since the current host arch
at this point is x86_64, the cpuModel that will be set for this
capability is "core2duo";
- every other latest arch test will use the same hostCPU as the first
one set since we read it from the cache after the first run.
qemuTestSetHostCPU() makes no difference because we won't update the
host model due to FLAG_REAL_CAPS being set. Using the previous example,
every other latest ppc64 test that will be run will be using the
"core2duo" cpuModel.
Using fake capabilities (e.g. using DO_TEST()) prevents FLAG_REAL_CAPS to
be set, meaning that the cpuModel will be updated using the current
settings the test is being ran due to testUpdateQEMUCaps().
Note that not all latest caps arch tests care about the cpuModel being
set to an unexpected default cpuModel. But some tests will care, e.g.
"pseries-cpu-compat-power9", and changing it from DO_TEST() to
DO_TEST_CAPS_ARCH_LATEST() will make it fail every time the
"disk-floppy-pseries" is being ran first.
One way of fixing it is to rethink all the existing logic, for example
not setting FLAG_REAL_CAPS for latest arch tests. Another way is
presented here. ARGS_CAPS_HOST_CPU_MODEL is a new testQemuInfo arg that
allow us to set any specific host CPU model we want when running latest
arch caps tests. This new arg can then be used when converting existing
DO_TEST() testcases to DO_TEST_CAPS_ARCH_LATEST() that requires a
specific host CPU setting to be successful, which we're going to do in
the next patch with "pseries-cpu-compat-power9".
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
2022-05-20 16:58:23 +03:00
static void
testUpdateQEMUCapsHostCPUModel ( virQEMUCaps * qemuCaps , virArch hostArch )
{
virQEMUCapsUpdateHostCPUModel ( qemuCaps , hostArch , VIR_DOMAIN_VIRT_KVM ) ;
virQEMUCapsUpdateHostCPUModel ( qemuCaps , hostArch , VIR_DOMAIN_VIRT_QEMU ) ;
}
2016-08-03 11:47:00 +03:00
2016-08-03 13:21:19 +03:00
static int
2019-03-31 18:32:18 +03:00
testUpdateQEMUCaps ( const struct testQemuInfo * info ,
2021-04-09 16:18:41 +03:00
virArch arch ,
2021-03-11 10:16:13 +03:00
virCaps * caps )
2016-08-03 13:21:19 +03:00
{
2017-07-21 16:09:54 +03:00
if ( ! caps )
2019-11-12 23:46:29 +03:00
return - 1 ;
2017-07-21 16:09:54 +03:00
2021-04-09 16:18:41 +03:00
virQEMUCapsSetArch ( info - > qemuCaps , arch ) ;
2016-08-03 13:26:41 +03:00
2018-09-09 04:19:35 +03:00
if ( testAddCPUModels ( info - > qemuCaps ,
! ! ( info - > flags & FLAG_SKIP_LEGACY_CPUS ) ) < 0 )
2019-11-12 23:46:29 +03:00
return - 1 ;
2016-08-03 13:21:19 +03:00
testutilsqemu: introduce ARG_CAPS_HOST_CPU_MODEL
When loading a latest caps for an arch for the first time the following
occurs in testQemuInfoInitArgs():
- the caps file is located. It's not in the cache since it's the first time
it's being read;
- the cachecaps are retrieved using qemuTestParseCapabilitiesArch() and
stored in the capscache;
- FLAG_REAL_CAPS is set and regular flow continues.
Loading the same latest caps for the second time the caps are loaded from the
cache, skipping qemuTestParseCapabilitiesArch(). By skipping this function it
means that it also skips virQEMUCapsLoadCache() and, more relevant to
our case, virQEMUCapsInitHostCPUModel(). This function will use the
current arch and cpuModel settings to write the qemuCaps that are being
stored in the cache. And we're also setting FLAG_REAL_CAPS, meaning that
we won't be updating the qemucaps host model via testUpdateQEMUCaps() as
well.
This has side-effects such as:
- the first time the latest caps for an arch is loaded determines the
cpuModel it'll use during the current qemuxml2argvtest run. For
example, when running all tests, the first time the latest ppc64 caps
are read is on "disk-floppy-pseries" test. Since the current host arch
at this point is x86_64, the cpuModel that will be set for this
capability is "core2duo";
- every other latest arch test will use the same hostCPU as the first
one set since we read it from the cache after the first run.
qemuTestSetHostCPU() makes no difference because we won't update the
host model due to FLAG_REAL_CAPS being set. Using the previous example,
every other latest ppc64 test that will be run will be using the
"core2duo" cpuModel.
Using fake capabilities (e.g. using DO_TEST()) prevents FLAG_REAL_CAPS to
be set, meaning that the cpuModel will be updated using the current
settings the test is being ran due to testUpdateQEMUCaps().
Note that not all latest caps arch tests care about the cpuModel being
set to an unexpected default cpuModel. But some tests will care, e.g.
"pseries-cpu-compat-power9", and changing it from DO_TEST() to
DO_TEST_CAPS_ARCH_LATEST() will make it fail every time the
"disk-floppy-pseries" is being ran first.
One way of fixing it is to rethink all the existing logic, for example
not setting FLAG_REAL_CAPS for latest arch tests. Another way is
presented here. ARGS_CAPS_HOST_CPU_MODEL is a new testQemuInfo arg that
allow us to set any specific host CPU model we want when running latest
arch caps tests. This new arg can then be used when converting existing
DO_TEST() testcases to DO_TEST_CAPS_ARCH_LATEST() that requires a
specific host CPU setting to be successful, which we're going to do in
the next patch with "pseries-cpu-compat-power9".
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
2022-05-20 16:58:23 +03:00
testUpdateQEMUCapsHostCPUModel ( info - > qemuCaps , caps - > host . arch ) ;
2016-06-15 15:35:18 +03:00
2019-11-12 23:46:29 +03:00
return 0 ;
2016-08-03 13:21:19 +03:00
}
2018-09-09 04:33:57 +03:00
static int
testCheckExclusiveFlags ( int flags )
{
virCheckFlags ( FLAG_EXPECT_FAILURE |
FLAG_EXPECT_PARSE_ERROR |
2020-10-21 11:08:11 +03:00
FLAG_FIPS_HOST |
2018-09-09 01:13:23 +03:00
FLAG_REAL_CAPS |
2018-09-09 04:19:35 +03:00
FLAG_SKIP_LEGACY_CPUS |
2019-08-08 17:55:14 +03:00
FLAG_SLIRP_HELPER |
2018-09-09 04:33:57 +03:00
0 , - 1 ) ;
2018-09-09 04:19:35 +03:00
VIR_EXCLUSIVE_FLAGS_RET ( FLAG_REAL_CAPS , FLAG_SKIP_LEGACY_CPUS , - 1 ) ;
2018-09-09 04:33:57 +03:00
return 0 ;
}
2021-03-11 10:16:13 +03:00
static virCommand *
testCompareXMLToArgvCreateArgs ( virQEMUDriver * drv ,
virDomainObj * vm ,
2020-05-15 09:50:31 +03:00
const char * migrateURI ,
struct testQemuInfo * info ,
2021-09-24 20:15:22 +03:00
unsigned int flags )
2020-05-15 09:50:31 +03:00
{
2021-03-11 10:16:13 +03:00
qemuDomainObjPrivate * priv = vm - > privateData ;
2020-05-15 09:50:31 +03:00
size_t i ;
2022-05-16 13:47:19 +03:00
drv - > hostFips = flags & FLAG_FIPS_HOST ;
2022-01-04 17:13:45 +03:00
if ( qemuProcessCreatePretendCmdPrepare ( drv , vm , migrateURI ,
2020-10-15 15:39:16 +03:00
VIR_QEMU_PROCESS_START_COLD ) < 0 )
return NULL ;
2021-10-25 13:42:16 +03:00
if ( qemuDomainDeviceBackendChardevForeach ( vm - > def ,
2022-02-09 14:30:25 +03:00
testQemuPrepareHostBackendChardevOne ,
2022-02-02 19:31:29 +03:00
vm ) < 0 )
2021-10-25 13:42:16 +03:00
return NULL ;
2022-02-09 14:30:25 +03:00
if ( testQemuPrepareHostBackendChardevOne ( NULL , priv - > monConfig , vm ) < 0 )
2022-02-02 19:31:29 +03:00
return NULL ;
2021-10-25 13:42:16 +03:00
2020-10-15 14:47:46 +03:00
for ( i = 0 ; i < vm - > def - > ndisks ; i + + ) {
2021-03-11 10:16:13 +03:00
virDomainDiskDef * disk = vm - > def - > disks [ i ] ;
2020-10-15 14:47:46 +03:00
/* host cdrom requires special treatment in qemu, mock it */
if ( disk - > device = = VIR_DOMAIN_DISK_DEVICE_CDROM & &
disk - > src - > format = = VIR_STORAGE_FILE_RAW & &
virStorageSourceIsBlockLocal ( disk - > src ) & &
STREQ ( disk - > src - > path , " /dev/cdrom " ) )
disk - > src - > hostcdrom = true ;
}
2020-05-15 09:50:31 +03:00
for ( i = 0 ; i < vm - > def - > nhostdevs ; i + + ) {
2021-03-11 10:16:13 +03:00
virDomainHostdevDef * hostdev = vm - > def - > hostdevs [ i ] ;
2020-05-15 09:50:31 +03:00
if ( hostdev - > mode = = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS & &
hostdev - > source . subsys . type = = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI & &
hostdev - > source . subsys . u . pci . backend = = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT ) {
hostdev - > source . subsys . u . pci . backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO ;
}
2020-10-15 16:06:01 +03:00
if ( virHostdevIsSCSIDevice ( hostdev ) ) {
2021-03-11 10:16:13 +03:00
virDomainHostdevSubsysSCSI * scsisrc = & hostdev - > source . subsys . u . scsi ;
2020-10-15 16:06:01 +03:00
switch ( ( virDomainHostdevSCSIProtocolType ) scsisrc - > protocol ) {
case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_NONE :
scsisrc - > u . host . src - > path = g_strdup ( " /dev/sg0 " ) ;
break ;
case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI :
break ;
case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_LAST :
default :
virReportEnumRangeError ( virDomainHostdevSCSIProtocolType , scsisrc - > protocol ) ;
return NULL ;
}
}
2020-05-15 09:50:31 +03:00
}
if ( vm - > def - > vsock ) {
2021-03-11 10:16:13 +03:00
virDomainVsockDef * vsock = vm - > def - > vsock ;
qemuDomainVsockPrivate * vsockPriv =
( qemuDomainVsockPrivate * ) vsock - > privateData ;
2020-05-15 09:50:31 +03:00
if ( vsock - > auto_cid = = VIR_TRISTATE_BOOL_YES )
vsock - > guest_cid = 42 ;
vsockPriv - > vhostfd = 6789 ;
}
2020-06-10 21:11:47 +03:00
for ( i = 0 ; i < vm - > def - > ntpms ; i + + ) {
if ( vm - > def - > tpms [ i ] - > type ! = VIR_DOMAIN_TPM_TYPE_EMULATOR )
continue ;
2021-11-15 18:52:52 +03:00
VIR_FREE ( vm - > def - > tpms [ i ] - > data . emulator . source - > data . nix . path ) ;
vm - > def - > tpms [ i ] - > data . emulator . source - > type = VIR_DOMAIN_CHR_TYPE_UNIX ;
vm - > def - > tpms [ i ] - > data . emulator . source - > data . nix . path = g_strdup ( " /dev/test " ) ;
2020-05-15 09:50:31 +03:00
}
for ( i = 0 ; i < vm - > def - > nvideos ; i + + ) {
2021-03-11 10:16:13 +03:00
virDomainVideoDef * video = vm - > def - > videos [ i ] ;
2020-05-15 09:50:31 +03:00
if ( video - > backend = = VIR_DOMAIN_VIDEO_BACKEND_TYPE_VHOSTUSER ) {
2021-03-11 10:16:13 +03:00
qemuDomainVideoPrivate * vpriv = QEMU_DOMAIN_VIDEO_PRIVATE ( video ) ;
2020-05-15 09:50:31 +03:00
vpriv - > vhost_user_fd = 1729 ;
}
}
if ( flags & FLAG_SLIRP_HELPER ) {
for ( i = 0 ; i < vm - > def - > nnets ; i + + ) {
2021-03-11 10:16:13 +03:00
virDomainNetDef * net = vm - > def - > nets [ i ] ;
2020-05-15 09:50:31 +03:00
if ( net - > type = = VIR_DOMAIN_NET_TYPE_USER & &
2022-12-15 22:19:16 +03:00
net - > backend . type = = VIR_DOMAIN_NET_BACKEND_DEFAULT & &
2020-05-15 09:50:31 +03:00
virQEMUCapsGet ( info - > qemuCaps , QEMU_CAPS_DBUS_VMSTATE ) ) {
2021-03-11 10:16:13 +03:00
qemuSlirp * slirp = qemuSlirpNew ( ) ;
2020-05-15 09:50:31 +03:00
slirp - > fd [ 0 ] = 42 ;
QEMU_DOMAIN_NETWORK_PRIVATE ( net ) - > slirp = slirp ;
}
}
}
2022-05-16 14:55:25 +03:00
return qemuProcessCreatePretendCmdBuild ( vm , migrateURI ) ;
2020-05-15 09:50:31 +03:00
}
2021-09-24 14:28:57 +03:00
struct testValidateSchemaCommandData {
const char * name ;
const char * schema ;
2021-10-15 13:21:06 +03:00
bool allowIncomplete ; /* relax validator for commands with incomplete schema */
2021-09-24 14:28:57 +03:00
} ;
static const struct testValidateSchemaCommandData commands [ ] = {
2021-10-15 13:21:06 +03:00
{ " -blockdev " , " blockdev-add " , false } ,
{ " -netdev " , " netdev_add " , false } ,
{ " -object " , " object-add " , false } ,
{ " -device " , " device_add " , true } ,
2021-09-24 14:28:57 +03:00
} ;
static int
testCompareXMLToArgvValidateSchemaCommand ( GStrv args ,
GHashTable * schema )
{
GStrv arg ;
for ( arg = args ; * arg ; arg + + ) {
const char * curcommand = * arg ;
const char * curargs = * ( arg + 1 ) ;
size_t i ;
for ( i = 0 ; i < G_N_ELEMENTS ( commands ) ; i + + ) {
const struct testValidateSchemaCommandData * command = commands + i ;
g_auto ( virBuffer ) debug = VIR_BUFFER_INITIALIZER ;
g_autoptr ( virJSONValue ) jsonargs = NULL ;
if ( STRNEQ ( curcommand , command - > name ) )
continue ;
if ( ! curargs ) {
VIR_TEST_VERBOSE ( " expected arguments for command '%s' " ,
command - > name ) ;
return - 1 ;
}
if ( * curargs ! = ' { ' ) {
arg + + ;
break ;
}
if ( ! ( jsonargs = virJSONValueFromString ( curargs ) ) )
return - 1 ;
if ( testQEMUSchemaValidateCommand ( command - > schema , jsonargs ,
2021-10-15 13:21:06 +03:00
schema , false , false ,
command - > allowIncomplete ,
& debug ) < 0 ) {
2021-09-24 14:28:57 +03:00
VIR_TEST_VERBOSE ( " failed to validate '%s %s' against QAPI schema: %s " ,
command - > name , curargs , virBufferCurrentContent ( & debug ) ) ;
return - 1 ;
}
arg + + ;
}
}
return 0 ;
}
2020-05-15 15:33:10 +03:00
static int
2022-10-19 18:10:45 +03:00
testCompareXMLToArgvValidateSchema ( virCommand * cmd ,
struct testQemuInfo * info )
2020-05-15 15:33:10 +03:00
{
2020-12-01 11:21:32 +03:00
g_auto ( GStrv ) args = NULL ;
2021-02-19 18:19:09 +03:00
GHashTable * schema = NULL ;
2020-05-15 15:33:10 +03:00
2021-02-19 18:25:29 +03:00
/* comment out with line comment to enable schema checking for non _CAPS tests
if ( ! info - > schemafile )
info - > schemafile = testQemuGetLatestCapsForArch ( virArchToString ( info - > arch ) , " replies " ) ;
// */
2021-02-19 18:19:09 +03:00
if ( info - > schemafile ) {
/* lookup and insert into cache if not found */
2021-08-17 17:26:58 +03:00
if ( ! g_hash_table_lookup_extended ( info - > conf - > qapiSchemaCache ,
2021-02-19 18:19:09 +03:00
info - > schemafile ,
NULL , ( void * * ) & schema ) ) {
schema = testQEMUSchemaLoad ( info - > schemafile ) ;
2021-08-17 17:26:58 +03:00
g_hash_table_insert ( info - > conf - > qapiSchemaCache ,
2021-02-19 18:19:09 +03:00
g_strdup ( info - > schemafile ) ,
schema ) ;
}
}
2020-05-15 15:33:10 +03:00
if ( ! schema )
return 0 ;
2021-09-24 14:32:16 +03:00
if ( virCommandGetArgList ( cmd , & args ) < 0 )
2020-05-15 15:33:10 +03:00
return - 1 ;
2021-09-24 14:28:57 +03:00
if ( testCompareXMLToArgvValidateSchemaCommand ( args , schema ) < 0 )
return - 1 ;
2020-05-15 15:33:10 +03:00
return 0 ;
}
2018-03-27 12:11:01 +03:00
static int
testCompareXMLToArgv ( const void * data )
{
2019-03-31 18:32:18 +03:00
struct testQemuInfo * info = ( void * ) data ;
2020-07-28 22:57:28 +03:00
g_autofree char * migrateURI = NULL ;
2021-06-11 10:45:12 +03:00
g_auto ( virBuffer ) actualBuf = VIR_BUFFER_INITIALIZER ;
2020-07-28 22:57:28 +03:00
g_autofree char * actualargv = NULL ;
2016-08-03 11:42:08 +03:00
unsigned int flags = info - > flags ;
unsigned int parseFlags = info - > parseFlags ;
2010-11-23 02:09:13 +03:00
int ret = - 1 ;
2021-03-11 10:16:13 +03:00
virDomainObj * vm = NULL ;
2011-01-08 02:36:25 +03:00
virDomainChrSourceDef monitor_chr ;
2020-07-28 22:58:18 +03:00
g_autoptr ( virConnect ) conn = NULL ;
2020-09-22 14:57:39 +03:00
virError * err = NULL ;
2021-09-04 23:33:55 +03:00
g_autofree char * log = NULL ;
2020-07-28 22:58:18 +03:00
g_autoptr ( virCommand ) cmd = NULL ;
2021-03-11 10:16:13 +03:00
qemuDomainObjPrivate * priv = NULL ;
2021-03-31 17:11:42 +03:00
g_autoptr ( xmlDoc ) xml = NULL ;
g_autoptr ( xmlXPathContext ) ctxt = NULL ;
2021-04-09 16:18:41 +03:00
g_autofree char * archstr = NULL ;
virArch arch = VIR_ARCH_NONE ;
2021-05-07 18:53:40 +03:00
g_autoptr ( virIdentity ) sysident = virIdentityGetSystem ( ) ;
2022-01-06 14:32:33 +03:00
int rc ;
2010-02-10 16:19:17 +03:00
2021-09-22 11:52:23 +03:00
memset ( & monitor_chr , 0 , sizeof ( monitor_chr ) ) ;
2021-08-17 16:30:44 +03:00
if ( testQemuInfoInitArgs ( ( struct testQemuInfo * ) info ) < 0 )
goto cleanup ;
2022-01-06 14:32:33 +03:00
if ( info - > args . hostOS = = HOST_OS_MACOS )
driver . caps = macOSCaps ;
else
driver . caps = linuxCaps ;
2019-11-27 19:20:02 +03:00
if ( info - > arch ! = VIR_ARCH_NONE & & info - > arch ! = VIR_ARCH_X86_64 )
2019-11-26 20:51:22 +03:00
qemuTestSetHostArch ( & driver , info - > arch ) ;
2019-11-27 19:20:02 +03:00
testutilsqemu: introduce ARG_CAPS_HOST_CPU_MODEL
When loading a latest caps for an arch for the first time the following
occurs in testQemuInfoInitArgs():
- the caps file is located. It's not in the cache since it's the first time
it's being read;
- the cachecaps are retrieved using qemuTestParseCapabilitiesArch() and
stored in the capscache;
- FLAG_REAL_CAPS is set and regular flow continues.
Loading the same latest caps for the second time the caps are loaded from the
cache, skipping qemuTestParseCapabilitiesArch(). By skipping this function it
means that it also skips virQEMUCapsLoadCache() and, more relevant to
our case, virQEMUCapsInitHostCPUModel(). This function will use the
current arch and cpuModel settings to write the qemuCaps that are being
stored in the cache. And we're also setting FLAG_REAL_CAPS, meaning that
we won't be updating the qemucaps host model via testUpdateQEMUCaps() as
well.
This has side-effects such as:
- the first time the latest caps for an arch is loaded determines the
cpuModel it'll use during the current qemuxml2argvtest run. For
example, when running all tests, the first time the latest ppc64 caps
are read is on "disk-floppy-pseries" test. Since the current host arch
at this point is x86_64, the cpuModel that will be set for this
capability is "core2duo";
- every other latest arch test will use the same hostCPU as the first
one set since we read it from the cache after the first run.
qemuTestSetHostCPU() makes no difference because we won't update the
host model due to FLAG_REAL_CAPS being set. Using the previous example,
every other latest ppc64 test that will be run will be using the
"core2duo" cpuModel.
Using fake capabilities (e.g. using DO_TEST()) prevents FLAG_REAL_CAPS to
be set, meaning that the cpuModel will be updated using the current
settings the test is being ran due to testUpdateQEMUCaps().
Note that not all latest caps arch tests care about the cpuModel being
set to an unexpected default cpuModel. But some tests will care, e.g.
"pseries-cpu-compat-power9", and changing it from DO_TEST() to
DO_TEST_CAPS_ARCH_LATEST() will make it fail every time the
"disk-floppy-pseries" is being ran first.
One way of fixing it is to rethink all the existing logic, for example
not setting FLAG_REAL_CAPS for latest arch tests. Another way is
presented here. ARGS_CAPS_HOST_CPU_MODEL is a new testQemuInfo arg that
allow us to set any specific host CPU model we want when running latest
arch caps tests. This new arg can then be used when converting existing
DO_TEST() testcases to DO_TEST_CAPS_ARCH_LATEST() that requires a
specific host CPU setting to be successful, which we're going to do in
the next patch with "pseries-cpu-compat-power9".
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
2022-05-20 16:58:23 +03:00
if ( info - > args . capsHostCPUModel ) {
virCPUDef * hostCPUModel = qemuTestGetCPUDef ( info - > args . capsHostCPUModel ) ;
qemuTestSetHostCPU ( & driver , driver . hostarch , hostCPUModel ) ;
testUpdateQEMUCapsHostCPUModel ( info - > qemuCaps , driver . hostarch ) ;
}
2010-02-10 16:19:17 +03:00
if ( ! ( conn = virGetConnect ( ) ) )
2016-08-03 11:19:10 +03:00
goto cleanup ;
2016-08-03 11:42:08 +03:00
2011-11-01 05:29:07 +04:00
conn - > secretDriver = & fakeSecretDriver ;
2013-11-20 19:04:10 +04:00
conn - > storageDriver = & fakeStorageDriver ;
2018-07-12 10:08:04 +03:00
conn - > nwfilterDriver = & fakeNWFilterDriver ;
2007-07-19 01:34:22 +04:00
2018-07-12 10:08:04 +03:00
virSetConnectInterface ( conn ) ;
virSetConnectNetwork ( conn ) ;
virSetConnectNWFilter ( conn ) ;
virSetConnectNodeDev ( conn ) ;
2018-02-09 19:06:43 +03:00
virSetConnectSecret ( conn ) ;
virSetConnectStorage ( conn ) ;
2021-05-07 18:53:40 +03:00
if ( virIdentitySetCurrent ( sysident ) < 0 )
goto cleanup ;
2018-09-09 04:33:57 +03:00
if ( testCheckExclusiveFlags ( info - > flags ) < 0 )
goto cleanup ;
2022-09-22 15:30:53 +03:00
if ( ! ( xml = virXMLParse ( info - > infile , NULL , " (domain_definition) " ,
2022-09-22 16:58:16 +03:00
" domain " , & ctxt , NULL , false ) ) )
2021-03-31 17:11:42 +03:00
goto cleanup ;
2022-01-04 20:21:36 +03:00
if ( ( archstr = virXPathString ( " string(./os/type[1]/@arch) " , ctxt ) ) )
arch = virArchFromString ( archstr ) ;
if ( arch = = VIR_ARCH_NONE )
arch = virArchFromHost ( ) ;
2021-04-09 16:18:41 +03:00
if ( ! ( info - > flags & FLAG_REAL_CAPS ) ) {
if ( testUpdateQEMUCaps ( info , arch , driver . caps ) < 0 )
goto cleanup ;
}
2023-03-02 19:44:21 +03:00
virFileCacheClear ( driver . qemuCapsCache ) ;
2022-01-06 14:32:33 +03:00
if ( info - > args . hostOS = = HOST_OS_MACOS )
rc = qemuTestCapsCacheInsertMacOS ( driver . qemuCapsCache , info - > qemuCaps ) ;
else
rc = qemuTestCapsCacheInsert ( driver . qemuCapsCache , info - > qemuCaps ) ;
if ( rc < 0 )
2016-08-03 11:42:08 +03:00
goto cleanup ;
if ( info - > migrateFrom & &
2018-02-12 20:11:41 +03:00
! ( migrateURI = qemuMigrationDstGetURI ( info - > migrateFrom ,
info - > migrateFd ) ) )
2016-08-03 11:42:08 +03:00
goto cleanup ;
2016-03-17 15:19:35 +03:00
if ( ! ( vm = virDomainObjNew ( driver . xmlopt ) ) )
2016-08-03 11:19:10 +03:00
goto cleanup ;
2016-03-17 15:19:35 +03:00
2020-06-25 23:18:23 +03:00
if ( ! virFileExists ( info - > infile ) ) {
virReportError ( VIR_ERR_INTERNAL_ERROR ,
" Input file '%s' not found " , info - > infile ) ;
goto cleanup ;
}
2016-08-03 11:42:08 +03:00
parseFlags | = VIR_DOMAIN_DEF_PARSE_INACTIVE ;
2021-03-31 17:11:42 +03:00
2022-09-23 15:38:39 +03:00
if ( ! ( vm - > def = virDomainDefParseNode ( ctxt , driver . xmlopt , NULL , parseFlags ) ) ) {
2020-09-22 14:57:39 +03:00
err = virGetLastError ( ) ;
if ( ! err ) {
VIR_TEST_DEBUG ( " no error was reported for expected parse error " ) ;
goto cleanup ;
}
2020-09-24 14:09:47 +03:00
if ( flags & FLAG_EXPECT_PARSE_ERROR ) {
g_autofree char * tmperr = g_strdup_printf ( " %s \n " , NULLSTR ( err - > message ) ) ;
if ( virTestCompareToFile ( tmperr , info - > errfile ) > = 0 )
goto ok ;
}
2016-08-03 11:19:10 +03:00
goto cleanup ;
2012-07-09 20:29:55 +04:00
}
2017-09-07 15:19:37 +03:00
if ( flags & FLAG_EXPECT_PARSE_ERROR ) {
VIR_TEST_DEBUG ( " passed instead of expected parse error " ) ;
goto cleanup ;
}
2016-03-15 15:54:24 +03:00
priv = vm - > privateData ;
2007-07-19 01:34:22 +04:00
2022-10-11 16:52:54 +03:00
if ( info - > args . fds ) {
g_clear_pointer ( & priv - > fds , g_hash_table_unref ) ;
priv - > fds = g_steal_pointer ( & info - > args . fds ) ;
}
2016-06-17 15:56:45 +03:00
if ( virBitmapParse ( " 0-3 " , & priv - > autoNodeset , 4 ) < 0 )
2016-08-03 11:19:10 +03:00
goto cleanup ;
2016-03-15 15:57:47 +03:00
2017-05-19 16:07:15 +03:00
if ( ! virDomainDefCheckABIStability ( vm - > def , vm - > def , driver . xmlopt ) ) {
2019-03-31 17:59:30 +03:00
VIR_TEST_DEBUG ( " ABI stability check failed on %s " , info - > infile ) ;
2016-08-03 11:19:10 +03:00
goto cleanup ;
2014-01-10 21:18:03 +04:00
}
2016-03-17 15:19:35 +03:00
vm - > def - > id = - 1 ;
2007-09-22 01:20:32 +04:00
2016-03-15 15:54:24 +03:00
if ( qemuProcessPrepareMonitorChr ( & monitor_chr , priv - > libDir ) < 0 )
2016-08-03 11:19:10 +03:00
goto cleanup ;
2009-07-09 21:06:38 +04:00
2010-11-29 16:11:53 +03:00
virResetLastError ( ) ;
2010-10-22 20:50:34 +04:00
2020-05-15 09:50:31 +03:00
if ( ! ( cmd = testCompareXMLToArgvCreateArgs ( & driver , vm , migrateURI , info ,
2021-09-24 20:15:22 +03:00
flags ) ) ) {
2020-09-22 14:57:39 +03:00
err = virGetLastError ( ) ;
if ( ! err ) {
VIR_TEST_DEBUG ( " no error was reported for expected failure " ) ;
goto cleanup ;
}
2020-09-24 14:09:47 +03:00
if ( flags & FLAG_EXPECT_FAILURE ) {
g_autofree char * tmperr = g_strdup_printf ( " %s \n " , NULLSTR ( err - > message ) ) ;
if ( virTestCompareToFile ( tmperr , info - > errfile ) > = 0 )
goto ok ;
}
2016-08-03 11:19:10 +03:00
goto cleanup ;
2010-10-22 20:50:34 +04:00
}
2017-09-07 15:19:37 +03:00
if ( flags & FLAG_EXPECT_FAILURE ) {
VIR_TEST_DEBUG ( " passed instead of expected failure " ) ;
goto cleanup ;
}
2010-10-22 20:50:34 +04:00
2022-10-19 18:10:45 +03:00
if ( testCompareXMLToArgvValidateSchema ( cmd , info ) < 0 )
2020-05-15 15:33:10 +03:00
goto cleanup ;
2021-06-11 10:45:12 +03:00
if ( virCommandToStringBuf ( cmd , & actualBuf , true , false ) < 0 )
2016-08-03 11:19:10 +03:00
goto cleanup ;
2010-11-23 02:09:13 +03:00
2021-06-11 10:45:12 +03:00
virBufferAddLit ( & actualBuf , " \n " ) ;
actualargv = virBufferContentAndReset ( & actualBuf ) ;
2021-03-31 11:46:36 +03:00
if ( virTestCompareToFileFull ( actualargv , info - > outfile , false ) < 0 )
2016-08-03 11:19:10 +03:00
goto cleanup ;
2007-07-19 01:34:22 +04:00
2016-03-14 12:37:40 +03:00
ret = 0 ;
2012-01-13 07:39:24 +04:00
ok :
2016-04-13 09:21:42 +03:00
if ( ret = = 0 & & flags & FLAG_EXPECT_FAILURE ) {
2016-03-14 12:37:40 +03:00
ret = - 1 ;
2019-05-03 11:31:02 +03:00
VIR_TEST_DEBUG ( " Error expected but there wasn't any. " ) ;
2016-08-03 11:19:10 +03:00
goto cleanup ;
2016-03-14 12:37:40 +03:00
}
2019-08-29 15:04:07 +03:00
if ( flags & FLAG_EXPECT_FAILURE ) {
if ( ( log = virTestLogContentAndReset ( ) ) )
VIR_TEST_DEBUG ( " Got expected error: \n %s " , log ) ;
2012-01-13 07:39:24 +04:00
}
2019-08-29 15:04:07 +03:00
virResetLastError ( ) ;
ret = 0 ;
2012-01-13 07:39:24 +04:00
2016-08-03 11:19:10 +03:00
cleanup :
2016-07-09 00:45:22 +03:00
virDomainChrSourceDefClear ( & monitor_chr ) ;
2016-03-17 15:19:35 +03:00
virObjectUnref ( vm ) ;
2021-05-07 18:53:40 +03:00
virIdentitySetCurrent ( NULL ) ;
2018-02-09 19:06:43 +03:00
virSetConnectSecret ( NULL ) ;
virSetConnectStorage ( NULL ) ;
2019-11-27 19:20:02 +03:00
if ( info - > arch ! = VIR_ARCH_NONE & & info - > arch ! = VIR_ARCH_X86_64 )
2019-11-26 20:51:22 +03:00
qemuTestSetHostArch ( & driver , VIR_ARCH_NONE ) ;
2019-11-27 19:20:02 +03:00
2016-08-03 11:42:08 +03:00
return ret ;
2007-07-19 01:34:22 +04:00
}
2019-10-22 16:26:14 +03:00
static void
2019-03-31 18:32:18 +03:00
testInfoSetPaths ( struct testQemuInfo * info ,
2019-03-31 18:08:19 +03:00
const char * suffix )
{
2019-10-22 16:26:14 +03:00
info - > infile = g_strdup_printf ( " %s/qemuxml2argvdata/%s.xml " ,
abs_srcdir , info - > name ) ;
info - > outfile = g_strdup_printf ( " %s/qemuxml2argvdata/%s%s.args " ,
abs_srcdir , info - > name , suffix ? suffix : " " ) ;
2020-09-22 14:57:39 +03:00
info - > errfile = g_strdup_printf ( " %s/qemuxml2argvdata/%s%s.err " ,
abs_srcdir , info - > name , suffix ? suffix : " " ) ;
2019-03-31 18:08:19 +03:00
}
2008-05-29 19:31:49 +04:00
static int
2011-04-29 20:21:20 +04:00
mymain ( void )
2007-07-19 01:34:22 +04:00
{
2019-03-31 19:43:44 +03:00
int ret = 0 ;
2021-08-17 17:26:58 +03:00
g_autoptr ( GHashTable ) capslatest = testQemuGetLatestCaps ( ) ;
2021-11-30 16:07:36 +03:00
g_autoptr ( GHashTable ) qapiSchemaCache = virHashNew ( ( GDestroyNotify ) g_hash_table_unref ) ;
2022-07-13 23:26:51 +03:00
g_autoptr ( GHashTable ) capscache = virHashNew ( virObjectUnref ) ;
2021-08-17 17:26:58 +03:00
struct testQemuConf testConf = { . capslatest = capslatest ,
. capscache = capscache ,
2021-08-20 17:34:26 +03:00
. qapiSchemaCache = qapiSchemaCache } ;
2021-08-17 17:26:58 +03:00
if ( ! capslatest )
return EXIT_FAILURE ;
2007-07-19 01:34:22 +04:00
2014-02-06 17:24:02 +04:00
/* Set the timezone because we are mocking the time() function.
* If we don ' t do that , then localtime ( ) may return unpredictable
* results . In order to detect things that just work by a blind
* chance , we need to set an virtual timezone that no libvirt
* developer resides in . */
2019-12-18 20:16:19 +03:00
if ( g_setenv ( " TZ " , " VIR00:30 " , TRUE ) = = FALSE ) {
perror ( " g_setenv " ) ;
2014-02-06 17:24:02 +04:00
return EXIT_FAILURE ;
}
2015-09-15 09:16:02 +03:00
if ( qemuTestDriverInit ( & driver ) < 0 )
2014-04-07 10:53:26 +04:00
return EXIT_FAILURE ;
2015-06-15 21:59:58 +03:00
2022-01-06 14:32:33 +03:00
/* By default, the driver gets a virCaps instance that's suitable for
* tests that expect Linux as the host OS . We create another one for
* macOS and keep around pointers to both : this allows us to later
* pick the appropriate one for each test case */
linuxCaps = driver . caps ;
macOSCaps = testQemuCapsInitMacOS ( ) ;
2023-03-07 17:36:35 +03:00
virFileWrapperAddPrefix ( " /sys/devices/system " ,
abs_srcdir " /vircaps2xmldata/linux-basic/system " ) ;
2019-02-25 16:15:28 +03:00
virFileWrapperAddPrefix ( SYSCONFDIR " /qemu/firmware " ,
abs_srcdir " /qemufirmwaredata/etc/qemu/firmware " ) ;
virFileWrapperAddPrefix ( PREFIX " /share/qemu/firmware " ,
abs_srcdir " /qemufirmwaredata/usr/share/qemu/firmware " ) ;
virFileWrapperAddPrefix ( " /home/user/.config/qemu/firmware " ,
abs_srcdir " /qemufirmwaredata/home/user/.config/qemu/firmware " ) ;
2019-09-23 13:44:39 +03:00
virFileWrapperAddPrefix ( SYSCONFDIR " /qemu/vhost-user " ,
abs_srcdir " /qemuvhostuserdata/etc/qemu/vhost-user " ) ;
virFileWrapperAddPrefix ( PREFIX " /share/qemu/vhost-user " ,
abs_srcdir " /qemuvhostuserdata/usr/share/qemu/vhost-user " ) ;
virFileWrapperAddPrefix ( " /home/user/.config/qemu/vhost-user " ,
abs_srcdir " /qemuvhostuserdata/home/user/.config/qemu/vhost-user " ) ;
virFileWrapperAddPrefix ( " /usr/libexec/qemu/vhost-user " ,
abs_srcdir " /qemuvhostuserdata/usr/libexec/qemu/vhost-user " ) ;
2018-04-04 10:42:36 +03:00
/**
* The following set of macros allows testing of XML - > argv conversion with a
* real set of capabilities gathered from a real qemu copy . It is desired to use
* these for positive test cases as it provides combinations of flags which
* can be met in real life .
*
* The capabilities are taken from the real capabilities stored in
* tests / qemucapabilitiesdata .
*
* It is suggested to use the DO_TEST_CAPS_LATEST macro which always takes the
* most recent capability set . In cases when the new code would change behaviour
* the test cases should be forked using DO_TEST_CAPS_VER with the appropriate
* version .
*/
2021-08-16 18:02:16 +03:00
# define DO_TEST_FULL(_name, _suffix, ...) \
2018-04-04 10:42:36 +03:00
do { \
2019-03-31 18:32:18 +03:00
static struct testQemuInfo info = { \
2019-03-14 02:26:08 +03:00
. name = _name , \
2018-04-04 10:42:36 +03:00
} ; \
2021-08-17 16:30:44 +03:00
testQemuInfoSetArgs ( & info , & testConf , __VA_ARGS__ ) ; \
2019-10-22 16:26:14 +03:00
testInfoSetPaths ( & info , _suffix ) ; \
2021-08-20 17:34:26 +03:00
virTestRunLog ( & ret , " QEMU XML-2-ARGV " _name _suffix , testCompareXMLToArgv , & info ) ; \
2019-03-31 18:32:18 +03:00
testQemuInfoClear ( & info ) ; \
2018-04-04 10:42:36 +03:00
} while ( 0 )
2019-03-14 16:38:02 +03:00
# define DO_TEST_CAPS_INTERNAL(name, arch, ver, ...) \
2021-08-16 18:02:16 +03:00
DO_TEST_FULL ( name , " . " arch " - " ver , \
ARG_CAPS_ARCH , arch , \
ARG_CAPS_VER , ver , \
__VA_ARGS__ , \
ARG_END )
2019-03-14 16:38:02 +03:00
2019-03-14 02:15:05 +03:00
# define DO_TEST_CAPS_ARCH_LATEST_FULL(name, arch, ...) \
2019-03-14 02:48:06 +03:00
DO_TEST_CAPS_INTERNAL ( name , arch , " latest " , __VA_ARGS__ )
2018-08-06 18:41:06 +03:00
2019-07-02 18:35:33 +03:00
# define DO_TEST_CAPS_ARCH_VER_FULL(name, arch, ver, ...) \
DO_TEST_CAPS_INTERNAL ( name , arch , ver , __VA_ARGS__ )
2018-12-07 15:13:58 +03:00
# define DO_TEST_CAPS_ARCH_LATEST(name, arch) \
2019-03-14 02:15:05 +03:00
DO_TEST_CAPS_ARCH_LATEST_FULL ( name , arch , ARG_END )
2018-12-07 15:13:58 +03:00
2023-03-27 20:47:27 +03:00
# define DO_TEST_CAPS_ARCH_LATEST_ABI_UPDATE(name, arch) \
DO_TEST_CAPS_ARCH_LATEST_FULL ( name , arch , \
ARG_PARSEFLAGS , VIR_DOMAIN_DEF_PARSE_ABI_UPDATE , \
ARG_END )
2019-07-02 18:33:31 +03:00
# define DO_TEST_CAPS_ARCH_VER(name, arch, ver) \
2019-07-02 18:35:33 +03:00
DO_TEST_CAPS_ARCH_VER_FULL ( name , arch , ver , ARG_END )
2019-07-02 18:33:31 +03:00
2018-04-04 10:42:36 +03:00
# define DO_TEST_CAPS_LATEST(name) \
2018-08-06 18:41:06 +03:00
DO_TEST_CAPS_ARCH_LATEST ( name , " x86_64 " )
2018-04-04 10:42:36 +03:00
2019-07-02 18:33:31 +03:00
# define DO_TEST_CAPS_VER(name, ver) \
DO_TEST_CAPS_ARCH_VER ( name , " x86_64 " , ver )
2020-02-05 21:35:50 +03:00
# define DO_TEST_CAPS_LATEST_PPC64(name) \
DO_TEST_CAPS_ARCH_LATEST ( name , " ppc64 " )
2022-05-20 21:15:18 +03:00
# define DO_TEST_CAPS_LATEST_PPC64_HOSTCPU(name, hostcpu) \
DO_TEST_CAPS_ARCH_LATEST_FULL ( name , " ppc64 " , \
ARG_CAPS_HOST_CPU_MODEL , hostcpu )
# define DO_TEST_CAPS_LATEST_PPC64_HOSTCPU_FAILURE(name, hostcpu) \
DO_TEST_CAPS_ARCH_LATEST_FULL ( name , " ppc64 " , \
ARG_CAPS_HOST_CPU_MODEL , hostcpu , \
ARG_FLAGS , FLAG_EXPECT_FAILURE )
2019-07-02 18:37:20 +03:00
# define DO_TEST_CAPS_ARCH_LATEST_FAILURE(name, arch) \
DO_TEST_CAPS_ARCH_LATEST_FULL ( name , arch , \
2019-03-14 02:15:05 +03:00
ARG_FLAGS , FLAG_EXPECT_FAILURE )
2018-12-07 15:13:58 +03:00
2019-07-02 18:37:20 +03:00
# define DO_TEST_CAPS_ARCH_VER_FAILURE(name, arch, ver) \
DO_TEST_CAPS_ARCH_VER_FULL ( name , arch , ver , \
ARG_FLAGS , FLAG_EXPECT_FAILURE )
# define DO_TEST_CAPS_LATEST_FAILURE(name) \
DO_TEST_CAPS_ARCH_LATEST_FAILURE ( name , " x86_64 " )
# define DO_TEST_CAPS_VER_FAILURE(name, ver) \
DO_TEST_CAPS_ARCH_VER_FAILURE ( name , " x86_64 " , ver )
# define DO_TEST_CAPS_ARCH_LATEST_PARSE_ERROR(name, arch) \
DO_TEST_CAPS_ARCH_LATEST_FULL ( name , arch , \
2019-03-14 02:15:05 +03:00
ARG_FLAGS , FLAG_EXPECT_PARSE_ERROR )
2018-12-07 15:13:58 +03:00
2019-07-02 18:37:20 +03:00
# define DO_TEST_CAPS_ARCH_VER_PARSE_ERROR(name, arch, ver) \
DO_TEST_CAPS_ARCH_VER_FULL ( name , arch , ver , \
ARG_FLAGS , FLAG_EXPECT_PARSE_ERROR )
# define DO_TEST_CAPS_LATEST_PARSE_ERROR(name) \
DO_TEST_CAPS_ARCH_LATEST_PARSE_ERROR ( name , " x86_64 " )
# define DO_TEST_CAPS_VER_PARSE_ERROR(name, ver) \
DO_TEST_CAPS_ARCH_VER_PARSE_ERROR ( name , " x86_64 " , ver )
2019-03-14 16:43:23 +03:00
/* All the following macros require an explicit QEMU_CAPS_* list
* at the end of the argument list , or the NONE placeholder .
* */
2017-11-03 15:09:47 +03:00
# define DO_TEST(name, ...) \
2021-08-16 18:02:16 +03:00
DO_TEST_FULL ( name , " " , ARG_QEMU_CAPS , __VA_ARGS__ , QEMU_CAPS_LAST , ARG_END )
2021-08-17 11:35:53 +03:00
# define DO_TEST_NOCAPS(name) \
DO_TEST_FULL ( name , " " , ARG_END )
2012-07-09 20:29:55 +04:00
2017-11-03 15:09:47 +03:00
# define DO_TEST_GIC(name, gic, ...) \
2021-08-16 18:02:16 +03:00
DO_TEST_FULL ( name , " " , \
2019-03-13 22:49:18 +03:00
ARG_GIC , gic , \
2021-08-16 18:02:16 +03:00
ARG_QEMU_CAPS , __VA_ARGS__ , QEMU_CAPS_LAST , ARG_END )
2022-01-06 14:32:33 +03:00
# define DO_TEST_MACOS(name, ...) \
DO_TEST_FULL ( name , " " , \
ARG_HOST_OS , HOST_OS_MACOS , \
ARG_QEMU_CAPS , __VA_ARGS__ , QEMU_CAPS_LAST , ARG_END )
2016-05-10 13:36:10 +03:00
2017-11-03 15:09:47 +03:00
# define DO_TEST_FAILURE(name, ...) \
2021-08-16 18:02:16 +03:00
DO_TEST_FULL ( name , " " , \
2019-03-13 23:04:44 +03:00
ARG_FLAGS , FLAG_EXPECT_FAILURE , \
2021-08-16 18:02:16 +03:00
ARG_QEMU_CAPS , __VA_ARGS__ , QEMU_CAPS_LAST , ARG_END )
2021-08-17 11:35:53 +03:00
# define DO_TEST_FAILURE_NOCAPS(name) \
DO_TEST_FULL ( name , " " , ARG_FLAGS , FLAG_EXPECT_FAILURE , ARG_END )
2012-07-09 20:29:55 +04:00
2017-11-03 15:09:47 +03:00
# define DO_TEST_PARSE_ERROR(name, ...) \
2021-08-16 18:02:16 +03:00
DO_TEST_FULL ( name , " " , \
2019-03-13 23:04:44 +03:00
ARG_FLAGS , FLAG_EXPECT_PARSE_ERROR | FLAG_EXPECT_FAILURE , \
2021-08-16 18:02:16 +03:00
ARG_QEMU_CAPS , __VA_ARGS__ , QEMU_CAPS_LAST , ARG_END )
2021-08-17 11:35:53 +03:00
# define DO_TEST_PARSE_ERROR_NOCAPS(name) \
DO_TEST_FULL ( name , " " , \
ARG_FLAGS , FLAG_EXPECT_PARSE_ERROR | FLAG_EXPECT_FAILURE , \
ARG_END )
2016-02-25 18:21:13 +03:00
2009-12-28 18:21:15 +03:00
/* Unset or set all envvars here that are copied in qemudBuildCommandLine
* using ADD_ENV_COPY , otherwise these tests may fail due to unexpected
* values for these envvars */
2019-12-18 20:16:19 +03:00
g_setenv ( " PATH " , " /bin " , TRUE ) ;
g_setenv ( " USER " , " test " , TRUE ) ;
g_setenv ( " LOGNAME " , " test " , TRUE ) ;
g_setenv ( " HOME " , " /home/test " , TRUE ) ;
2020-09-22 14:57:39 +03:00
g_setenv ( " LC_ALL " , " C " , TRUE ) ;
2019-12-18 20:16:19 +03:00
g_unsetenv ( " TMPDIR " ) ;
g_unsetenv ( " LD_PRELOAD " ) ;
g_unsetenv ( " LD_LIBRARY_PATH " ) ;
2022-08-17 16:41:57 +03:00
g_unsetenv ( " DYLD_INSERT_LIBRARIES " ) ;
g_unsetenv ( " DYLD_FORCE_FLAT_NAMESPACE " ) ;
2019-12-18 20:16:19 +03:00
g_unsetenv ( " QEMU_AUDIO_DRV " ) ;
g_unsetenv ( " SDL_AUDIODRIVER " ) ;
2008-10-10 20:52:20 +04:00
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " minimal " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " minimal-no-memory " ) ;
2018-03-21 01:29:46 +03:00
DO_TEST_CAPS_LATEST ( " genid " ) ;
DO_TEST_CAPS_LATEST ( " genid-auto " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " machine-aliases1 " ) ;
2012-09-14 18:34:33 +04:00
DO_TEST ( " machine-aliases2 " , QEMU_CAPS_KVM ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " machine-core-on " ) ;
2016-08-03 18:20:19 +03:00
driver . config - > dumpGuestCore = true ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " machine-core-off " ) ;
2016-08-03 18:20:19 +03:00
driver . config - > dumpGuestCore = false ;
2022-05-13 17:00:09 +03:00
DO_TEST_CAPS_LATEST ( " machine-smm-on " ) ;
2022-05-13 17:05:26 +03:00
DO_TEST_CAPS_LATEST ( " machine-smm-off " ) ;
2018-03-29 13:51:55 +03:00
DO_TEST ( " machine-vmport-opt " ,
2015-04-02 19:44:44 +03:00
QEMU_CAPS_MACHINE_VMPORT_OPT ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " default-kvm-host-arch " ) ;
DO_TEST_NOCAPS ( " default-qemu-host-arch " ) ;
2022-01-06 00:19:40 +03:00
DO_TEST_CAPS_LATEST ( " x86-kvm-32-on-64 " ) ;
2022-08-23 16:13:53 +03:00
DO_TEST_CAPS_LATEST ( " boot-cdrom " ) ;
DO_TEST_CAPS_LATEST ( " boot-network " ) ;
DO_TEST_CAPS_LATEST ( " boot-floppy " ) ;
DO_TEST_CAPS_LATEST ( " boot-floppy-q35 " ) ;
DO_TEST_CAPS_LATEST ( " boot-multi " ) ;
DO_TEST_CAPS_LATEST ( " boot-menu-enable " ) ;
DO_TEST_CAPS_LATEST ( " boot-menu-enable-with-timeout " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " boot-menu-enable-with-timeout-invalid " ) ;
DO_TEST_CAPS_LATEST ( " boot-menu-disable " ) ;
DO_TEST_CAPS_LATEST ( " boot-menu-disable-drive " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " boot-dev+order " ) ;
DO_TEST_CAPS_LATEST ( " boot-order " ) ;
DO_TEST_CAPS_LATEST ( " boot-complex " ) ;
2012-09-18 14:32:07 +04:00
2021-02-24 17:40:19 +03:00
DO_TEST_CAPS_LATEST ( " audio-none-minimal " ) ;
DO_TEST_CAPS_LATEST ( " audio-alsa-minimal " ) ;
DO_TEST_CAPS_LATEST ( " audio-coreaudio-minimal " ) ;
DO_TEST_CAPS_LATEST ( " audio-jack-minimal " ) ;
DO_TEST_CAPS_LATEST ( " audio-oss-minimal " ) ;
DO_TEST_CAPS_LATEST ( " audio-pulseaudio-minimal " ) ;
DO_TEST_CAPS_LATEST ( " audio-sdl-minimal " ) ;
DO_TEST_CAPS_LATEST ( " audio-spice-minimal " ) ;
DO_TEST_CAPS_LATEST ( " audio-file-minimal " ) ;
2021-03-02 20:22:47 +03:00
DO_TEST_CAPS_LATEST ( " audio-none-best " ) ;
DO_TEST_CAPS_LATEST ( " audio-alsa-best " ) ;
DO_TEST_CAPS_LATEST ( " audio-coreaudio-best " ) ;
2021-02-24 17:40:19 +03:00
DO_TEST_CAPS_LATEST ( " audio-oss-best " ) ;
2021-03-02 20:22:47 +03:00
DO_TEST_CAPS_LATEST ( " audio-pulseaudio-best " ) ;
2021-02-24 17:40:19 +03:00
DO_TEST_CAPS_LATEST ( " audio-sdl-best " ) ;
2021-03-02 20:22:47 +03:00
DO_TEST_CAPS_LATEST ( " audio-spice-best " ) ;
DO_TEST_CAPS_LATEST ( " audio-file-best " ) ;
DO_TEST_CAPS_LATEST ( " audio-none-full " ) ;
DO_TEST_CAPS_LATEST ( " audio-alsa-full " ) ;
DO_TEST_CAPS_LATEST ( " audio-coreaudio-full " ) ;
DO_TEST_CAPS_LATEST ( " audio-jack-full " ) ;
DO_TEST_CAPS_LATEST ( " audio-oss-full " ) ;
DO_TEST_CAPS_LATEST ( " audio-pulseaudio-full " ) ;
DO_TEST_CAPS_LATEST ( " audio-sdl-full " ) ;
DO_TEST_CAPS_LATEST ( " audio-spice-full " ) ;
DO_TEST_CAPS_LATEST ( " audio-file-full " ) ;
2021-02-24 17:40:19 +03:00
DO_TEST_CAPS_LATEST ( " audio-many-backends " ) ;
2021-02-23 21:32:25 +03:00
2021-02-24 17:24:10 +03:00
/* Validate auto-creation of <audio> for legacy compat */
g_setenv ( " QEMU_AUDIO_DRV " , " sdl " , TRUE ) ;
g_setenv ( " SDL_AUDIODRIVER " , " esd " , TRUE ) ;
2021-06-15 12:46:54 +03:00
DO_TEST ( " audio-default-sdl " , QEMU_CAPS_DEVICE_CIRRUS_VGA , QEMU_CAPS_SDL ) ;
2021-02-24 17:40:19 +03:00
DO_TEST_CAPS_LATEST ( " audio-default-sdl " ) ;
2021-02-24 17:24:10 +03:00
g_unsetenv ( " QEMU_AUDIO_DRV " ) ;
g_unsetenv ( " SDL_AUDIODRIVER " ) ;
g_setenv ( " QEMU_AUDIO_DRV " , " alsa " , TRUE ) ;
driver . config - > vncAllowHostAudio = true ;
DO_TEST ( " audio-default-vnc " , QEMU_CAPS_VNC , QEMU_CAPS_DEVICE_CIRRUS_VGA ) ;
2021-02-24 17:40:19 +03:00
DO_TEST_CAPS_LATEST ( " audio-default-vnc " ) ;
2021-02-24 17:24:10 +03:00
driver . config - > vncAllowHostAudio = false ;
g_unsetenv ( " QEMU_AUDIO_DRV " ) ;
DO_TEST ( " audio-default-spice " , QEMU_CAPS_SPICE , QEMU_CAPS_DEVICE_CIRRUS_VGA ) ;
2021-02-24 17:40:19 +03:00
DO_TEST_CAPS_LATEST ( " audio-default-spice " ) ;
2021-02-24 17:24:10 +03:00
g_setenv ( " QEMU_AUDIO_DRV " , " alsa " , TRUE ) ;
driver . config - > nogfxAllowHostAudio = true ;
2021-02-24 17:40:19 +03:00
DO_TEST_CAPS_LATEST ( " audio-default-nographics " ) ;
2021-02-24 17:24:10 +03:00
driver . config - > nogfxAllowHostAudio = false ;
g_unsetenv ( " QEMU_AUDIO_DRV " ) ;
2021-08-09 11:02:06 +03:00
DO_TEST_NOCAPS ( " reboot-timeout-disabled " ) ;
DO_TEST_NOCAPS ( " reboot-timeout-enabled " ) ;
2012-09-18 14:32:07 +04:00
2023-02-08 21:10:48 +03:00
DO_TEST_CAPS_LATEST ( " firmware-manual-bios " ) ;
DO_TEST_CAPS_LATEST ( " firmware-manual-bios-stateless " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " firmware-manual-bios-not-stateless " ) ;
DO_TEST_CAPS_LATEST ( " firmware-manual-efi " ) ;
2022-06-20 18:44:31 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " firmware-manual-efi-features " ) ;
2023-01-26 17:23:38 +03:00
DO_TEST_CAPS_LATEST ( " firmware-manual-efi-rw " ) ;
DO_TEST_CAPS_LATEST ( " firmware-manual-efi-rw-implicit " ) ;
2023-03-16 19:36:45 +03:00
DO_TEST_CAPS_LATEST ( " firmware-manual-efi-loader-secure " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " firmware-manual-efi-loader-no-path " ) ;
2023-03-15 21:39:06 +03:00
DO_TEST_CAPS_LATEST ( " firmware-manual-efi-secboot " ) ;
DO_TEST_CAPS_LATEST ( " firmware-manual-efi-no-enrolled-keys " ) ;
DO_TEST_CAPS_LATEST ( " firmware-manual-efi-no-secboot " ) ;
2022-07-22 18:59:43 +03:00
DO_TEST_CAPS_LATEST ( " firmware-manual-efi-stateless " ) ;
2022-06-09 16:54:36 +03:00
DO_TEST_CAPS_LATEST ( " firmware-manual-efi-nvram-template " ) ;
conf: support stateless UEFI firmware
Normally when an UEFI firmware is marked as read-only, an associated
NVRAM file will be created. Some builds of UEFI firmware, however, wish
to remain stateless and so will be read-only, but never have any NVRAM
file. To represent this concept a 'stateless' tristate bool attribute
is introduced on the <loader/> element.
There are rather a large number of permutations to consider.
With default firmware selection
* <os/>
=> Historic default, no change
* <os>
<loader stateless='yes'/>
</os>
=> Explicit version of historic default, no change
* <os>
<loader stateless='no'/>
</os>
=> Invalid, bios is always stateless
With manual legacy BIOS selection
* <os>
<loader>/path/to/seabios</loader>
...
</os>
=> Historic default, no change
* <os>
<loader stateless='yes'>/path/to/seabios</loader>
...
</os>
=> Explicit version of historic default, no change
* <os>
<loader stateless='no'>/path/to/seabios</loader>
...
</os>
=> Invalid, bios is always stateless
With manual UEFI selection
* <os>
<loader type='pflash'>/path/to/edk2</loader>
...
</os>
=> Historic default, no change
* <os>
<loader type='pflash' stateless='yes'>/path/to/edk2</loader>
...
</os>
=> Skip auto-filling NVRAM / template
* <os>
<loader type='pflash' stateless='no'>/path/to/edk2</loader>
...
</os>
=> Explicit version of historic default, no change
With automatic firmware selection
* <os firmware='bios'/>
=> Historic default, no change
* <os firmware='bios'>
<loader stateless='yes'/>
</os>
=> Explicit version of historic default, no change
* <os firmware='bios'>
<loader stateless='no'/>
</os>
=> Invalid, bios is always stateless
* <os firmware='uefi'/>
=> Historic default, no change
* <os firmware='uefi'>
<loader stateless='yes'/>
</os>
=> Skip auto-filling NVRAM / template
* <os firmware='uefi'>
<loader stateless='no'/>
</os>
=> Explicit version of historic default, no change
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2022-07-22 17:27:55 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " firmware-manual-efi-nvram-template-stateless " ) ;
2022-06-09 16:54:36 +03:00
DO_TEST_CAPS_LATEST ( " firmware-manual-efi-nvram-network-iscsi " ) ;
DO_TEST_CAPS_LATEST ( " firmware-manual-efi-nvram-network-nbd " ) ;
DO_TEST_CAPS_LATEST ( " firmware-manual-efi-nvram-file " ) ;
conf: support stateless UEFI firmware
Normally when an UEFI firmware is marked as read-only, an associated
NVRAM file will be created. Some builds of UEFI firmware, however, wish
to remain stateless and so will be read-only, but never have any NVRAM
file. To represent this concept a 'stateless' tristate bool attribute
is introduced on the <loader/> element.
There are rather a large number of permutations to consider.
With default firmware selection
* <os/>
=> Historic default, no change
* <os>
<loader stateless='yes'/>
</os>
=> Explicit version of historic default, no change
* <os>
<loader stateless='no'/>
</os>
=> Invalid, bios is always stateless
With manual legacy BIOS selection
* <os>
<loader>/path/to/seabios</loader>
...
</os>
=> Historic default, no change
* <os>
<loader stateless='yes'>/path/to/seabios</loader>
...
</os>
=> Explicit version of historic default, no change
* <os>
<loader stateless='no'>/path/to/seabios</loader>
...
</os>
=> Invalid, bios is always stateless
With manual UEFI selection
* <os>
<loader type='pflash'>/path/to/edk2</loader>
...
</os>
=> Historic default, no change
* <os>
<loader type='pflash' stateless='yes'>/path/to/edk2</loader>
...
</os>
=> Skip auto-filling NVRAM / template
* <os>
<loader type='pflash' stateless='no'>/path/to/edk2</loader>
...
</os>
=> Explicit version of historic default, no change
With automatic firmware selection
* <os firmware='bios'/>
=> Historic default, no change
* <os firmware='bios'>
<loader stateless='yes'/>
</os>
=> Explicit version of historic default, no change
* <os firmware='bios'>
<loader stateless='no'/>
</os>
=> Invalid, bios is always stateless
* <os firmware='uefi'/>
=> Historic default, no change
* <os firmware='uefi'>
<loader stateless='yes'/>
</os>
=> Skip auto-filling NVRAM / template
* <os firmware='uefi'>
<loader stateless='no'/>
</os>
=> Explicit version of historic default, no change
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2022-07-22 17:27:55 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " firmware-manual-efi-nvram-stateless " ) ;
2017-03-09 18:38:56 +03:00
/* Make sure all combinations of ACPI and UEFI behave as expected */
2023-02-08 21:10:48 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " firmware-manual-efi-acpi-aarch64 " , " aarch64 " ) ;
DO_TEST_CAPS_LATEST ( " firmware-manual-efi-acpi-q35 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " firmware-manual-efi-noacpi-aarch64 " , " aarch64 " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " firmware-manual-efi-noacpi-q35 " ) ;
DO_TEST_CAPS_ARCH_LATEST_PARSE_ERROR ( " firmware-manual-noefi-acpi-aarch64 " , " aarch64 " ) ;
DO_TEST_CAPS_LATEST ( " firmware-manual-noefi-acpi-q35 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " firmware-manual-noefi-noacpi-aarch64 " , " aarch64 " ) ;
DO_TEST_CAPS_LATEST ( " firmware-manual-noefi-noacpi-q35 " ) ;
2022-06-09 16:54:36 +03:00
DO_TEST_CAPS_LATEST ( " firmware-auto-bios " ) ;
conf: support stateless UEFI firmware
Normally when an UEFI firmware is marked as read-only, an associated
NVRAM file will be created. Some builds of UEFI firmware, however, wish
to remain stateless and so will be read-only, but never have any NVRAM
file. To represent this concept a 'stateless' tristate bool attribute
is introduced on the <loader/> element.
There are rather a large number of permutations to consider.
With default firmware selection
* <os/>
=> Historic default, no change
* <os>
<loader stateless='yes'/>
</os>
=> Explicit version of historic default, no change
* <os>
<loader stateless='no'/>
</os>
=> Invalid, bios is always stateless
With manual legacy BIOS selection
* <os>
<loader>/path/to/seabios</loader>
...
</os>
=> Historic default, no change
* <os>
<loader stateless='yes'>/path/to/seabios</loader>
...
</os>
=> Explicit version of historic default, no change
* <os>
<loader stateless='no'>/path/to/seabios</loader>
...
</os>
=> Invalid, bios is always stateless
With manual UEFI selection
* <os>
<loader type='pflash'>/path/to/edk2</loader>
...
</os>
=> Historic default, no change
* <os>
<loader type='pflash' stateless='yes'>/path/to/edk2</loader>
...
</os>
=> Skip auto-filling NVRAM / template
* <os>
<loader type='pflash' stateless='no'>/path/to/edk2</loader>
...
</os>
=> Explicit version of historic default, no change
With automatic firmware selection
* <os firmware='bios'/>
=> Historic default, no change
* <os firmware='bios'>
<loader stateless='yes'/>
</os>
=> Explicit version of historic default, no change
* <os firmware='bios'>
<loader stateless='no'/>
</os>
=> Invalid, bios is always stateless
* <os firmware='uefi'/>
=> Historic default, no change
* <os firmware='uefi'>
<loader stateless='yes'/>
</os>
=> Skip auto-filling NVRAM / template
* <os firmware='uefi'>
<loader stateless='no'/>
</os>
=> Explicit version of historic default, no change
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2022-07-22 17:27:55 +03:00
DO_TEST_CAPS_LATEST ( " firmware-auto-bios-stateless " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " firmware-auto-bios-not-stateless " ) ;
2022-06-15 13:00:58 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " firmware-auto-bios-nvram " ) ;
2022-06-09 16:54:36 +03:00
DO_TEST_CAPS_LATEST ( " firmware-auto-efi " ) ;
2022-07-22 18:59:43 +03:00
DO_TEST_CAPS_LATEST ( " firmware-auto-efi-stateless " ) ;
2022-06-09 16:56:32 +03:00
DO_TEST_CAPS_LATEST ( " firmware-auto-efi-nvram " ) ;
2022-06-09 16:54:36 +03:00
DO_TEST_CAPS_LATEST ( " firmware-auto-efi-loader-secure " ) ;
conf: Remove some firmware validation checks
libvirt 8.6.0 introduced these checks and very clearly delineated
two possible firmware selection scenarios: manual firmware
selection, where the user is responsible for providing all
information, and firmware autoselection, where a list of desired
features is provided and everything else is handled by libvirt.
In the interest of maintaining the clear separation between these
two scenarios, setting most attributes when firmware autoselection
is active will result in the configuration being rejected.
This works fine, but is unnecessarily restrictive: in most cases,
the additional information that the user has provided matches
the information that libvirt would have discovered on its own by
looking at firmware descriptors, and asking the user to scrub it
from the XML only result in pointless friction.
Remove these checks entirely.
Unsurprisingly, this results in a few test cases that were
rejected until now to suddenly start working and producing
sensible results.
The firmware-auto-efi-loader-path-nonstandard test case is
notable: while we can now enable the xml2xml part of the test,
the xml2argv part is still failing, although in a slightly
different way. This is expected: since the firmware binary is a
non-standard one, libvirt is unable to figure out the missing
information from a firmware descriptor, and the configuration
is still ultimately an invalid one. However, if we were to find
such a configuration on disk at daemon startup, we would not
ignore it completely and instead would offer the user a chance
to fix it.
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
2023-03-15 01:02:46 +03:00
DO_TEST_CAPS_LATEST ( " firmware-auto-efi-loader-insecure " ) ;
DO_TEST_CAPS_LATEST ( " firmware-auto-efi-loader-path " ) ;
DO_TEST_CAPS_LATEST_FAILURE ( " firmware-auto-efi-loader-path-nonstandard " ) ;
2022-06-09 16:56:32 +03:00
DO_TEST_CAPS_LATEST ( " firmware-auto-efi-secboot " ) ;
DO_TEST_CAPS_LATEST ( " firmware-auto-efi-no-secboot " ) ;
DO_TEST_CAPS_LATEST ( " firmware-auto-efi-enrolled-keys " ) ;
2022-06-09 16:54:36 +03:00
DO_TEST_CAPS_LATEST ( " firmware-auto-efi-no-enrolled-keys " ) ;
2022-06-15 12:30:48 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " firmware-auto-efi-enrolled-keys-no-secboot " ) ;
2023-01-27 19:22:24 +03:00
DO_TEST_CAPS_LATEST ( " firmware-auto-efi-smm-off " ) ;
2022-06-09 16:54:36 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " firmware-auto-efi-aarch64 " , " aarch64 " ) ;
2023-03-27 20:56:46 +03:00
DO_TEST_CAPS_ARCH_LATEST_ABI_UPDATE ( " firmware-auto-efi-abi-update-aarch64 " , " aarch64 " ) ;
2023-02-10 19:40:29 +03:00
DO_TEST_CAPS_LATEST ( " firmware-auto-efi-nvram-file " ) ;
DO_TEST_CAPS_LATEST ( " firmware-auto-efi-nvram-network-nbd " ) ;
DO_TEST_CAPS_LATEST ( " firmware-auto-efi-nvram-network-iscsi " ) ;
2021-08-17 11:35:53 +03:00
2023-02-08 20:47:39 +03:00
DO_TEST_CAPS_LATEST ( " firmware-auto-efi-format-loader-qcow2 " ) ;
DO_TEST_CAPS_LATEST ( " firmware-auto-efi-format-nvram-qcow2 " ) ;
DO_TEST_CAPS_LATEST ( " firmware-auto-efi-format-nvram-qcow2-path " ) ;
DO_TEST_CAPS_LATEST ( " firmware-auto-efi-format-nvram-qcow2-network-nbd " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " firmware-auto-efi-format-loader-raw " , " aarch64 " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " firmware-auto-efi-format-mismatch " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " clock-utc " ) ;
DO_TEST_NOCAPS ( " clock-localtime " ) ;
DO_TEST_NOCAPS ( " clock-localtime-basis-localtime " ) ;
DO_TEST_NOCAPS ( " clock-variable " ) ;
DO_TEST_NOCAPS ( " clock-france " ) ;
DO_TEST_NOCAPS ( " clock-hpet-off " ) ;
2018-05-03 11:38:42 +03:00
DO_TEST ( " clock-catchup " , QEMU_CAPS_KVM_PIT_TICK_POLICY ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " cpu-kvmclock " ) ;
DO_TEST_NOCAPS ( " cpu-host-kvmclock " ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " kvmclock " , QEMU_CAPS_KVM ) ;
2014-01-21 21:50:12 +04:00
DO_TEST ( " clock-timer-hyperv-rtc " , QEMU_CAPS_KVM ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " clock-realtime " ) ;
2022-04-26 18:21:51 +03:00
DO_TEST_CAPS_LATEST ( " clock-absolute " ) ;
2012-07-09 20:29:55 +04:00
2022-01-05 15:01:10 +03:00
DO_TEST_CAPS_LATEST ( " controller-usb-order " ) ;
2016-05-20 15:41:49 +03:00
DO_TEST ( " controller-order " ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_KVM ,
QEMU_CAPS_PIIX3_USB_UHCI ,
QEMU_CAPS_CCID_PASSTHRU ,
QEMU_CAPS_SPICE ,
QEMU_CAPS_HDA_DUPLEX ,
QEMU_CAPS_USB_HUB ,
2017-11-26 19:35:28 +03:00
QEMU_CAPS_DEVICE_ISA_SERIAL ,
2016-10-10 18:51:38 +03:00
QEMU_CAPS_DEVICE_CIRRUS_VGA ) ;
2022-06-21 18:07:51 +03:00
/* 'eoi' cpu feature with an explicit CPU defined */
DO_TEST_CAPS_LATEST ( " cpu-eoi-disabled " ) ;
DO_TEST_CAPS_LATEST ( " cpu-eoi-enabled " ) ;
/* 'eoi' cpu feature without an explicit CPU defined */
2019-06-12 13:08:06 +03:00
DO_TEST_CAPS_LATEST ( " eoi-disabled " ) ;
DO_TEST_CAPS_LATEST ( " eoi-enabled " ) ;
DO_TEST_CAPS_LATEST ( " pv-spinlock-disabled " ) ;
DO_TEST_CAPS_LATEST ( " pv-spinlock-enabled " ) ;
DO_TEST_CAPS_LATEST ( " kvmclock+eoi-disabled " ) ;
2012-09-13 17:27:07 +04:00
2019-08-09 17:31:38 +03:00
DO_TEST_CAPS_LATEST ( " hyperv " ) ;
DO_TEST_CAPS_LATEST ( " hyperv-off " ) ;
DO_TEST_CAPS_LATEST ( " hyperv-panic " ) ;
2021-11-25 21:57:49 +03:00
DO_TEST_CAPS_VER ( " hyperv-passthrough " , " 6.1.0 " ) ;
DO_TEST_CAPS_LATEST ( " hyperv-passthrough " ) ;
2019-08-09 17:31:40 +03:00
DO_TEST_CAPS_LATEST ( " hyperv-stimer-direct " ) ;
2012-10-17 16:55:18 +04:00
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " kvm-features " ) ;
DO_TEST_NOCAPS ( " kvm-features-off " ) ;
2014-08-21 21:04:45 +04:00
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " pmu-feature " ) ;
DO_TEST_NOCAPS ( " pmu-feature-off " ) ;
2015-01-05 18:52:18 +03:00
2022-11-02 16:10:41 +03:00
DO_TEST_CAPS_LATEST ( " pages-discard " ) ;
DO_TEST_CAPS_LATEST ( " pages-discard-hugepages " ) ;
DO_TEST_CAPS_LATEST ( " pages-dimm-discard " ) ;
DO_TEST_CAPS_LATEST ( " hugepages-default " ) ;
DO_TEST_CAPS_LATEST ( " hugepages-default-2M " ) ;
DO_TEST_CAPS_LATEST ( " hugepages-default-system-size " ) ;
2022-02-22 11:02:17 +03:00
DO_TEST_CAPS_LATEST_FAILURE ( " hugepages-default-5M " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " hugepages-default-1G-nodeset-2M " ) ;
2022-11-02 16:10:41 +03:00
DO_TEST_CAPS_LATEST ( " hugepages-nodeset " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " hugepages-nodeset-nonexist " ) ;
DO_TEST_CAPS_LATEST ( " hugepages-numa-default " ) ;
DO_TEST_CAPS_LATEST ( " hugepages-numa-default-2M " ) ;
DO_TEST_CAPS_LATEST ( " hugepages-numa-default-dimm " ) ;
DO_TEST_CAPS_LATEST ( " hugepages-numa-nodeset " ) ;
DO_TEST_CAPS_LATEST ( " hugepages-numa-nodeset-part " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " hugepages-numa-nodeset-nonexist " ) ;
DO_TEST_CAPS_LATEST ( " hugepages-shared " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " hugepages-memaccess-invalid " ) ;
2022-11-02 16:10:41 +03:00
DO_TEST_CAPS_LATEST ( " hugepages-memaccess " ) ;
DO_TEST_CAPS_LATEST ( " hugepages-memaccess2 " ) ;
2022-11-03 18:01:02 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " hugepages-memaccess3 " ) ;
2020-12-14 14:20:07 +03:00
DO_TEST_CAPS_LATEST ( " hugepages-memaccess3 " ) ;
2018-08-09 17:29:17 +03:00
DO_TEST_CAPS_LATEST ( " hugepages-nvdimm " ) ;
2021-08-09 15:56:11 +03:00
DO_TEST_NOCAPS ( " nosharepages " ) ;
2021-09-21 17:35:51 +03:00
2022-09-30 16:45:08 +03:00
DO_TEST_CAPS_ARCH_LATEST_PARSE_ERROR ( " non-x86_64-timer-error " , " s390x " ) ;
2021-09-21 17:35:51 +03:00
2018-07-19 15:07:17 +03:00
DO_TEST_CAPS_LATEST ( " disk-cdrom " ) ;
2019-10-15 16:19:58 +03:00
DO_TEST_CAPS_LATEST ( " disk-cdrom-empty-network-invalid " ) ;
2019-01-28 17:59:36 +03:00
DO_TEST_CAPS_LATEST ( " disk-cdrom-bus-other " ) ;
2018-07-19 15:07:17 +03:00
DO_TEST_CAPS_LATEST ( " disk-cdrom-network " ) ;
DO_TEST_CAPS_LATEST ( " disk-cdrom-tray " ) ;
2018-07-19 18:30:07 +03:00
DO_TEST_CAPS_LATEST ( " disk-floppy " ) ;
2022-01-05 12:07:41 +03:00
DO_TEST_CAPS_LATEST ( " disk-floppy-q35 " ) ;
2021-09-22 11:46:06 +03:00
DO_TEST_CAPS_ARCH_LATEST_FAILURE ( " disk-floppy-pseries " , " ppc64 " ) ;
2021-09-22 11:21:43 +03:00
DO_TEST_CAPS_LATEST ( " disk-floppy-tray " ) ;
DO_TEST_CAPS_LATEST ( " disk-virtio " ) ;
2021-09-22 11:58:22 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " disk-virtio-ccw " , " s390x " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " disk-virtio-ccw-many " , " s390x " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " disk-virtio-s390-zpci " , " s390x " ) ;
2021-09-22 11:21:43 +03:00
DO_TEST_CAPS_LATEST ( " disk-order " ) ;
2021-09-09 06:34:44 +03:00
DO_TEST_CAPS_LATEST ( " disk-virtio-queues " ) ;
2021-09-22 11:21:43 +03:00
DO_TEST_CAPS_LATEST ( " disk-boot-disk " ) ;
DO_TEST_CAPS_LATEST ( " disk-boot-cdrom " ) ;
2018-07-19 18:30:07 +03:00
DO_TEST_CAPS_LATEST ( " floppy-drive-fat " ) ;
2018-07-19 18:30:07 +03:00
DO_TEST_CAPS_LATEST ( " disk-readonly-disk " ) ;
2021-09-22 11:41:52 +03:00
DO_TEST_CAPS_LATEST ( " disk-fmt-qcow " ) ;
2021-09-21 20:14:19 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-fmt-cow " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-fmt-dir " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-fmt-iso " ) ;
2018-07-19 18:30:07 +03:00
DO_TEST_CAPS_LATEST ( " disk-shared " ) ;
2021-09-21 20:14:19 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-shared-qcow " ) ;
2018-07-19 11:29:29 +03:00
DO_TEST_CAPS_LATEST ( " disk-error-policy " ) ;
2020-03-31 21:15:13 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " disk-error-policy-s390x " , " s390x " ) ;
2018-07-19 15:51:21 +03:00
DO_TEST_CAPS_LATEST ( " disk-cache " ) ;
2021-01-06 20:20:29 +03:00
DO_TEST_CAPS_LATEST ( " disk-metadata-cache " ) ;
2020-09-24 13:23:24 +03:00
DO_TEST_CAPS_LATEST ( " disk-transient " ) ;
2018-07-19 17:29:19 +03:00
DO_TEST_CAPS_LATEST ( " disk-network-nbd " ) ;
2018-07-19 17:19:32 +03:00
DO_TEST_CAPS_LATEST ( " disk-network-iscsi " ) ;
2021-09-21 20:14:19 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-network-iscsi-auth-secrettype-invalid " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-network-iscsi-auth-wrong-secrettype " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-network-source-auth-both " ) ;
2018-07-19 18:30:07 +03:00
DO_TEST_CAPS_LATEST ( " disk-network-gluster " ) ;
2018-07-19 18:07:45 +03:00
DO_TEST_CAPS_LATEST ( " disk-network-rbd " ) ;
2021-10-24 12:51:29 +03:00
DO_TEST_CAPS_VER_PARSE_ERROR ( " disk-network-rbd-encryption " , " 6.0.0 " ) ;
DO_TEST_CAPS_LATEST ( " disk-network-rbd-encryption " ) ;
2023-03-13 12:50:21 +03:00
DO_TEST_CAPS_VER_PARSE_ERROR ( " disk-network-rbd-encryption-layering " , " 7.2.0 " ) ;
DO_TEST_CAPS_LATEST ( " disk-network-rbd-encryption-layering " ) ;
2023-03-13 12:50:23 +03:00
DO_TEST_CAPS_VER_PARSE_ERROR ( " disk-network-rbd-encryption-luks-any " , " 7.2.0 " ) ;
DO_TEST_CAPS_LATEST ( " disk-network-rbd-encryption-luks-any " ) ;
2022-04-22 17:33:28 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-encryption-wrong " ) ;
2021-09-22 11:30:56 +03:00
DO_TEST_CAPS_LATEST ( " disk-network-rbd-no-colon " ) ;
2022-02-10 11:47:19 +03:00
/* qemu-6.0 is the last qemu version supporting sheepdog */
2021-05-17 11:38:25 +03:00
DO_TEST_CAPS_VER ( " disk-network-sheepdog " , " 6.0.0 " ) ;
2018-07-19 18:30:07 +03:00
DO_TEST_CAPS_LATEST ( " disk-network-source-auth " ) ;
2021-01-07 00:32:32 +03:00
DO_TEST_CAPS_LATEST ( " disk-network-nfs " ) ;
qemu: Add TLS support for Veritas HyperScale (VxHS)
Alter qemu command line generation in order to possibly add TLS for
a suitably configured domain.
Sample TLS args generated by libvirt -
-object tls-creds-x509,id=objvirtio-disk0_tls0,dir=/etc/pki/qemu,\
endpoint=client,verify-peer=yes \
-drive file.driver=vxhs,file.tls-creds=objvirtio-disk0_tls0,\
file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,\
file.server.type=tcp,file.server.host=192.168.0.1,\
file.server.port=9999,format=raw,if=none,\
id=drive-virtio-disk0,cache=none \
-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\
id=virtio-disk0
Update the qemuxml2argvtest with a couple of examples. One for a
simple case and the other a bit more complex where multiple VxHS disks
are added where at least one uses a VxHS that doesn't require TLS
credentials and thus sets the domain disk source attribute "tls = 'no'".
Update the hotplug to be able to handle processing the tlsAlias whether
it's to add the TLS object when hotplugging a disk or to remove the TLS
object when hot unplugging a disk. The hot plug/unplug code is largely
generic, but the addition code does make the VXHS specific checks only
because it needs to grab the correct config directory and generate the
object as the command line would do.
Signed-off-by: Ashish Mittal <Ashish.Mittal@veritas.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
2017-08-30 18:06:00 +03:00
driver . config - > vxhsTLS = 1 ;
2020-06-30 18:08:44 +03:00
driver . config - > nbdTLSx509secretUUID = g_strdup ( " 6fd3f62d-9fe7-4a4e-a869-7acd6376d8ea " ) ;
driver . config - > vxhsTLSx509secretUUID = g_strdup ( " 6fd3f62d-9fe7-4a4e-a869-7acd6376d8ea " ) ;
2021-03-12 19:56:49 +03:00
DO_TEST_CAPS_VER ( " disk-network-tlsx509-nbd " , " 5.2.0 " ) ;
2020-07-30 18:29:44 +03:00
DO_TEST_CAPS_LATEST ( " disk-network-tlsx509-nbd " ) ;
2022-03-10 12:05:53 +03:00
DO_TEST_CAPS_VER_PARSE_ERROR ( " disk-network-tlsx509-nbd-hostname " , " 6.2.0 " ) ;
DO_TEST_CAPS_LATEST ( " disk-network-tlsx509-nbd-hostname " ) ;
2020-07-30 18:46:03 +03:00
DO_TEST_CAPS_VER ( " disk-network-tlsx509-vxhs " , " 5.0.0 " ) ;
2020-03-09 14:38:21 +03:00
DO_TEST_CAPS_LATEST ( " disk-network-http " ) ;
2023-03-06 15:43:01 +03:00
VIR_FREE ( driver . config - > nbdTLSx509secretUUID ) ;
VIR_FREE ( driver . config - > vxhsTLSx509secretUUID ) ;
qemu: Add TLS support for Veritas HyperScale (VxHS)
Alter qemu command line generation in order to possibly add TLS for
a suitably configured domain.
Sample TLS args generated by libvirt -
-object tls-creds-x509,id=objvirtio-disk0_tls0,dir=/etc/pki/qemu,\
endpoint=client,verify-peer=yes \
-drive file.driver=vxhs,file.tls-creds=objvirtio-disk0_tls0,\
file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,\
file.server.type=tcp,file.server.host=192.168.0.1,\
file.server.port=9999,format=raw,if=none,\
id=drive-virtio-disk0,cache=none \
-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\
id=virtio-disk0
Update the qemuxml2argvtest with a couple of examples. One for a
simple case and the other a bit more complex where multiple VxHS disks
are added where at least one uses a VxHS that doesn't require TLS
credentials and thus sets the domain disk source attribute "tls = 'no'".
Update the hotplug to be able to handle processing the tlsAlias whether
it's to add the TLS object when hotplugging a disk or to remove the TLS
object when hot unplugging a disk. The hot plug/unplug code is largely
generic, but the addition code does make the VXHS specific checks only
because it needs to grab the correct config directory and generate the
object as the command line would do.
Signed-off-by: Ashish Mittal <Ashish.Mittal@veritas.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
2017-08-30 18:06:00 +03:00
driver . config - > vxhsTLS = 0 ;
2021-09-22 11:21:43 +03:00
DO_TEST_CAPS_LATEST ( " disk-no-boot " ) ;
2019-06-21 16:07:22 +03:00
DO_TEST_CAPS_LATEST ( " disk-nvme " ) ;
2022-01-13 14:47:17 +03:00
DO_TEST_CAPS_VER ( " disk-vhostuser-numa " , " 4.2.0 " ) ;
DO_TEST_CAPS_LATEST ( " disk-vhostuser-numa " ) ;
2021-02-01 14:00:35 +03:00
DO_TEST_CAPS_LATEST ( " disk-vhostuser " ) ;
2021-09-21 20:14:19 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-device-lun-type-invalid " ) ;
2019-09-30 16:41:00 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-attaching-partition-nosupport " ) ;
2021-09-22 11:21:43 +03:00
DO_TEST_CAPS_LATEST ( " disk-usb-device " ) ;
DO_TEST_CAPS_LATEST ( " disk-usb-device-removable " ) ;
2021-09-21 20:14:19 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-usb-pci " ) ;
2019-01-28 14:59:49 +03:00
DO_TEST_CAPS_LATEST ( " disk-scsi " ) ;
2019-01-28 13:25:12 +03:00
DO_TEST_CAPS_LATEST ( " disk-scsi-device-auto " ) ;
2021-09-22 11:21:43 +03:00
DO_TEST_CAPS_LATEST ( " disk-scsi-disk-split " ) ;
DO_TEST_CAPS_LATEST ( " disk-scsi-disk-wwn " ) ;
DO_TEST_CAPS_LATEST ( " disk-scsi-disk-vpd " ) ;
2021-09-21 20:14:19 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-scsi-disk-vpd-build-error " ) ;
2019-01-28 12:47:21 +03:00
DO_TEST_CAPS_LATEST ( " controller-virtio-scsi " ) ;
2021-09-22 11:21:43 +03:00
DO_TEST_CAPS_LATEST ( " disk-sata-device " ) ;
2018-07-19 15:14:11 +03:00
DO_TEST_CAPS_LATEST ( " disk-aio " ) ;
2020-04-21 15:19:37 +03:00
DO_TEST_CAPS_LATEST ( " disk-aio-io_uring " ) ;
2021-09-22 11:41:52 +03:00
DO_TEST_CAPS_LATEST ( " disk-source-pool " ) ;
DO_TEST_CAPS_LATEST ( " disk-source-pool-mode " ) ;
2021-09-22 11:21:43 +03:00
DO_TEST_CAPS_LATEST ( " disk-ioeventfd " ) ;
2018-07-19 14:49:39 +03:00
DO_TEST_CAPS_LATEST ( " disk-copy_on_read " ) ;
2020-05-04 19:53:31 +03:00
DO_TEST_CAPS_LATEST ( " disk-discard " ) ;
2018-07-19 15:12:19 +03:00
DO_TEST_CAPS_LATEST ( " disk-detect-zeroes " ) ;
2021-09-22 11:21:43 +03:00
DO_TEST_CAPS_LATEST ( " disk-snapshot " ) ;
2021-09-21 20:14:19 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-same-targets " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-missing-target-invalid " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-address-conflict " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-hostdev-scsi-address-conflict " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " hostdevs-drive-address-conflict " ) ;
2021-09-22 11:21:43 +03:00
DO_TEST_CAPS_LATEST ( " event_idx " ) ;
DO_TEST_CAPS_LATEST ( " virtio-lun " ) ;
DO_TEST_CAPS_LATEST ( " disk-scsi-lun-passthrough " ) ;
DO_TEST_CAPS_LATEST ( " disk-serial " ) ;
2021-09-21 20:14:19 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-fdc-incompatible-address " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-ide-incompatible-address " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-sata-incompatible-address " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " disk-scsi-incompatible-address " ) ;
2018-06-19 14:16:54 +03:00
DO_TEST_CAPS_LATEST ( " disk-backing-chains-index " ) ;
DO_TEST_CAPS_LATEST ( " disk-backing-chains-noindex " ) ;
2022-12-19 17:54:59 +03:00
DO_TEST_CAPS_ARCH_LATEST_FULL ( " disk-source-fd " , " x86_64 " ,
ARG_FD_GROUP , " testgroup2 " , 2 , 700 , 705 ,
ARG_FD_GROUP , " testgroup5 " , 1 , 704 ,
ARG_FD_GROUP , " testgroup6 " , 2 , 777 , 778 ) ;
2011-06-20 12:26:47 +04:00
2020-02-05 20:18:39 +03:00
DO_TEST_CAPS_LATEST ( " disk-slices " ) ;
2021-03-31 12:17:07 +03:00
DO_TEST_CAPS_LATEST ( " disk-rotation " ) ;
2020-02-05 20:18:39 +03:00
2020-05-06 12:40:18 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " disk-arm-virtio-sd " , " aarch64 " ) ;
2021-09-21 17:43:58 +03:00
DO_TEST_CAPS_LATEST ( " encrypted-disk " ) ;
DO_TEST_CAPS_LATEST ( " encrypted-disk-usage " ) ;
DO_TEST_CAPS_LATEST ( " luks-disks " ) ;
DO_TEST_CAPS_LATEST ( " luks-disks-source " ) ;
2021-09-21 17:35:51 +03:00
DO_TEST_CAPS_VER ( " luks-disks-source-qcow2 " , " 5.2.0 " ) ;
DO_TEST_CAPS_LATEST ( " luks-disks-source-qcow2 " ) ;
2021-09-21 17:43:58 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " luks-disk-invalid " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " luks-disks-source-both " ) ;
2021-09-21 17:35:51 +03:00
2021-09-22 11:21:43 +03:00
DO_TEST_CAPS_LATEST ( " disk-ide-split " ) ;
DO_TEST_CAPS_LATEST ( " disk-ide-wwn " ) ;
DO_TEST_CAPS_LATEST ( " disk-geometry " ) ;
DO_TEST_CAPS_LATEST ( " disk-blockio " ) ;
2021-09-21 17:35:51 +03:00
DO_TEST_CAPS_VER ( " disk-virtio-scsi-reservations " , " 5.2.0 " ) ;
DO_TEST_CAPS_LATEST ( " disk-virtio-scsi-reservations " ) ;
2018-06-30 17:23:01 +03:00
DO_TEST ( " graphics-egl-headless " ,
2021-06-15 12:46:54 +03:00
QEMU_CAPS_DEVICE_CIRRUS_VGA ,
QEMU_CAPS_EGL_HEADLESS ) ;
2018-11-15 13:38:00 +03:00
DO_TEST_CAPS_LATEST ( " graphics-egl-headless " ) ;
DO_TEST_CAPS_LATEST ( " graphics-egl-headless-rendernode " ) ;
2018-06-30 17:23:01 +03:00
2021-09-23 18:15:16 +03:00
DO_TEST_CAPS_LATEST ( " graphics-vnc " ) ;
2021-09-23 18:12:53 +03:00
DO_TEST_CAPS_LATEST ( " graphics-vnc-socket " ) ;
2021-09-23 18:15:16 +03:00
DO_TEST_CAPS_LATEST ( " graphics-vnc-websocket " ) ;
DO_TEST_CAPS_LATEST ( " graphics-vnc-policy " ) ;
2021-02-16 16:38:06 +03:00
DO_TEST_CAPS_LATEST ( " graphics-vnc-power " ) ;
2021-09-23 18:15:16 +03:00
DO_TEST_CAPS_LATEST ( " graphics-vnc-no-listen-attr " ) ;
DO_TEST_CAPS_LATEST ( " graphics-vnc-remove-generated-socket " ) ;
2016-05-19 11:53:55 +03:00
driver . config - > vncAutoUnixSocket = true ;
2021-09-23 18:12:53 +03:00
DO_TEST_CAPS_LATEST ( " graphics-vnc-auto-socket-cfg " ) ;
2016-05-19 11:53:55 +03:00
driver . config - > vncAutoUnixSocket = false ;
2021-09-23 18:12:53 +03:00
DO_TEST_CAPS_LATEST ( " graphics-vnc-auto-socket " ) ;
2021-09-23 18:15:16 +03:00
DO_TEST_CAPS_LATEST ( " graphics-vnc-none " ) ;
DO_TEST_CAPS_LATEST ( " graphics-vnc-socket-new-cmdline " ) ;
2009-03-16 16:54:26 +03:00
2013-01-11 01:03:14 +04:00
driver . config - > vncSASL = 1 ;
2021-09-23 18:15:16 +03:00
DO_TEST_CAPS_LATEST ( " graphics-vnc-sasl " ) ;
2013-01-11 01:03:14 +04:00
driver . config - > vncTLS = 1 ;
driver . config - > vncTLSx509verify = 1 ;
2018-07-16 16:15:21 +03:00
DO_TEST_CAPS_LATEST ( " graphics-vnc-tls " ) ;
2019-10-20 14:49:46 +03:00
driver . config - > vncTLSx509secretUUID = g_strdup ( " 6fd3f62d-9fe7-4a4e-a869-7acd6376d8ea " ) ;
2021-03-12 19:56:49 +03:00
DO_TEST_CAPS_VER ( " graphics-vnc-tls-secret " , " 5.2.0 " ) ;
2019-01-14 16:20:01 +03:00
DO_TEST_CAPS_LATEST ( " graphics-vnc-tls-secret " ) ;
VIR_FREE ( driver . config - > vncTLSx509secretUUID ) ;
2013-01-11 01:03:14 +04:00
driver . config - > vncSASL = driver . config - > vncTLSx509verify = driver . config - > vncTLS = 0 ;
2021-09-23 18:15:16 +03:00
DO_TEST_CAPS_LATEST ( " graphics-vnc-egl-headless " ) ;
2009-03-16 16:54:26 +03:00
2018-03-29 13:51:55 +03:00
DO_TEST ( " graphics-sdl " ,
2021-06-15 12:46:54 +03:00
QEMU_CAPS_DEVICE_VGA , QEMU_CAPS_SDL ) ;
2018-12-07 16:53:46 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " graphics-sdl-egl-headless " ) ;
2018-03-29 13:51:55 +03:00
DO_TEST ( " graphics-sdl-fullscreen " ,
2021-06-15 12:46:54 +03:00
QEMU_CAPS_DEVICE_CIRRUS_VGA , QEMU_CAPS_SDL ) ;
2023-03-02 22:23:37 +03:00
driver . config - > spiceTLS = 1 ;
2021-11-02 17:29:30 +03:00
DO_TEST_CAPS_LATEST ( " graphics-spice " ) ;
DO_TEST_CAPS_LATEST ( " graphics-spice-no-args " ) ;
2012-02-24 18:13:06 +04:00
driver . config - > spiceSASL = 1 ;
2021-11-02 17:29:30 +03:00
DO_TEST_CAPS_LATEST ( " graphics-spice-sasl " ) ;
2012-02-24 18:13:06 +04:00
driver . config - > spiceSASL = 0 ;
2021-11-02 17:29:30 +03:00
DO_TEST_CAPS_LATEST ( " graphics-spice-agentmouse " ) ;
DO_TEST_CAPS_LATEST ( " graphics-spice-compression " ) ;
DO_TEST_CAPS_LATEST ( " graphics-spice-timeout " ) ;
DO_TEST_CAPS_LATEST ( " graphics-spice-qxl-vga " ) ;
DO_TEST_CAPS_LATEST ( " graphics-spice-usb-redir " ) ;
DO_TEST_CAPS_LATEST ( " graphics-spice-agent-file-xfer " ) ;
DO_TEST_CAPS_LATEST ( " graphics-spice-socket " ) ;
DO_TEST_CAPS_LATEST ( " graphics-spice-auto-socket " ) ;
2016-05-18 15:11:20 +03:00
driver . config - > spiceAutoUnixSocket = true ;
2021-11-02 17:29:30 +03:00
DO_TEST_CAPS_LATEST ( " graphics-spice-auto-socket-cfg " ) ;
2016-05-18 15:11:20 +03:00
driver . config - > spiceAutoUnixSocket = false ;
2021-11-02 17:29:30 +03:00
DO_TEST_CAPS_LATEST ( " graphics-spice-egl-headless " ) ;
2018-12-07 16:53:46 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " graphics-spice-invalid-egl-headless " ) ;
2018-11-14 18:48:27 +03:00
DO_TEST_CAPS_LATEST ( " graphics-spice-gl-auto-rendernode " ) ;
2023-03-02 22:23:37 +03:00
driver . config - > spiceTLS = 0 ;
2011-02-08 17:22:39 +03:00
2022-05-13 21:38:13 +03:00
DO_TEST ( " graphics-dbus " ,
QEMU_CAPS_DEVICE_CIRRUS_VGA , QEMU_CAPS_DISPLAY_DBUS ) ;
DO_TEST ( " graphics-dbus-address " ,
QEMU_CAPS_DEVICE_CIRRUS_VGA , QEMU_CAPS_DISPLAY_DBUS ) ;
DO_TEST ( " graphics-dbus-p2p " ,
QEMU_CAPS_DEVICE_CIRRUS_VGA , QEMU_CAPS_DISPLAY_DBUS ) ;
2022-05-13 21:38:16 +03:00
DO_TEST ( " graphics-dbus-audio " ,
2022-06-22 17:14:47 +03:00
QEMU_CAPS_DEVICE_CIRRUS_VGA , QEMU_CAPS_DISPLAY_DBUS ) ;
2022-05-13 21:38:18 +03:00
DO_TEST ( " graphics-dbus-chardev " ,
QEMU_CAPS_DEVICE_ISA_SERIAL ,
QEMU_CAPS_DEVICE_CIRRUS_VGA ,
QEMU_CAPS_DISPLAY_DBUS ) ;
2022-05-13 21:38:19 +03:00
DO_TEST ( " graphics-dbus-usbredir " ,
QEMU_CAPS_DEVICE_CIRRUS_VGA ,
QEMU_CAPS_DISPLAY_DBUS ,
QEMU_CAPS_USB_REDIR ) ;
2022-05-13 21:38:13 +03:00
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " input-usbmouse " ) ;
DO_TEST_NOCAPS ( " input-usbtablet " ) ;
DO_TEST_NOCAPS ( " misc-acpi " ) ;
2016-01-05 01:57:06 +03:00
DO_TEST ( " misc-disable-s3 " , QEMU_CAPS_PIIX_DISABLE_S3 ) ;
DO_TEST ( " misc-disable-suspends " , QEMU_CAPS_PIIX_DISABLE_S3 , QEMU_CAPS_PIIX_DISABLE_S4 ) ;
DO_TEST ( " misc-enable-s4 " , QEMU_CAPS_PIIX_DISABLE_S4 ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " misc-enable-s4 " ) ;
2021-09-22 13:50:51 +03:00
DO_TEST_CAPS_VER ( " misc-no-reboot " , " 5.2.0 " ) ;
2021-08-23 18:09:30 +03:00
DO_TEST_CAPS_LATEST ( " misc-no-reboot " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " misc-uuid " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " vhost_queues-invalid " ) ;
2022-02-03 15:31:28 +03:00
DO_TEST_NOCAPS ( " net-vhostuser " ) ;
2018-10-04 20:44:55 +03:00
DO_TEST_CAPS_LATEST ( " net-vhostuser " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " net-vhostuser-multiq " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_FAILURE_NOCAPS ( " net-vhostuser-fail " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " net-user " ) ;
2022-06-22 14:03:24 +03:00
DO_TEST_CAPS_ARCH_LATEST_FULL ( " net-user " , " x86_64 " , ARG_FLAGS , FLAG_SLIRP_HELPER ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " net-user-addr " ) ;
2022-12-15 22:19:16 +03:00
DO_TEST_CAPS_LATEST ( " net-user-passt " ) ;
2023-02-21 02:26:51 +03:00
DO_TEST_CAPS_VER ( " net-user-passt " , " 7.2.0 " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " net-virtio " ) ;
2022-08-11 16:30:23 +03:00
DO_TEST_NOCAPS ( " net-virtio-device " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " net-virtio-disable-offloads " ) ;
DO_TEST_NOCAPS ( " net-virtio-netdev " ) ;
2022-09-30 16:45:08 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " net-virtio-ccw " , " s390x " ) ;
2022-11-07 17:08:25 +03:00
DO_TEST_NOCAPS ( " net-virtio-rxtxqueuesize " ) ;
2022-11-07 17:06:49 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " net-virtio-rxqueuesize-invalid-size " ) ;
qemu: support interface <teaming> functionality
The QEMU driver uses the <teaming type='persistent|transient'
persistent='blah'/> element to setup a "failover" pair of devices -
the persistent device must be a virtio emulated NIC, with the only
extra configuration being the addition of ",failover=on" to the device
commandline, and the transient device must be a hostdev NIC
(<interface type='hostdev'> or <interface type='network'> with a
network that is a pool of SRIOV VFs) where the extra configuration is
the addition of ",failover_pair_id=$aliasOfVirtio" to the device
commandline. These new options are supported in QEMU 4.2.0 and later.
Extra qemu-specific validation is added to ensure that the device
type/model is appropriate and that the qemu binary supports these
commandline options.
The result of this will be:
1) The virtio device presented to the guest will have an extra bit set
in its PCI capabilities indicating that it can be used as a failover
backup device. The virtio guest driver will need to be equipped to do
something with this information - this is included in the Linux
virtio-net driver in kernel 4.18 and above (and also backported to
some older distro kernels). Unfortunately there is no way for libvirt
to learn whether or not the guest driver supports failover - if it
doesn't then the extra PCI capability will be ignored and the guest OS
will just see two independent devices. (NB: the current virtio guest
driver also requires that the MAC addresses of the two NICs match in
order to pair them into a bond).
2) When a migration is requested, QEMu will automatically unplug the
transient/hostdev NIC from the guest on the source host before
starting migration, and automatically re-plug a similar device after
restarting the guest CPUs on the destination host. While the transient
NIC is unplugged, all network traffic will go through the
persistent/virtio device, but when the hostdev NIC is plugged in, it
will get all the traffic. This means that in normal circumstances the
guest gets the performance advantage of vfio-assigned "real hardware"
networking, but it can still be migrated with the only downside being
a performance penalty (due to using an emulated NIC) during the
migration.
Signed-off-by: Laine Stump <laine@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
2020-01-23 23:34:53 +03:00
DO_TEST ( " net-virtio-teaming " ,
QEMU_CAPS_DEVICE_VFIO_PCI ) ;
2021-02-11 10:05:15 +03:00
DO_TEST ( " net-virtio-teaming-hostdev " ,
QEMU_CAPS_DEVICE_VFIO_PCI ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " net-eth " ) ;
DO_TEST_NOCAPS ( " net-eth-ifname " ) ;
DO_TEST_NOCAPS ( " net-eth-names " ) ;
DO_TEST_NOCAPS ( " net-eth-hostip " ) ;
DO_TEST_NOCAPS ( " net-eth-unmanaged-tap " ) ;
DO_TEST_NOCAPS ( " net-client " ) ;
DO_TEST_NOCAPS ( " net-server " ) ;
DO_TEST_NOCAPS ( " net-many-models " ) ;
DO_TEST_NOCAPS ( " net-mcast " ) ;
DO_TEST_NOCAPS ( " net-udp " ) ;
2019-08-12 17:47:14 +03:00
DO_TEST ( " net-hostdev " , QEMU_CAPS_DEVICE_VFIO_PCI ) ;
DO_TEST ( " net-hostdev-bootorder " , QEMU_CAPS_DEVICE_VFIO_PCI ) ;
DO_TEST ( " net-hostdev-multidomain " , QEMU_CAPS_DEVICE_VFIO_PCI ) ;
2013-04-25 15:58:37 +04:00
DO_TEST ( " net-hostdev-vfio " ,
QEMU_CAPS_DEVICE_VFIO_PCI ) ;
2014-04-30 15:32:19 +04:00
DO_TEST ( " net-hostdev-vfio-multidomain " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_DEVICE_VFIO_PCI ) ;
2016-09-26 10:54:26 +03:00
DO_TEST_FAILURE ( " net-hostdev-fail " ,
QEMU_CAPS_DEVICE_VFIO_PCI ) ;
2020-10-14 20:08:27 +03:00
DO_TEST_CAPS_LATEST ( " net-vdpa " ) ;
2022-03-02 01:55:21 +03:00
DO_TEST_CAPS_LATEST ( " net-vdpa-multiqueue " ) ;
2022-01-10 00:07:37 +03:00
DO_TEST_CAPS_LATEST ( " net-virtio-rss " ) ;
2016-09-26 10:54:26 +03:00
2019-08-29 22:19:02 +03:00
DO_TEST ( " hostdev-pci-multifunction " ,
QEMU_CAPS_KVM ,
QEMU_CAPS_DEVICE_VFIO_PCI ) ;
2011-02-08 17:22:39 +03:00
2019-12-17 23:35:03 +03:00
DO_TEST ( " hostdev-pci-address-unassigned " ,
QEMU_CAPS_KVM ,
QEMU_CAPS_DEVICE_VFIO_PCI ) ;
2017-06-26 20:13:00 +03:00
DO_TEST ( " serial-file-log " ,
2022-08-22 17:34:44 +03:00
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
2023-03-02 22:23:37 +03:00
driver . config - > spiceTLS = 1 ;
2014-01-30 15:19:12 +04:00
DO_TEST ( " serial-spiceport " ,
2016-10-11 18:42:37 +03:00
QEMU_CAPS_DEVICE_QXL ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_SPICE ,
2018-09-12 15:38:45 +03:00
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
2023-03-02 22:23:37 +03:00
driver . config - > spiceTLS = 0 ;
2014-01-30 15:19:12 +04:00
2017-11-26 19:35:28 +03:00
DO_TEST ( " console-compat " ,
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
DO_TEST ( " console-compat-auto " ,
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " serial-vc-chardev " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " serial-pty-chardev " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " serial-dev-chardev " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
2015-06-16 16:07:59 +03:00
DO_TEST ( " serial-dev-chardev-iobase " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " serial-file-chardev " ,
2022-08-22 17:30:41 +03:00
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " serial-unix-chardev " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
2021-10-26 15:38:41 +03:00
DO_TEST_CAPS_LATEST ( " serial-file-log " ) ;
2023-03-02 22:23:37 +03:00
driver . config - > spiceTLS = 1 ;
2021-10-26 15:38:41 +03:00
DO_TEST_CAPS_LATEST ( " serial-spiceport " ) ;
2023-03-02 22:23:37 +03:00
driver . config - > spiceTLS = 0 ;
2022-02-02 14:54:59 +03:00
DO_TEST_CAPS_LATEST ( " serial-debugcon " ) ;
2021-10-26 15:38:41 +03:00
DO_TEST_CAPS_LATEST ( " console-compat " ) ;
DO_TEST_CAPS_LATEST ( " console-compat-auto " ) ;
DO_TEST_CAPS_LATEST ( " serial-vc-chardev " ) ;
DO_TEST_CAPS_LATEST ( " serial-pty-chardev " ) ;
DO_TEST_CAPS_LATEST ( " serial-dev-chardev " ) ;
DO_TEST_CAPS_LATEST ( " serial-dev-chardev-iobase " ) ;
DO_TEST_CAPS_LATEST ( " serial-file-chardev " ) ;
2018-07-06 13:00:11 +03:00
DO_TEST_CAPS_LATEST ( " serial-unix-chardev " ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " serial-tcp-chardev " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " serial-udp-chardev " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " serial-tcp-telnet-chardev " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
2021-10-26 15:38:41 +03:00
DO_TEST_CAPS_LATEST ( " serial-unix-chardev " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " serial-unix-missing-source " ) ;
DO_TEST_CAPS_LATEST ( " serial-tcp-chardev " ) ;
DO_TEST_CAPS_LATEST ( " serial-udp-chardev " ) ;
DO_TEST_CAPS_LATEST ( " serial-tcp-telnet-chardev " ) ;
2016-06-10 01:30:55 +03:00
driver . config - > chardevTLS = 1 ;
DO_TEST ( " serial-tcp-tlsx509-chardev " ,
2021-09-23 11:01:45 +03:00
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
2021-10-26 15:38:41 +03:00
DO_TEST_CAPS_LATEST ( " serial-tcp-tlsx509-chardev " ) ;
2016-10-17 18:31:43 +03:00
driver . config - > chardevTLSx509verify = 1 ;
DO_TEST ( " serial-tcp-tlsx509-chardev-verify " ,
2021-09-23 11:01:45 +03:00
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
2021-10-26 15:38:41 +03:00
DO_TEST_CAPS_LATEST ( " serial-tcp-tlsx509-chardev-verify " ) ;
2016-10-17 18:31:43 +03:00
driver . config - > chardevTLSx509verify = 0 ;
2016-10-24 15:05:54 +03:00
DO_TEST ( " serial-tcp-tlsx509-chardev-notls " ,
2021-09-23 11:01:45 +03:00
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
2021-10-26 15:38:41 +03:00
DO_TEST_CAPS_LATEST ( " serial-tcp-tlsx509-chardev-notls " ) ;
2019-10-20 14:49:46 +03:00
driver . config - > chardevTLSx509secretUUID = g_strdup ( " 6fd3f62d-9fe7-4a4e-a869-7acd6376d8ea " ) ;
2016-10-22 02:02:35 +03:00
DO_TEST ( " serial-tcp-tlsx509-secret-chardev " ,
2021-09-23 11:01:45 +03:00
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
2021-10-26 15:38:41 +03:00
DO_TEST_CAPS_LATEST ( " serial-tcp-tlsx509-secret-chardev " ) ;
2023-03-06 15:43:01 +03:00
VIR_FREE ( driver . config - > chardevTLSx509secretUUID ) ;
2016-06-10 01:30:55 +03:00
driver . config - > chardevTLS = 0 ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " serial-many-chardev " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " parallel-tcp-chardev " ) ;
DO_TEST_NOCAPS ( " parallel-parport-chardev " ) ;
2021-10-26 15:38:41 +03:00
DO_TEST_CAPS_LATEST ( " serial-many-chardev " ) ;
DO_TEST_CAPS_LATEST ( " parallel-tcp-chardev " ) ;
DO_TEST_CAPS_LATEST ( " parallel-parport-chardev " ) ;
2018-10-04 20:03:12 +03:00
DO_TEST_CAPS_LATEST ( " parallel-unix-chardev " ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " console-compat-chardev " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
2015-05-06 18:50:03 +03:00
DO_TEST ( " pci-serial-dev-chardev " ,
QEMU_CAPS_DEVICE_PCI_SERIAL ) ;
2021-10-26 15:38:41 +03:00
DO_TEST_CAPS_LATEST ( " console-compat-chardev " ) ;
DO_TEST_CAPS_LATEST ( " pci-serial-dev-chardev " ) ;
2011-02-08 17:22:39 +03:00
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " channel-guestfwd " ) ;
2018-10-04 20:11:43 +03:00
DO_TEST_CAPS_LATEST ( " channel-unix-guestfwd " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " channel-virtio " ) ;
DO_TEST_NOCAPS ( " channel-virtio-state " ) ;
DO_TEST_NOCAPS ( " channel-virtio-auto " ) ;
DO_TEST_NOCAPS ( " channel-virtio-autoassign " ) ;
DO_TEST_NOCAPS ( " channel-virtio-autoadd " ) ;
DO_TEST_NOCAPS ( " console-virtio " ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " console-virtio-many " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_DEVICE_ISA_SERIAL ) ;
2022-09-30 16:45:08 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " console-virtio-ccw " , " s390x " ) ;
2018-10-04 20:15:15 +03:00
DO_TEST_CAPS_LATEST ( " console-virtio-unix " ) ;
2021-06-10 18:08:05 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " console-sclp " , " s390x " ) ;
2023-03-02 22:23:37 +03:00
driver . config - > spiceTLS = 1 ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " channel-spicevmc " ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_SPICE ,
2016-10-10 18:51:38 +03:00
QEMU_CAPS_DEVICE_CIRRUS_VGA ) ;
2023-03-02 22:23:37 +03:00
driver . config - > spiceTLS = 0 ;
2022-03-19 01:04:05 +03:00
DO_TEST_CAPS_LATEST ( " channel-qemu-vdagent " ) ;
DO_TEST_CAPS_LATEST ( " channel-qemu-vdagent-features " ) ;
2015-06-30 11:21:21 +03:00
DO_TEST ( " channel-virtio-default " ,
2022-05-12 10:40:03 +03:00
QEMU_CAPS_SPICE ,
QEMU_CAPS_DEVICE_CIRRUS_VGA ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " channel-virtio-unix " ) ;
2011-02-08 17:22:39 +03:00
2012-07-09 20:29:55 +04:00
DO_TEST ( " smartcard-host " ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_CCID_EMULATED ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " smartcard-host-certificates " ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_CCID_EMULATED ) ;
2018-06-15 17:45:05 +03:00
DO_TEST ( " smartcard-host-certificates-database " ,
QEMU_CAPS_CCID_EMULATED ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " smartcard-passthrough-tcp " ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_CCID_PASSTHRU ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " smartcard-passthrough-spicevmc " ,
2022-05-12 10:40:03 +03:00
QEMU_CAPS_CCID_PASSTHRU ,
QEMU_CAPS_SPICE ,
QEMU_CAPS_DEVICE_CIRRUS_VGA ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " smartcard-controller " ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_CCID_EMULATED ) ;
2018-10-04 19:24:53 +03:00
DO_TEST_CAPS_LATEST ( " smartcard-passthrough-unix " ) ;
2011-02-08 17:22:39 +03:00
2017-08-25 20:11:24 +03:00
DO_TEST ( " chardev-reconnect " ,
QEMU_CAPS_CHARDEV_RECONNECT ,
QEMU_CAPS_USB_REDIR ,
QEMU_CAPS_DEVICE_VIRTIO_RNG ,
QEMU_CAPS_OBJECT_RNG_EGD ,
QEMU_CAPS_CCID_PASSTHRU ) ;
DO_TEST_PARSE_ERROR ( " chardev-reconnect-invalid-timeout " ,
QEMU_CAPS_CHARDEV_RECONNECT ) ;
2017-08-30 16:56:52 +03:00
DO_TEST_PARSE_ERROR ( " chardev-reconnect-generated-path " ,
QEMU_CAPS_CHARDEV_RECONNECT ) ;
2017-08-25 20:11:24 +03:00
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " usb-controller " ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " usb-piix3-controller " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_PIIX3_USB_UHCI ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " usb-ich9-ehci-addr " ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_ICH9_USB_EHCI1 ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " input-usbmouse-addr " ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " usb-ich9-companion " ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_ICH9_USB_EHCI1 ) ;
2013-04-23 18:23:51 +04:00
DO_TEST_PARSE_ERROR ( " usb-ich9-no-companion " ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_ICH9_USB_EHCI1 ) ;
2016-07-18 18:16:33 +03:00
DO_TEST ( " usb-ich9-autoassign " ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_ICH9_USB_EHCI1 ,
2016-07-18 18:16:33 +03:00
QEMU_CAPS_USB_HUB ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " usb-hub " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_USB_HUB ) ;
2016-06-17 10:49:54 +03:00
DO_TEST ( " usb-hub-autoadd " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_USB_HUB ) ;
2017-01-27 16:06:29 +03:00
DO_TEST ( " usb-hub-autoadd-deluxe " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_USB_HUB ) ;
2015-08-12 17:52:17 +03:00
DO_TEST_PARSE_ERROR ( " usb-hub-conflict " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_USB_HUB ) ;
2016-08-15 18:39:35 +03:00
DO_TEST_PARSE_ERROR ( " usb-hub-nonexistent " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_USB_HUB ) ;
2016-07-01 15:20:44 +03:00
DO_TEST ( " usb-port-missing " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_USB_HUB ) ;
2017-09-07 15:19:36 +03:00
DO_TEST_FAILURE ( " usb-bus-missing " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_USB_HUB ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " usb-ports " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_USB_HUB ) ;
2016-11-28 13:05:22 +03:00
DO_TEST_PARSE_ERROR ( " usb-ports-out-of-range " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_USB_HUB ) ;
2016-07-18 18:16:33 +03:00
DO_TEST ( " usb-port-autoassign " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_USB_HUB ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " usb-redir " ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_USB_HUB ,
QEMU_CAPS_ICH9_USB_EHCI1 ,
QEMU_CAPS_USB_REDIR ,
2022-05-12 10:40:03 +03:00
QEMU_CAPS_SPICE ,
QEMU_CAPS_DEVICE_CIRRUS_VGA ) ;
2012-11-20 22:47:09 +04:00
DO_TEST ( " usb-redir-boot " ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_USB_HUB ,
QEMU_CAPS_ICH9_USB_EHCI1 ,
QEMU_CAPS_USB_REDIR ,
2022-05-12 10:40:03 +03:00
QEMU_CAPS_SPICE ,
QEMU_CAPS_DEVICE_CIRRUS_VGA ) ;
2012-09-13 11:25:47 +04:00
DO_TEST ( " usb-redir-filter " ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_USB_HUB ,
QEMU_CAPS_ICH9_USB_EHCI1 ,
QEMU_CAPS_USB_REDIR ,
QEMU_CAPS_SPICE ,
2022-05-12 10:40:03 +03:00
QEMU_CAPS_USB_REDIR_FILTER ,
QEMU_CAPS_DEVICE_CIRRUS_VGA ) ;
2015-04-10 16:49:42 +03:00
DO_TEST ( " usb-redir-filter-version " ,
QEMU_CAPS_USB_REDIR ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_SPICE ,
2022-05-12 10:40:03 +03:00
QEMU_CAPS_USB_REDIR_FILTER ,
QEMU_CAPS_DEVICE_CIRRUS_VGA ) ;
2018-10-04 20:24:01 +03:00
DO_TEST_CAPS_LATEST ( " usb-redir-unix " ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " usb1-usb2 " ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_PIIX3_USB_UHCI ,
QEMU_CAPS_USB_HUB ,
QEMU_CAPS_ICH9_USB_EHCI1 ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " usb-none " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " usb-none-other " ) ;
2012-07-03 17:43:13 +04:00
DO_TEST_PARSE_ERROR ( " usb-none-hub " ,
QEMU_CAPS_USB_HUB ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " usb-none-usbtablet " ) ;
2016-01-08 18:20:47 +03:00
DO_TEST ( " usb-controller-default-q35 " ,
qemu: initially reserve one open pcie-root-port for hotplug
For machinetypes with a pci-root bus (all legacy PCI), libvirt will
make a "fake" reservation for one extra slot prior to assigning
addresses to unaddressed PCI endpoint devices in the domain. This will
trigger auto-adding of a pci-bridge for the final device to be
assigned an address *if that device would have otherwise instead been
the last device on the last available pci-bridge*; thus it assures
that there will always be at least one slot left open in the domain's
bus topology for expansion (which is important both for hotplug (since
a new pci-bridge can't be added while the guest is running) as well as
for offline additions to the config (since adding a new device might
otherwise in some cases require re-addressing existing devices, which
we want to avoid)).
It's important to note that for the above case (legacy PCI), we must
check for the special case of all slots on all buses being occupied
*prior to assigning any addresses*, and avoid attempting to reserve
the extra address in that case, because there is no free address in
the existing topology, so no place to auto-add a pci-bridge for
expansion (i.e. it would always fail anyway). Since that condition can
only be reached by manual intervention, this is acceptable.
For machinetypes with pcie-root (Q35, aarch64 virt), libvirt's
methodology for automatically expanding the bus topology is different
- pcie-root-ports are plugged into slots (soon to be functions) of
pcie-root as needed, and the new endpoint devices are assigned to the
single slot in each pcie-root-port. This is done so that the devices
are, by default, hotpluggable (the slots of pcie-root don't support
hotplug, but the single slot of the pcie-root-port does). Since
pcie-root-ports can only be plugged into pcie-root, and we don't
auto-assign endpoint devices to the pcie-root slots, this means
topology expansion doesn't compete with endpoint devices for slots, so
we don't need to worry about checking for all "useful" slots being
free *prior* to assigning addresses to new endpoint devices - as a
matter of fact, if we attempt to reserve the open slots before the
used slots, it can lead to errors.
Instead this patch just reserves one slot for a "future potential"
PCIe device after doing the assignment for actual devices, but only
if the only PCI controller defined prior to starting address
assignment was pcie-root, and only if we auto-added at least one PCI
controller during address assignment. This assures two things:
1) that reserving the open slots will only be done when the domain is
initially defined, never at any time after, and
2) that if the user understands enough about PCI controllers that they
are adding them manually, that we don't mess up their plan by
adding extras - if they know enough to add one pcie-root-port, or
to manually assign addresses such that no pcie-root-ports are
needed, they know enough to add extra pcie-root-ports if they want
them (this could be called the "libguestfs clause", since
libguestfs needs to be able to create domains with as few
devices/controllers as possible).
This is set to reserve a single free port for now, but could be
increased in the future if public sentiment goes in that direction
(it's easy to increase later, but essentially impossible to decrease)
2016-09-28 03:37:30 +03:00
QEMU_CAPS_DEVICE_IOH3420 ,
2017-02-23 20:47:36 +03:00
QEMU_CAPS_PCI_OHCI ,
QEMU_CAPS_PIIX3_USB_UHCI ,
QEMU_CAPS_NEC_USB_XHCI ) ;
2016-01-08 18:20:47 +03:00
DO_TEST_FAILURE ( " usb-controller-default-unavailable-q35 " ,
qemu: initially reserve one open pcie-root-port for hotplug
For machinetypes with a pci-root bus (all legacy PCI), libvirt will
make a "fake" reservation for one extra slot prior to assigning
addresses to unaddressed PCI endpoint devices in the domain. This will
trigger auto-adding of a pci-bridge for the final device to be
assigned an address *if that device would have otherwise instead been
the last device on the last available pci-bridge*; thus it assures
that there will always be at least one slot left open in the domain's
bus topology for expansion (which is important both for hotplug (since
a new pci-bridge can't be added while the guest is running) as well as
for offline additions to the config (since adding a new device might
otherwise in some cases require re-addressing existing devices, which
we want to avoid)).
It's important to note that for the above case (legacy PCI), we must
check for the special case of all slots on all buses being occupied
*prior to assigning any addresses*, and avoid attempting to reserve
the extra address in that case, because there is no free address in
the existing topology, so no place to auto-add a pci-bridge for
expansion (i.e. it would always fail anyway). Since that condition can
only be reached by manual intervention, this is acceptable.
For machinetypes with pcie-root (Q35, aarch64 virt), libvirt's
methodology for automatically expanding the bus topology is different
- pcie-root-ports are plugged into slots (soon to be functions) of
pcie-root as needed, and the new endpoint devices are assigned to the
single slot in each pcie-root-port. This is done so that the devices
are, by default, hotpluggable (the slots of pcie-root don't support
hotplug, but the single slot of the pcie-root-port does). Since
pcie-root-ports can only be plugged into pcie-root, and we don't
auto-assign endpoint devices to the pcie-root slots, this means
topology expansion doesn't compete with endpoint devices for slots, so
we don't need to worry about checking for all "useful" slots being
free *prior* to assigning addresses to new endpoint devices - as a
matter of fact, if we attempt to reserve the open slots before the
used slots, it can lead to errors.
Instead this patch just reserves one slot for a "future potential"
PCIe device after doing the assignment for actual devices, but only
if the only PCI controller defined prior to starting address
assignment was pcie-root, and only if we auto-added at least one PCI
controller during address assignment. This assures two things:
1) that reserving the open slots will only be done when the domain is
initially defined, never at any time after, and
2) that if the user understands enough about PCI controllers that they
are adding them manually, that we don't mess up their plan by
adding extras - if they know enough to add one pcie-root-port, or
to manually assign addresses such that no pcie-root-ports are
needed, they know enough to add extra pcie-root-ports if they want
them (this could be called the "libguestfs clause", since
libguestfs needs to be able to create domains with as few
devices/controllers as possible).
This is set to reserve a single free port for now, but could be
increased in the future if public sentiment goes in that direction
(it's easy to increase later, but essentially impossible to decrease)
2016-09-28 03:37:30 +03:00
QEMU_CAPS_DEVICE_IOH3420 ,
2017-02-23 20:47:36 +03:00
QEMU_CAPS_PCI_OHCI ,
2016-01-08 18:20:47 +03:00
QEMU_CAPS_NEC_USB_XHCI ) ;
DO_TEST ( " usb-controller-explicit-q35 " ,
qemu: initially reserve one open pcie-root-port for hotplug
For machinetypes with a pci-root bus (all legacy PCI), libvirt will
make a "fake" reservation for one extra slot prior to assigning
addresses to unaddressed PCI endpoint devices in the domain. This will
trigger auto-adding of a pci-bridge for the final device to be
assigned an address *if that device would have otherwise instead been
the last device on the last available pci-bridge*; thus it assures
that there will always be at least one slot left open in the domain's
bus topology for expansion (which is important both for hotplug (since
a new pci-bridge can't be added while the guest is running) as well as
for offline additions to the config (since adding a new device might
otherwise in some cases require re-addressing existing devices, which
we want to avoid)).
It's important to note that for the above case (legacy PCI), we must
check for the special case of all slots on all buses being occupied
*prior to assigning any addresses*, and avoid attempting to reserve
the extra address in that case, because there is no free address in
the existing topology, so no place to auto-add a pci-bridge for
expansion (i.e. it would always fail anyway). Since that condition can
only be reached by manual intervention, this is acceptable.
For machinetypes with pcie-root (Q35, aarch64 virt), libvirt's
methodology for automatically expanding the bus topology is different
- pcie-root-ports are plugged into slots (soon to be functions) of
pcie-root as needed, and the new endpoint devices are assigned to the
single slot in each pcie-root-port. This is done so that the devices
are, by default, hotpluggable (the slots of pcie-root don't support
hotplug, but the single slot of the pcie-root-port does). Since
pcie-root-ports can only be plugged into pcie-root, and we don't
auto-assign endpoint devices to the pcie-root slots, this means
topology expansion doesn't compete with endpoint devices for slots, so
we don't need to worry about checking for all "useful" slots being
free *prior* to assigning addresses to new endpoint devices - as a
matter of fact, if we attempt to reserve the open slots before the
used slots, it can lead to errors.
Instead this patch just reserves one slot for a "future potential"
PCIe device after doing the assignment for actual devices, but only
if the only PCI controller defined prior to starting address
assignment was pcie-root, and only if we auto-added at least one PCI
controller during address assignment. This assures two things:
1) that reserving the open slots will only be done when the domain is
initially defined, never at any time after, and
2) that if the user understands enough about PCI controllers that they
are adding them manually, that we don't mess up their plan by
adding extras - if they know enough to add one pcie-root-port, or
to manually assign addresses such that no pcie-root-ports are
needed, they know enough to add extra pcie-root-ports if they want
them (this could be called the "libguestfs clause", since
libguestfs needs to be able to create domains with as few
devices/controllers as possible).
This is set to reserve a single free port for now, but could be
increased in the future if public sentiment goes in that direction
(it's easy to increase later, but essentially impossible to decrease)
2016-09-28 03:37:30 +03:00
QEMU_CAPS_DEVICE_IOH3420 ,
2017-02-23 20:47:36 +03:00
QEMU_CAPS_PCI_OHCI ,
QEMU_CAPS_PIIX3_USB_UHCI ,
QEMU_CAPS_NEC_USB_XHCI ) ;
2016-01-08 18:20:47 +03:00
DO_TEST_FAILURE ( " usb-controller-explicit-unavailable-q35 " ,
qemu: initially reserve one open pcie-root-port for hotplug
For machinetypes with a pci-root bus (all legacy PCI), libvirt will
make a "fake" reservation for one extra slot prior to assigning
addresses to unaddressed PCI endpoint devices in the domain. This will
trigger auto-adding of a pci-bridge for the final device to be
assigned an address *if that device would have otherwise instead been
the last device on the last available pci-bridge*; thus it assures
that there will always be at least one slot left open in the domain's
bus topology for expansion (which is important both for hotplug (since
a new pci-bridge can't be added while the guest is running) as well as
for offline additions to the config (since adding a new device might
otherwise in some cases require re-addressing existing devices, which
we want to avoid)).
It's important to note that for the above case (legacy PCI), we must
check for the special case of all slots on all buses being occupied
*prior to assigning any addresses*, and avoid attempting to reserve
the extra address in that case, because there is no free address in
the existing topology, so no place to auto-add a pci-bridge for
expansion (i.e. it would always fail anyway). Since that condition can
only be reached by manual intervention, this is acceptable.
For machinetypes with pcie-root (Q35, aarch64 virt), libvirt's
methodology for automatically expanding the bus topology is different
- pcie-root-ports are plugged into slots (soon to be functions) of
pcie-root as needed, and the new endpoint devices are assigned to the
single slot in each pcie-root-port. This is done so that the devices
are, by default, hotpluggable (the slots of pcie-root don't support
hotplug, but the single slot of the pcie-root-port does). Since
pcie-root-ports can only be plugged into pcie-root, and we don't
auto-assign endpoint devices to the pcie-root slots, this means
topology expansion doesn't compete with endpoint devices for slots, so
we don't need to worry about checking for all "useful" slots being
free *prior* to assigning addresses to new endpoint devices - as a
matter of fact, if we attempt to reserve the open slots before the
used slots, it can lead to errors.
Instead this patch just reserves one slot for a "future potential"
PCIe device after doing the assignment for actual devices, but only
if the only PCI controller defined prior to starting address
assignment was pcie-root, and only if we auto-added at least one PCI
controller during address assignment. This assures two things:
1) that reserving the open slots will only be done when the domain is
initially defined, never at any time after, and
2) that if the user understands enough about PCI controllers that they
are adding them manually, that we don't mess up their plan by
adding extras - if they know enough to add one pcie-root-port, or
to manually assign addresses such that no pcie-root-ports are
needed, they know enough to add extra pcie-root-ports if they want
them (this could be called the "libguestfs clause", since
libguestfs needs to be able to create domains with as few
devices/controllers as possible).
This is set to reserve a single free port for now, but could be
increased in the future if public sentiment goes in that direction
(it's easy to increase later, but essentially impossible to decrease)
2016-09-28 03:37:30 +03:00
QEMU_CAPS_DEVICE_IOH3420 ,
2017-02-23 20:47:36 +03:00
QEMU_CAPS_PCI_OHCI ,
2016-01-08 18:20:47 +03:00
QEMU_CAPS_PIIX3_USB_UHCI ) ;
2016-04-24 02:52:56 +03:00
DO_TEST ( " usb-controller-xhci " ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_PIIX3_USB_UHCI ,
2022-08-22 17:49:17 +03:00
QEMU_CAPS_NEC_USB_XHCI ) ;
2016-07-18 18:16:33 +03:00
DO_TEST ( " usb-xhci-autoassign " ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_PIIX3_USB_UHCI ,
QEMU_CAPS_NEC_USB_XHCI ,
2016-07-18 18:16:33 +03:00
QEMU_CAPS_USB_HUB ) ;
2016-11-28 19:37:39 +03:00
DO_TEST_PARSE_ERROR ( " usb-controller-xhci-limit " ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_PIIX3_USB_UHCI ,
2022-08-22 17:49:17 +03:00
QEMU_CAPS_NEC_USB_XHCI ) ;
2017-04-13 13:25:25 +03:00
DO_TEST ( " usb-controller-qemu-xhci " , QEMU_CAPS_DEVICE_QEMU_XHCI ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_FAILURE_NOCAPS ( " usb-controller-qemu-xhci-unavailable " ) ;
2017-04-13 13:25:25 +03:00
DO_TEST_PARSE_ERROR ( " usb-controller-qemu-xhci-limit " ,
QEMU_CAPS_DEVICE_QEMU_XHCI ) ;
2011-09-02 17:21:23 +04:00
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " smbios " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " smbios-date " ) ;
DO_TEST_PARSE_ERROR_NOCAPS ( " smbios-uuid-match " ) ;
2021-09-20 18:04:33 +03:00
DO_TEST_NOCAPS ( " smbios-type-fwcfg " ) ;
2011-02-08 17:22:39 +03:00
2021-03-25 20:23:19 +03:00
DO_TEST_CAPS_LATEST ( " watchdog " ) ;
DO_TEST_CAPS_LATEST ( " watchdog-device " ) ;
DO_TEST_CAPS_LATEST ( " watchdog-dump " ) ;
DO_TEST_CAPS_LATEST ( " watchdog-injectnmi " ) ;
2022-11-08 11:10:57 +03:00
DO_TEST_CAPS_LATEST ( " watchdog-q35-multiple " ) ;
2021-06-10 18:01:37 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " watchdog-diag288 " , " s390x " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " balloon-device " ) ;
2018-03-29 13:51:55 +03:00
DO_TEST ( " balloon-device-deflate " ,
2016-01-08 13:45:07 +03:00
QEMU_CAPS_VIRTIO_BALLOON_AUTODEFLATE ) ;
2022-09-30 16:45:08 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " balloon-ccw-deflate " , " s390x " ) ;
2018-03-29 13:51:55 +03:00
DO_TEST ( " balloon-mmio-deflate " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_DEVICE_VIRTIO_MMIO ,
2016-01-08 13:45:07 +03:00
QEMU_CAPS_VIRTIO_BALLOON_AUTODEFLATE ) ;
2018-03-29 13:51:55 +03:00
DO_TEST ( " balloon-device-deflate-off " ,
2016-01-08 13:45:07 +03:00
QEMU_CAPS_VIRTIO_BALLOON_AUTODEFLATE ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " balloon-device-auto " ) ;
DO_TEST_NOCAPS ( " balloon-device-period " ) ;
DO_TEST_NOCAPS ( " sound " ) ;
2012-07-09 20:29:55 +04:00
DO_TEST ( " sound-device " ,
2013-09-24 18:17:38 +04:00
QEMU_CAPS_HDA_DUPLEX , QEMU_CAPS_HDA_MICRO ,
2018-05-22 14:12:34 +03:00
QEMU_CAPS_HDA_OUTPUT ,
2014-07-24 19:32:31 +04:00
QEMU_CAPS_DEVICE_ICH9_INTEL_HDA ,
QEMU_CAPS_OBJECT_USB_AUDIO ) ;
2019-07-16 13:49:32 +03:00
DO_TEST_CAPS_LATEST ( " fs9p " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " fs9p-ccw " , " s390x " ) ;
2011-02-08 17:22:39 +03:00
2022-07-12 14:00:33 +03:00
DO_TEST_CAPS_LATEST ( " hostdev-usb-address " ) ;
DO_TEST_CAPS_LATEST ( " hostdev-usb-address-device " ) ;
DO_TEST_CAPS_LATEST ( " hostdev-usb-address-device-boot " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " hostdev-usb-duplicate " ) ;
2022-07-12 14:00:33 +03:00
DO_TEST_CAPS_LATEST ( " hostdev-pci-address " ) ;
DO_TEST_CAPS_LATEST ( " hostdev-pci-address-device " ) ;
2021-06-18 13:46:12 +03:00
DO_TEST_PARSE_ERROR ( " hostdev-pci-duplicate " ,
QEMU_CAPS_DEVICE_VFIO_PCI ) ;
2013-04-25 15:58:37 +04:00
DO_TEST ( " hostdev-vfio " ,
QEMU_CAPS_DEVICE_VFIO_PCI ) ;
2014-04-30 15:32:19 +04:00
DO_TEST ( " hostdev-vfio-multidomain " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_DEVICE_VFIO_PCI ) ;
2017-01-07 15:27:34 +03:00
DO_TEST ( " hostdev-mdev-precreated " ,
QEMU_CAPS_DEVICE_VFIO_PCI ) ;
DO_TEST_PARSE_ERROR ( " hostdev-mdev-src-address-invalid " ,
QEMU_CAPS_DEVICE_VFIO_PCI ) ;
DO_TEST_PARSE_ERROR ( " hostdev-mdev-invalid-target-address " ,
QEMU_CAPS_DEVICE_VFIO_PCI ) ;
2021-06-18 13:46:12 +03:00
DO_TEST_PARSE_ERROR ( " hostdev-mdev-duplicate " ,
QEMU_CAPS_DEVICE_VFIO_PCI ) ;
2018-05-25 16:55:42 +03:00
DO_TEST_CAPS_LATEST ( " hostdev-mdev-display-spice-opengl " ) ;
DO_TEST_CAPS_LATEST ( " hostdev-mdev-display-spice-egl-headless " ) ;
DO_TEST_CAPS_LATEST ( " hostdev-mdev-display-vnc " ) ;
DO_TEST_CAPS_LATEST ( " hostdev-mdev-display-vnc-egl-headless " ) ;
DO_TEST_PARSE_ERROR ( " hostdev-mdev-display-missing-graphics " ,
QEMU_CAPS_DEVICE_VFIO_PCI ,
QEMU_CAPS_VFIO_PCI_DISPLAY ) ;
2019-10-18 18:30:17 +03:00
DO_TEST_CAPS_LATEST ( " hostdev-mdev-display-ramfb " ) ;
2022-04-29 23:07:26 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " hostdev-mdev-display-ramfb-multiple " ) ;
2018-11-08 14:00:27 +03:00
DO_TEST_PARSE_ERROR ( " hostdev-vfio-zpci-wrong-arch " ,
QEMU_CAPS_DEVICE_VFIO_PCI ) ;
2018-11-08 14:00:26 +03:00
DO_TEST ( " hostdev-vfio-zpci " ,
QEMU_CAPS_DEVICE_VFIO_PCI ,
QEMU_CAPS_DEVICE_ZPCI ) ;
2020-06-18 11:25:17 +03:00
DO_TEST_PARSE_ERROR ( " hostdev-vfio-zpci-autogenerate-fids " ,
QEMU_CAPS_DEVICE_VFIO_PCI ) ;
2022-09-30 17:02:23 +03:00
DO_TEST_CAPS_ARCH_LATEST_PARSE_ERROR ( " hostdev-vfio-zpci-invalid-uid-valid-fid " , " s390x " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " hostdev-vfio-zpci-multidomain-many " , " s390x " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " hostdev-vfio-zpci-autogenerate " , " s390x " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " hostdev-vfio-zpci-autogenerate-uids " , " s390x " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " hostdev-vfio-zpci-autogenerate-fids " , " s390x " ) ;
conf: fix zPCI address auto-generation on s390
Let us fix the issues with zPCI address validation and auto-generation
on s390.
Currently, there are two issues with handling the ZPCI address
extension. Firstly, when the uid is to be auto-generated with a
specified fid, .i.e.:
...
<address type='pci'>
<zpci fid='0x0000001f'/>
</address>
...
we expect uid='0x0001' (or the next available uid for the domain).
However, we get a parsing error:
$ virsh define zpci.xml
error: XML error: Invalid PCI address uid='0x0000', must be > 0x0000
and <= 0xffff
Secondly, when the uid is specified explicitly with the invalid
numerical value '0x0000', we actually expect the parsing error above.
However, the domain is being defined and the uid value is silently
changed to a valid value.
The first issue is a bug and the second one is undesired behaviour, and
both issues are related to how we (in-band) signal invalid values for
uid and fid. So let's fix the XML parsing to do validation based on what
is actually specified in the XML.
The first issue is also related to the current code behaviour, which
is, if either uid or fid is specified by the user, it is incorrectly
assumed that both uid and fid are specified. This bug is fixed by
identifying when the user specified ZPCI address is incomplete and
auto-generating the missing ZPCI address.
Signed-off-by: Bjoern Walk <bwalk@linux.ibm.com>
Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
Signed-off-by: Shalini Chellathurai Saroja <shalini@linux.ibm.com>
Reviewed-by: Andrea Bolognani <abologna@redhat.com>
2020-06-18 11:25:15 +03:00
DO_TEST_PARSE_ERROR ( " hostdev-vfio-zpci-uid-set-zero " ,
QEMU_CAPS_DEVICE_VFIO_PCI ,
QEMU_CAPS_DEVICE_ZPCI ) ;
2018-11-08 14:00:29 +03:00
DO_TEST ( " hostdev-vfio-zpci-boundaries " ,
QEMU_CAPS_DEVICE_VFIO_PCI ,
QEMU_CAPS_DEVICE_PCI_BRIDGE ,
QEMU_CAPS_DEVICE_ZPCI ) ;
DO_TEST_PARSE_ERROR ( " hostdev-vfio-zpci " ,
QEMU_CAPS_DEVICE_VFIO_PCI ) ;
2020-06-18 11:25:17 +03:00
DO_TEST_PARSE_ERROR ( " hostdev-vfio-zpci-duplicate " ,
QEMU_CAPS_DEVICE_VFIO_PCI ,
QEMU_CAPS_DEVICE_ZPCI ) ;
DO_TEST_PARSE_ERROR ( " hostdev-vfio-zpci-set-zero " ,
QEMU_CAPS_DEVICE_VFIO_PCI ,
QEMU_CAPS_DEVICE_ZPCI ) ;
2022-09-30 16:45:08 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " hostdev-vfio-zpci-ccw-memballoon " , " s390x " ) ;
2020-06-18 11:25:17 +03:00
2019-08-12 17:47:14 +03:00
DO_TEST ( " pci-rom " , QEMU_CAPS_DEVICE_VFIO_PCI ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " pci-rom-disabled " ) ;
DO_TEST_NOCAPS ( " pci-rom-disabled-invalid " ) ;
2011-02-08 17:22:39 +03:00
2022-09-30 16:45:08 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " hostdev-subsys-mdev-vfio-ccw " , " s390x " ) ;
2019-08-27 17:19:23 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " hostdev-subsys-mdev-vfio-ccw-boot " ,
" s390x " ) ;
2022-09-30 15:01:44 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " hostdev-subsys-mdev-vfio-ccw " ) ;
2018-05-07 17:41:15 +03:00
DO_TEST_PARSE_ERROR ( " hostdev-subsys-mdev-vfio-ccw-duplicate-address " ,
QEMU_CAPS_DEVICE_VFIO_CCW ) ;
DO_TEST_PARSE_ERROR ( " hostdev-subsys-mdev-vfio-ccw-invalid-address " ,
QEMU_CAPS_DEVICE_VFIO_CCW ) ;
2019-08-27 17:19:18 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " hostdev-subsys-mdev-vfio-ap " ,
" s390x " ) ;
2019-08-27 17:19:20 +03:00
DO_TEST_CAPS_ARCH_LATEST_PARSE_ERROR ( " hostdev-subsys-mdev-vfio-ap-boot-fail " ,
" s390x " ) ;
2019-08-27 17:19:18 +03:00
2021-08-16 18:02:16 +03:00
DO_TEST_FULL ( " restore-v2 " , " " ,
2019-03-13 22:59:42 +03:00
ARG_MIGRATE_FROM , " exec:cat " ,
2021-08-16 18:02:16 +03:00
ARG_MIGRATE_FD , 7 ,
ARG_END ) ;
DO_TEST_FULL ( " restore-v2-fd " , " " ,
2019-03-13 22:59:42 +03:00
ARG_MIGRATE_FROM , " stdio " ,
2021-08-16 18:02:16 +03:00
ARG_MIGRATE_FD , 7 ,
ARG_END ) ;
DO_TEST_FULL ( " restore-v2-fd " , " " ,
2019-03-13 22:59:42 +03:00
ARG_MIGRATE_FROM , " fd:7 " ,
2021-08-16 18:02:16 +03:00
ARG_MIGRATE_FD , 7 , ARG_END ) ;
DO_TEST_FULL ( " migrate " , " " ,
ARG_MIGRATE_FROM , " tcp:10.0.0.1:5000 " , ARG_END ) ;
2011-02-08 17:22:39 +03:00
2021-08-16 18:02:16 +03:00
DO_TEST_FULL ( " migrate-numa-unaligned " , " " ,
2019-03-13 22:59:42 +03:00
ARG_MIGRATE_FROM , " stdio " ,
ARG_MIGRATE_FD , 7 ,
2019-03-13 22:18:11 +03:00
ARG_QEMU_CAPS ,
2021-08-16 18:02:16 +03:00
QEMU_CAPS_LAST ,
ARG_END ) ;
2015-09-21 20:10:12 +03:00
2019-06-18 09:27:07 +03:00
DO_TEST_CAPS_LATEST ( " qemu-ns " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " qemu-ns-no-env " ) ;
DO_TEST_NOCAPS ( " qemu-ns-alt " ) ;
2011-02-08 17:22:39 +03:00
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " smp " ) ;
2019-12-16 18:28:09 +03:00
DO_TEST ( " smp-dies " , QEMU_CAPS_SMP_DIES ) ;
2011-02-08 17:22:39 +03:00
2023-02-22 17:23:04 +03:00
DO_TEST_CAPS_LATEST ( " iothreads-ids " ) ;
DO_TEST_CAPS_LATEST ( " iothreads-ids-partial " ) ;
2022-03-09 13:46:15 +03:00
DO_TEST_CAPS_LATEST ( " iothreads-ids-pool-sizes " ) ;
2023-02-22 17:23:04 +03:00
DO_TEST_CAPS_LATEST ( " iothreads-disk " ) ;
2022-09-30 16:45:08 +03:00
DO_TEST_CAPS_ARCH_VER ( " iothreads-disk-virtio-ccw " , " s390x " , " 4.2.0 " ) ;
2021-03-12 19:56:49 +03:00
DO_TEST_CAPS_VER ( " iothreads-virtio-scsi-pci " , " 5.2.0 " ) ;
2019-01-28 16:17:15 +03:00
DO_TEST_CAPS_LATEST ( " iothreads-virtio-scsi-pci " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " iothreads-virtio-scsi-ccw " , " s390x " ) ;
2014-08-23 02:15:30 +04:00
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " cpu-topology1 " ) ;
DO_TEST_NOCAPS ( " cpu-topology2 " ) ;
DO_TEST_NOCAPS ( " cpu-topology3 " ) ;
2014-09-23 21:07:09 +04:00
DO_TEST ( " cpu-minimum1 " , QEMU_CAPS_KVM ) ;
DO_TEST ( " cpu-minimum2 " , QEMU_CAPS_KVM ) ;
DO_TEST ( " cpu-exact1 " , QEMU_CAPS_KVM ) ;
DO_TEST ( " cpu-exact2 " , QEMU_CAPS_KVM ) ;
DO_TEST ( " cpu-exact2-nofallback " , QEMU_CAPS_KVM ) ;
DO_TEST ( " cpu-fallback " , QEMU_CAPS_KVM ) ;
DO_TEST_FAILURE ( " cpu-nofallback " , QEMU_CAPS_KVM ) ;
DO_TEST ( " cpu-strict1 " , QEMU_CAPS_KVM ) ;
2019-04-25 12:51:55 +03:00
DO_TEST ( " cpu-no-removed-features " , QEMU_CAPS_KVM ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " cpu-numa1 " ) ;
DO_TEST_NOCAPS ( " cpu-numa2 " ) ;
DO_TEST_NOCAPS ( " cpu-numa-no-memory-element " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " cpu-numa3 " ) ;
2022-11-07 12:58:59 +03:00
DO_TEST_NOCAPS ( " cpu-numa-disjoint " ) ;
2022-11-03 18:01:02 +03:00
DO_TEST_NOCAPS ( " cpu-numa-memshared " ) ;
2021-08-18 15:21:45 +03:00
DO_TEST ( " cpu-host-model " ,
QEMU_CAPS_DEVICE_PCI_BRIDGE ,
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE ,
QEMU_CAPS_DEVICE_IOH3420 ,
QEMU_CAPS_ICH9_AHCI ,
QEMU_CAPS_ICH9_USB_EHCI1 ) ;
2021-08-18 15:28:23 +03:00
/* host-model cpu expansion depends on the cpu reported by qemu and thus
* we invoke it for all real capability dumps we have */
DO_TEST_CAPS_VER ( " cpu-host-model " , " 4.2.0 " ) ;
DO_TEST_CAPS_VER ( " cpu-host-model " , " 5.0.0 " ) ;
DO_TEST_CAPS_VER ( " cpu-host-model " , " 5.1.0 " ) ;
DO_TEST_CAPS_VER ( " cpu-host-model " , " 5.2.0 " ) ;
DO_TEST_CAPS_VER ( " cpu-host-model " , " 6.0.0 " ) ;
DO_TEST_CAPS_VER ( " cpu-host-model " , " 6.1.0 " ) ;
2021-08-25 15:50:25 +03:00
/* For this specific test we accept the increased likelihood of changes
2021-08-18 15:30:10 +03:00
* if qemu updates the CPU model */
DO_TEST_CAPS_LATEST ( " cpu-host-model " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " cpu-host-model-vendor " ) ;
2021-08-16 18:02:16 +03:00
DO_TEST_FULL ( " cpu-host-model-fallback " , " " ,
ARG_FLAGS , FLAG_SKIP_LEGACY_CPUS , ARG_END ) ;
DO_TEST_FULL ( " cpu-host-model-nofallback " , " " ,
ARG_FLAGS , FLAG_SKIP_LEGACY_CPUS | FLAG_EXPECT_FAILURE ,
ARG_END ) ;
2016-05-16 11:08:29 +03:00
DO_TEST ( " cpu-host-passthrough " , QEMU_CAPS_KVM ) ;
DO_TEST_FAILURE ( " cpu-qemu-host-passthrough " , QEMU_CAPS_KVM ) ;
2011-02-08 17:22:39 +03:00
2019-11-26 20:51:22 +03:00
qemuTestSetHostArch ( & driver , VIR_ARCH_S390X ) ;
2022-09-30 15:01:44 +03:00
DO_TEST ( " cpu-s390-zEC12 " , QEMU_CAPS_KVM ) ;
2016-12-18 22:22:29 +03:00
DO_TEST ( " cpu-s390-features " , QEMU_CAPS_KVM , QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION ) ;
DO_TEST_FAILURE ( " cpu-s390-features " , QEMU_CAPS_KVM ) ;
2019-11-26 20:51:22 +03:00
qemuTestSetHostArch ( & driver , VIR_ARCH_NONE ) ;
2016-12-18 22:22:28 +03:00
2022-05-05 17:27:55 +03:00
qemuTestSetHostCPU ( & driver , driver . hostarch , qemuTestGetCPUDef ( QEMU_CPU_DEF_HASWELL ) ) ;
2015-03-23 19:19:28 +03:00
DO_TEST ( " cpu-Haswell " , QEMU_CAPS_KVM ) ;
DO_TEST ( " cpu-Haswell2 " , QEMU_CAPS_KVM ) ;
DO_TEST ( " cpu-Haswell3 " , QEMU_CAPS_KVM ) ;
DO_TEST ( " cpu-Haswell-noTSX " , QEMU_CAPS_KVM ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " cpu-host-model-cmt " ) ;
2017-03-23 17:54:38 +03:00
DO_TEST ( " cpu-tsc-frequency " , QEMU_CAPS_KVM ) ;
2022-06-22 14:30:18 +03:00
qemuTestSetHostCPU ( & driver , driver . hostarch , NULL ) ;
2019-06-11 18:14:27 +03:00
DO_TEST_CAPS_LATEST ( " cpu-translation " ) ;
2015-03-23 19:19:28 +03:00
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " memtune " ) ;
DO_TEST_NOCAPS ( " memtune-unlimited " ) ;
DO_TEST_NOCAPS ( " blkiotune " ) ;
DO_TEST_NOCAPS ( " blkiotune-device " ) ;
2023-02-22 17:57:47 +03:00
DO_TEST_CAPS_LATEST ( " cputune " ) ;
DO_TEST_CAPS_LATEST ( " cputune-zero-shares " ) ;
2023-02-23 11:21:41 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " cputune-iothreadsched-toomuch " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " cputune-vcpusched-overlap " ) ;
2023-02-22 17:57:47 +03:00
DO_TEST_CAPS_LATEST ( " cputune-numatune " ) ;
DO_TEST_CAPS_LATEST ( " vcpu-placement-static " ) ;
2020-06-11 14:57:07 +03:00
DO_TEST_CAPS_LATEST ( " cputune-cpuset-big-id " ) ;
2014-07-02 13:15:45 +04:00
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " numatune-memory " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " numatune-memory-invalid-nodeset " ) ;
2022-11-07 12:58:59 +03:00
DO_TEST_NOCAPS ( " numatune-memnode " ) ;
2021-03-12 19:42:14 +03:00
DO_TEST_CAPS_VER ( " numatune-memnode " , " 5.2.0 " ) ;
DO_TEST_CAPS_LATEST ( " numatune-memnode " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " numatune-memnode-invalid-mode " ) ;
2021-04-15 16:55:04 +03:00
DO_TEST_CAPS_LATEST ( " numatune-memnode-restrictive-mode " ) ;
2021-11-09 17:00:53 +03:00
DO_TEST_CAPS_LATEST ( " numatune-system-memory " ) ;
2014-07-02 13:15:45 +04:00
2022-11-07 12:58:59 +03:00
DO_TEST_NOCAPS ( " numatune-memnode-no-memory " ) ;
2014-07-02 13:15:45 +04:00
2022-11-07 12:58:59 +03:00
DO_TEST_NOCAPS ( " numatune-distances " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " numatune-no-vcpu " ) ;
2020-07-08 12:28:37 +03:00
DO_TEST_CAPS_LATEST ( " numatune-hmat " ) ;
2017-11-14 16:31:17 +03:00
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " numatune-auto-nodeset-invalid " ) ;
2022-11-03 18:01:02 +03:00
DO_TEST_NOCAPS ( " numatune-auto-prefer " ) ;
2022-11-03 12:52:40 +03:00
DO_TEST_FAILURE_NOCAPS ( " numatune-static-nodeset-exceed-hostnode " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " numatune-memnode-nocpu " ) ;
DO_TEST_PARSE_ERROR_NOCAPS ( " numatune-memnodes-problematic " ) ;
2023-01-03 21:27:19 +03:00
DO_TEST_CAPS_LATEST_FAILURE ( " numatune-memnode-unavailable-strict " ) ;
2023-01-03 20:46:05 +03:00
DO_TEST_CAPS_LATEST_FAILURE ( " numatune-memnode-unavailable-restrictive " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " numad " ) ;
DO_TEST_NOCAPS ( " numad-auto-vcpu-static-numatune " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " numad-auto-vcpu-static-numatune-no-nodeset " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " numad-auto-memory-vcpu-cpuset " ) ;
DO_TEST_NOCAPS ( " numad-auto-memory-vcpu-no-cpuset-and-placement " ) ;
DO_TEST_NOCAPS ( " numad-static-memory-auto-vcpu " ) ;
2022-01-06 00:38:24 +03:00
DO_TEST_CAPS_LATEST ( " blkdeviotune " ) ;
2020-05-04 19:16:26 +03:00
DO_TEST_CAPS_LATEST ( " blkdeviotune-max " ) ;
DO_TEST_CAPS_LATEST ( " blkdeviotune-group-num " ) ;
DO_TEST_CAPS_LATEST ( " blkdeviotune-max-length " ) ;
2011-02-08 09:59:38 +03:00
2012-07-09 20:29:55 +04:00
DO_TEST ( " multifunction-pci-device " ,
2018-03-29 00:20:45 +03:00
QEMU_CAPS_SCSI_LSI ) ;
2011-06-08 08:34:04 +04:00
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " monitor-json " ) ;
DO_TEST_NOCAPS ( " seclabel-dynamic " ) ;
DO_TEST_NOCAPS ( " seclabel-dynamic-baselabel " ) ;
DO_TEST_NOCAPS ( " seclabel-dynamic-override " ) ;
DO_TEST_NOCAPS ( " seclabel-dynamic-labelskip " ) ;
DO_TEST_NOCAPS ( " seclabel-dynamic-relabel " ) ;
DO_TEST_NOCAPS ( " seclabel-static " ) ;
DO_TEST_NOCAPS ( " seclabel-static-relabel " ) ;
DO_TEST_NOCAPS ( " seclabel-static-labelskip " ) ;
DO_TEST_NOCAPS ( " seclabel-none " ) ;
DO_TEST_NOCAPS ( " seclabel-dac-none " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " seclabel-multiple " ) ;
DO_TEST_PARSE_ERROR_NOCAPS ( " seclabel-device-duplicates " ) ;
2011-12-23 04:47:46 +04:00
2022-09-13 17:30:35 +03:00
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-basic " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-vio " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-usb-default " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-usb-multi " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-vio-user-assigned " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-nvram " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-usb-kbd " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-cpu-exact " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " pseries-no-parallel " ) ;
2022-09-13 17:30:35 +03:00
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-cpu-le " ) ;
2016-08-04 14:19:39 +03:00
2019-11-26 20:51:22 +03:00
qemuTestSetHostArch ( & driver , VIR_ARCH_PPC64 ) ;
2022-09-13 17:30:35 +03:00
DO_TEST_CAPS_LATEST_PPC64_HOSTCPU ( " pseries-cpu-compat " ,
QEMU_CPU_DEF_POWER9 ) ;
2022-05-20 21:15:18 +03:00
DO_TEST_CAPS_LATEST_PPC64_HOSTCPU_FAILURE ( " pseries-cpu-compat-power9 " ,
QEMU_CPU_DEF_POWER8 ) ;
DO_TEST_CAPS_LATEST_PPC64_HOSTCPU ( " pseries-cpu-compat-power9 " ,
QEMU_CPU_DEF_POWER9 ) ;
2022-05-03 23:15:05 +03:00
DO_TEST_CAPS_LATEST_PPC64_HOSTCPU_FAILURE ( " pseries-cpu-compat-power10 " ,
QEMU_CPU_DEF_POWER9 ) ;
DO_TEST_CAPS_LATEST_PPC64_HOSTCPU ( " pseries-cpu-compat-power10 " ,
QEMU_CPU_DEF_POWER10 ) ;
2017-05-17 17:39:16 +03:00
2019-11-26 20:51:22 +03:00
qemuTestSetHostArch ( & driver , VIR_ARCH_NONE ) ;
2016-08-04 14:19:39 +03:00
2022-09-13 17:30:35 +03:00
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-panic-missing " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-panic-no-address " ) ;
DO_TEST_CAPS_ARCH_LATEST_PARSE_ERROR ( " pseries-panic-address " , " ppc64 " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-phb-simple " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-phb-default-missing " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-phb-numa-node " ) ;
DO_TEST_CAPS_ARCH_LATEST_PARSE_ERROR ( " pseries-default-phb-numa-node " ,
" ppc64 " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " pseries-phb-invalid-target-index-1 " ) ;
DO_TEST_PARSE_ERROR_NOCAPS ( " pseries-phb-invalid-target-index-2 " ) ;
DO_TEST_PARSE_ERROR_NOCAPS ( " pseries-phb-invalid-target-index-3 " ) ;
2017-02-20 20:20:26 +03:00
2022-09-13 17:30:35 +03:00
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-many-devices " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-many-buses-1 " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-many-buses-2 " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-hostdevs-1 " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-hostdevs-2 " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-hostdevs-3 " ) ;
2017-05-26 19:33:36 +03:00
2022-09-13 17:30:35 +03:00
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-features " ) ;
2019-12-10 02:15:06 +03:00
/* parse error: no QEMU_CAPS_MACHINE_PSERIES_CAP_HPT_MAX_PAGE_SIZE */
2022-09-15 19:22:08 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " pseries-features-hpt-pagesize " ) ;
2019-12-10 02:15:06 +03:00
/* parse error: no QEMU_CAPS_MACHINE_PSERIES_CAP_HTM */
2022-09-15 19:22:08 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " pseries-features-htm " ) ;
2019-12-10 02:15:06 +03:00
/* parse error: no QEMU_CAPS_MACHINE_PSERIES_CAP_NESTED_HV */
2022-09-15 19:22:08 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " pseries-features-nested-hv " ) ;
2019-12-10 02:15:06 +03:00
/* parse error: no QEMU_CAPS_MACHINE_PSERIES_CAP_CCF_ASSIST */
2022-09-15 19:22:08 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " pseries-features-ccf " ) ;
2020-04-27 15:14:27 +03:00
/* parse error: no QEMU_CAPS_MACHINE_PSERIES_CFPC */
2022-09-15 19:22:08 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " pseries-features-cfpc " ) ;
2020-04-27 15:14:29 +03:00
/* parse error: no QEMU_CAPS_MACHINE_PSERIES_SBBC */
2022-09-15 19:22:08 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " pseries-features-sbbc " ) ;
2020-04-27 15:14:31 +03:00
/* parse error: no QEMU_CAPS_MACHINE_PSERIES_IBS */
2022-09-15 19:22:08 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " pseries-features-ibs " ) ;
2020-04-27 15:14:27 +03:00
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " pseries-features-invalid-machine " ) ;
2017-11-06 18:39:58 +03:00
2022-09-13 17:30:35 +03:00
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-serial-native " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-serial+console-native " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-serial-compat " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-serial-pci " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-serial-usb " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-console-native " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " pseries-console-virtio " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " pseries-serial-invalid-machine " ) ;
DO_TEST_PARSE_ERROR_NOCAPS ( " pseries-spaprvio-invalid " ) ;
2017-11-08 17:31:21 +03:00
2017-11-09 19:14:57 +03:00
DO_TEST ( " mach-virt-serial-native " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_DEVICE_PL011 ) ;
2017-11-09 19:14:57 +03:00
DO_TEST ( " mach-virt-serial+console-native " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_DEVICE_PL011 ) ;
2017-11-09 19:14:57 +03:00
DO_TEST ( " mach-virt-serial-compat " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_DEVICE_PL011 ) ;
2017-11-09 19:14:57 +03:00
DO_TEST ( " mach-virt-serial-pci " ,
QEMU_CAPS_OBJECT_GPEX ,
QEMU_CAPS_DEVICE_PCIE_ROOT_PORT ,
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE ,
QEMU_CAPS_DEVICE_PCI_BRIDGE ,
QEMU_CAPS_DEVICE_PCI_SERIAL ) ;
DO_TEST ( " mach-virt-serial-usb " ,
QEMU_CAPS_OBJECT_GPEX ,
QEMU_CAPS_DEVICE_PCIE_ROOT_PORT ,
QEMU_CAPS_DEVICE_QEMU_XHCI ,
QEMU_CAPS_DEVICE_USB_SERIAL ) ;
DO_TEST ( " mach-virt-console-native " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_DEVICE_PL011 ) ;
2018-08-30 19:03:58 +03:00
DO_TEST ( " mach-virt-console-virtio " ,
QEMU_CAPS_DEVICE_VIRTIO_MMIO ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " mach-virt-serial-invalid-machine " ) ;
2017-11-09 19:14:57 +03:00
2012-12-14 11:09:17 +04:00
DO_TEST ( " video-device-pciaddr-default " ,
2017-02-23 20:47:36 +03:00
QEMU_CAPS_KVM ,
QEMU_CAPS_VNC ,
QEMU_CAPS_DEVICE_QXL ) ;
2021-03-29 14:47:15 +03:00
DO_TEST ( " video-vga-device " , QEMU_CAPS_DEVICE_VGA ) ;
2016-01-13 03:26:40 +03:00
DO_TEST ( " video-vga-device-vgamem " , QEMU_CAPS_DEVICE_VGA ,
2021-03-29 14:47:15 +03:00
QEMU_CAPS_VGA_VGAMEM ) ;
2016-10-11 18:42:37 +03:00
DO_TEST ( " video-qxl-device " ,
2021-03-29 14:47:15 +03:00
QEMU_CAPS_DEVICE_QXL ) ;
2016-01-13 03:26:40 +03:00
DO_TEST ( " video-qxl-device-vgamem " ,
2016-10-11 18:42:37 +03:00
QEMU_CAPS_DEVICE_QXL ,
QEMU_CAPS_QXL_VGAMEM ) ;
2018-08-27 18:59:26 +03:00
DO_TEST_CAPS_LATEST ( " video-qxl-device-vram64 " ) ;
2016-10-11 18:42:37 +03:00
DO_TEST ( " video-qxl-sec-device " ,
2021-03-29 14:47:15 +03:00
QEMU_CAPS_DEVICE_QXL ) ;
2016-01-13 03:26:40 +03:00
DO_TEST ( " video-qxl-sec-device-vgamem " ,
2016-10-11 18:42:37 +03:00
QEMU_CAPS_DEVICE_QXL ,
2014-11-20 21:52:00 +03:00
QEMU_CAPS_QXL_VGAMEM ) ;
2018-08-27 18:59:26 +03:00
DO_TEST_CAPS_LATEST ( " video-qxl-sec-device-vram64 " ) ;
2022-01-18 18:22:33 +03:00
DO_TEST ( " video-qxl-heads " , QEMU_CAPS_DEVICE_QXL ) ;
DO_TEST ( " video-vga-qxl-heads " , QEMU_CAPS_DEVICE_QXL ) ;
DO_TEST ( " video-qxl-noheads " , QEMU_CAPS_DEVICE_QXL ) ;
2019-10-17 07:30:31 +03:00
DO_TEST ( " video-qxl-resolution " ,
QEMU_CAPS_DEVICE_QXL ,
QEMU_CAPS_QXL_VGAMEM ) ;
2015-11-25 11:42:32 +03:00
DO_TEST ( " video-virtio-gpu-device " ,
2021-03-29 14:47:15 +03:00
QEMU_CAPS_DEVICE_VIRTIO_GPU ) ;
2015-11-25 11:42:33 +03:00
DO_TEST ( " video-virtio-gpu-virgl " ,
2016-01-13 03:26:40 +03:00
QEMU_CAPS_DEVICE_VIRTIO_GPU ,
2021-03-29 14:47:15 +03:00
QEMU_CAPS_VIRTIO_GPU_VIRGL ) ;
2016-02-19 17:30:15 +03:00
DO_TEST ( " video-virtio-gpu-spice-gl " ,
QEMU_CAPS_DEVICE_VIRTIO_GPU ,
2016-10-11 15:06:53 +03:00
QEMU_CAPS_VIRTIO_GPU_VIRGL ,
2016-02-19 17:30:15 +03:00
QEMU_CAPS_SPICE ,
QEMU_CAPS_SPICE_GL ,
2021-03-29 14:47:15 +03:00
QEMU_CAPS_SPICE_RENDERNODE ) ;
2018-05-10 13:53:59 +03:00
DO_TEST ( " video-virtio-gpu-sdl-gl " ,
QEMU_CAPS_DEVICE_VIRTIO_GPU ,
2021-06-15 12:46:54 +03:00
QEMU_CAPS_VIRTIO_GPU_VIRGL ,
QEMU_CAPS_SDL ) ;
2016-10-10 21:19:06 +03:00
DO_TEST ( " video-virtio-gpu-secondary " ,
2021-03-29 14:47:15 +03:00
QEMU_CAPS_DEVICE_VIRTIO_GPU ) ;
2016-09-30 15:41:37 +03:00
DO_TEST ( " video-virtio-vga " ,
QEMU_CAPS_DEVICE_VIRTIO_GPU ,
2022-01-18 18:22:33 +03:00
QEMU_CAPS_DEVICE_VIRTIO_VGA ) ;
2022-02-24 00:06:55 +03:00
DO_TEST_CAPS_LATEST ( " video-virtio-blob-on " ) ;
DO_TEST_CAPS_LATEST ( " video-virtio-blob-off " ) ;
2021-06-09 11:32:27 +03:00
DO_TEST_CAPS_LATEST ( " video-virtio-vga-gpu-gl " ) ;
2019-07-12 23:12:16 +03:00
DO_TEST_CAPS_LATEST ( " video-bochs-display-device " ) ;
2019-09-14 00:20:29 +03:00
DO_TEST_CAPS_LATEST ( " video-ramfb-display-device " ) ;
2020-06-25 23:18:22 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " video-ramfb-display-device-pci-address " ) ;
2018-05-21 15:29:26 +03:00
DO_TEST ( " video-none-device " ,
QEMU_CAPS_VNC ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " video-invalid-multiple-devices " ) ;
DO_TEST_PARSE_ERROR_NOCAPS ( " default-video-type-x86_64-caps-test-0 " ) ;
2012-12-14 11:09:17 +04:00
2020-01-22 13:56:09 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " default-video-type-aarch64 " , " aarch64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " default-video-type-ppc64 " , " ppc64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " default-video-type-riscv64 " , " riscv64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " default-video-type-s390x " , " s390x " ) ;
2020-12-02 23:23:02 +03:00
DO_TEST_PARSE_ERROR ( " video-multiple-primaries " ,
QEMU_CAPS_DEVICE_QXL ,
2021-03-29 14:47:15 +03:00
QEMU_CAPS_DEVICE_VGA ) ;
2020-12-02 23:23:02 +03:00
2017-06-26 20:13:00 +03:00
DO_TEST ( " virtio-rng-default " ,
QEMU_CAPS_DEVICE_VIRTIO_RNG ,
2013-03-07 15:50:14 +04:00
QEMU_CAPS_OBJECT_RNG_RANDOM ) ;
2017-06-26 20:13:00 +03:00
DO_TEST ( " virtio-rng-random " ,
QEMU_CAPS_DEVICE_VIRTIO_RNG ,
2013-02-12 20:56:00 +04:00
QEMU_CAPS_OBJECT_RNG_RANDOM ) ;
2017-06-26 20:13:00 +03:00
DO_TEST ( " virtio-rng-egd " ,
QEMU_CAPS_DEVICE_VIRTIO_RNG ,
2013-02-12 20:56:00 +04:00
QEMU_CAPS_OBJECT_RNG_EGD ) ;
2021-03-12 19:56:49 +03:00
DO_TEST_CAPS_VER ( " virtio-rng-builtin " , " 5.2.0 " ) ;
2020-01-09 11:00:08 +03:00
DO_TEST_CAPS_LATEST ( " virtio-rng-builtin " ) ;
2021-03-12 19:56:49 +03:00
DO_TEST_CAPS_VER ( " virtio-rng-egd-unix " , " 5.2.0 " ) ;
2018-10-04 20:27:17 +03:00
DO_TEST_CAPS_LATEST ( " virtio-rng-egd-unix " ) ;
2017-06-26 20:13:00 +03:00
DO_TEST ( " virtio-rng-multiple " ,
QEMU_CAPS_DEVICE_VIRTIO_RNG ,
QEMU_CAPS_OBJECT_RNG_EGD ,
QEMU_CAPS_OBJECT_RNG_RANDOM ) ;
2016-01-13 03:26:40 +03:00
DO_TEST_PARSE_ERROR ( " virtio-rng-egd-crash " ,
2017-06-26 20:13:00 +03:00
QEMU_CAPS_DEVICE_VIRTIO_RNG ,
QEMU_CAPS_OBJECT_RNG_EGD ) ;
2022-09-30 16:45:08 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " virtio-rng-ccw " , " s390x " ) ;
2013-02-12 20:56:00 +04:00
2021-06-11 11:16:01 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " s390-allow-bogus-usb-none " , " s390x " ) ;
2021-06-11 11:16:01 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " s390-allow-bogus-usb-controller " , " s390x " ) ;
2013-04-26 19:50:36 +04:00
2022-09-30 15:01:44 +03:00
DO_TEST_NOCAPS ( " s390-panic-no-address " ) ;
DO_TEST_PARSE_ERROR_NOCAPS ( " s390-panic-address " ) ;
DO_TEST_NOCAPS ( " s390-panic-missing " ) ;
DO_TEST_PARSE_ERROR_NOCAPS ( " s390-no-parallel " ) ;
DO_TEST ( " s390-serial " , QEMU_CAPS_DEVICE_SCLPCONSOLE ) ;
2017-11-14 18:27:04 +03:00
DO_TEST ( " s390-serial-2 " ,
QEMU_CAPS_DEVICE_SCLPCONSOLE ,
QEMU_CAPS_DEVICE_SCLPLMCONSOLE ) ;
DO_TEST ( " s390-serial-console " ,
QEMU_CAPS_DEVICE_SCLPCONSOLE ) ;
2016-04-29 16:23:43 +03:00
2023-03-03 16:17:06 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " ppc-dtb " , " ppc " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " ppce500-serial " , " ppc " ) ;
2013-03-14 08:49:43 +04:00
2020-01-23 12:26:12 +03:00
DO_TEST_CAPS_LATEST ( " tpm-passthrough " ) ;
DO_TEST_CAPS_LATEST ( " tpm-passthrough-crb " ) ;
2016-01-13 03:26:40 +03:00
DO_TEST_PARSE_ERROR ( " tpm-no-backend-invalid " ,
2013-05-09 14:33:11 +04:00
QEMU_CAPS_DEVICE_TPM_PASSTHROUGH , QEMU_CAPS_DEVICE_TPM_TIS ) ;
2017-04-04 19:22:31 +03:00
DO_TEST_CAPS_LATEST ( " tpm-emulator " ) ;
2018-04-04 21:40:17 +03:00
DO_TEST_CAPS_LATEST ( " tpm-emulator-tpm2 " ) ;
2019-07-25 21:22:01 +03:00
DO_TEST_CAPS_LATEST ( " tpm-emulator-tpm2-enc " ) ;
2021-01-04 05:31:59 +03:00
DO_TEST_CAPS_LATEST ( " tpm-emulator-tpm2-pstate " ) ;
2020-02-05 21:35:50 +03:00
DO_TEST_CAPS_LATEST_PPC64 ( " tpm-emulator-spapr " ) ;
2021-02-10 00:57:22 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " aarch64-tpm " , " aarch64 " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " aarch64-tpm-wrong-model " ) ;
2022-10-17 17:05:08 +03:00
DO_TEST_CAPS_LATEST ( " tpm-external " ) ;
conf: more useful error message when pci function is out of range
If a pci address had a function number out of range, the error message
would be:
Insufficient specification for PCI address
which is logged by virDevicePCIAddressParseXML() after
virDevicePCIAddressIsValid returns a failure.
This patch enhances virDevicePCIAddressIsValid() to optionally report
the error itself (since it is the place that decides which part of the
address is "invalid"), and uses that feature when calling from
virDevicePCIAddressParseXML(), so that the error will be more useful,
e.g.:
Invalid PCI address function=0x8, must be <= 7
Previously, virDevicePCIAddressIsValid didn't check for the
theoretical limits of domain or bus, only for slot or function. While
adding log messages, we also correct that ommission. (The RNG for PCI
addresses already enforces this limit, which by the way means that we
can't add any negative tests for this - as far as I know our
domainschematest has no provisions for passing XML that is supposed to
fail).
Note that virDevicePCIAddressIsValid() can only check against the
absolute maximum attribute values for *any* possible PCI controller,
not for the actual maximums of the specific controller that this
device is attaching to; fortunately there is later more specific
validation for guest-side PCI addresses when building the set of
assigned PCI addresses. For host-side PCI addresses (e.g. for
<hostdev> and for network device pools), we rely on the error that
will be logged when it is found that the device doesn't actually
exist.
This resolves:
https://bugzilla.redhat.com/show_bug.cgi?id=1004596
2015-07-22 18:59:00 +03:00
2022-08-02 11:23:42 +03:00
g_setenv ( TEST_TPM_ENV_VAR , TPM_VER_2_0 , true ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " tpm-emulator " ) ;
g_setenv ( TEST_TPM_ENV_VAR , TPM_VER_1_2 , true ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " tpm-emulator-tpm2 " ) ;
unsetenv ( TEST_TPM_ENV_VAR ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " pci-domain-invalid " ) ;
DO_TEST_PARSE_ERROR_NOCAPS ( " pci-bus-invalid " ) ;
DO_TEST_PARSE_ERROR_NOCAPS ( " pci-slot-invalid " ) ;
DO_TEST_PARSE_ERROR_NOCAPS ( " pci-function-invalid " ) ;
conf: more useful error message when pci function is out of range
If a pci address had a function number out of range, the error message
would be:
Insufficient specification for PCI address
which is logged by virDevicePCIAddressParseXML() after
virDevicePCIAddressIsValid returns a failure.
This patch enhances virDevicePCIAddressIsValid() to optionally report
the error itself (since it is the place that decides which part of the
address is "invalid"), and uses that feature when calling from
virDevicePCIAddressParseXML(), so that the error will be more useful,
e.g.:
Invalid PCI address function=0x8, must be <= 7
Previously, virDevicePCIAddressIsValid didn't check for the
theoretical limits of domain or bus, only for slot or function. While
adding log messages, we also correct that ommission. (The RNG for PCI
addresses already enforces this limit, which by the way means that we
can't add any negative tests for this - as far as I know our
domainschematest has no provisions for passing XML that is supposed to
fail).
Note that virDevicePCIAddressIsValid() can only check against the
absolute maximum attribute values for *any* possible PCI controller,
not for the actual maximums of the specific controller that this
device is attaching to; fortunately there is later more specific
validation for guest-side PCI addresses when building the set of
assigned PCI addresses. For host-side PCI addresses (e.g. for
<hostdev> and for network device pools), we rely on the error that
will be logged when it is found that the device doesn't actually
exist.
This resolves:
https://bugzilla.redhat.com/show_bug.cgi?id=1004596
2015-07-22 18:59:00 +03:00
2017-02-23 20:47:36 +03:00
DO_TEST ( " pci-bridge " ,
QEMU_CAPS_DEVICE_PCI_BRIDGE ,
QEMU_CAPS_VNC ,
QEMU_CAPS_DEVICE_CIRRUS_VGA ) ;
DO_TEST ( " pci-autoadd-addr " ,
QEMU_CAPS_DEVICE_PCI_BRIDGE ,
2016-10-10 18:51:38 +03:00
QEMU_CAPS_DEVICE_CIRRUS_VGA ) ;
2017-02-23 20:47:36 +03:00
DO_TEST ( " pci-autoadd-idx " ,
QEMU_CAPS_DEVICE_PCI_BRIDGE ,
2016-10-10 18:51:38 +03:00
QEMU_CAPS_DEVICE_CIRRUS_VGA ) ;
DO_TEST ( " pci-autofill-addr " , QEMU_CAPS_DEVICE_CIRRUS_VGA ) ;
2015-01-15 16:14:19 +03:00
DO_TEST ( " pci-many " ,
2016-10-10 18:51:38 +03:00
QEMU_CAPS_DEVICE_CIRRUS_VGA ) ;
qemu: set/validate slot/connection type when assigning slots for PCI devices
Since PCI bridges, PCIe bridges, PCIe switches, and PCIe root ports
all share the same namespace, they are all defined as controllers of
type='pci' in libvirt (but with a differing model attribute). Each of
these controllers has a certain connection type upstream, allows
certain connection types downstream, and each can either allow a
single downstream connection at slot 0, or connections from slot 1 -
31.
Right now, we only support the pci-root and pci-bridge devices, both
of which only allow PCI devices to connect, and both which have usable
slots 1 - 31. In preparation for adding other types of controllers
that have different capabilities, this patch 1) adds info to the
qemuDomainPCIAddressBus object to indicate the capabilities, 2) sets
those capabilities appropriately for pci-root and pci-bridge devices,
and 3) validates that the controller being connected to is the proper
type when allocating slots or validating that a user-selected slot is
appropriate for a device..
Having this infrastructure in place will make it much easier to add
support for the other PCI controller types.
While it would be possible to do all the necessary checking by just
storing the controller model in the qemyuDomainPCIAddressBus, it
greatly simplifies all the validation code to also keep a "flags",
"minSlot" and "maxSlot" for each - that way we can just check those
attributes rather than requiring a nearly identical switch statement
everywhere we need to validate compatibility.
You may notice many places where the flags are seemingly hard-coded to
QEMU_PCI_CONNECT_HOTPLUGGABLE | QEMU_PCI_CONNECT_TYPE_PCI
This is currently the correct value for all PCI devices, and in the
future will be the default, with small bits of code added to change to
the flags for the few devices which are the exceptions to this rule.
Finally, there are a few places with "FIXME" comments. Note that these
aren't indicating places that are broken according to the currently
supported devices, they are places that will need fixing when support
for new PCI controller models is added.
To assure that there was no regression in the auto-allocation of PCI
addresses or auto-creation of integrated pci-root, ide, and usb
controllers, a new test case (pci-bridge-many-disks) has been added to
both the qemuxml2argv and qemuxml2xml tests. This new test defines a
domain with several dozen virtio disks but no pci-root or
pci-bridges. The .args file of the new test case was created using
libvirt sources from before this patch, and the test still passes
after this patch has been applied.
2013-07-15 04:09:44 +04:00
DO_TEST ( " pci-bridge-many-disks " ,
2016-01-13 03:26:40 +03:00
QEMU_CAPS_DEVICE_PCI_BRIDGE ) ;
2013-07-10 23:19:32 +04:00
DO_TEST ( " pcie-root " ,
2017-02-23 20:47:36 +03:00
QEMU_CAPS_DEVICE_IOH3420 ,
QEMU_CAPS_ICH9_AHCI ,
QEMU_CAPS_DEVICE_QXL ) ;
qemu: add dmi-to-pci-bridge controller
This PCI controller, named "dmi-to-pci-bridge" in the libvirt config,
and implemented with qemu's "i82801b11-bridge" device, connects to a
PCI Express slot (e.g. one of the slots provided by the pcie-root
controller, aka "pcie.0" on the qemu commandline), and provides 31
*non-hot-pluggable* PCI (*not* PCIe) slots, numbered 1-31.
Any time a machine is defined which has a pcie-root controller
(i.e. any q35-based machinetype), libvirt will automatically add a
dmi-to-pci-bridge controller if one doesn't exist, and also add a
pci-bridge controller. The reasoning here is that any useful domain
will have either an immediate (startup time) or eventual (subsequent
hot-plug) need for a standard PCI slot; since the pcie-root controller
only provides PCIe slots, we need to connect a dmi-to-pci-bridge
controller to it in order to get a non-hot-plug PCI slot that we can
then use to connect a pci-bridge - the slots provided by the
pci-bridge will be both standard PCI and hot-pluggable.
Since pci-bridge devices themselves can not be hot-plugged into a
running system (although you can hot-plug other devices into a
pci-bridge's slots), any new pci-bridge controller that is added can
(and will) be plugged into the dmi-to-pci-bridge as long as it has
empty slots available.
This patch is also changing the qemuxml2xml-pcie test from a "DO_TEST"
to a "DO_DIFFERENT_TEST". This is so that the "before" xml can omit
the automatically added dmi-to-pci-bridge and pci-bridge devices, and
the "after" xml can include it - this way we are testing if libvirt is
properly adding these devices.
2013-07-31 05:37:32 +04:00
DO_TEST ( " q35 " ,
2016-01-13 03:26:40 +03:00
QEMU_CAPS_DEVICE_PCI_BRIDGE ,
qemu: add dmi-to-pci-bridge controller
This PCI controller, named "dmi-to-pci-bridge" in the libvirt config,
and implemented with qemu's "i82801b11-bridge" device, connects to a
PCI Express slot (e.g. one of the slots provided by the pcie-root
controller, aka "pcie.0" on the qemu commandline), and provides 31
*non-hot-pluggable* PCI (*not* PCIe) slots, numbered 1-31.
Any time a machine is defined which has a pcie-root controller
(i.e. any q35-based machinetype), libvirt will automatically add a
dmi-to-pci-bridge controller if one doesn't exist, and also add a
pci-bridge controller. The reasoning here is that any useful domain
will have either an immediate (startup time) or eventual (subsequent
hot-plug) need for a standard PCI slot; since the pcie-root controller
only provides PCIe slots, we need to connect a dmi-to-pci-bridge
controller to it in order to get a non-hot-plug PCI slot that we can
then use to connect a pci-bridge - the slots provided by the
pci-bridge will be both standard PCI and hot-pluggable.
Since pci-bridge devices themselves can not be hot-plugged into a
running system (although you can hot-plug other devices into a
pci-bridge's slots), any new pci-bridge controller that is added can
(and will) be plugged into the dmi-to-pci-bridge as long as it has
empty slots available.
This patch is also changing the qemuxml2xml-pcie test from a "DO_TEST"
to a "DO_DIFFERENT_TEST". This is so that the "before" xml can omit
the automatically added dmi-to-pci-bridge and pci-bridge devices, and
the "after" xml can include it - this way we are testing if libvirt is
properly adding these devices.
2013-07-31 05:37:32 +04:00
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE ,
qemu: initially reserve one open pcie-root-port for hotplug
For machinetypes with a pci-root bus (all legacy PCI), libvirt will
make a "fake" reservation for one extra slot prior to assigning
addresses to unaddressed PCI endpoint devices in the domain. This will
trigger auto-adding of a pci-bridge for the final device to be
assigned an address *if that device would have otherwise instead been
the last device on the last available pci-bridge*; thus it assures
that there will always be at least one slot left open in the domain's
bus topology for expansion (which is important both for hotplug (since
a new pci-bridge can't be added while the guest is running) as well as
for offline additions to the config (since adding a new device might
otherwise in some cases require re-addressing existing devices, which
we want to avoid)).
It's important to note that for the above case (legacy PCI), we must
check for the special case of all slots on all buses being occupied
*prior to assigning any addresses*, and avoid attempting to reserve
the extra address in that case, because there is no free address in
the existing topology, so no place to auto-add a pci-bridge for
expansion (i.e. it would always fail anyway). Since that condition can
only be reached by manual intervention, this is acceptable.
For machinetypes with pcie-root (Q35, aarch64 virt), libvirt's
methodology for automatically expanding the bus topology is different
- pcie-root-ports are plugged into slots (soon to be functions) of
pcie-root as needed, and the new endpoint devices are assigned to the
single slot in each pcie-root-port. This is done so that the devices
are, by default, hotpluggable (the slots of pcie-root don't support
hotplug, but the single slot of the pcie-root-port does). Since
pcie-root-ports can only be plugged into pcie-root, and we don't
auto-assign endpoint devices to the pcie-root slots, this means
topology expansion doesn't compete with endpoint devices for slots, so
we don't need to worry about checking for all "useful" slots being
free *prior* to assigning addresses to new endpoint devices - as a
matter of fact, if we attempt to reserve the open slots before the
used slots, it can lead to errors.
Instead this patch just reserves one slot for a "future potential"
PCIe device after doing the assignment for actual devices, but only
if the only PCI controller defined prior to starting address
assignment was pcie-root, and only if we auto-added at least one PCI
controller during address assignment. This assures two things:
1) that reserving the open slots will only be done when the domain is
initially defined, never at any time after, and
2) that if the user understands enough about PCI controllers that they
are adding them manually, that we don't mess up their plan by
adding extras - if they know enough to add one pcie-root-port, or
to manually assign addresses such that no pcie-root-ports are
needed, they know enough to add extra pcie-root-ports if they want
them (this could be called the "libguestfs clause", since
libguestfs needs to be able to create domains with as few
devices/controllers as possible).
This is set to reserve a single free port for now, but could be
increased in the future if public sentiment goes in that direction
(it's easy to increase later, but essentially impossible to decrease)
2016-09-28 03:37:30 +03:00
QEMU_CAPS_DEVICE_IOH3420 ,
2015-11-06 17:28:57 +03:00
QEMU_CAPS_ICH9_AHCI ,
2017-02-23 20:47:36 +03:00
QEMU_CAPS_ICH9_USB_EHCI1 ,
2016-10-11 18:42:37 +03:00
QEMU_CAPS_DEVICE_QXL ) ;
2016-08-05 22:01:08 +03:00
DO_TEST_PARSE_ERROR ( " q35-dmi-bad-address1 " ,
QEMU_CAPS_DEVICE_PCI_BRIDGE ,
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE ,
QEMU_CAPS_DEVICE_IOH3420 ) ;
DO_TEST_PARSE_ERROR ( " q35-dmi-bad-address2 " ,
QEMU_CAPS_DEVICE_PCI_BRIDGE ,
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE ,
QEMU_CAPS_DEVICE_IOH3420 ) ;
2016-01-10 00:00:01 +03:00
DO_TEST ( " q35-pm-disable " ,
2016-01-13 03:26:40 +03:00
QEMU_CAPS_DEVICE_PCI_BRIDGE ,
qemu: initially reserve one open pcie-root-port for hotplug
For machinetypes with a pci-root bus (all legacy PCI), libvirt will
make a "fake" reservation for one extra slot prior to assigning
addresses to unaddressed PCI endpoint devices in the domain. This will
trigger auto-adding of a pci-bridge for the final device to be
assigned an address *if that device would have otherwise instead been
the last device on the last available pci-bridge*; thus it assures
that there will always be at least one slot left open in the domain's
bus topology for expansion (which is important both for hotplug (since
a new pci-bridge can't be added while the guest is running) as well as
for offline additions to the config (since adding a new device might
otherwise in some cases require re-addressing existing devices, which
we want to avoid)).
It's important to note that for the above case (legacy PCI), we must
check for the special case of all slots on all buses being occupied
*prior to assigning any addresses*, and avoid attempting to reserve
the extra address in that case, because there is no free address in
the existing topology, so no place to auto-add a pci-bridge for
expansion (i.e. it would always fail anyway). Since that condition can
only be reached by manual intervention, this is acceptable.
For machinetypes with pcie-root (Q35, aarch64 virt), libvirt's
methodology for automatically expanding the bus topology is different
- pcie-root-ports are plugged into slots (soon to be functions) of
pcie-root as needed, and the new endpoint devices are assigned to the
single slot in each pcie-root-port. This is done so that the devices
are, by default, hotpluggable (the slots of pcie-root don't support
hotplug, but the single slot of the pcie-root-port does). Since
pcie-root-ports can only be plugged into pcie-root, and we don't
auto-assign endpoint devices to the pcie-root slots, this means
topology expansion doesn't compete with endpoint devices for slots, so
we don't need to worry about checking for all "useful" slots being
free *prior* to assigning addresses to new endpoint devices - as a
matter of fact, if we attempt to reserve the open slots before the
used slots, it can lead to errors.
Instead this patch just reserves one slot for a "future potential"
PCIe device after doing the assignment for actual devices, but only
if the only PCI controller defined prior to starting address
assignment was pcie-root, and only if we auto-added at least one PCI
controller during address assignment. This assures two things:
1) that reserving the open slots will only be done when the domain is
initially defined, never at any time after, and
2) that if the user understands enough about PCI controllers that they
are adding them manually, that we don't mess up their plan by
adding extras - if they know enough to add one pcie-root-port, or
to manually assign addresses such that no pcie-root-ports are
needed, they know enough to add extra pcie-root-ports if they want
them (this could be called the "libguestfs clause", since
libguestfs needs to be able to create domains with as few
devices/controllers as possible).
This is set to reserve a single free port for now, but could be
increased in the future if public sentiment goes in that direction
(it's easy to increase later, but essentially impossible to decrease)
2016-09-28 03:37:30 +03:00
QEMU_CAPS_DEVICE_IOH3420 ,
2016-01-10 00:00:01 +03:00
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE , QEMU_CAPS_ICH9_AHCI ,
QEMU_CAPS_PIIX_DISABLE_S3 , QEMU_CAPS_PIIX_DISABLE_S4 ,
QEMU_CAPS_ICH9_DISABLE_S3 , QEMU_CAPS_ICH9_DISABLE_S4 ) ;
DO_TEST ( " q35-pm-disable-fallback " ,
2016-01-13 03:26:40 +03:00
QEMU_CAPS_DEVICE_PCI_BRIDGE ,
qemu: initially reserve one open pcie-root-port for hotplug
For machinetypes with a pci-root bus (all legacy PCI), libvirt will
make a "fake" reservation for one extra slot prior to assigning
addresses to unaddressed PCI endpoint devices in the domain. This will
trigger auto-adding of a pci-bridge for the final device to be
assigned an address *if that device would have otherwise instead been
the last device on the last available pci-bridge*; thus it assures
that there will always be at least one slot left open in the domain's
bus topology for expansion (which is important both for hotplug (since
a new pci-bridge can't be added while the guest is running) as well as
for offline additions to the config (since adding a new device might
otherwise in some cases require re-addressing existing devices, which
we want to avoid)).
It's important to note that for the above case (legacy PCI), we must
check for the special case of all slots on all buses being occupied
*prior to assigning any addresses*, and avoid attempting to reserve
the extra address in that case, because there is no free address in
the existing topology, so no place to auto-add a pci-bridge for
expansion (i.e. it would always fail anyway). Since that condition can
only be reached by manual intervention, this is acceptable.
For machinetypes with pcie-root (Q35, aarch64 virt), libvirt's
methodology for automatically expanding the bus topology is different
- pcie-root-ports are plugged into slots (soon to be functions) of
pcie-root as needed, and the new endpoint devices are assigned to the
single slot in each pcie-root-port. This is done so that the devices
are, by default, hotpluggable (the slots of pcie-root don't support
hotplug, but the single slot of the pcie-root-port does). Since
pcie-root-ports can only be plugged into pcie-root, and we don't
auto-assign endpoint devices to the pcie-root slots, this means
topology expansion doesn't compete with endpoint devices for slots, so
we don't need to worry about checking for all "useful" slots being
free *prior* to assigning addresses to new endpoint devices - as a
matter of fact, if we attempt to reserve the open slots before the
used slots, it can lead to errors.
Instead this patch just reserves one slot for a "future potential"
PCIe device after doing the assignment for actual devices, but only
if the only PCI controller defined prior to starting address
assignment was pcie-root, and only if we auto-added at least one PCI
controller during address assignment. This assures two things:
1) that reserving the open slots will only be done when the domain is
initially defined, never at any time after, and
2) that if the user understands enough about PCI controllers that they
are adding them manually, that we don't mess up their plan by
adding extras - if they know enough to add one pcie-root-port, or
to manually assign addresses such that no pcie-root-ports are
needed, they know enough to add extra pcie-root-ports if they want
them (this could be called the "libguestfs clause", since
libguestfs needs to be able to create domains with as few
devices/controllers as possible).
This is set to reserve a single free port for now, but could be
increased in the future if public sentiment goes in that direction
(it's easy to increase later, but essentially impossible to decrease)
2016-09-28 03:37:30 +03:00
QEMU_CAPS_DEVICE_IOH3420 ,
2016-01-10 00:00:01 +03:00
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE , QEMU_CAPS_ICH9_AHCI ,
QEMU_CAPS_PIIX_DISABLE_S3 , QEMU_CAPS_PIIX_DISABLE_S4 ) ;
2021-10-11 15:30:58 +03:00
DO_TEST_CAPS_LATEST ( " pc-i440fx-acpi-root-hotplug-disable " ) ;
2021-10-11 15:55:42 +03:00
DO_TEST_CAPS_LATEST ( " pc-i440fx-acpi-root-hotplug-enable " ) ;
2021-10-11 15:30:58 +03:00
DO_TEST_CAPS_VER_PARSE_ERROR ( " pc-i440fx-acpi-root-hotplug-disable " , " 5.1.0 " ) ;
2021-10-11 15:55:42 +03:00
DO_TEST_CAPS_VER_PARSE_ERROR ( " pc-i440fx-acpi-root-hotplug-enable " , " 5.1.0 " ) ;
2015-10-21 22:08:49 +03:00
DO_TEST ( " q35-usb2 " ,
2016-01-13 03:26:40 +03:00
QEMU_CAPS_DEVICE_PCI_BRIDGE ,
2015-10-21 22:08:49 +03:00
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE ,
qemu: initially reserve one open pcie-root-port for hotplug
For machinetypes with a pci-root bus (all legacy PCI), libvirt will
make a "fake" reservation for one extra slot prior to assigning
addresses to unaddressed PCI endpoint devices in the domain. This will
trigger auto-adding of a pci-bridge for the final device to be
assigned an address *if that device would have otherwise instead been
the last device on the last available pci-bridge*; thus it assures
that there will always be at least one slot left open in the domain's
bus topology for expansion (which is important both for hotplug (since
a new pci-bridge can't be added while the guest is running) as well as
for offline additions to the config (since adding a new device might
otherwise in some cases require re-addressing existing devices, which
we want to avoid)).
It's important to note that for the above case (legacy PCI), we must
check for the special case of all slots on all buses being occupied
*prior to assigning any addresses*, and avoid attempting to reserve
the extra address in that case, because there is no free address in
the existing topology, so no place to auto-add a pci-bridge for
expansion (i.e. it would always fail anyway). Since that condition can
only be reached by manual intervention, this is acceptable.
For machinetypes with pcie-root (Q35, aarch64 virt), libvirt's
methodology for automatically expanding the bus topology is different
- pcie-root-ports are plugged into slots (soon to be functions) of
pcie-root as needed, and the new endpoint devices are assigned to the
single slot in each pcie-root-port. This is done so that the devices
are, by default, hotpluggable (the slots of pcie-root don't support
hotplug, but the single slot of the pcie-root-port does). Since
pcie-root-ports can only be plugged into pcie-root, and we don't
auto-assign endpoint devices to the pcie-root slots, this means
topology expansion doesn't compete with endpoint devices for slots, so
we don't need to worry about checking for all "useful" slots being
free *prior* to assigning addresses to new endpoint devices - as a
matter of fact, if we attempt to reserve the open slots before the
used slots, it can lead to errors.
Instead this patch just reserves one slot for a "future potential"
PCIe device after doing the assignment for actual devices, but only
if the only PCI controller defined prior to starting address
assignment was pcie-root, and only if we auto-added at least one PCI
controller during address assignment. This assures two things:
1) that reserving the open slots will only be done when the domain is
initially defined, never at any time after, and
2) that if the user understands enough about PCI controllers that they
are adding them manually, that we don't mess up their plan by
adding extras - if they know enough to add one pcie-root-port, or
to manually assign addresses such that no pcie-root-ports are
needed, they know enough to add extra pcie-root-ports if they want
them (this could be called the "libguestfs clause", since
libguestfs needs to be able to create domains with as few
devices/controllers as possible).
This is set to reserve a single free port for now, but could be
increased in the future if public sentiment goes in that direction
(it's easy to increase later, but essentially impossible to decrease)
2016-09-28 03:37:30 +03:00
QEMU_CAPS_DEVICE_IOH3420 ,
2015-10-21 22:08:49 +03:00
QEMU_CAPS_ICH9_AHCI ,
2017-02-23 20:47:36 +03:00
QEMU_CAPS_ICH9_USB_EHCI1 ,
2016-10-11 18:42:37 +03:00
QEMU_CAPS_DEVICE_QXL ) ;
2015-10-21 22:08:49 +03:00
DO_TEST ( " q35-usb2-multi " ,
2016-01-13 03:26:40 +03:00
QEMU_CAPS_DEVICE_PCI_BRIDGE ,
2015-10-21 22:08:49 +03:00
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE ,
qemu: initially reserve one open pcie-root-port for hotplug
For machinetypes with a pci-root bus (all legacy PCI), libvirt will
make a "fake" reservation for one extra slot prior to assigning
addresses to unaddressed PCI endpoint devices in the domain. This will
trigger auto-adding of a pci-bridge for the final device to be
assigned an address *if that device would have otherwise instead been
the last device on the last available pci-bridge*; thus it assures
that there will always be at least one slot left open in the domain's
bus topology for expansion (which is important both for hotplug (since
a new pci-bridge can't be added while the guest is running) as well as
for offline additions to the config (since adding a new device might
otherwise in some cases require re-addressing existing devices, which
we want to avoid)).
It's important to note that for the above case (legacy PCI), we must
check for the special case of all slots on all buses being occupied
*prior to assigning any addresses*, and avoid attempting to reserve
the extra address in that case, because there is no free address in
the existing topology, so no place to auto-add a pci-bridge for
expansion (i.e. it would always fail anyway). Since that condition can
only be reached by manual intervention, this is acceptable.
For machinetypes with pcie-root (Q35, aarch64 virt), libvirt's
methodology for automatically expanding the bus topology is different
- pcie-root-ports are plugged into slots (soon to be functions) of
pcie-root as needed, and the new endpoint devices are assigned to the
single slot in each pcie-root-port. This is done so that the devices
are, by default, hotpluggable (the slots of pcie-root don't support
hotplug, but the single slot of the pcie-root-port does). Since
pcie-root-ports can only be plugged into pcie-root, and we don't
auto-assign endpoint devices to the pcie-root slots, this means
topology expansion doesn't compete with endpoint devices for slots, so
we don't need to worry about checking for all "useful" slots being
free *prior* to assigning addresses to new endpoint devices - as a
matter of fact, if we attempt to reserve the open slots before the
used slots, it can lead to errors.
Instead this patch just reserves one slot for a "future potential"
PCIe device after doing the assignment for actual devices, but only
if the only PCI controller defined prior to starting address
assignment was pcie-root, and only if we auto-added at least one PCI
controller during address assignment. This assures two things:
1) that reserving the open slots will only be done when the domain is
initially defined, never at any time after, and
2) that if the user understands enough about PCI controllers that they
are adding them manually, that we don't mess up their plan by
adding extras - if they know enough to add one pcie-root-port, or
to manually assign addresses such that no pcie-root-ports are
needed, they know enough to add extra pcie-root-ports if they want
them (this could be called the "libguestfs clause", since
libguestfs needs to be able to create domains with as few
devices/controllers as possible).
This is set to reserve a single free port for now, but could be
increased in the future if public sentiment goes in that direction
(it's easy to increase later, but essentially impossible to decrease)
2016-09-28 03:37:30 +03:00
QEMU_CAPS_DEVICE_IOH3420 ,
2015-10-21 22:08:49 +03:00
QEMU_CAPS_ICH9_AHCI ,
2017-02-23 20:47:36 +03:00
QEMU_CAPS_ICH9_USB_EHCI1 ,
2016-10-11 18:42:37 +03:00
QEMU_CAPS_DEVICE_QXL ) ;
2015-10-21 22:08:49 +03:00
DO_TEST ( " q35-usb2-reorder " ,
2016-01-13 03:26:40 +03:00
QEMU_CAPS_DEVICE_PCI_BRIDGE ,
2015-10-21 22:08:49 +03:00
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE ,
qemu: initially reserve one open pcie-root-port for hotplug
For machinetypes with a pci-root bus (all legacy PCI), libvirt will
make a "fake" reservation for one extra slot prior to assigning
addresses to unaddressed PCI endpoint devices in the domain. This will
trigger auto-adding of a pci-bridge for the final device to be
assigned an address *if that device would have otherwise instead been
the last device on the last available pci-bridge*; thus it assures
that there will always be at least one slot left open in the domain's
bus topology for expansion (which is important both for hotplug (since
a new pci-bridge can't be added while the guest is running) as well as
for offline additions to the config (since adding a new device might
otherwise in some cases require re-addressing existing devices, which
we want to avoid)).
It's important to note that for the above case (legacy PCI), we must
check for the special case of all slots on all buses being occupied
*prior to assigning any addresses*, and avoid attempting to reserve
the extra address in that case, because there is no free address in
the existing topology, so no place to auto-add a pci-bridge for
expansion (i.e. it would always fail anyway). Since that condition can
only be reached by manual intervention, this is acceptable.
For machinetypes with pcie-root (Q35, aarch64 virt), libvirt's
methodology for automatically expanding the bus topology is different
- pcie-root-ports are plugged into slots (soon to be functions) of
pcie-root as needed, and the new endpoint devices are assigned to the
single slot in each pcie-root-port. This is done so that the devices
are, by default, hotpluggable (the slots of pcie-root don't support
hotplug, but the single slot of the pcie-root-port does). Since
pcie-root-ports can only be plugged into pcie-root, and we don't
auto-assign endpoint devices to the pcie-root slots, this means
topology expansion doesn't compete with endpoint devices for slots, so
we don't need to worry about checking for all "useful" slots being
free *prior* to assigning addresses to new endpoint devices - as a
matter of fact, if we attempt to reserve the open slots before the
used slots, it can lead to errors.
Instead this patch just reserves one slot for a "future potential"
PCIe device after doing the assignment for actual devices, but only
if the only PCI controller defined prior to starting address
assignment was pcie-root, and only if we auto-added at least one PCI
controller during address assignment. This assures two things:
1) that reserving the open slots will only be done when the domain is
initially defined, never at any time after, and
2) that if the user understands enough about PCI controllers that they
are adding them manually, that we don't mess up their plan by
adding extras - if they know enough to add one pcie-root-port, or
to manually assign addresses such that no pcie-root-ports are
needed, they know enough to add extra pcie-root-ports if they want
them (this could be called the "libguestfs clause", since
libguestfs needs to be able to create domains with as few
devices/controllers as possible).
This is set to reserve a single free port for now, but could be
increased in the future if public sentiment goes in that direction
(it's easy to increase later, but essentially impossible to decrease)
2016-09-28 03:37:30 +03:00
QEMU_CAPS_DEVICE_IOH3420 ,
2015-10-21 22:08:49 +03:00
QEMU_CAPS_ICH9_AHCI ,
2017-02-23 20:47:36 +03:00
QEMU_CAPS_ICH9_USB_EHCI1 ,
2016-10-11 18:42:37 +03:00
QEMU_CAPS_DEVICE_QXL ) ;
2022-06-23 18:11:57 +03:00
2022-08-25 16:46:09 +03:00
/* Note: The real caps versions of the following tests based on qemu-4.2.0
* were added as a comparison point between fake caps testing and real caps
* testing and don ' t have any other specific purpose */
qemu: assign virtio devices to PCIe slot when appropriate
libvirt previously assigned nearly all devices to a "hotpluggable"
legacy PCI slot even on machines with a PCIe root bus (and even though
most such machines don't even support hotplug on legacy PCI slots!)
Forcing all devices onto legacy PCI slots means that the domain will
need a dmi-to-pci-bridge (to convert from PCIe to legacy PCI) and a
pci-bridge (to provide hotpluggable legacy PCI slots which, again,
usually aren't hotpluggable anyway).
To help reduce the need for these legacy controllers, this patch tries
to assign virtio-1.0-capable devices to PCIe slots whenever possible,
by setting appropriate connectFlags in
virDomainCalculateDevicePCIConnectFlags(). Happily, when that function
was written (just a few commits ago) it was created with a
"virtioFlags" argument, set by both of its callers, which is the
proper connectFlags to set for any virtio-*-pci device - depending on
the arch/machinetype of the domain, and whether or not the qemu binary
supports virtio-1.0, that flag will have either been set to PCI or
PCIe. This patch merely enables the functionality by setting the flags
for the device to whatever is in virtioFlags if the device is a
virtio-*-pci device.
NB: the first virtio video device will be placed directly on bus 0
slot 1 rather than on a pcie-root-port due to the override for primary
video devices in qemuDomainValidateDevicePCISlotsQ35(). Whether or not
to change that is a topic of discussion, but this patch doesn't change
that particular behavior.
NB2: since the slot must be hotpluggable, and pcie-root (the PCIe root
complex) does *not* support hotplug, this means that suitable
controllers must also be in the config (i.e. either pcie-root-port, or
pcie-downstream-port). For now, libvirt doesn't add those
automatically, so if you put virtio devices in a config for a qemu
that has PCIe-capable virtio devices, you'll need to add extra
pcie-root-ports yourself. That requirement will be eliminated in a
future patch, but for now, it's simple to do this:
<controller type='pci' model='pcie-root-port'/>
<controller type='pci' model='pcie-root-port'/>
<controller type='pci' model='pcie-root-port'/>
...
Partially Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1330024
2016-08-14 01:10:41 +03:00
/* verify that devices with pcie capability are assigned to a pcie slot */
2022-08-25 16:46:09 +03:00
DO_TEST_CAPS_VER ( " q35-pcie " , " 4.2.0 " ) ;
2022-06-23 18:11:57 +03:00
DO_TEST_CAPS_LATEST ( " q35-pcie " ) ;
qemu: auto-add pcie-root-port/dmi-to-pci-bridge controllers as needed
Previously libvirt would only add pci-bridge devices automatically
when an address was requested for a device that required a legacy PCI
slot and none was available. This patch expands that support to
dmi-to-pci-bridge (which is needed in order to add a pci-bridge on a
machine with a pcie-root), and pcie-root-port (which is needed to add
a hotpluggable PCIe device). It does *not* automatically add
pcie-switch-upstream-ports or pcie-switch-downstream-ports (and
currently there are no plans for that).
Given the existing code to auto-add pci-bridge devices, automatically
adding pcie-root-ports is fairly straightforward. The
dmi-to-pci-bridge support is a bit tricky though, for a few reasons:
1) Although the only reason to add a dmi-to-pci-bridge is so that
there is a reasonable place to plug in a pci-bridge controller,
most of the time it's not the presence of a pci-bridge *in the
config* that triggers the requirement to add a dmi-to-pci-bridge.
Rather, it is the presence of a legacy-PCI device in the config,
which triggers auto-add of a pci-bridge, which triggers auto-add of
a dmi-to-pci-bridge (this is handled in
virDomainPCIAddressSetGrow() - if there's a request to add a
pci-bridge we'll check if there is a suitable bus to plug it into;
if not, we first add a dmi-to-pci-bridge).
2) Once there is already a single dmi-to-pci-bridge on the system,
there won't be a need for any more, even if it's full, as long as
there is a pci-bridge with an open slot - you can also plug
pci-bridges into existing pci-bridges. So we have to make sure we
don't add a dmi-to-pci-bridge unless there aren't any
dmi-to-pci-bridges *or* any pci-bridges.
3) Although it is strongly discouraged, it is legal for a pci-bridge
to be directly plugged into pcie-root, and we don't want to
auto-add a dmi-to-pci-bridge if there is already a pci-bridge
that's been forced directly into pcie-root.
Although libvirt will now automatically create a dmi-to-pci-bridge
when it's needed, the code still remains for now that forces a
dmi-to-pci-bridge on all domains with pcie-root (in
qemuDomainDefAddDefaultDevices()). That will be removed in a future
patch.
For now, the pcie-root-ports are added one to a slot, which is a bit
wasteful and means it will fail after 31 total PCIe devices (30 if
there are also some PCI devices), but helps keep the changeset down
for this patch. A future patch will have 8 pcie-root-ports sharing the
functions on a single slot.
2016-09-19 21:38:47 +03:00
/* same as q35-pcie, but all PCI controllers are added automatically */
2022-08-25 16:46:09 +03:00
DO_TEST_CAPS_VER ( " q35-pcie-autoadd " , " 4.2.0 " ) ;
2022-06-23 18:11:57 +03:00
DO_TEST_CAPS_LATEST ( " q35-pcie-autoadd " ) ;
2022-08-25 16:46:09 +03:00
DO_TEST_CAPS_VER ( " q35-default-devices-only " , " 4.2.0 " ) ;
2022-06-23 18:11:57 +03:00
DO_TEST_CAPS_LATEST ( " q35-default-devices-only " ) ;
2022-08-25 16:46:09 +03:00
DO_TEST_CAPS_VER ( " q35-multifunction " , " 4.2.0 " ) ;
2022-06-23 18:11:57 +03:00
DO_TEST_CAPS_LATEST ( " q35-multifunction " ) ;
2022-08-25 16:46:09 +03:00
DO_TEST_CAPS_VER ( " q35-virt-manager-basic " , " 4.2.0 " ) ;
2022-06-23 18:11:57 +03:00
DO_TEST_CAPS_LATEST ( " q35-virt-manager-basic " ) ;
2017-03-16 19:41:21 +03:00
/* Test automatic and manual setting of pcie-root-port attributes */
2015-06-17 20:27:57 +03:00
DO_TEST ( " pcie-root-port " ,
QEMU_CAPS_DEVICE_IOH3420 ,
2015-11-06 17:28:57 +03:00
QEMU_CAPS_ICH9_AHCI ,
2016-10-11 18:42:37 +03:00
QEMU_CAPS_DEVICE_QXL ) ;
2017-03-16 19:41:21 +03:00
/* Make sure the default model for PCIe Root Ports is picked correctly
* based on QEMU binary capabilities . We use x86 / q35 for the test , but
* any PCIe machine type ( such as aarch64 / virt ) will behave the same */
DO_TEST ( " pcie-root-port-model-generic " ,
QEMU_CAPS_DEVICE_PCIE_ROOT_PORT ,
2018-03-29 00:20:45 +03:00
QEMU_CAPS_DEVICE_IOH3420 ) ;
2017-03-16 19:41:21 +03:00
DO_TEST ( " pcie-root-port-model-ioh3420 " ,
2018-03-29 00:20:45 +03:00
QEMU_CAPS_DEVICE_IOH3420 ) ;
2020-03-04 06:22:14 +03:00
DO_TEST_CAPS_LATEST ( " pcie-root-port-nohotplug " ) ;
2017-03-16 19:41:21 +03:00
2016-05-10 20:14:32 +03:00
DO_TEST ( " autoindex " ,
QEMU_CAPS_DEVICE_PCI_BRIDGE ,
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE ,
QEMU_CAPS_DEVICE_IOH3420 ,
QEMU_CAPS_DEVICE_X3130_UPSTREAM ,
QEMU_CAPS_DEVICE_XIO3130_DOWNSTREAM ,
QEMU_CAPS_ICH9_AHCI ,
2017-02-23 20:47:36 +03:00
QEMU_CAPS_ICH9_USB_EHCI1 ,
2016-05-10 20:14:32 +03:00
QEMU_CAPS_NEC_USB_XHCI ) ;
2016-10-12 18:02:37 +03:00
/* Make sure the user can always override libvirt's default device
* placement policy by providing an explicit PCI address */
DO_TEST ( " q35-pci-force-address " ,
QEMU_CAPS_DEVICE_PCI_BRIDGE ,
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE ,
QEMU_CAPS_DEVICE_IOH3420 ,
QEMU_CAPS_HDA_DUPLEX ) ;
2015-06-17 20:27:57 +03:00
2016-04-20 00:05:54 +03:00
DO_TEST_PARSE_ERROR ( " q35-wrong-root " ,
qemu: initially reserve one open pcie-root-port for hotplug
For machinetypes with a pci-root bus (all legacy PCI), libvirt will
make a "fake" reservation for one extra slot prior to assigning
addresses to unaddressed PCI endpoint devices in the domain. This will
trigger auto-adding of a pci-bridge for the final device to be
assigned an address *if that device would have otherwise instead been
the last device on the last available pci-bridge*; thus it assures
that there will always be at least one slot left open in the domain's
bus topology for expansion (which is important both for hotplug (since
a new pci-bridge can't be added while the guest is running) as well as
for offline additions to the config (since adding a new device might
otherwise in some cases require re-addressing existing devices, which
we want to avoid)).
It's important to note that for the above case (legacy PCI), we must
check for the special case of all slots on all buses being occupied
*prior to assigning any addresses*, and avoid attempting to reserve
the extra address in that case, because there is no free address in
the existing topology, so no place to auto-add a pci-bridge for
expansion (i.e. it would always fail anyway). Since that condition can
only be reached by manual intervention, this is acceptable.
For machinetypes with pcie-root (Q35, aarch64 virt), libvirt's
methodology for automatically expanding the bus topology is different
- pcie-root-ports are plugged into slots (soon to be functions) of
pcie-root as needed, and the new endpoint devices are assigned to the
single slot in each pcie-root-port. This is done so that the devices
are, by default, hotpluggable (the slots of pcie-root don't support
hotplug, but the single slot of the pcie-root-port does). Since
pcie-root-ports can only be plugged into pcie-root, and we don't
auto-assign endpoint devices to the pcie-root slots, this means
topology expansion doesn't compete with endpoint devices for slots, so
we don't need to worry about checking for all "useful" slots being
free *prior* to assigning addresses to new endpoint devices - as a
matter of fact, if we attempt to reserve the open slots before the
used slots, it can lead to errors.
Instead this patch just reserves one slot for a "future potential"
PCIe device after doing the assignment for actual devices, but only
if the only PCI controller defined prior to starting address
assignment was pcie-root, and only if we auto-added at least one PCI
controller during address assignment. This assures two things:
1) that reserving the open slots will only be done when the domain is
initially defined, never at any time after, and
2) that if the user understands enough about PCI controllers that they
are adding them manually, that we don't mess up their plan by
adding extras - if they know enough to add one pcie-root-port, or
to manually assign addresses such that no pcie-root-ports are
needed, they know enough to add extra pcie-root-ports if they want
them (this could be called the "libguestfs clause", since
libguestfs needs to be able to create domains with as few
devices/controllers as possible).
This is set to reserve a single free port for now, but could be
increased in the future if public sentiment goes in that direction
(it's easy to increase later, but essentially impossible to decrease)
2016-09-28 03:37:30 +03:00
QEMU_CAPS_DEVICE_IOH3420 ,
2016-04-20 00:05:54 +03:00
QEMU_CAPS_ICH9_AHCI ,
2018-03-29 00:20:45 +03:00
QEMU_CAPS_ICH9_USB_EHCI1 ,
2016-10-11 18:42:37 +03:00
QEMU_CAPS_DEVICE_QXL ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " 440fx-wrong-root " ) ;
DO_TEST_PARSE_ERROR_NOCAPS ( " 440fx-ide-address-conflict " ) ;
2016-04-20 00:05:54 +03:00
2016-05-14 23:36:16 +03:00
DO_TEST_PARSE_ERROR ( " pcie-root-port-too-many " ,
2015-06-17 20:27:57 +03:00
QEMU_CAPS_DEVICE_IOH3420 ,
2015-11-06 17:28:57 +03:00
QEMU_CAPS_ICH9_AHCI ,
2016-10-11 18:42:37 +03:00
QEMU_CAPS_DEVICE_QXL ) ;
2013-04-19 14:38:53 +04:00
2015-06-16 22:09:07 +03:00
DO_TEST ( " pcie-switch-upstream-port " ,
QEMU_CAPS_DEVICE_IOH3420 ,
QEMU_CAPS_DEVICE_X3130_UPSTREAM ,
2015-11-06 17:28:57 +03:00
QEMU_CAPS_ICH9_AHCI ,
2016-10-11 18:42:37 +03:00
QEMU_CAPS_DEVICE_QXL ) ;
2015-06-18 00:48:28 +03:00
DO_TEST ( " pcie-switch-downstream-port " ,
QEMU_CAPS_DEVICE_IOH3420 ,
QEMU_CAPS_DEVICE_X3130_UPSTREAM ,
QEMU_CAPS_DEVICE_XIO3130_DOWNSTREAM ,
2015-11-06 17:28:57 +03:00
QEMU_CAPS_ICH9_AHCI ,
2016-10-11 18:42:37 +03:00
QEMU_CAPS_DEVICE_QXL ) ;
2015-06-16 22:09:07 +03:00
2016-03-04 22:35:20 +03:00
DO_TEST ( " pci-expander-bus " ,
QEMU_CAPS_DEVICE_PXB ) ;
DO_TEST_PARSE_ERROR ( " pci-expander-bus-bad-node " ,
QEMU_CAPS_DEVICE_PXB ) ;
DO_TEST_PARSE_ERROR ( " pci-expander-bus-bad-machine " ,
QEMU_CAPS_DEVICE_PXB ) ;
2016-08-07 02:03:31 +03:00
DO_TEST_PARSE_ERROR ( " pci-expander-bus-bad-bus " ,
QEMU_CAPS_DEVICE_PXB ) ;
2016-03-04 22:35:20 +03:00
2016-03-23 22:49:29 +03:00
DO_TEST ( " pcie-expander-bus " ,
QEMU_CAPS_DEVICE_IOH3420 ,
QEMU_CAPS_DEVICE_X3130_UPSTREAM ,
QEMU_CAPS_DEVICE_XIO3130_DOWNSTREAM ,
QEMU_CAPS_DEVICE_PXB_PCIE ) ;
DO_TEST_PARSE_ERROR ( " pcie-expander-bus-bad-machine " ,
QEMU_CAPS_DEVICE_IOH3420 ,
QEMU_CAPS_DEVICE_X3130_UPSTREAM ,
QEMU_CAPS_DEVICE_XIO3130_DOWNSTREAM ,
QEMU_CAPS_DEVICE_PXB_PCIE ) ;
2016-08-07 02:03:31 +03:00
DO_TEST_PARSE_ERROR ( " pcie-expander-bus-bad-bus " ,
QEMU_CAPS_DEVICE_IOH3420 ,
QEMU_CAPS_DEVICE_PXB_PCIE ) ;
2021-07-22 16:06:03 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " pcie-expander-bus-aarch64 " , " aarch64 " ) ;
2016-03-23 22:49:29 +03:00
2020-06-17 15:58:49 +03:00
DO_TEST_CAPS_LATEST ( " hostdev-scsi-lsi " ) ;
2020-06-17 16:51:57 +03:00
DO_TEST_CAPS_LATEST ( " hostdev-scsi-virtio-scsi " ) ;
2020-06-17 15:55:04 +03:00
2016-11-22 06:58:20 +03:00
DO_TEST ( " hostdev-scsi-vhost-scsi-ccw " ,
2022-09-30 15:01:44 +03:00
QEMU_CAPS_VIRTIO_SCSI , QEMU_CAPS_DEVICE_VHOST_SCSI ) ;
2016-11-22 06:58:20 +03:00
DO_TEST ( " hostdev-scsi-vhost-scsi-pci " ,
2018-09-18 13:29:10 +03:00
QEMU_CAPS_VIRTIO_SCSI ,
QEMU_CAPS_DEVICE_VHOST_SCSI ) ;
2019-08-27 17:19:20 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " hostdev-scsi-vhost-scsi-pci-boot-fail " ) ;
2022-08-25 16:46:09 +03:00
DO_TEST_CAPS_VER ( " hostdev-scsi-vhost-scsi-pcie " , " 4.2.0 " ) ;
2022-06-23 18:11:57 +03:00
DO_TEST_CAPS_LATEST ( " hostdev-scsi-vhost-scsi-pcie " ) ;
2021-06-18 13:46:12 +03:00
DO_TEST_PARSE_ERROR ( " hostdev-scsi-duplicate " ,
QEMU_CAPS_VIRTIO_SCSI ,
QEMU_CAPS_DEVICE_VHOST_SCSI ) ;
qemu: Build qemu command line for scsi host device
Except the scsi host device's controller is "lsilogic", mapping
between the libvirt attributes and scsi-generic properties is:
libvirt qemu
-----------------------------------------
controller bus ($libvirt_controller.0)
bus channel
target scsi-id
unit lun
For scsi host device with "lsilogic" controller, the mapping is:
('target (libvirt)' must be 0, as it's not used; 'unit (libvirt)
must <= 7).
libvirt qemu
----------------------------------------------------------
controller && bus bus ($libvirt_controller.$libvirt_bus)
unit scsi-id
It's not good to hardcode/hard-check limits of these attributes,
and even worse, these limits are not documented, one has to find
out by either testing or reading the qemu code, I'm looking forward
to qemu expose limits like these one day). For example, exposing
"max_target", "max_lun" for megasas:
static const struct SCSIBusInfo megasas_scsi_info = {
.tcq = true,
.max_target = MFI_MAX_LD,
.max_lun = 255,
.transfer_data = megasas_xfer_complete,
.get_sg_list = megasas_get_sg_list,
.complete = megasas_command_complete,
.cancel = megasas_command_cancel,
};
Example of the qemu command line (lsilogic controller):
-drive file=/dev/sg2,if=none,id=drive-hostdev-scsi_host7-0-0-0 \
-device scsi-generic,bus=scsi0.0,scsi-id=8,\
drive=drive-hostdev-scsi_host7-0-0-0,id=hostdev-scsi_host7-0-0-0
Example of the qemu command line (virtio-scsi controller):
-drive file=/dev/sg2,if=none,id=drive-hostdev-scsi_host7-0-0-0 \
-device scsi-generic,bus=scsi0.0,channel=0,scsi-id=128,lun=128,\
drive=drive-hostdev-scsi_host7-0-0-0,id=hostdev-scsi_host7-0-0-0
Signed-off-by: Han Cheng <hanc.fnst@cn.fujitsu.com>
Signed-off-by: Osier Yang <jyang@redhat.com>
2013-05-03 22:07:23 +04:00
2019-04-12 11:01:53 +03:00
DO_TEST_CAPS_LATEST ( " mlock-on " ) ;
DO_TEST_CAPS_LATEST ( " mlock-off " ) ;
2019-04-12 11:00:41 +03:00
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " pci-bridge-negative-index-invalid " ) ;
DO_TEST_PARSE_ERROR_NOCAPS ( " pci-bridge-duplicate-index " ) ;
DO_TEST_PARSE_ERROR_NOCAPS ( " pci-root-nonzero-index " ) ;
DO_TEST_PARSE_ERROR_NOCAPS ( " pci-root-address " ) ;
2013-07-12 16:17:23 +04:00
2013-07-18 13:19:23 +04:00
DO_TEST ( " hotplug-base " ,
2016-01-13 03:26:40 +03:00
QEMU_CAPS_KVM , QEMU_CAPS_VIRTIO_SCSI ) ;
2013-07-18 13:19:23 +04:00
2022-08-11 20:08:35 +03:00
DO_TEST_NOCAPS ( " pcihole64 " ) ;
2013-08-12 15:48:34 +04:00
DO_TEST ( " pcihole64-q35 " ,
qemu: initially reserve one open pcie-root-port for hotplug
For machinetypes with a pci-root bus (all legacy PCI), libvirt will
make a "fake" reservation for one extra slot prior to assigning
addresses to unaddressed PCI endpoint devices in the domain. This will
trigger auto-adding of a pci-bridge for the final device to be
assigned an address *if that device would have otherwise instead been
the last device on the last available pci-bridge*; thus it assures
that there will always be at least one slot left open in the domain's
bus topology for expansion (which is important both for hotplug (since
a new pci-bridge can't be added while the guest is running) as well as
for offline additions to the config (since adding a new device might
otherwise in some cases require re-addressing existing devices, which
we want to avoid)).
It's important to note that for the above case (legacy PCI), we must
check for the special case of all slots on all buses being occupied
*prior to assigning any addresses*, and avoid attempting to reserve
the extra address in that case, because there is no free address in
the existing topology, so no place to auto-add a pci-bridge for
expansion (i.e. it would always fail anyway). Since that condition can
only be reached by manual intervention, this is acceptable.
For machinetypes with pcie-root (Q35, aarch64 virt), libvirt's
methodology for automatically expanding the bus topology is different
- pcie-root-ports are plugged into slots (soon to be functions) of
pcie-root as needed, and the new endpoint devices are assigned to the
single slot in each pcie-root-port. This is done so that the devices
are, by default, hotpluggable (the slots of pcie-root don't support
hotplug, but the single slot of the pcie-root-port does). Since
pcie-root-ports can only be plugged into pcie-root, and we don't
auto-assign endpoint devices to the pcie-root slots, this means
topology expansion doesn't compete with endpoint devices for slots, so
we don't need to worry about checking for all "useful" slots being
free *prior* to assigning addresses to new endpoint devices - as a
matter of fact, if we attempt to reserve the open slots before the
used slots, it can lead to errors.
Instead this patch just reserves one slot for a "future potential"
PCIe device after doing the assignment for actual devices, but only
if the only PCI controller defined prior to starting address
assignment was pcie-root, and only if we auto-added at least one PCI
controller during address assignment. This assures two things:
1) that reserving the open slots will only be done when the domain is
initially defined, never at any time after, and
2) that if the user understands enough about PCI controllers that they
are adding them manually, that we don't mess up their plan by
adding extras - if they know enough to add one pcie-root-port, or
to manually assign addresses such that no pcie-root-ports are
needed, they know enough to add extra pcie-root-ports if they want
them (this could be called the "libguestfs clause", since
libguestfs needs to be able to create domains with as few
devices/controllers as possible).
This is set to reserve a single free port for now, but could be
increased in the future if public sentiment goes in that direction
(it's easy to increase later, but essentially impossible to decrease)
2016-09-28 03:37:30 +03:00
QEMU_CAPS_DEVICE_IOH3420 ,
2015-11-06 17:28:57 +03:00
QEMU_CAPS_ICH9_AHCI ,
2022-08-11 20:08:35 +03:00
QEMU_CAPS_DEVICE_QXL ) ;
2013-08-12 15:48:34 +04:00
2023-03-03 16:38:25 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " arm-vexpressa9-nodevs " , " aarch64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " arm-vexpressa9-basic " , " aarch64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " arm-vexpressa9-virtio " , " aarch64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " arm-virt-virtio " , " aarch64 " ) ;
2013-07-30 23:41:14 +04:00
2014-01-02 14:42:56 +04:00
DO_TEST ( " aarch64-virt-virtio " ,
2015-11-06 17:28:57 +03:00
QEMU_CAPS_DEVICE_VIRTIO_MMIO ,
2017-11-28 13:34:55 +03:00
QEMU_CAPS_DEVICE_PL011 ,
2014-01-02 14:42:56 +04:00
QEMU_CAPS_DEVICE_VIRTIO_RNG , QEMU_CAPS_OBJECT_RNG_RANDOM ) ;
2016-01-28 01:47:14 +03:00
/* Demonstrates the virtio-pci default... namely that there isn't any!
q35 style PCI controllers will be added if the binary supports it ,
but virtio - mmio is always used unless PCI addresses are manually
specified . */
2022-08-25 16:46:09 +03:00
DO_TEST_CAPS_ARCH_VER ( " aarch64-virtio-pci-default " , " aarch64 " , " 4.2.0 " ) ;
2022-06-23 18:11:57 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " aarch64-virtio-pci-default " , " aarch64 " ) ;
2016-04-08 11:46:41 +03:00
DO_TEST ( " aarch64-virt-2.6-virtio-pci-default " ,
2015-11-06 17:28:57 +03:00
QEMU_CAPS_DEVICE_VIRTIO_MMIO ,
2015-09-30 03:10:07 +03:00
QEMU_CAPS_DEVICE_VIRTIO_RNG , QEMU_CAPS_OBJECT_RNG_RANDOM ,
QEMU_CAPS_OBJECT_GPEX , QEMU_CAPS_DEVICE_PCI_BRIDGE ,
qemu: initially reserve one open pcie-root-port for hotplug
For machinetypes with a pci-root bus (all legacy PCI), libvirt will
make a "fake" reservation for one extra slot prior to assigning
addresses to unaddressed PCI endpoint devices in the domain. This will
trigger auto-adding of a pci-bridge for the final device to be
assigned an address *if that device would have otherwise instead been
the last device on the last available pci-bridge*; thus it assures
that there will always be at least one slot left open in the domain's
bus topology for expansion (which is important both for hotplug (since
a new pci-bridge can't be added while the guest is running) as well as
for offline additions to the config (since adding a new device might
otherwise in some cases require re-addressing existing devices, which
we want to avoid)).
It's important to note that for the above case (legacy PCI), we must
check for the special case of all slots on all buses being occupied
*prior to assigning any addresses*, and avoid attempting to reserve
the extra address in that case, because there is no free address in
the existing topology, so no place to auto-add a pci-bridge for
expansion (i.e. it would always fail anyway). Since that condition can
only be reached by manual intervention, this is acceptable.
For machinetypes with pcie-root (Q35, aarch64 virt), libvirt's
methodology for automatically expanding the bus topology is different
- pcie-root-ports are plugged into slots (soon to be functions) of
pcie-root as needed, and the new endpoint devices are assigned to the
single slot in each pcie-root-port. This is done so that the devices
are, by default, hotpluggable (the slots of pcie-root don't support
hotplug, but the single slot of the pcie-root-port does). Since
pcie-root-ports can only be plugged into pcie-root, and we don't
auto-assign endpoint devices to the pcie-root slots, this means
topology expansion doesn't compete with endpoint devices for slots, so
we don't need to worry about checking for all "useful" slots being
free *prior* to assigning addresses to new endpoint devices - as a
matter of fact, if we attempt to reserve the open slots before the
used slots, it can lead to errors.
Instead this patch just reserves one slot for a "future potential"
PCIe device after doing the assignment for actual devices, but only
if the only PCI controller defined prior to starting address
assignment was pcie-root, and only if we auto-added at least one PCI
controller during address assignment. This assures two things:
1) that reserving the open slots will only be done when the domain is
initially defined, never at any time after, and
2) that if the user understands enough about PCI controllers that they
are adding them manually, that we don't mess up their plan by
adding extras - if they know enough to add one pcie-root-port, or
to manually assign addresses such that no pcie-root-ports are
needed, they know enough to add extra pcie-root-ports if they want
them (this could be called the "libguestfs clause", since
libguestfs needs to be able to create domains with as few
devices/controllers as possible).
This is set to reserve a single free port for now, but could be
increased in the future if public sentiment goes in that direction
(it's easy to increase later, but essentially impossible to decrease)
2016-09-28 03:37:30 +03:00
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE ,
2017-11-28 13:34:55 +03:00
QEMU_CAPS_DEVICE_PL011 ,
qemu: initially reserve one open pcie-root-port for hotplug
For machinetypes with a pci-root bus (all legacy PCI), libvirt will
make a "fake" reservation for one extra slot prior to assigning
addresses to unaddressed PCI endpoint devices in the domain. This will
trigger auto-adding of a pci-bridge for the final device to be
assigned an address *if that device would have otherwise instead been
the last device on the last available pci-bridge*; thus it assures
that there will always be at least one slot left open in the domain's
bus topology for expansion (which is important both for hotplug (since
a new pci-bridge can't be added while the guest is running) as well as
for offline additions to the config (since adding a new device might
otherwise in some cases require re-addressing existing devices, which
we want to avoid)).
It's important to note that for the above case (legacy PCI), we must
check for the special case of all slots on all buses being occupied
*prior to assigning any addresses*, and avoid attempting to reserve
the extra address in that case, because there is no free address in
the existing topology, so no place to auto-add a pci-bridge for
expansion (i.e. it would always fail anyway). Since that condition can
only be reached by manual intervention, this is acceptable.
For machinetypes with pcie-root (Q35, aarch64 virt), libvirt's
methodology for automatically expanding the bus topology is different
- pcie-root-ports are plugged into slots (soon to be functions) of
pcie-root as needed, and the new endpoint devices are assigned to the
single slot in each pcie-root-port. This is done so that the devices
are, by default, hotpluggable (the slots of pcie-root don't support
hotplug, but the single slot of the pcie-root-port does). Since
pcie-root-ports can only be plugged into pcie-root, and we don't
auto-assign endpoint devices to the pcie-root slots, this means
topology expansion doesn't compete with endpoint devices for slots, so
we don't need to worry about checking for all "useful" slots being
free *prior* to assigning addresses to new endpoint devices - as a
matter of fact, if we attempt to reserve the open slots before the
used slots, it can lead to errors.
Instead this patch just reserves one slot for a "future potential"
PCIe device after doing the assignment for actual devices, but only
if the only PCI controller defined prior to starting address
assignment was pcie-root, and only if we auto-added at least one PCI
controller during address assignment. This assures two things:
1) that reserving the open slots will only be done when the domain is
initially defined, never at any time after, and
2) that if the user understands enough about PCI controllers that they
are adding them manually, that we don't mess up their plan by
adding extras - if they know enough to add one pcie-root-port, or
to manually assign addresses such that no pcie-root-ports are
needed, they know enough to add extra pcie-root-ports if they want
them (this could be called the "libguestfs clause", since
libguestfs needs to be able to create domains with as few
devices/controllers as possible).
This is set to reserve a single free port for now, but could be
increased in the future if public sentiment goes in that direction
(it's easy to increase later, but essentially impossible to decrease)
2016-09-28 03:37:30 +03:00
QEMU_CAPS_DEVICE_IOH3420 ) ;
2016-01-28 01:47:14 +03:00
/* Example of using virtio-pci with no explicit PCI controller
but with manual PCI addresses */
DO_TEST ( " aarch64-virtio-pci-manual-addresses " ,
2015-11-06 17:28:57 +03:00
QEMU_CAPS_DEVICE_VIRTIO_MMIO ,
2015-09-30 03:10:07 +03:00
QEMU_CAPS_DEVICE_VIRTIO_RNG , QEMU_CAPS_OBJECT_RNG_RANDOM ,
QEMU_CAPS_OBJECT_GPEX , QEMU_CAPS_DEVICE_PCI_BRIDGE ,
qemu: initially reserve one open pcie-root-port for hotplug
For machinetypes with a pci-root bus (all legacy PCI), libvirt will
make a "fake" reservation for one extra slot prior to assigning
addresses to unaddressed PCI endpoint devices in the domain. This will
trigger auto-adding of a pci-bridge for the final device to be
assigned an address *if that device would have otherwise instead been
the last device on the last available pci-bridge*; thus it assures
that there will always be at least one slot left open in the domain's
bus topology for expansion (which is important both for hotplug (since
a new pci-bridge can't be added while the guest is running) as well as
for offline additions to the config (since adding a new device might
otherwise in some cases require re-addressing existing devices, which
we want to avoid)).
It's important to note that for the above case (legacy PCI), we must
check for the special case of all slots on all buses being occupied
*prior to assigning any addresses*, and avoid attempting to reserve
the extra address in that case, because there is no free address in
the existing topology, so no place to auto-add a pci-bridge for
expansion (i.e. it would always fail anyway). Since that condition can
only be reached by manual intervention, this is acceptable.
For machinetypes with pcie-root (Q35, aarch64 virt), libvirt's
methodology for automatically expanding the bus topology is different
- pcie-root-ports are plugged into slots (soon to be functions) of
pcie-root as needed, and the new endpoint devices are assigned to the
single slot in each pcie-root-port. This is done so that the devices
are, by default, hotpluggable (the slots of pcie-root don't support
hotplug, but the single slot of the pcie-root-port does). Since
pcie-root-ports can only be plugged into pcie-root, and we don't
auto-assign endpoint devices to the pcie-root slots, this means
topology expansion doesn't compete with endpoint devices for slots, so
we don't need to worry about checking for all "useful" slots being
free *prior* to assigning addresses to new endpoint devices - as a
matter of fact, if we attempt to reserve the open slots before the
used slots, it can lead to errors.
Instead this patch just reserves one slot for a "future potential"
PCIe device after doing the assignment for actual devices, but only
if the only PCI controller defined prior to starting address
assignment was pcie-root, and only if we auto-added at least one PCI
controller during address assignment. This assures two things:
1) that reserving the open slots will only be done when the domain is
initially defined, never at any time after, and
2) that if the user understands enough about PCI controllers that they
are adding them manually, that we don't mess up their plan by
adding extras - if they know enough to add one pcie-root-port, or
to manually assign addresses such that no pcie-root-ports are
needed, they know enough to add extra pcie-root-ports if they want
them (this could be called the "libguestfs clause", since
libguestfs needs to be able to create domains with as few
devices/controllers as possible).
This is set to reserve a single free port for now, but could be
increased in the future if public sentiment goes in that direction
(it's easy to increase later, but essentially impossible to decrease)
2016-09-28 03:37:30 +03:00
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE ,
QEMU_CAPS_DEVICE_IOH3420 ,
QEMU_CAPS_VIRTIO_SCSI ) ;
qemu: map "virtio" video model to "virt" machtype correctly (arm/aarch64)
Most of QEMU's PCI display device models, such as:
libvirt video/model/@type QEMU -device
------------------------- ------------
cirrus cirrus-vga
vga VGA
qxl qxl-vga
virtio virtio-vga
come with a linear framebuffer (sometimes called "VGA compatibility
framebuffer"). This linear framebuffer lives in one of the PCI device's
MMIO BARs, and allows guest code (primarily: firmware drivers, and
non-accelerated OS drivers) to display graphics with direct memory access.
Due to architectural reasons on aarch64/KVM hosts, this kind of
framebuffer doesn't / can't work in
qemu-system-(arm|aarch64) -M virt
machines. Cache coherency issues guarantee a corrupted / unusable display.
The problem has been researched by several people, including kvm-arm
maintainers, and it's been decided that the best way (practically the only
way) to have boot time graphics for such guests is to consolidate on
QEMU's "virtio-gpu-pci" device.
>From <https://bugzilla.redhat.com/show_bug.cgi?id=1195176>, libvirt
supports
<devices>
<video>
<model type='virtio'/>
</video>
</devices>
but libvirt unconditionally maps @type='virtio' to QEMU's "virtio-vga"
device model. (See the qemuBuildDeviceVideoStr() function and the
"qemuDeviceVideo" enum impl.)
According to the above, this is not right for the "virt" machine type; the
qemu-system-(arm|aarch64) binaries don't even recognize the "virtio-vga"
device model (justifiedly). Whereas "virtio-gpu-pci", which is a pure
virtio device without a compatibility framebuffer, is available, and works
fine.
(The ArmVirtQemu ("AAVMF") platform of edk2 -- that is, the UEFI firmware
for "virt" -- supports "virtio-gpu-pci", as of upstream commit
3ef3209d3028. See
<https://tianocore.acgmultimedia.com/show_bug.cgi?id=66>.)
Override the default mapping of "virtio", from "virtio-vga" to
"virtio-gpu-pci", if qemuDomainMachineIsVirt() evaluates to true.
Cc: Andrea Bolognani <abologna@redhat.com>
Cc: Drew Jones <drjones@redhat.com>
Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
Cc: Martin Kletzander <mkletzan@redhat.com>
Suggested-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1372901
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Acked-by: Martin Kletzander <mkletzan@redhat.com>
2016-09-16 10:30:23 +03:00
DO_TEST ( " aarch64-video-virtio-gpu-pci " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_OBJECT_GPEX ,
qemu: map "virtio" video model to "virt" machtype correctly (arm/aarch64)
Most of QEMU's PCI display device models, such as:
libvirt video/model/@type QEMU -device
------------------------- ------------
cirrus cirrus-vga
vga VGA
qxl qxl-vga
virtio virtio-vga
come with a linear framebuffer (sometimes called "VGA compatibility
framebuffer"). This linear framebuffer lives in one of the PCI device's
MMIO BARs, and allows guest code (primarily: firmware drivers, and
non-accelerated OS drivers) to display graphics with direct memory access.
Due to architectural reasons on aarch64/KVM hosts, this kind of
framebuffer doesn't / can't work in
qemu-system-(arm|aarch64) -M virt
machines. Cache coherency issues guarantee a corrupted / unusable display.
The problem has been researched by several people, including kvm-arm
maintainers, and it's been decided that the best way (practically the only
way) to have boot time graphics for such guests is to consolidate on
QEMU's "virtio-gpu-pci" device.
>From <https://bugzilla.redhat.com/show_bug.cgi?id=1195176>, libvirt
supports
<devices>
<video>
<model type='virtio'/>
</video>
</devices>
but libvirt unconditionally maps @type='virtio' to QEMU's "virtio-vga"
device model. (See the qemuBuildDeviceVideoStr() function and the
"qemuDeviceVideo" enum impl.)
According to the above, this is not right for the "virt" machine type; the
qemu-system-(arm|aarch64) binaries don't even recognize the "virtio-vga"
device model (justifiedly). Whereas "virtio-gpu-pci", which is a pure
virtio device without a compatibility framebuffer, is available, and works
fine.
(The ArmVirtQemu ("AAVMF") platform of edk2 -- that is, the UEFI firmware
for "virt" -- supports "virtio-gpu-pci", as of upstream commit
3ef3209d3028. See
<https://tianocore.acgmultimedia.com/show_bug.cgi?id=66>.)
Override the default mapping of "virtio", from "virtio-vga" to
"virtio-gpu-pci", if qemuDomainMachineIsVirt() evaluates to true.
Cc: Andrea Bolognani <abologna@redhat.com>
Cc: Drew Jones <drjones@redhat.com>
Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
Cc: Martin Kletzander <mkletzan@redhat.com>
Suggested-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1372901
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Acked-by: Martin Kletzander <mkletzan@redhat.com>
2016-09-16 10:30:23 +03:00
QEMU_CAPS_DEVICE_PCI_BRIDGE , QEMU_CAPS_DEVICE_IOH3420 ,
2018-08-09 14:26:17 +03:00
QEMU_CAPS_DEVICE_VIRTIO_GPU ) ;
2017-08-27 18:04:42 +03:00
DO_TEST ( " aarch64-video-default " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_OBJECT_GPEX ,
2017-08-27 18:04:42 +03:00
QEMU_CAPS_DEVICE_PCI_BRIDGE , QEMU_CAPS_DEVICE_IOH3420 ,
QEMU_CAPS_DEVICE_VIRTIO_GPU , QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE ,
QEMU_CAPS_VNC ) ;
2015-02-25 17:12:31 +03:00
DO_TEST ( " aarch64-aavmf-virtio-mmio " ,
2015-11-06 17:28:57 +03:00
QEMU_CAPS_DEVICE_VIRTIO_MMIO ,
2015-02-25 17:12:31 +03:00
QEMU_CAPS_DEVICE_VIRTIO_RNG , QEMU_CAPS_OBJECT_RNG_RANDOM ) ;
2014-02-14 18:09:00 +04:00
DO_TEST ( " aarch64-virt-default-nic " ,
QEMU_CAPS_DEVICE_VIRTIO_MMIO ) ;
2019-11-26 20:51:22 +03:00
qemuTestSetHostArch ( & driver , VIR_ARCH_AARCH64 ) ;
2016-01-13 03:26:40 +03:00
DO_TEST ( " aarch64-cpu-passthrough " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_DEVICE_VIRTIO_MMIO ,
2016-05-16 11:08:29 +03:00
QEMU_CAPS_KVM ) ;
2016-05-10 13:36:10 +03:00
DO_TEST_GIC ( " aarch64-gic-none " , GIC_NONE ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2016-05-10 13:36:10 +03:00
DO_TEST_GIC ( " aarch64-gic-none-v2 " , GIC_V2 ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2016-05-10 13:36:10 +03:00
DO_TEST_GIC ( " aarch64-gic-none-v3 " , GIC_V3 ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2016-05-10 13:36:10 +03:00
DO_TEST_GIC ( " aarch64-gic-none-both " , GIC_BOTH ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
DO_TEST_FULL ( " aarch64-gic-none-tcg " , " " , ARG_GIC , GIC_BOTH , ARG_END ) ;
2016-05-10 13:36:10 +03:00
DO_TEST_GIC ( " aarch64-gic-default " , GIC_NONE ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2018-02-01 20:17:13 +03:00
DO_TEST_GIC ( " aarch64-gic-default-v2 " , GIC_V2 ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2018-02-01 20:17:13 +03:00
DO_TEST_GIC ( " aarch64-gic-default-v3 " , GIC_V3 ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2018-02-01 20:17:13 +03:00
DO_TEST_GIC ( " aarch64-gic-default-both " , GIC_BOTH ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2016-05-10 13:36:10 +03:00
DO_TEST_GIC ( " aarch64-gic-v2 " , GIC_NONE ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2016-05-10 13:36:10 +03:00
DO_TEST_GIC ( " aarch64-gic-v2 " , GIC_V2 ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2016-05-10 13:36:10 +03:00
DO_TEST_GIC ( " aarch64-gic-v2 " , GIC_V3 ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2016-05-10 13:36:10 +03:00
DO_TEST_GIC ( " aarch64-gic-v2 " , GIC_BOTH ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2016-05-10 13:36:10 +03:00
DO_TEST_GIC ( " aarch64-gic-v3 " , GIC_NONE ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2016-05-10 13:36:10 +03:00
DO_TEST_GIC ( " aarch64-gic-v3 " , GIC_V2 ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2016-05-10 13:36:10 +03:00
DO_TEST_GIC ( " aarch64-gic-v3 " , GIC_V3 ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2016-05-10 13:36:10 +03:00
DO_TEST_GIC ( " aarch64-gic-v3 " , GIC_BOTH ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2016-05-10 13:36:10 +03:00
DO_TEST_GIC ( " aarch64-gic-host " , GIC_NONE ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2016-05-10 13:36:10 +03:00
DO_TEST_GIC ( " aarch64-gic-host " , GIC_V2 ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2016-05-10 13:36:10 +03:00
DO_TEST_GIC ( " aarch64-gic-host " , GIC_V3 ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2016-05-10 13:36:10 +03:00
DO_TEST_GIC ( " aarch64-gic-host " , GIC_BOTH ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2016-07-29 19:11:26 +03:00
DO_TEST_PARSE_ERROR ( " aarch64-gic-invalid " ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2018-02-02 18:05:51 +03:00
DO_TEST_PARSE_ERROR ( " aarch64-gic-not-virt " ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2018-02-02 18:05:51 +03:00
DO_TEST_PARSE_ERROR ( " aarch64-gic-not-arm " ,
2023-03-06 18:04:56 +03:00
QEMU_CAPS_KVM ) ;
2023-03-03 16:38:25 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " aarch64-kvm-32-on-64 " , " aarch64 " ) ;
2017-06-26 19:10:49 +03:00
DO_TEST ( " aarch64-pci-serial " ,
QEMU_CAPS_DEVICE_PCI_SERIAL ,
QEMU_CAPS_OBJECT_GPEX ,
QEMU_CAPS_DEVICE_PCI_BRIDGE ,
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE ,
QEMU_CAPS_DEVICE_PCIE_ROOT_PORT ) ;
2018-01-09 20:42:51 +03:00
DO_TEST ( " aarch64-traditional-pci " ,
QEMU_CAPS_OBJECT_GPEX ,
QEMU_CAPS_DEVICE_PCIE_ROOT_PORT ,
QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE ,
2018-03-28 13:48:38 +03:00
QEMU_CAPS_DEVICE_PCIE_PCI_BRIDGE ,
2018-01-09 20:42:51 +03:00
QEMU_CAPS_DEVICE_PCI_BRIDGE ,
QEMU_CAPS_DEVICE_PCI_SERIAL ) ;
2017-03-09 18:38:56 +03:00
2019-06-24 16:22:24 +03:00
/* aarch64 doesn't support the same CPU features as x86 */
DO_TEST_CAPS_ARCH_LATEST_FAILURE ( " aarch64-features-wrong " , " aarch64 " ) ;
/* Can't enable vector lengths when SVE is overall disabled */
DO_TEST_CAPS_ARCH_LATEST_PARSE_ERROR ( " aarch64-features-sve-disabled " , " aarch64 " ) ;
/* SVE aarch64 CPU features work on modern QEMU */
DO_TEST_CAPS_ARCH_LATEST ( " aarch64-features-sve " , " aarch64 " ) ;
2020-02-07 15:11:42 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " clock-timer-armvtimer " , " aarch64 " ) ;
2019-11-26 20:51:22 +03:00
qemuTestSetHostArch ( & driver , VIR_ARCH_NONE ) ;
2015-05-22 01:18:20 +03:00
2016-12-09 17:28:04 +03:00
DO_TEST ( " kvm-pit-delay " , QEMU_CAPS_KVM_PIT_TICK_POLICY ) ;
2016-12-09 17:28:05 +03:00
DO_TEST ( " kvm-pit-discard " , QEMU_CAPS_KVM_PIT_TICK_POLICY ) ;
2013-07-01 20:28:50 +04:00
2021-03-26 18:21:19 +03:00
DO_TEST_CAPS_LATEST ( " panic " ) ;
DO_TEST_CAPS_LATEST ( " panic-double " ) ;
DO_TEST_CAPS_LATEST ( " panic-no-address " ) ;
2015-02-26 17:28:07 +03:00
2023-02-20 19:12:56 +03:00
DO_TEST_CAPS_LATEST ( " pvpanic-pci-x86_64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " pvpanic-pci-aarch64 " , " aarch64 " ) ;
DO_TEST_CAPS_ARCH_LATEST_PARSE_ERROR ( " pvpanic-pci-invalid-address-aarch64 " , " aarch64 " ) ;
2023-02-20 19:12:58 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " pvpanic-pci-no-address-aarch64 " , " aarch64 " ) ;
2023-02-20 19:12:56 +03:00
2020-10-21 11:08:11 +03:00
DO_TEST_CAPS_ARCH_VER_FULL ( " fips-enabled " , " x86_64 " , " 5.1.0 " , ARG_FLAGS , FLAG_FIPS_HOST ) ;
DO_TEST_CAPS_ARCH_LATEST_FULL ( " fips-enabled " , " x86_64 " , ARG_FLAGS , FLAG_FIPS_HOST ) ;
2014-09-18 19:38:32 +04:00
2016-05-20 15:41:49 +03:00
DO_TEST ( " shmem " , QEMU_CAPS_DEVICE_IVSHMEM ) ;
2016-08-10 12:15:22 +03:00
DO_TEST ( " shmem-plain-doorbell " , QEMU_CAPS_DEVICE_IVSHMEM ,
QEMU_CAPS_DEVICE_IVSHMEM_PLAIN ,
QEMU_CAPS_DEVICE_IVSHMEM_DOORBELL ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " shmem " ) ;
2016-05-20 15:41:49 +03:00
DO_TEST_FAILURE ( " shmem-invalid-size " ,
2016-01-13 03:26:40 +03:00
QEMU_CAPS_DEVICE_IVSHMEM ) ;
2016-05-20 15:41:49 +03:00
DO_TEST_FAILURE ( " shmem-invalid-address " ,
2016-01-13 03:26:40 +03:00
QEMU_CAPS_DEVICE_IVSHMEM ) ;
2016-05-20 15:41:49 +03:00
DO_TEST_FAILURE ( " shmem-small-size " ,
2016-01-13 03:26:40 +03:00
QEMU_CAPS_DEVICE_IVSHMEM ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " shmem-msi-only " ) ;
2016-05-16 11:08:29 +03:00
DO_TEST ( " cpu-host-passthrough-features " , QEMU_CAPS_KVM ) ;
2014-09-22 12:49:39 +04:00
2021-08-17 11:35:53 +03:00
DO_TEST_FAILURE_NOCAPS ( " memory-align-fail " ) ;
2020-07-28 11:51:32 +03:00
DO_TEST_PARSE_ERROR ( " memory-hotplug-nonuma " , QEMU_CAPS_DEVICE_PC_DIMM ) ;
2022-07-26 20:27:06 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " memory-hotplug-invalid-targetnode " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " memory-hotplug " ) ;
2022-11-07 12:58:59 +03:00
DO_TEST ( " memory-hotplug " , QEMU_CAPS_DEVICE_PC_DIMM ) ;
DO_TEST ( " memory-hotplug-dimm " , QEMU_CAPS_DEVICE_PC_DIMM ) ;
2022-07-26 20:42:33 +03:00
DO_TEST_CAPS_LATEST ( " memory-hotplug-dimm-addr " ) ;
2022-11-07 12:58:59 +03:00
DO_TEST ( " memory-hotplug-ppc64-nonuma " , QEMU_CAPS_KVM , QEMU_CAPS_DEVICE_PC_DIMM ,
2022-11-03 18:01:02 +03:00
QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE ) ;
2021-08-16 18:02:16 +03:00
DO_TEST_FULL ( " memory-hotplug-ppc64-nonuma-abi-update " , " " ,
qemu_domain.c: align all pSeries mem modules when PARSE_ABI_UPDATE
qemuDomainAlignMemorySizes() has an operation order problem. We are
calculating 'initialmem' without aligning the memory modules first.
Since we're aligning the dimms afterwards this can create inconsistencies
in the end result. x86 has alignment of 1-2MiB and it's not severely
impacted by it, but pSeries works with 256MiB alignment and the difference
is noticeable.
This is the case of the existing 'memory-hotplug-ppc64-nonuma' test.
The test consists of a 2GiB (aligned value) guest with 2 ~520MiB dimms,
both unaligned. 'initialmem' is calculated by taking total_mem and
subtracting the dimms size (via virDomainDefGetMemoryInitial()), which
wil give us 2GiB - 520MiB - 520MiB, ending up with a little more than
an 1GiB of 'initialmem'. Note that this value is now unaligned, and
will be aligned up via VIR_ROUND_UP(), and we'll end up with 'initialmem'
of 1GiB + 256MiB. Given that the dimms are aligned later on, the end
result for QEMU is that the guest will have a 'mem' size of 1310720k,
plus the two 512 MiB dimms, exceeding in 256MiB the desired 2GiB
memory and currentMemory specified in the XML.
Existing guests can't be fixed without breaking ABI, but we have
code already in place to align pSeries NVDIMM modules for new guests.
Let's extend it to align all pSeries mem modules.
A new test, 'memory-hotplug-ppc64-nonuma-abi-update', a copy of the
existing 'memory-hotplug-ppc64-nonuma', was added to demonstrate the
result for new pSeries guests. For the same unaligned XML mentioned
above, after applying this patch:
- starting QEMU mem size without PARSE_ABI_UPDATE:
-m size=1310720k,slots=16,maxmem=4194304k \ (no changes)
- starting QEMU mem size with PARSE_ABI_UPDATE:
-m size=1048576k,slots=16,maxmem=4194304k \ (size fixed)
Reviewed-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
2020-11-18 22:58:34 +03:00
ARG_PARSEFLAGS , VIR_DOMAIN_DEF_PARSE_ABI_UPDATE ,
ARG_QEMU_CAPS ,
QEMU_CAPS_KVM , QEMU_CAPS_DEVICE_PC_DIMM ,
2022-11-07 12:58:59 +03:00
QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE ,
2021-08-16 18:02:16 +03:00
QEMU_CAPS_LAST ,
ARG_END ) ;
2018-12-20 12:14:46 +03:00
DO_TEST_CAPS_LATEST ( " memory-hotplug-nvdimm " ) ;
DO_TEST_CAPS_LATEST ( " memory-hotplug-nvdimm-access " ) ;
2021-03-12 19:56:49 +03:00
DO_TEST_CAPS_VER ( " memory-hotplug-nvdimm-label " , " 5.2.0 " ) ;
2018-12-20 12:14:46 +03:00
DO_TEST_CAPS_LATEST ( " memory-hotplug-nvdimm-label " ) ;
2021-03-12 19:56:49 +03:00
DO_TEST_CAPS_VER ( " memory-hotplug-nvdimm-align " , " 5.2.0 " ) ;
2018-12-20 12:14:47 +03:00
DO_TEST_CAPS_LATEST ( " memory-hotplug-nvdimm-align " ) ;
2021-03-12 19:56:49 +03:00
DO_TEST_CAPS_VER ( " memory-hotplug-nvdimm-pmem " , " 5.2.0 " ) ;
2018-12-20 12:14:48 +03:00
DO_TEST_CAPS_LATEST ( " memory-hotplug-nvdimm-pmem " ) ;
2021-03-12 19:56:49 +03:00
DO_TEST_CAPS_VER ( " memory-hotplug-nvdimm-readonly " , " 5.2.0 " ) ;
2018-12-20 12:14:49 +03:00
DO_TEST_CAPS_LATEST ( " memory-hotplug-nvdimm-readonly " ) ;
2020-12-02 21:56:57 +03:00
DO_TEST ( " memory-hotplug-nvdimm-ppc64 " , QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE ,
QEMU_CAPS_DEVICE_NVDIMM ) ;
2021-08-16 18:02:16 +03:00
DO_TEST_FULL ( " memory-hotplug-nvdimm-ppc64-abi-update " , " " ,
2020-11-18 22:58:33 +03:00
ARG_PARSEFLAGS , VIR_DOMAIN_DEF_PARSE_ABI_UPDATE ,
ARG_QEMU_CAPS ,
QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE ,
QEMU_CAPS_DEVICE_NVDIMM ,
2021-08-16 18:02:16 +03:00
QEMU_CAPS_LAST ,
ARG_END ) ;
2021-03-12 19:56:49 +03:00
DO_TEST_CAPS_VER ( " memory-hotplug-virtio-pmem " , " 5.2.0 " ) ;
2020-10-31 22:50:22 +03:00
DO_TEST_CAPS_LATEST ( " memory-hotplug-virtio-pmem " ) ;
2021-01-19 12:16:55 +03:00
DO_TEST_CAPS_LATEST ( " memory-hotplug-virtio-mem " ) ;
2014-10-06 16:18:37 +04:00
2015-04-28 00:57:30 +03:00
DO_TEST ( " machine-aeskeywrap-on-caps " ,
2022-09-30 15:01:44 +03:00
QEMU_CAPS_VIRTIO_SCSI ) ;
2015-04-28 00:57:30 +03:00
DO_TEST ( " machine-aeskeywrap-on-cap " ,
2022-09-30 15:01:44 +03:00
QEMU_CAPS_VIRTIO_SCSI ) ;
2015-04-28 00:57:30 +03:00
DO_TEST ( " machine-aeskeywrap-off-caps " ,
2022-09-30 15:01:44 +03:00
QEMU_CAPS_VIRTIO_SCSI ) ;
2015-04-28 00:57:30 +03:00
DO_TEST ( " machine-aeskeywrap-off-cap " ,
2022-09-30 15:01:44 +03:00
QEMU_CAPS_VIRTIO_SCSI ) ;
2015-04-28 00:57:30 +03:00
DO_TEST ( " machine-deakeywrap-on-caps " ,
2022-09-30 15:01:44 +03:00
QEMU_CAPS_VIRTIO_SCSI ) ;
2015-04-28 00:57:30 +03:00
DO_TEST ( " machine-deakeywrap-on-cap " ,
2022-09-30 15:01:44 +03:00
QEMU_CAPS_VIRTIO_SCSI ) ;
2015-04-28 00:57:30 +03:00
DO_TEST ( " machine-deakeywrap-off-caps " ,
2022-09-30 15:01:44 +03:00
QEMU_CAPS_VIRTIO_SCSI ) ;
2015-04-28 00:57:30 +03:00
DO_TEST ( " machine-deakeywrap-off-cap " ,
2022-09-30 15:01:44 +03:00
QEMU_CAPS_VIRTIO_SCSI ) ;
2015-04-28 00:57:30 +03:00
DO_TEST ( " machine-keywrap-none-caps " ,
2022-09-30 15:01:44 +03:00
QEMU_CAPS_VIRTIO_SCSI ) ;
2015-04-28 00:57:30 +03:00
DO_TEST ( " machine-keywrap-none " ,
2022-09-30 15:01:44 +03:00
QEMU_CAPS_VIRTIO_SCSI ) ;
2015-04-28 00:57:30 +03:00
2023-03-06 18:29:06 +03:00
DO_TEST_NOCAPS ( " machine-loadparm-s390 " ) ;
DO_TEST_NOCAPS ( " machine-loadparm-net-s390 " ) ;
2023-03-10 05:38:09 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " machine-loadparm-hostdev " , " s390x " ) ;
2023-03-06 18:29:06 +03:00
DO_TEST_NOCAPS ( " machine-loadparm-multiple-disks-nets-s390 " ) ;
DO_TEST_PARSE_ERROR_NOCAPS ( " machine-loadparm-s390-char-invalid " ) ;
DO_TEST_PARSE_ERROR_NOCAPS ( " machine-loadparm-s390-len-invalid " ) ;
2017-06-01 19:36:25 +03:00
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " qemu-ns-domain-ns0 " ) ;
DO_TEST_NOCAPS ( " qemu-ns-domain-commandline " ) ;
DO_TEST_NOCAPS ( " qemu-ns-domain-commandline-ns0 " ) ;
DO_TEST_NOCAPS ( " qemu-ns-commandline " ) ;
DO_TEST_NOCAPS ( " qemu-ns-commandline-ns0 " ) ;
DO_TEST_NOCAPS ( " qemu-ns-commandline-ns1 " ) ;
2015-10-20 17:01:01 +03:00
2016-01-13 03:26:40 +03:00
DO_TEST ( " virtio-input " , QEMU_CAPS_VIRTIO_KEYBOARD ,
2015-11-13 13:38:07 +03:00
QEMU_CAPS_VIRTIO_MOUSE , QEMU_CAPS_VIRTIO_TABLET ) ;
2016-01-13 03:26:40 +03:00
DO_TEST ( " virtio-input-passthrough " , QEMU_CAPS_VIRTIO_INPUT_HOST ) ;
2015-11-13 13:38:07 +03:00
2021-05-21 14:01:08 +03:00
DO_TEST_CAPS_LATEST ( " input-linux " ) ;
2016-01-07 18:14:58 +03:00
DO_TEST ( " ppc64-usb-controller " ,
2018-02-21 12:18:19 +03:00
QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE ,
2016-01-13 03:26:40 +03:00
QEMU_CAPS_PCI_OHCI ) ;
2016-01-07 18:14:58 +03:00
DO_TEST ( " ppc64-usb-controller-legacy " ,
2018-02-21 12:18:19 +03:00
QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE ,
2016-01-13 03:26:40 +03:00
QEMU_CAPS_PIIX3_USB_UHCI ) ;
2021-08-16 18:02:16 +03:00
DO_TEST_FULL ( " ppc64-usb-controller-qemu-xhci " , " " ,
2019-03-13 23:17:10 +03:00
ARG_PARSEFLAGS , VIR_DOMAIN_DEF_PARSE_ABI_UPDATE ,
2019-03-13 22:18:11 +03:00
ARG_QEMU_CAPS ,
2018-02-21 12:18:19 +03:00
QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE ,
2017-04-27 18:56:41 +03:00
QEMU_CAPS_NEC_USB_XHCI ,
2021-08-16 17:53:29 +03:00
QEMU_CAPS_DEVICE_QEMU_XHCI ,
2021-08-16 18:02:16 +03:00
QEMU_CAPS_LAST ,
ARG_END ) ;
2017-04-27 18:56:41 +03:00
2020-06-10 21:11:49 +03:00
DO_TEST_PARSE_ERROR ( " ppc64-tpmproxy-double " ,
QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE ,
QEMU_CAPS_PCI_OHCI ,
QEMU_CAPS_DEVICE_TPM_PASSTHROUGH ,
QEMU_CAPS_DEVICE_SPAPR_TPM_PROXY ) ;
DO_TEST_PARSE_ERROR ( " ppc64-tpm-double " ,
QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE ,
QEMU_CAPS_PCI_OHCI ,
QEMU_CAPS_DEVICE_TPM_PASSTHROUGH ,
QEMU_CAPS_DEVICE_SPAPR_TPM_PROXY ) ;
2020-06-10 21:11:51 +03:00
DO_TEST_CAPS_LATEST_PPC64 ( " ppc64-tpmproxy-single " ) ;
DO_TEST_CAPS_LATEST_PPC64 ( " ppc64-tpmproxy-with-tpm " ) ;
2017-04-27 18:56:41 +03:00
DO_TEST ( " aarch64-usb-controller-qemu-xhci " ,
QEMU_CAPS_OBJECT_GPEX ,
QEMU_CAPS_NEC_USB_XHCI ,
QEMU_CAPS_DEVICE_QEMU_XHCI ) ;
2016-01-07 18:14:58 +03:00
2017-04-27 18:53:51 +03:00
DO_TEST ( " aarch64-usb-controller-nec-xhci " ,
QEMU_CAPS_OBJECT_GPEX ,
QEMU_CAPS_NEC_USB_XHCI ) ;
2023-03-02 18:53:47 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " sparc-minimal " , " sparc " ) ;
2020-11-18 19:20:36 +03:00
2022-01-06 00:46:50 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " missing-machine " ) ;
2016-02-25 18:21:41 +03:00
2021-11-15 19:00:56 +03:00
DO_TEST_CAPS_LATEST ( " name-escape " ) ;
2016-03-10 22:46:39 +03:00
2021-09-21 18:50:00 +03:00
DO_TEST_NOCAPS ( " master-key " ) ;
2018-03-29 13:51:55 +03:00
DO_TEST ( " usb-long-port-path " ,
2016-04-20 16:03:57 +03:00
QEMU_CAPS_USB_HUB ) ;
2016-07-29 14:54:13 +03:00
DO_TEST_PARSE_ERROR ( " usb-too-long-port-path-invalid " ,
2018-03-29 13:51:55 +03:00
QEMU_CAPS_USB_HUB ) ;
2016-03-30 01:23:02 +03:00
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " acpi-table " ) ;
2019-05-17 15:45:36 +03:00
DO_TEST_CAPS_LATEST ( " intel-iommu " ) ;
DO_TEST_CAPS_LATEST ( " intel-iommu-caching-mode " ) ;
DO_TEST_CAPS_LATEST ( " intel-iommu-eim " ) ;
DO_TEST_CAPS_LATEST ( " intel-iommu-device-iotlb " ) ;
2020-06-04 10:42:43 +03:00
DO_TEST_CAPS_LATEST ( " intel-iommu-aw-bits " ) ;
2019-07-02 17:36:55 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " intel-iommu-wrong-machine " ) ;
2019-05-17 14:23:16 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " iommu-smmuv3 " , " aarch64 " ) ;
2021-09-23 15:46:23 +03:00
DO_TEST_CAPS_LATEST ( " virtio-iommu-x86_64 " ) ;
2021-10-07 20:35:45 +03:00
DO_TEST_CAPS_VER_PARSE_ERROR ( " virtio-iommu-x86_64 " , " 6.1.0 " ) ;
2021-09-23 15:46:23 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " virtio-iommu-aarch64 " , " aarch64 " ) ;
2021-09-22 20:02:17 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " virtio-iommu-wrong-machine " ) ;
2021-10-07 19:47:20 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " virtio-iommu-no-acpi " ) ;
2021-10-07 20:53:45 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " virtio-iommu-invalid-address-type " ) ;
2021-10-07 20:44:26 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " virtio-iommu-invalid-address " ) ;
2016-05-12 14:21:01 +03:00
2016-08-04 15:36:24 +03:00
DO_TEST ( " cpu-hotplug-startup " , QEMU_CAPS_QUERY_HOTPLUGGABLE_CPUS ) ;
2017-12-14 17:54:59 +03:00
DO_TEST_PARSE_ERROR ( " cpu-hotplug-granularity " ,
QEMU_CAPS_QUERY_HOTPLUGGABLE_CPUS ) ;
2020-04-23 16:15:06 +03:00
DO_TEST_CAPS_LATEST ( " virtio-options " ) ;
2020-04-23 16:15:07 +03:00
DO_TEST_CAPS_LATEST ( " virtio-options-controller-iommu " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-disk-iommu " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-fs-iommu " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-input-iommu " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-memballoon-iommu " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-net-iommu " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-rng-iommu " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-video-iommu " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-controller-ats " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-disk-ats " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-fs-ats " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-input-ats " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-memballoon-ats " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-net-ats " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-rng-ats " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-video-ats " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-controller-packed " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-disk-packed " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-fs-packed " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-input-packed " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-memballoon-packed " ) ;
2020-10-13 02:35:39 +03:00
DO_TEST_CAPS_LATEST ( " virtio-options-memballoon-freepage-reporting " ) ;
2020-04-23 16:15:07 +03:00
DO_TEST_CAPS_LATEST ( " virtio-options-net-packed " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-rng-packed " ) ;
DO_TEST_CAPS_LATEST ( " virtio-options-video-packed " ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_PARSE_ERROR_NOCAPS ( " virtio-options-memballoon-freepage-reporting " ) ;
2016-08-04 15:36:24 +03:00
2022-11-03 18:01:02 +03:00
DO_TEST ( " fd-memory-numa-topology " , QEMU_CAPS_KVM ) ;
DO_TEST ( " fd-memory-numa-topology2 " , QEMU_CAPS_KVM ) ;
DO_TEST ( " fd-memory-numa-topology3 " , QEMU_CAPS_KVM ) ;
2021-09-15 17:05:49 +03:00
DO_TEST_CAPS_LATEST ( " fd-memory-numa-topology4 " ) ;
2017-02-02 16:27:33 +03:00
2022-11-03 18:01:02 +03:00
DO_TEST ( " fd-memory-no-numa-topology " , QEMU_CAPS_KVM ) ;
2017-02-02 16:27:33 +03:00
2018-11-15 14:55:53 +03:00
DO_TEST_CAPS_LATEST ( " memfd-memory-numa " ) ;
2019-03-29 18:21:28 +03:00
DO_TEST_CAPS_LATEST ( " memfd-memory-default-hugepage " ) ;
2018-11-15 14:55:53 +03:00
2017-03-01 18:12:07 +03:00
DO_TEST ( " cpu-check-none " , QEMU_CAPS_KVM ) ;
DO_TEST ( " cpu-check-partial " , QEMU_CAPS_KVM ) ;
DO_TEST ( " cpu-check-full " , QEMU_CAPS_KVM ) ;
DO_TEST ( " cpu-check-default-none " , QEMU_CAPS_KVM ) ;
2021-08-17 11:35:53 +03:00
DO_TEST_NOCAPS ( " cpu-check-default-none2 " ) ;
2017-03-01 18:12:07 +03:00
DO_TEST ( " cpu-check-default-partial " , QEMU_CAPS_KVM ) ;
DO_TEST ( " cpu-check-default-partial2 " , QEMU_CAPS_KVM ) ;
2017-04-25 20:07:19 +03:00
DO_TEST ( " cpu-cache-disable " , QEMU_CAPS_KVM , QEMU_CAPS_CPU_CACHE ) ;
DO_TEST ( " cpu-cache-disable2 " , QEMU_CAPS_KVM ) ;
DO_TEST ( " cpu-cache-disable3 " , QEMU_CAPS_KVM , QEMU_CAPS_CPU_CACHE ) ;
DO_TEST ( " cpu-cache-passthrough " , QEMU_CAPS_KVM , QEMU_CAPS_CPU_CACHE ) ;
DO_TEST ( " cpu-cache-passthrough2 " , QEMU_CAPS_KVM ) ;
DO_TEST ( " cpu-cache-emulate-l3 " , QEMU_CAPS_KVM , QEMU_CAPS_CPU_CACHE ) ;
DO_TEST_PARSE_ERROR ( " cpu-cache-emulate-l2 " , QEMU_CAPS_KVM ) ;
DO_TEST_PARSE_ERROR ( " cpu-cache-passthrough3 " , QEMU_CAPS_KVM ) ;
DO_TEST_PARSE_ERROR ( " cpu-cache-passthrough-l3 " , QEMU_CAPS_KVM ) ;
2017-11-16 19:49:38 +03:00
DO_TEST ( " vmcoreinfo " , QEMU_CAPS_DEVICE_VMCOREINFO ) ;
2017-04-25 20:07:19 +03:00
2022-07-15 17:48:22 +03:00
DO_TEST_CAPS_LATEST ( " user-aliases " ) ;
DO_TEST_CAPS_LATEST ( " user-aliases2 " ) ;
DO_TEST_CAPS_LATEST ( " user-aliases-usb " ) ;
2017-10-20 17:48:14 +03:00
2018-05-11 00:37:18 +03:00
DO_TEST_CAPS_LATEST ( " tseg-explicit-size " ) ;
2019-07-02 17:36:55 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " tseg-i440fx " ) ;
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " tseg-invalid-size " ) ;
2018-05-11 00:37:18 +03:00
2022-09-30 15:01:44 +03:00
DO_TEST ( " video-virtio-gpu-ccw " ,
2018-03-23 20:22:39 +03:00
QEMU_CAPS_DEVICE_VIRTIO_GPU ,
QEMU_CAPS_VNC ,
QEMU_CAPS_DEVICE_VIRTIO_GPU_CCW ) ;
2022-09-30 15:01:44 +03:00
DO_TEST ( " input-virtio-ccw " ,
2018-03-23 20:22:42 +03:00
QEMU_CAPS_VIRTIO_KEYBOARD ,
QEMU_CAPS_VIRTIO_MOUSE ,
QEMU_CAPS_VIRTIO_TABLET ,
QEMU_CAPS_DEVICE_VIRTIO_KEYBOARD_CCW ,
QEMU_CAPS_DEVICE_VIRTIO_MOUSE_CCW ,
QEMU_CAPS_DEVICE_VIRTIO_TABLET_CCW ) ;
2018-05-22 16:57:47 +03:00
DO_TEST_CAPS_LATEST ( " vhost-vsock " ) ;
DO_TEST_CAPS_LATEST ( " vhost-vsock-auto " ) ;
2018-08-06 18:41:07 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " vhost-vsock-ccw " , " s390x " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " vhost-vsock-ccw-auto " , " s390x " ) ;
2021-01-27 21:46:59 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " vhost-vsock-ccw-iommu " , " s390x " ) ;
2018-05-22 16:57:47 +03:00
2021-06-10 16:58:15 +03:00
DO_TEST_CAPS_VER ( " launch-security-sev " , " 6.0.0 " ) ;
2022-02-10 12:01:36 +03:00
DO_TEST_CAPS_VER ( " launch-security-sev-missing-platform-info " , " 6.0.0 " ) ;
2021-12-09 17:57:05 +03:00
DO_TEST_CAPS_ARCH_LATEST_FULL ( " launch-security-sev-direct " ,
" x86_64 " ,
ARG_QEMU_CAPS ,
QEMU_CAPS_SEV_GUEST ,
QEMU_CAPS_LAST ) ;
2018-06-08 17:40:58 +03:00
2021-07-21 14:17:40 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " launch-security-s390-pv " , " s390x " ) ;
2019-08-06 19:21:32 +03:00
DO_TEST_CAPS_LATEST ( " vhost-user-fs-fd-memory " ) ;
DO_TEST_CAPS_LATEST ( " vhost-user-fs-hugepages " ) ;
2020-05-13 11:52:36 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " vhost-user-fs-readonly " ) ;
2019-08-06 19:21:32 +03:00
2023-03-03 10:12:39 +03:00
/* The generic pcie bridge emulation device can be compiled out of qemu. */
DO_TEST_CAPS_ARCH_LATEST_FULL ( " riscv64-virt " , " riscv64 " ,
ARG_QEMU_CAPS_DEL ,
QEMU_CAPS_OBJECT_GPEX ,
QEMU_CAPS_LAST ) ;
DO_TEST_CAPS_ARCH_LATEST ( " riscv64-virt-pci " , " riscv64 " ) ;
2018-08-22 12:15:27 +03:00
2019-01-11 23:06:05 +03:00
DO_TEST_CAPS_LATEST ( " virtio-transitional " ) ;
DO_TEST_CAPS_LATEST ( " virtio-non-transitional " ) ;
2019-07-02 17:36:55 +03:00
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " virtio-transitional-not-supported " ) ;
2019-01-11 23:06:05 +03:00
2018-09-05 14:38:34 +03:00
/* Simple headless guests for various architectures */
DO_TEST_CAPS_ARCH_LATEST ( " aarch64-virt-headless " , " aarch64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " ppc64-pseries-headless " , " ppc64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " riscv64-virt-headless " , " riscv64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " s390x-ccw-headless " , " s390x " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " x86_64-pc-headless " , " x86_64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " x86_64-q35-headless " , " x86_64 " ) ;
2019-02-27 20:08:29 +03:00
/* Simple guests with graphics for various architectures */
DO_TEST_CAPS_ARCH_LATEST ( " aarch64-virt-graphics " , " aarch64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " ppc64-pseries-graphics " , " ppc64 " ) ;
2019-06-13 14:51:33 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " riscv64-virt-graphics " , " riscv64 " ) ;
2019-03-21 12:28:29 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " s390x-ccw-graphics " , " s390x " ) ;
2019-02-27 20:08:29 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " x86_64-pc-graphics " , " x86_64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " x86_64-q35-graphics " , " x86_64 " ) ;
2019-09-23 13:44:43 +03:00
DO_TEST_CAPS_LATEST ( " vhost-user-vga " ) ;
DO_TEST_CAPS_LATEST ( " vhost-user-gpu-secondary " ) ;
2019-10-18 17:14:23 +03:00
DO_TEST_CAPS_LATEST ( " cpu-Icelake-Server-pconfig " ) ;
2019-10-11 21:15:03 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " aarch64-default-cpu-kvm-virt-4.2 " , " aarch64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " aarch64-default-cpu-tcg-virt-4.2 " , " aarch64 " ) ;
2019-10-11 21:15:03 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " ppc64-default-cpu-kvm-pseries-2.7 " , " ppc64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " ppc64-default-cpu-tcg-pseries-2.7 " , " ppc64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " ppc64-default-cpu-kvm-pseries-3.1 " , " ppc64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " ppc64-default-cpu-tcg-pseries-3.1 " , " ppc64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " ppc64-default-cpu-kvm-pseries-4.2 " , " ppc64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " ppc64-default-cpu-tcg-pseries-4.2 " , " ppc64 " ) ;
2020-02-06 12:18:49 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " s390-default-cpu-kvm-ccw-virtio-2.7 " , " s390x " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " s390-default-cpu-tcg-ccw-virtio-2.7 " , " s390x " ) ;
2019-10-11 21:15:03 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " s390-default-cpu-kvm-ccw-virtio-4.2 " , " s390x " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " s390-default-cpu-tcg-ccw-virtio-4.2 " , " s390x " ) ;
2019-10-11 21:15:03 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " x86_64-default-cpu-kvm-pc-4.2 " , " x86_64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " x86_64-default-cpu-tcg-pc-4.2 " , " x86_64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " x86_64-default-cpu-kvm-q35-4.2 " , " x86_64 " ) ;
DO_TEST_CAPS_ARCH_LATEST ( " x86_64-default-cpu-tcg-q35-4.2 " , " x86_64 " ) ;
2021-11-04 13:43:52 +03:00
DO_TEST_CAPS_ARCH_LATEST ( " x86_64-default-cpu-tcg-features " , " x86_64 " ) ;
2019-10-11 21:15:03 +03:00
2020-03-30 21:26:19 +03:00
DO_TEST_CAPS_LATEST ( " virtio-9p-multidevs " ) ;
2020-10-08 17:32:25 +03:00
DO_TEST_CAPS_LATEST ( " virtio-9p-createmode " ) ;
2020-03-30 21:26:19 +03:00
2021-04-06 17:01:20 +03:00
DO_TEST_CAPS_LATEST ( " devices-acpi-index " ) ;
2022-01-04 19:27:01 +03:00
DO_TEST_MACOS ( " hvf-x86_64-q35-headless " ,
2022-08-25 16:35:48 +03:00
QEMU_CAPS_VIRTIO_PCI_TRANSITIONAL ,
2022-01-04 19:27:01 +03:00
QEMU_CAPS_DEVICE_PCIE_ROOT_PORT ,
QEMU_CAPS_DEVICE_VIRTIO_NET ,
QEMU_CAPS_DEVICE_ISA_SERIAL ,
QEMU_CAPS_DEVICE_VIRTIO_RNG ,
QEMU_CAPS_OBJECT_RNG_RANDOM ) ;
DO_TEST_MACOS ( " hvf-aarch64-virt-headless " ,
QEMU_CAPS_OBJECT_GPEX ,
2022-08-25 16:35:48 +03:00
QEMU_CAPS_VIRTIO_PCI_TRANSITIONAL ,
2022-01-04 19:27:01 +03:00
QEMU_CAPS_DEVICE_PCIE_ROOT_PORT ,
QEMU_CAPS_DEVICE_VIRTIO_NET ,
QEMU_CAPS_DEVICE_PL011 ,
QEMU_CAPS_DEVICE_VIRTIO_RNG ,
QEMU_CAPS_OBJECT_RNG_RANDOM ) ;
/* HVF guests should not work on Linux with KVM */
DO_TEST_CAPS_LATEST_PARSE_ERROR ( " hvf-x86_64-q35-headless " ) ;
2022-07-29 22:34:35 +03:00
DO_TEST ( " cpu-phys-bits-passthrough " , QEMU_CAPS_KVM ) ;
DO_TEST ( " cpu-phys-bits-emulate " , QEMU_CAPS_KVM ) ;
DO_TEST ( " cpu-phys-bits-emulate2 " , QEMU_CAPS_KVM ) ;
DO_TEST_PARSE_ERROR ( " cpu-phys-bits-emulate3 " , QEMU_CAPS_KVM ) ;
DO_TEST_PARSE_ERROR ( " cpu-phys-bits-passthrough2 " , QEMU_CAPS_KVM ) ;
qemu: Add command-line to generate SGX EPC memory backend
According to the result parsing from xml, add the argument of
SGX EPC memory backend into QEMU command line.
$ qemu-system-x86_64 \
...... \
-object '{"qom-type":"memory-backend-epc","id":"memepc0","prealloc":true,"size":67108864,"host-nodes":[0,1],"policy":"bind"}' \
-object '{"qom-type":"memory-backend-epc","id":"memepc1","prealloc":true,"size":16777216,"host-nodes":[2,3],"policy":"bind"}' \
-machine sgx-epc.0.memdev=memepc0,sgx-epc.0.node=0,sgx-epc.1.memdev=memepc1,sgx-epc.1.node=1
Signed-off-by: Lin Yang <lin.a.yang@intel.com>
Signed-off-by: Haibin Huang <haibin.huang@intel.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
2022-11-11 04:21:27 +03:00
DO_TEST_CAPS_VER ( " sgx-epc " , " 7.0.0 " ) ;
2023-01-17 04:46:53 +03:00
DO_TEST_CAPS_LATEST ( " crypto-builtin " ) ;
2015-09-15 09:16:02 +03:00
qemuTestDriverFree ( & driver ) ;
2019-03-13 11:56:47 +03:00
virFileWrapperClearPrefixes ( ) ;
2008-02-27 07:35:08 +03:00
2014-03-17 13:38:38 +04:00
return ret = = 0 ? EXIT_SUCCESS : EXIT_FAILURE ;
2007-07-19 01:34:22 +04:00
}
2017-03-29 17:45:42 +03:00
VIR_TEST_MAIN_PRELOAD ( mymain ,
2019-08-21 19:13:16 +03:00
VIR_TEST_MOCK ( " qemuxml2argv " ) ,
2019-11-15 13:56:46 +03:00
VIR_TEST_MOCK ( " domaincaps " ) ,
2019-08-21 19:13:16 +03:00
VIR_TEST_MOCK ( " virrandom " ) ,
VIR_TEST_MOCK ( " qemucpu " ) ,
2023-03-07 17:36:35 +03:00
VIR_TEST_MOCK ( " virpci " ) ,
VIR_TEST_MOCK ( " virnuma " ) )
2008-05-29 19:31:49 +04:00
2007-11-26 15:03:34 +03:00
# else
2011-07-09 03:24:44 +04:00
int main ( void )
{
return EXIT_AM_SKIP ;
}
2007-11-26 15:03:34 +03:00
# endif /* WITH_QEMU */