2010-10-07 16:35:17 +02:00
/*
* cputest . c : Test the libvirtd internal CPU APIs
*
2014-09-03 13:39:21 -06:00
* Copyright ( C ) 2010 - 2014 Red Hat , Inc .
2010-10-07 16:35:17 +02:00
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2.1 of the License , or ( at your option ) any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
2012-09-20 16:30:55 -06:00
* License along with this library . If not , see
2012-07-21 18:06:23 +08:00
* < http : //www.gnu.org/licenses/>.
2010-10-07 16:35:17 +02:00
*
* Author : Jiri Denemark < jdenemar @ redhat . com >
*/
# include <config.h>
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <string.h>
# include <sys/types.h>
# include <fcntl.h>
# include "internal.h"
2012-12-13 18:13:21 +00:00
# include "virxml.h"
2012-12-12 18:06:53 +00:00
# include "viralloc.h"
2012-12-04 12:04:07 +00:00
# include "virbuffer.h"
2010-10-07 16:35:17 +02:00
# include "testutils.h"
# include "cpu_conf.h"
# include "cpu/cpu.h"
# include "cpu/cpu_map.h"
2013-04-03 12:36:23 +02:00
# include "virstring.h"
2010-10-07 16:35:17 +02:00
2016-06-01 15:57:00 +02:00
# if WITH_QEMU && WITH_YAJL
# include "testutilsqemu.h"
# include "qemumonitortestutils.h"
# include "qemu / qemu_monitor_json.h"
# endif
2010-10-07 16:35:17 +02:00
# define VIR_FROM_THIS VIR_FROM_CPU
enum cpuTestBoolWithError {
FAIL = - 1 ,
NO = 0 ,
YES = 1
} ;
struct data {
const char * arch ;
const char * host ;
const char * name ;
const char * * models ;
const char * modelsName ;
unsigned int nmodels ;
const char * preferred ;
2013-08-02 13:08:19 -06:00
unsigned int flags ;
2010-10-07 16:35:17 +02:00
int result ;
} ;
2016-06-01 15:57:00 +02:00
# if WITH_QEMU && WITH_YAJL
static virQEMUDriver driver ;
# endif
2010-10-07 16:35:17 +02:00
static virCPUDefPtr
cpuTestLoadXML ( const char * arch , const char * name )
{
2011-04-25 00:25:10 +02:00
char * xml = NULL ;
2010-10-07 16:35:17 +02:00
xmlDocPtr doc = NULL ;
xmlXPathContextPtr ctxt = NULL ;
virCPUDefPtr cpu = NULL ;
2011-04-25 00:25:10 +02:00
if ( virAsprintf ( & xml , " %s/cputestdata/%s-%s.xml " , abs_srcdir , arch , name ) < 0 )
goto cleanup ;
2010-10-07 16:35:17 +02:00
2011-08-18 15:37:14 -06:00
if ( ! ( doc = virXMLParseFileCtxt ( xml , & ctxt ) ) )
2010-10-07 16:35:17 +02:00
goto cleanup ;
cpu = virCPUDefParseXML ( ctxt - > node , ctxt , VIR_CPU_TYPE_AUTO ) ;
2014-03-25 07:53:44 +01:00
cleanup :
2010-10-07 16:35:17 +02:00
xmlXPathFreeContext ( ctxt ) ;
xmlFreeDoc ( doc ) ;
2012-02-02 16:16:43 -07:00
VIR_FREE ( xml ) ;
2010-10-07 16:35:17 +02:00
return cpu ;
}
static virCPUDefPtr *
cpuTestLoadMultiXML ( const char * arch ,
const char * name ,
unsigned int * count )
{
2011-04-25 00:25:10 +02:00
char * xml = NULL ;
2010-10-07 16:35:17 +02:00
xmlDocPtr doc = NULL ;
xmlXPathContextPtr ctxt = NULL ;
xmlNodePtr * nodes = NULL ;
virCPUDefPtr * cpus = NULL ;
int n ;
Convert 'int i' to 'size_t i' in tests/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 15:09:33 +01:00
size_t i ;
2010-10-07 16:35:17 +02:00
2011-04-25 00:25:10 +02:00
if ( virAsprintf ( & xml , " %s/cputestdata/%s-%s.xml " , abs_srcdir , arch , name ) < 0 )
goto cleanup ;
2010-10-07 16:35:17 +02:00
2011-08-18 15:37:14 -06:00
if ( ! ( doc = virXMLParseFileCtxt ( xml , & ctxt ) ) )
2012-02-06 09:35:47 +01:00
goto cleanup ;
2010-10-07 16:35:17 +02:00
n = virXPathNodeSet ( " /cpuTest/cpu " , ctxt , & nodes ) ;
2015-03-23 17:19:28 +01:00
if ( n < = 0 | | ( VIR_ALLOC_N ( cpus , n ) < 0 ) ) {
fprintf ( stderr , " \n No /cpuTest/cpu elements found in %s \n " , xml ) ;
2012-02-06 09:35:47 +01:00
goto cleanup ;
2015-03-23 17:19:28 +01:00
}
2010-10-07 16:35:17 +02:00
for ( i = 0 ; i < n ; i + + ) {
ctxt - > node = nodes [ i ] ;
cpus [ i ] = virCPUDefParseXML ( nodes [ i ] , ctxt , VIR_CPU_TYPE_HOST ) ;
if ( ! cpus [ i ] )
2012-02-06 09:35:47 +01:00
goto cleanup_cpus ;
2010-10-07 16:35:17 +02:00
}
* count = n ;
2014-03-25 07:53:44 +01:00
cleanup :
2012-02-02 16:16:43 -07:00
VIR_FREE ( xml ) ;
VIR_FREE ( nodes ) ;
2010-10-07 16:35:17 +02:00
xmlXPathFreeContext ( ctxt ) ;
xmlFreeDoc ( doc ) ;
return cpus ;
2014-03-25 07:53:44 +01:00
cleanup_cpus :
2012-02-06 09:35:47 +01:00
for ( i = 0 ; i < n ; i + + )
virCPUDefFree ( cpus [ i ] ) ;
VIR_FREE ( cpus ) ;
2010-10-07 16:35:17 +02:00
goto cleanup ;
}
static int
cpuTestCompareXML ( const char * arch ,
2013-10-04 19:40:19 -06:00
virCPUDef * cpu ,
2011-12-19 15:41:16 +01:00
const char * name ,
2015-01-06 11:54:32 +00:00
bool updateCPU )
2010-10-07 16:35:17 +02:00
{
2011-04-25 00:25:10 +02:00
char * xml = NULL ;
2010-10-07 16:35:17 +02:00
char * actual = NULL ;
int ret = - 1 ;
2011-04-25 00:25:10 +02:00
if ( virAsprintf ( & xml , " %s/cputestdata/%s-%s.xml " ,
abs_srcdir , arch , name ) < 0 )
goto cleanup ;
2010-10-07 16:35:17 +02:00
2015-02-16 17:28:48 +01:00
if ( ! ( actual = virCPUDefFormat ( cpu , NULL , updateCPU ) ) )
2010-10-07 16:35:17 +02:00
goto cleanup ;
2016-05-26 17:01:53 +02:00
if ( virTestCompareToFile ( actual , xml ) < 0 )
2010-10-07 16:35:17 +02:00
goto cleanup ;
ret = 0 ;
2014-03-25 07:53:44 +01:00
cleanup :
2012-02-02 16:16:43 -07:00
VIR_FREE ( xml ) ;
VIR_FREE ( actual ) ;
2010-10-07 16:35:17 +02:00
return ret ;
}
static const char *
cpuTestCompResStr ( virCPUCompareResult result )
{
switch ( result ) {
case VIR_CPU_COMPARE_ERROR : return " ERROR " ;
case VIR_CPU_COMPARE_INCOMPATIBLE : return " INCOMPATIBLE " ;
case VIR_CPU_COMPARE_IDENTICAL : return " IDENTICAL " ;
case VIR_CPU_COMPARE_SUPERSET : return " SUPERSET " ;
2012-01-20 11:43:28 -07:00
case VIR_CPU_COMPARE_LAST : break ;
2010-10-07 16:35:17 +02:00
}
return " unknown " ;
}
static const char *
cpuTestBoolWithErrorStr ( enum cpuTestBoolWithError result )
{
switch ( result ) {
case FAIL : return " FAIL " ;
case NO : return " NO " ;
case YES : return " YES " ;
}
return " unknown " ;
}
static int
cpuTestCompare ( const void * arg )
{
const struct data * data = arg ;
int ret = - 1 ;
virCPUDefPtr host = NULL ;
virCPUDefPtr cpu = NULL ;
virCPUCompareResult result ;
if ( ! ( host = cpuTestLoadXML ( data - > arch , data - > host ) ) | |
! ( cpu = cpuTestLoadXML ( data - > arch , data - > name ) ) )
goto cleanup ;
2014-05-28 15:11:57 +02:00
result = cpuCompare ( host , cpu , false ) ;
2010-10-07 16:35:17 +02:00
if ( data - > result = = VIR_CPU_COMPARE_ERROR )
virResetLastError ( ) ;
if ( data - > result ! = result ) {
2015-04-23 13:38:00 -04:00
VIR_TEST_VERBOSE ( " \n Expected result %s, got %s \n " ,
2010-10-07 16:35:17 +02:00
cpuTestCompResStr ( data - > result ) ,
cpuTestCompResStr ( result ) ) ;
2015-04-23 13:38:00 -04:00
/* Pad to line up with test name ... in virTestRun */
VIR_TEST_VERBOSE ( " %74s " , " ... " ) ;
2010-10-07 16:35:17 +02:00
goto cleanup ;
}
ret = 0 ;
2014-03-25 07:53:44 +01:00
cleanup :
2010-10-07 16:35:17 +02:00
virCPUDefFree ( host ) ;
virCPUDefFree ( cpu ) ;
return ret ;
}
static int
cpuTestGuestData ( const void * arg )
{
const struct data * data = arg ;
2015-08-07 17:39:08 +02:00
int ret = - 2 ;
2010-10-07 16:35:17 +02:00
virCPUDefPtr host = NULL ;
virCPUDefPtr cpu = NULL ;
virCPUDefPtr guest = NULL ;
2012-12-18 19:44:23 +01:00
virCPUDataPtr guestData = NULL ;
2010-10-07 16:35:17 +02:00
virCPUCompareResult cmpResult ;
virBuffer buf = VIR_BUFFER_INITIALIZER ;
char * result = NULL ;
if ( ! ( host = cpuTestLoadXML ( data - > arch , data - > host ) ) | |
! ( cpu = cpuTestLoadXML ( data - > arch , data - > name ) ) )
goto cleanup ;
2012-04-17 15:24:47 +02:00
cmpResult = cpuGuestData ( host , cpu , & guestData , NULL ) ;
2010-10-07 16:35:17 +02:00
if ( cmpResult = = VIR_CPU_COMPARE_ERROR | |
2015-08-07 17:39:08 +02:00
cmpResult = = VIR_CPU_COMPARE_INCOMPATIBLE ) {
ret = - 1 ;
2010-10-07 16:35:17 +02:00
goto cleanup ;
2015-08-07 17:39:08 +02:00
}
2010-10-07 16:35:17 +02:00
2012-12-18 19:32:23 +00:00
if ( VIR_ALLOC ( guest ) < 0 )
2010-10-07 16:35:17 +02:00
goto cleanup ;
2012-12-18 19:32:23 +00:00
guest - > arch = host - > arch ;
2010-10-07 16:35:17 +02:00
guest - > type = VIR_CPU_TYPE_GUEST ;
guest - > match = VIR_CPU_MATCH_EXACT ;
2011-12-21 14:27:16 +01:00
guest - > fallback = cpu - > fallback ;
2010-10-07 16:35:17 +02:00
if ( cpuDecode ( guest , guestData , data - > models ,
data - > nmodels , data - > preferred ) < 0 ) {
2015-08-07 17:39:08 +02:00
ret = - 1 ;
2010-10-07 16:35:17 +02:00
goto cleanup ;
}
2011-04-30 10:34:49 -06:00
virBufferAsprintf ( & buf , " %s+%s " , data - > host , data - > name ) ;
2010-10-07 16:35:17 +02:00
if ( data - > nmodels )
2011-04-30 10:34:49 -06:00
virBufferAsprintf ( & buf , " ,%s " , data - > modelsName ) ;
2010-10-07 16:35:17 +02:00
if ( data - > preferred )
2011-04-30 10:34:49 -06:00
virBufferAsprintf ( & buf , " ,%s " , data - > preferred ) ;
2010-10-07 16:35:17 +02:00
virBufferAddLit ( & buf , " -result " ) ;
if ( virBufferError ( & buf ) ) {
virBufferFreeAndReset ( & buf ) ;
goto cleanup ;
}
result = virBufferContentAndReset ( & buf ) ;
2015-08-07 17:39:08 +02:00
if ( cpuTestCompareXML ( data - > arch , guest , result , false ) < 0 )
goto cleanup ;
ret = 0 ;
2010-10-07 16:35:17 +02:00
2014-03-25 07:53:44 +01:00
cleanup :
2010-10-07 16:35:17 +02:00
VIR_FREE ( result ) ;
2013-07-16 14:39:40 +02:00
cpuDataFree ( guestData ) ;
2010-10-07 16:35:17 +02:00
virCPUDefFree ( host ) ;
virCPUDefFree ( cpu ) ;
virCPUDefFree ( guest ) ;
2015-08-07 17:39:08 +02:00
if ( ret = = data - > result ) {
/* We got the result we expected, whether it was
* a success or a failure */
virResetLastError ( ) ;
ret = 0 ;
} else {
VIR_TEST_VERBOSE ( " \n Expected result %d, got %d \n " ,
data - > result , ret ) ;
/* Pad to line up with test name ... in virTestRun */
VIR_TEST_VERBOSE ( " %74s " , " ... " ) ;
ret = - 1 ;
}
2010-10-07 16:35:17 +02:00
return ret ;
}
static int
cpuTestBaseline ( const void * arg )
{
const struct data * data = arg ;
int ret = - 1 ;
virCPUDefPtr * cpus = NULL ;
virCPUDefPtr baseline = NULL ;
unsigned int ncpus = 0 ;
2011-04-25 00:25:10 +02:00
char * result = NULL ;
2014-01-28 00:00:44 +01:00
const char * suffix ;
Convert 'int i' to 'size_t i' in tests/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 15:09:33 +01:00
size_t i ;
2010-10-07 16:35:17 +02:00
if ( ! ( cpus = cpuTestLoadMultiXML ( data - > arch , data - > name , & ncpus ) ) )
goto cleanup ;
2013-08-02 13:08:19 -06:00
baseline = cpuBaseline ( cpus , ncpus , NULL , 0 , data - > flags ) ;
2010-10-07 16:35:17 +02:00
if ( data - > result < 0 ) {
virResetLastError ( ) ;
2014-09-03 13:39:21 -06:00
if ( ! baseline ) {
2010-10-07 16:35:17 +02:00
ret = 0 ;
2015-04-23 13:38:00 -04:00
} else {
VIR_TEST_VERBOSE ( " \n %-70s... " ,
2010-10-07 16:35:17 +02:00
" cpuBaseline was expected to fail but it succeeded " ) ;
}
goto cleanup ;
}
if ( ! baseline )
goto cleanup ;
2014-01-28 00:00:44 +01:00
if ( data - > flags & VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES )
suffix = " expanded " ;
2015-02-05 15:28:09 +01:00
else if ( data - > flags & VIR_CONNECT_BASELINE_CPU_MIGRATABLE )
suffix = " migratable " ;
2014-01-28 00:00:44 +01:00
else
suffix = " result " ;
if ( virAsprintf ( & result , " %s-%s " , data - > name , suffix ) < 0 )
2011-04-25 00:25:10 +02:00
goto cleanup ;
2015-01-06 11:54:32 +00:00
if ( cpuTestCompareXML ( data - > arch , baseline , result , false ) < 0 )
2010-10-07 16:35:17 +02:00
goto cleanup ;
for ( i = 0 ; i < ncpus ; i + + ) {
virCPUCompareResult cmp ;
2014-05-28 15:11:57 +02:00
cmp = cpuCompare ( cpus [ i ] , baseline , false ) ;
2010-10-07 16:35:17 +02:00
if ( cmp ! = VIR_CPU_COMPARE_SUPERSET & &
cmp ! = VIR_CPU_COMPARE_IDENTICAL ) {
2015-04-23 13:38:00 -04:00
VIR_TEST_VERBOSE ( " \n baseline CPU is incompatible with CPU %zu \n " ,
i ) ;
VIR_TEST_VERBOSE ( " %74s " , " ... " ) ;
2010-10-07 16:35:17 +02:00
ret = - 1 ;
goto cleanup ;
}
}
ret = 0 ;
2014-03-25 07:53:44 +01:00
cleanup :
2010-10-07 16:35:17 +02:00
if ( cpus ) {
for ( i = 0 ; i < ncpus ; i + + )
virCPUDefFree ( cpus [ i ] ) ;
2012-02-02 16:16:43 -07:00
VIR_FREE ( cpus ) ;
2010-10-07 16:35:17 +02:00
}
virCPUDefFree ( baseline ) ;
2012-02-02 16:16:43 -07:00
VIR_FREE ( result ) ;
2010-10-07 16:35:17 +02:00
return ret ;
}
static int
cpuTestUpdate ( const void * arg )
{
const struct data * data = arg ;
int ret = - 1 ;
virCPUDefPtr host = NULL ;
virCPUDefPtr cpu = NULL ;
2011-04-25 00:25:10 +02:00
char * result = NULL ;
2010-10-07 16:35:17 +02:00
if ( ! ( host = cpuTestLoadXML ( data - > arch , data - > host ) ) | |
! ( cpu = cpuTestLoadXML ( data - > arch , data - > name ) ) )
goto cleanup ;
if ( cpuUpdate ( cpu , host ) < 0 )
goto cleanup ;
2011-04-25 00:25:10 +02:00
if ( virAsprintf ( & result , " %s+%s " , data - > host , data - > name ) < 0 )
goto cleanup ;
2015-01-06 11:54:32 +00:00
ret = cpuTestCompareXML ( data - > arch , cpu , result , true ) ;
2010-10-07 16:35:17 +02:00
2014-03-25 07:53:44 +01:00
cleanup :
2010-10-07 16:35:17 +02:00
virCPUDefFree ( host ) ;
virCPUDefFree ( cpu ) ;
2012-02-02 16:16:43 -07:00
VIR_FREE ( result ) ;
2010-10-07 16:35:17 +02:00
return ret ;
}
static int
cpuTestHasFeature ( const void * arg )
{
const struct data * data = arg ;
int ret = - 1 ;
virCPUDefPtr host = NULL ;
2012-12-18 19:44:23 +01:00
virCPUDataPtr hostData = NULL ;
2010-10-07 16:35:17 +02:00
int result ;
if ( ! ( host = cpuTestLoadXML ( data - > arch , data - > host ) ) )
goto cleanup ;
if ( cpuEncode ( host - > arch , host , NULL , & hostData ,
NULL , NULL , NULL , NULL ) < 0 )
goto cleanup ;
2013-07-16 14:39:40 +02:00
result = cpuHasFeature ( hostData , data - > name ) ;
2010-10-07 16:35:17 +02:00
if ( data - > result = = - 1 )
virResetLastError ( ) ;
if ( data - > result ! = result ) {
2015-04-23 13:38:00 -04:00
VIR_TEST_VERBOSE ( " \n Expected result %s, got %s \n " ,
cpuTestBoolWithErrorStr ( data - > result ) ,
cpuTestBoolWithErrorStr ( result ) ) ;
/* Pad to line up with test name ... in virTestRun */
VIR_TEST_VERBOSE ( " %74s " , " ... " ) ;
2010-10-07 16:35:17 +02:00
goto cleanup ;
}
ret = 0 ;
2014-03-25 07:53:44 +01:00
cleanup :
2013-07-16 14:39:40 +02:00
cpuDataFree ( hostData ) ;
2010-10-07 16:35:17 +02:00
virCPUDefFree ( host ) ;
return ret ;
}
2016-06-01 15:57:00 +02:00
static int
2016-06-08 16:57:28 +02:00
cpuTestCPUID ( bool guest , const void * arg )
2016-06-01 15:57:00 +02:00
{
const struct data * data = arg ;
int ret = - 1 ;
virCPUDataPtr hostData = NULL ;
char * hostFile = NULL ;
char * host = NULL ;
virCPUDefPtr cpu = NULL ;
char * result = NULL ;
if ( virAsprintf ( & hostFile , " %s/cputestdata/%s-cpuid-%s.xml " ,
abs_srcdir , data - > arch , data - > host ) < 0 )
goto cleanup ;
if ( virTestLoadFile ( hostFile , & host ) < 0 | |
! ( hostData = cpuDataParse ( host ) ) )
goto cleanup ;
if ( VIR_ALLOC ( cpu ) < 0 )
goto cleanup ;
cpu - > arch = hostData - > arch ;
2016-06-08 16:57:28 +02:00
if ( guest ) {
2016-06-01 15:57:00 +02:00
cpu - > type = VIR_CPU_TYPE_GUEST ;
cpu - > match = VIR_CPU_MATCH_EXACT ;
cpu - > fallback = VIR_CPU_FALLBACK_FORBID ;
} else {
cpu - > type = VIR_CPU_TYPE_HOST ;
}
if ( cpuDecode ( cpu , hostData , NULL , 0 , NULL ) < 0 )
goto cleanup ;
if ( virAsprintf ( & result , " cpuid-%s-%s " ,
data - > host ,
2016-06-08 16:57:28 +02:00
guest ? " guest " : " host " ) < 0 )
2016-06-01 15:57:00 +02:00
goto cleanup ;
ret = cpuTestCompareXML ( data - > arch , cpu , result , false ) ;
cleanup :
VIR_FREE ( hostFile ) ;
VIR_FREE ( host ) ;
cpuDataFree ( hostData ) ;
virCPUDefFree ( cpu ) ;
VIR_FREE ( result ) ;
return ret ;
}
2016-06-08 16:57:28 +02:00
static int
cpuTestHostCPUID ( const void * arg )
{
return cpuTestCPUID ( false , arg ) ;
}
static int
cpuTestGuestCPUID ( const void * arg )
{
return cpuTestCPUID ( true , arg ) ;
}
2016-06-01 15:57:00 +02:00
# if WITH_QEMU && WITH_YAJL
static int
cpuTestJSONCPUID ( const void * arg )
{
const struct data * data = arg ;
virCPUDataPtr cpuData = NULL ;
virCPUDefPtr cpu = NULL ;
qemuMonitorTestPtr testMon = NULL ;
char * json = NULL ;
char * result = NULL ;
int ret = - 1 ;
if ( virAsprintf ( & json , " %s/cputestdata/%s-cpuid-%s.json " ,
abs_srcdir , data - > arch , data - > host ) < 0 | |
virAsprintf ( & result , " cpuid-%s-json " , data - > host ) < 0 )
goto cleanup ;
if ( ! ( testMon = qemuMonitorTestNewFromFile ( json , driver . xmlopt , true ) ) )
goto cleanup ;
if ( qemuMonitorJSONGetCPUx86Data ( qemuMonitorTestGetMonitor ( testMon ) ,
" feature-words " , & cpuData ) < 0 )
goto cleanup ;
if ( VIR_ALLOC ( cpu ) < 0 )
goto cleanup ;
cpu - > arch = cpuData - > arch ;
cpu - > type = VIR_CPU_TYPE_GUEST ;
cpu - > match = VIR_CPU_MATCH_EXACT ;
cpu - > fallback = VIR_CPU_FALLBACK_FORBID ;
if ( cpuDecode ( cpu , cpuData , NULL , 0 , NULL ) < 0 )
goto cleanup ;
ret = cpuTestCompareXML ( data - > arch , cpu , result , false ) ;
cleanup :
qemuMonitorTestFree ( testMon ) ;
cpuDataFree ( cpuData ) ;
virCPUDefFree ( cpu ) ;
VIR_FREE ( result ) ;
VIR_FREE ( json ) ;
return ret ;
}
# endif
2010-10-07 16:35:17 +02:00
static const char * model486 [ ] = { " 486 " } ;
static const char * nomodel [ ] = { " nomodel " } ;
static const char * models [ ] = { " qemu64 " , " core2duo " , " Nehalem " } ;
2015-03-23 17:19:28 +01:00
static const char * haswell [ ] = { " SandyBridge " , " Haswell " } ;
2015-08-07 17:39:20 +02:00
static const char * ppc_models [ ] = { " POWER6 " , " POWER7 " , " POWER8 " } ;
2010-10-07 16:35:17 +02:00
static int
2011-04-29 10:21:20 -06:00
mymain ( void )
2010-10-07 16:35:17 +02:00
{
int ret = 0 ;
2016-06-01 15:57:00 +02:00
# if WITH_QEMU && WITH_YAJL
if ( qemuTestDriverInit ( & driver ) < 0 )
return EXIT_FAILURE ;
virEventRegisterDefaultImpl ( ) ;
# endif
2010-10-07 16:35:17 +02:00
# define DO_TEST(arch, api, name, host, cpu, \
2013-08-02 13:08:19 -06:00
models , nmodels , preferred , flags , result ) \
2010-10-07 16:35:17 +02:00
do { \
2016-06-08 16:57:28 +02:00
struct data data = { \
arch , host , cpu , models , \
2010-10-07 16:35:17 +02:00
models = = NULL ? NULL : # models , \
2013-08-02 13:08:19 -06:00
nmodels , preferred , flags , result \
2010-10-07 16:35:17 +02:00
} ; \
2016-06-08 16:57:28 +02:00
char * testLabel ; \
char * tmp ; \
\
tmp = virTestLogContentAndReset ( ) ; \
VIR_FREE ( tmp ) ; \
\
if ( virAsprintf ( & testLabel , " %s(%s): %s " , \
# api, arch, name) < 0) { \
2010-10-07 16:35:17 +02:00
ret = - 1 ; \
2016-06-08 16:57:28 +02:00
break ; \
} \
\
if ( virTestRun ( testLabel , api , & data ) < 0 ) { \
if ( virTestGetDebug ( ) ) { \
char * log ; \
if ( ( log = virTestLogContentAndReset ( ) ) & & \
strlen ( log ) > 0 ) \
VIR_TEST_DEBUG ( " \n %s \n " , log ) ; \
VIR_FREE ( log ) ; \
} \
ret = - 1 ; \
} \
\
VIR_FREE ( testLabel ) ; \
2010-10-07 16:35:17 +02:00
} while ( 0 )
# define DO_TEST_COMPARE(arch, host, cpu, result) \
2016-06-08 16:57:28 +02:00
DO_TEST ( arch , cpuTestCompare , \
2010-10-07 16:35:17 +02:00
host " / " cpu " ( " # result " ) " , \
2013-08-02 13:08:19 -06:00
host , cpu , NULL , 0 , NULL , 0 , result )
2010-10-07 16:35:17 +02:00
# define DO_TEST_UPDATE(arch, host, cpu, result) \
do { \
2016-06-08 16:57:28 +02:00
DO_TEST ( arch , cpuTestUpdate , \
2010-10-07 16:35:17 +02:00
cpu " on " host , \
2013-08-02 13:08:19 -06:00
host , cpu , NULL , 0 , NULL , 0 , 0 ) ; \
2010-10-07 16:35:17 +02:00
DO_TEST_COMPARE ( arch , host , host " + " cpu , result ) ; \
} while ( 0 )
2013-08-02 13:08:19 -06:00
# define DO_TEST_BASELINE(arch, name, flags, result) \
2014-01-28 00:00:44 +01:00
do { \
const char * suffix = " " ; \
char * label ; \
if ( ( flags ) & VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES ) \
suffix = " (expanded) " ; \
2015-02-05 15:28:09 +01:00
if ( ( flags ) & VIR_CONNECT_BASELINE_CPU_MIGRATABLE ) \
suffix = " (migratable) " ; \
2014-01-28 00:00:44 +01:00
if ( virAsprintf ( & label , " %s%s " , name , suffix ) < 0 ) { \
ret = - 1 ; \
} else { \
2016-06-08 16:57:28 +02:00
DO_TEST ( arch , cpuTestBaseline , label , NULL , \
" baseline- " name , NULL , 0 , NULL , flags , result ) ; \
2014-01-28 00:00:44 +01:00
} \
VIR_FREE ( label ) ; \
} while ( 0 )
2010-10-07 16:35:17 +02:00
# define DO_TEST_HASFEATURE(arch, host, feature, result) \
2016-06-08 16:57:28 +02:00
DO_TEST ( arch , cpuTestHasFeature , \
2010-10-07 16:35:17 +02:00
host " / " feature " ( " # result " ) " , \
2013-08-02 13:08:19 -06:00
host , feature , NULL , 0 , NULL , 0 , result )
2010-10-07 16:35:17 +02:00
# define DO_TEST_GUESTDATA(arch, host, cpu, models, preferred, result) \
2016-06-08 16:57:28 +02:00
DO_TEST ( arch , cpuTestGuestData , \
2010-10-07 16:35:17 +02:00
host " / " cpu " ( " # models " , pref= " # preferred " ) " , \
host , cpu , models , \
models = = NULL ? 0 : sizeof ( models ) / sizeof ( char * ) , \
2013-08-02 13:08:19 -06:00
preferred , 0 , result )
2010-10-07 16:35:17 +02:00
2016-06-01 15:57:00 +02:00
# if WITH_QEMU && WITH_YAJL
# define DO_TEST_CPUID_JSON(arch, host, json) \
do { \
if ( json ) { \
2016-06-08 16:57:28 +02:00
DO_TEST ( arch , cpuTestJSONCPUID , host , host , \
2016-06-01 15:57:00 +02:00
NULL , NULL , 0 , NULL , 0 , 0 ) ; \
} \
} while ( 0 )
# else
2016-06-13 10:11:41 +01:00
# define DO_TEST_CPUID_JSON(arch, host, json)
2016-06-01 15:57:00 +02:00
# endif
# define DO_TEST_CPUID(arch, host, json) \
do { \
2016-06-08 16:57:28 +02:00
DO_TEST ( arch , cpuTestHostCPUID , host , host , \
2016-06-01 15:57:00 +02:00
NULL , NULL , 0 , NULL , 0 , 0 ) ; \
2016-06-08 16:57:28 +02:00
DO_TEST ( arch , cpuTestGuestCPUID , host , host , \
2016-06-01 15:57:00 +02:00
NULL , NULL , 0 , NULL , 0 , 0 ) ; \
DO_TEST_CPUID_JSON ( arch , host , json ) ; \
} while ( 0 )
2010-10-07 16:35:17 +02:00
/* host to host comparison */
2012-03-29 10:47:07 +01:00
DO_TEST_COMPARE ( " x86 " , " host " , " host " , VIR_CPU_COMPARE_IDENTICAL ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " host-better " , VIR_CPU_COMPARE_INCOMPATIBLE ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " host-worse " , VIR_CPU_COMPARE_SUPERSET ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " host-amd-fake " , VIR_CPU_COMPARE_INCOMPATIBLE ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " host-incomp-arch " , VIR_CPU_COMPARE_INCOMPATIBLE ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " host-no-vendor " , VIR_CPU_COMPARE_IDENTICAL ) ;
DO_TEST_COMPARE ( " x86 " , " host-no-vendor " , " host " , VIR_CPU_COMPARE_INCOMPATIBLE ) ;
2010-10-07 16:35:17 +02:00
2015-08-07 17:39:21 +02:00
DO_TEST_COMPARE ( " ppc64 " , " host " , " host " , VIR_CPU_COMPARE_IDENTICAL ) ;
DO_TEST_COMPARE ( " ppc64 " , " host " , " host-better " , VIR_CPU_COMPARE_INCOMPATIBLE ) ;
DO_TEST_COMPARE ( " ppc64 " , " host " , " host-worse " , VIR_CPU_COMPARE_INCOMPATIBLE ) ;
DO_TEST_COMPARE ( " ppc64 " , " host " , " host-incomp-arch " , VIR_CPU_COMPARE_INCOMPATIBLE ) ;
DO_TEST_COMPARE ( " ppc64 " , " host " , " host-no-vendor " , VIR_CPU_COMPARE_IDENTICAL ) ;
DO_TEST_COMPARE ( " ppc64 " , " host-no-vendor " , " host " , VIR_CPU_COMPARE_INCOMPATIBLE ) ;
2010-10-07 16:35:17 +02:00
/* guest to host comparison */
2012-03-29 10:47:07 +01:00
DO_TEST_COMPARE ( " x86 " , " host " , " bogus-model " , VIR_CPU_COMPARE_ERROR ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " bogus-feature " , VIR_CPU_COMPARE_ERROR ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " min " , VIR_CPU_COMPARE_SUPERSET ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " pentium3 " , VIR_CPU_COMPARE_SUPERSET ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " exact " , VIR_CPU_COMPARE_SUPERSET ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " exact-forbid " , VIR_CPU_COMPARE_INCOMPATIBLE ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " exact-forbid-extra " , VIR_CPU_COMPARE_SUPERSET ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " exact-disable " , VIR_CPU_COMPARE_SUPERSET ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " exact-disable2 " , VIR_CPU_COMPARE_SUPERSET ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " exact-disable-extra " , VIR_CPU_COMPARE_SUPERSET ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " exact-require " , VIR_CPU_COMPARE_SUPERSET ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " exact-require-extra " , VIR_CPU_COMPARE_INCOMPATIBLE ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " exact-force " , VIR_CPU_COMPARE_SUPERSET ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " strict " , VIR_CPU_COMPARE_INCOMPATIBLE ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " strict-full " , VIR_CPU_COMPARE_IDENTICAL ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " strict-disable " , VIR_CPU_COMPARE_IDENTICAL ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " strict-force-extra " , VIR_CPU_COMPARE_IDENTICAL ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " guest " , VIR_CPU_COMPARE_SUPERSET ) ;
DO_TEST_COMPARE ( " x86 " , " host " , " pentium3-amd " , VIR_CPU_COMPARE_INCOMPATIBLE ) ;
DO_TEST_COMPARE ( " x86 " , " host-amd " , " pentium3-amd " , VIR_CPU_COMPARE_SUPERSET ) ;
2016-06-02 10:17:22 +02:00
DO_TEST_COMPARE ( " x86 " , " host-worse " , " penryn-force " , VIR_CPU_COMPARE_IDENTICAL ) ;
2013-07-21 00:27:40 +02:00
DO_TEST_COMPARE ( " x86 " , " host-SandyBridge " , " exact-force-Haswell " , VIR_CPU_COMPARE_IDENTICAL ) ;
2010-10-07 16:35:17 +02:00
2015-08-07 17:39:20 +02:00
DO_TEST_COMPARE ( " ppc64 " , " host " , " guest-strict " , VIR_CPU_COMPARE_IDENTICAL ) ;
DO_TEST_COMPARE ( " ppc64 " , " host " , " guest-exact " , VIR_CPU_COMPARE_INCOMPATIBLE ) ;
2015-08-07 17:39:21 +02:00
DO_TEST_COMPARE ( " ppc64 " , " host " , " guest-legacy " , VIR_CPU_COMPARE_IDENTICAL ) ;
DO_TEST_COMPARE ( " ppc64 " , " host " , " guest-legacy-incompatible " , VIR_CPU_COMPARE_INCOMPATIBLE ) ;
DO_TEST_COMPARE ( " ppc64 " , " host " , " guest-legacy-invalid " , VIR_CPU_COMPARE_ERROR ) ;
2015-08-14 16:45:18 +02:00
DO_TEST_COMPARE ( " ppc64 " , " host " , " guest-compat-none " , VIR_CPU_COMPARE_IDENTICAL ) ;
DO_TEST_COMPARE ( " ppc64 " , " host " , " guest-compat-valid " , VIR_CPU_COMPARE_IDENTICAL ) ;
DO_TEST_COMPARE ( " ppc64 " , " host " , " guest-compat-invalid " , VIR_CPU_COMPARE_ERROR ) ;
DO_TEST_COMPARE ( " ppc64 " , " host " , " guest-compat-incompatible " , VIR_CPU_COMPARE_INCOMPATIBLE ) ;
2013-09-03 14:28:25 +08:00
2010-10-07 16:35:17 +02:00
/* guest updates for migration
* automatically compares host CPU with the result */
2012-03-29 10:47:07 +01:00
DO_TEST_UPDATE ( " x86 " , " host " , " min " , VIR_CPU_COMPARE_IDENTICAL ) ;
DO_TEST_UPDATE ( " x86 " , " host " , " pentium3 " , VIR_CPU_COMPARE_IDENTICAL ) ;
DO_TEST_UPDATE ( " x86 " , " host " , " guest " , VIR_CPU_COMPARE_SUPERSET ) ;
DO_TEST_UPDATE ( " x86 " , " host " , " host-model " , VIR_CPU_COMPARE_IDENTICAL ) ;
DO_TEST_UPDATE ( " x86 " , " host " , " host-model-nofallback " , VIR_CPU_COMPARE_IDENTICAL ) ;
DO_TEST_UPDATE ( " x86 " , " host " , " host-passthrough " , VIR_CPU_COMPARE_IDENTICAL ) ;
2014-09-05 09:50:36 +02:00
DO_TEST_UPDATE ( " x86 " , " host-invtsc " , " host-model " , VIR_CPU_COMPARE_SUPERSET ) ;
2010-10-07 16:35:17 +02:00
2015-08-14 16:45:18 +02:00
DO_TEST_UPDATE ( " ppc64 " , " host " , " guest " , VIR_CPU_COMPARE_IDENTICAL ) ;
DO_TEST_UPDATE ( " ppc64 " , " host " , " guest-nofallback " , VIR_CPU_COMPARE_INCOMPATIBLE ) ;
DO_TEST_UPDATE ( " ppc64 " , " host " , " guest-legacy " , VIR_CPU_COMPARE_IDENTICAL ) ;
DO_TEST_UPDATE ( " ppc64 " , " host " , " guest-legacy-incompatible " , VIR_CPU_COMPARE_INCOMPATIBLE ) ;
DO_TEST_UPDATE ( " ppc64 " , " host " , " guest-legacy-invalid " , VIR_CPU_COMPARE_ERROR ) ;
DO_TEST_UPDATE ( " ppc64 " , " host " , " guest-compat-none " , VIR_CPU_COMPARE_IDENTICAL ) ;
DO_TEST_UPDATE ( " ppc64 " , " host " , " guest-compat-valid " , VIR_CPU_COMPARE_IDENTICAL ) ;
DO_TEST_UPDATE ( " ppc64 " , " host " , " guest-compat-invalid " , VIR_CPU_COMPARE_ERROR ) ;
DO_TEST_UPDATE ( " ppc64 " , " host " , " guest-compat-incompatible " , VIR_CPU_COMPARE_INCOMPATIBLE ) ;
2010-10-07 16:35:17 +02:00
/* computing baseline CPUs */
2013-08-02 13:08:19 -06:00
DO_TEST_BASELINE ( " x86 " , " incompatible-vendors " , 0 , - 1 ) ;
DO_TEST_BASELINE ( " x86 " , " no-vendor " , 0 , 0 ) ;
DO_TEST_BASELINE ( " x86 " , " some-vendors " , 0 , 0 ) ;
DO_TEST_BASELINE ( " x86 " , " 1 " , 0 , 0 ) ;
DO_TEST_BASELINE ( " x86 " , " 2 " , 0 , 0 ) ;
2014-01-27 21:53:51 +01:00
DO_TEST_BASELINE ( " x86 " , " 3 " , 0 , 0 ) ;
2013-08-02 13:08:19 -06:00
DO_TEST_BASELINE ( " x86 " , " 3 " , VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES , 0 ) ;
2014-01-27 21:53:51 +01:00
DO_TEST_BASELINE ( " x86 " , " 4 " , 0 , 0 ) ;
DO_TEST_BASELINE ( " x86 " , " 4 " , VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES , 0 ) ;
DO_TEST_BASELINE ( " x86 " , " 5 " , 0 , 0 ) ;
DO_TEST_BASELINE ( " x86 " , " 5 " , VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES , 0 ) ;
2015-02-05 15:28:09 +01:00
DO_TEST_BASELINE ( " x86 " , " 6 " , 0 , 0 ) ;
DO_TEST_BASELINE ( " x86 " , " 6 " , VIR_CONNECT_BASELINE_CPU_MIGRATABLE , 0 ) ;
2015-03-23 17:19:28 +01:00
DO_TEST_BASELINE ( " x86 " , " 7 " , 0 , 0 ) ;
DO_TEST_BASELINE ( " x86 " , " 8 " , 0 , 0 ) ;
2010-10-07 16:35:17 +02:00
2013-09-03 14:28:25 +08:00
DO_TEST_BASELINE ( " ppc64 " , " incompatible-vendors " , 0 , - 1 ) ;
DO_TEST_BASELINE ( " ppc64 " , " no-vendor " , 0 , 0 ) ;
2015-08-07 17:39:21 +02:00
DO_TEST_BASELINE ( " ppc64 " , " incompatible-models " , 0 , - 1 ) ;
DO_TEST_BASELINE ( " ppc64 " , " same-model " , 0 , 0 ) ;
DO_TEST_BASELINE ( " ppc64 " , " legacy " , 0 , - 1 ) ;
2015-08-07 17:39:12 +02:00
2010-10-07 16:35:17 +02:00
/* CPU features */
DO_TEST_HASFEATURE ( " x86 " , " host " , " vmx " , YES ) ;
DO_TEST_HASFEATURE ( " x86 " , " host " , " lm " , YES ) ;
DO_TEST_HASFEATURE ( " x86 " , " host " , " sse4.1 " , YES ) ;
DO_TEST_HASFEATURE ( " x86 " , " host " , " 3dnowext " , NO ) ;
DO_TEST_HASFEATURE ( " x86 " , " host " , " skinit " , NO ) ;
DO_TEST_HASFEATURE ( " x86 " , " host " , " foo " , FAIL ) ;
/* computing guest data and decoding the data into a guest CPU XML */
DO_TEST_GUESTDATA ( " x86 " , " host " , " guest " , NULL , NULL , 0 ) ;
DO_TEST_GUESTDATA ( " x86 " , " host-better " , " pentium3 " , NULL , NULL , 0 ) ;
DO_TEST_GUESTDATA ( " x86 " , " host-better " , " pentium3 " , NULL , " pentium3 " , 0 ) ;
DO_TEST_GUESTDATA ( " x86 " , " host-better " , " pentium3 " , NULL , " core2duo " , 0 ) ;
DO_TEST_GUESTDATA ( " x86 " , " host-worse " , " guest " , NULL , NULL , 0 ) ;
DO_TEST_GUESTDATA ( " x86 " , " host " , " strict-force-extra " , NULL , NULL , 0 ) ;
2016-06-02 10:17:22 +02:00
DO_TEST_GUESTDATA ( " x86 " , " host " , " penryn-force " , NULL , NULL , 0 ) ;
2010-10-07 16:35:17 +02:00
DO_TEST_GUESTDATA ( " x86 " , " host " , " guest " , model486 , NULL , 0 ) ;
DO_TEST_GUESTDATA ( " x86 " , " host " , " guest " , models , NULL , 0 ) ;
DO_TEST_GUESTDATA ( " x86 " , " host " , " guest " , models , " Penryn " , 0 ) ;
DO_TEST_GUESTDATA ( " x86 " , " host " , " guest " , models , " qemu64 " , 0 ) ;
DO_TEST_GUESTDATA ( " x86 " , " host " , " guest " , nomodel , NULL , - 1 ) ;
2011-12-21 14:27:16 +01:00
DO_TEST_GUESTDATA ( " x86 " , " host " , " guest-nofallback " , models , " Penryn " , - 1 ) ;
2011-12-19 15:41:16 +01:00
DO_TEST_GUESTDATA ( " x86 " , " host " , " host+host-model " , models , " Penryn " , 0 ) ;
DO_TEST_GUESTDATA ( " x86 " , " host " , " host+host-model-nofallback " ,
models , " Penryn " , - 1 ) ;
2015-03-23 17:19:28 +01:00
DO_TEST_GUESTDATA ( " x86 " , " host-Haswell-noTSX " , " Haswell " ,
haswell , " Haswell " , 0 ) ;
DO_TEST_GUESTDATA ( " x86 " , " host-Haswell-noTSX " , " Haswell-noTSX " ,
haswell , " Haswell-noTSX " , 0 ) ;
DO_TEST_GUESTDATA ( " x86 " , " host-Haswell-noTSX " , " Haswell-noTSX-nofallback " ,
haswell , " Haswell-noTSX " , - 1 ) ;
DO_TEST_GUESTDATA ( " x86 " , " host-Haswell-noTSX " , " Haswell-noTSX " ,
NULL , " Haswell-noTSX " , 0 ) ;
2010-10-07 16:35:17 +02:00
2013-09-03 14:28:25 +08:00
DO_TEST_GUESTDATA ( " ppc64 " , " host " , " guest " , ppc_models , NULL , 0 ) ;
2015-08-07 17:39:20 +02:00
DO_TEST_GUESTDATA ( " ppc64 " , " host " , " guest-nofallback " , ppc_models , " POWER8 " , - 1 ) ;
2015-08-07 17:39:21 +02:00
DO_TEST_GUESTDATA ( " ppc64 " , " host " , " guest-legacy " , ppc_models , NULL , 0 ) ;
DO_TEST_GUESTDATA ( " ppc64 " , " host " , " guest-legacy-incompatible " , ppc_models , NULL , - 1 ) ;
DO_TEST_GUESTDATA ( " ppc64 " , " host " , " guest-legacy-invalid " , ppc_models , NULL , - 1 ) ;
2013-09-03 14:28:25 +08:00
2016-06-06 14:43:07 +02:00
DO_TEST_CPUID ( " x86 " , " A10-5800K " , true ) ;
2016-06-01 17:52:51 +02:00
DO_TEST_CPUID ( " x86 " , " Atom-D510 " , false ) ;
2016-06-01 17:52:51 +02:00
DO_TEST_CPUID ( " x86 " , " Atom-N450 " , false ) ;
2016-06-01 17:52:51 +02:00
DO_TEST_CPUID ( " x86 " , " Core-i5-2500 " , true ) ;
2016-06-01 17:52:51 +02:00
DO_TEST_CPUID ( " x86 " , " Core-i5-2540M " , true ) ;
2016-06-01 17:52:51 +02:00
DO_TEST_CPUID ( " x86 " , " Core-i5-4670T " , true ) ;
2016-06-01 17:52:51 +02:00
DO_TEST_CPUID ( " x86 " , " Core-i5-6600 " , true ) ;
2016-06-01 17:52:52 +02:00
DO_TEST_CPUID ( " x86 " , " Core-i7-2600 " , true ) ;
2016-06-01 17:52:52 +02:00
DO_TEST_CPUID ( " x86 " , " Core-i7-3520M " , false ) ;
2016-06-01 17:52:52 +02:00
DO_TEST_CPUID ( " x86 " , " Core-i7-3740QM " , true ) ;
2016-06-01 17:52:52 +02:00
DO_TEST_CPUID ( " x86 " , " Core-i7-3770 " , true ) ;
2016-06-01 17:52:52 +02:00
DO_TEST_CPUID ( " x86 " , " Core-i7-4600U " , true ) ;
2016-06-01 17:52:53 +02:00
DO_TEST_CPUID ( " x86 " , " Core-i7-5600U " , true ) ;
2016-06-01 17:52:53 +02:00
DO_TEST_CPUID ( " x86 " , " Core2-E6850 " , true ) ;
2016-06-01 17:52:53 +02:00
DO_TEST_CPUID ( " x86 " , " Core2-Q9500 " , false ) ;
2016-06-01 17:52:53 +02:00
DO_TEST_CPUID ( " x86 " , " FX-8150 " , false ) ;
2016-06-01 17:52:53 +02:00
DO_TEST_CPUID ( " x86 " , " Opteron-1352 " , false ) ;
2016-06-01 17:52:53 +02:00
DO_TEST_CPUID ( " x86 " , " Opteron-2350 " , true ) ;
2016-06-01 17:52:54 +02:00
DO_TEST_CPUID ( " x86 " , " Opteron-6234 " , true ) ;
2016-06-01 17:52:54 +02:00
DO_TEST_CPUID ( " x86 " , " Opteron-6282 " , false ) ;
2016-06-01 17:52:54 +02:00
DO_TEST_CPUID ( " x86 " , " Pentium-P6100 " , false ) ;
2016-06-01 17:52:54 +02:00
DO_TEST_CPUID ( " x86 " , " Phenom-B95 " , true ) ;
2016-06-01 17:52:54 +02:00
DO_TEST_CPUID ( " x86 " , " Xeon-5110 " , false ) ;
2016-06-01 17:52:55 +02:00
DO_TEST_CPUID ( " x86 " , " Xeon-E3-1245 " , true ) ;
2016-06-01 17:52:55 +02:00
DO_TEST_CPUID ( " x86 " , " Xeon-E5-2630 " , true ) ;
2016-06-01 17:52:55 +02:00
DO_TEST_CPUID ( " x86 " , " Xeon-E5-2650 " , true ) ;
2016-06-01 17:52:55 +02:00
DO_TEST_CPUID ( " x86 " , " Xeon-E7-4820 " , true ) ;
2016-06-01 17:52:55 +02:00
DO_TEST_CPUID ( " x86 " , " Xeon-W3520 " , true ) ;
2016-06-01 17:52:56 +02:00
DO_TEST_CPUID ( " x86 " , " Xeon-X5460 " , false ) ;
2016-06-06 14:43:07 +02:00
2016-06-01 15:57:00 +02:00
# if WITH_QEMU && WITH_YAJL
qemuTestDriverFree ( & driver ) ;
# endif
2012-03-22 12:33:35 +01:00
return ret = = 0 ? EXIT_SUCCESS : EXIT_FAILURE ;
2010-10-07 16:35:17 +02:00
}
VIRT_TEST_MAIN ( mymain )