mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'pull-request-2024-06-12' of https://gitlab.com/thuth/qemu into staging
* Fix loongarch64 avocado test * Make qtests more flexible with regards to non-available CPU models * Improvements for the test-smp-parse unit test # -----BEGIN PGP SIGNATURE----- # # iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmZpoEoRHHRodXRoQHJl # ZGhhdC5jb20ACgkQLtnXdP5wLbVF6g/+JYTRKmaIduQIP9g2+NkM+qMTbjI9Ow47 # 8Vdj/ePMXNWOZsgMPkCUdisYeMZEC+XMcDN1xvwZXwLTMTJRacZCSFRpeN4P0m0W # 6aQ28+tPNgx+B9Eh2kc4TpxbiqSH8u5u4GEN4Y07rcX/3YbYyjFgZD8orRu/nJ+H # 0wV7Riq9csi1BkLxrgKaHocFSOl4eOga4OFi+u4wIn/xoW3MN0laxe4iuoQRMZPf # gJLPRhEija4lto8iIKNxJbTABB0wEcWRWtgqcbHxdatqh1lPTPBpWxmdD/v1LJn+ # H/eO+oh05NQdlhw7+xfWF9PD+MpIePbZ28oNb3X3uURROTdcxpBAgpPipv07FsT4 # LmU2nIBQ4FcpDOkhLnLmBmFBNO6uDCzuGzxFRhX1SIiGMABqTDOKynBQSgQI2iB0 # 5J47XUwHtnOoCvf4SRA/MZG8zNSQZdJbnuOBLgZ+vsCG14mWM2NbfSUwRkH6pd/J # fEbODuzHZoYgUTxjR9+WMbINAbNjMy+SP2sGZIBzcAIIkybKynOy58LoCyNT684U # ean9bnc65908PJxEfsQ6k9kNwkK4GwOqZi+X383nVgMJ9+3dDw8M76IVU59hsq1n # wnz4VgFcRdXMYhj9zghaCgH2Ezw8gZHILXH+RlX0Bav4LQ5vSZQ6tRNwM4+rfXBe # okF1Sxmz31U= # =s7+V # -----END PGP SIGNATURE----- # gpg: Signature made Wed 12 Jun 2024 06:19:06 AM PDT # gpg: using RSA key 27B88847EEE0250118F3EAB92ED9D774FE702DB5 # gpg: issuer "thuth@redhat.com" # gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [full] # gpg: aka "Thomas Huth <thuth@redhat.com>" [full] # gpg: aka "Thomas Huth <th.huth@posteo.de>" [unknown] # gpg: aka "Thomas Huth <huth@tuxfamily.org>" [full] * tag 'pull-request-2024-06-12' of https://gitlab.com/thuth/qemu: tests/tcg/s390x: Allow specifying extra QEMU options on the command line tests/unit/test-smp-parse: Test the full 8-levels topology hierarchy tests/unit/test-smp-parse: Test "modules" and "dies" combination case tests/unit/test-smp-parse: Test "modules" parameter in -smp tests/unit/test-smp-parse: Make test cases aware of module level tests/unit/test-smp-parse: Use default parameters=0 when not set in -smp tests/unit/test-smp-parse: Fix an invalid topology case tests/unit/test-smp-parse: Fix comment of parameters=1 case tests/unit/test-smp-parse: Fix comments of drawers and books case test: Remove libibumad dependence meson: Remove libibumad dependence tests/qtest/x86: check for availability of older cpu models before running tests tests/qtest/libqtest: add qtest_has_cpu_model() api qtest/x86/numa-test: do not use the obsolete 'pentium' cpu tests/avocado: Update LoongArch bios file Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
+1
-3
@@ -1885,11 +1885,9 @@ endif
|
||||
|
||||
rdma = not_found
|
||||
if not get_option('rdma').auto() or have_system
|
||||
libumad = cc.find_library('ibumad', required: get_option('rdma'))
|
||||
rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
|
||||
required: get_option('rdma')),
|
||||
cc.find_library('ibverbs', required: get_option('rdma')),
|
||||
libumad]
|
||||
cc.find_library('ibverbs', required: get_option('rdma'))]
|
||||
rdma = declare_dependency(dependencies: rdma_libs)
|
||||
foreach lib: rdma_libs
|
||||
if not lib.found()
|
||||
|
||||
@@ -49,7 +49,6 @@ packages:
|
||||
- libglusterfs-dev
|
||||
- libgnutls28-dev
|
||||
- libgtk-3-dev
|
||||
- libibumad-dev
|
||||
- libibverbs-dev
|
||||
- libiscsi-dev
|
||||
- libjemalloc-dev
|
||||
|
||||
@@ -49,7 +49,6 @@ packages:
|
||||
- libglusterfs-dev
|
||||
- libgnutls28-dev
|
||||
- libgtk-3-dev
|
||||
- libibumad-dev
|
||||
- libibverbs-dev
|
||||
- libiscsi-dev
|
||||
- libjemalloc-dev
|
||||
|
||||
@@ -27,18 +27,18 @@ class LoongArchMachine(QemuSystemTest):
|
||||
"""
|
||||
|
||||
kernel_url = ('https://github.com/yangxiaojuan-loongson/qemu-binary/'
|
||||
'releases/download/binary-files/vmlinuz.efi')
|
||||
'releases/download/2024-05-30/vmlinuz.efi')
|
||||
kernel_hash = '951b485b16e3788b6db03a3e1793c067009e31a2'
|
||||
kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
|
||||
|
||||
initrd_url = ('https://github.com/yangxiaojuan-loongson/qemu-binary/'
|
||||
'releases/download/binary-files/ramdisk')
|
||||
'releases/download/2024-05-30/ramdisk')
|
||||
initrd_hash = 'c67658d9b2a447ce7db2f73ba3d373c9b2b90ab2'
|
||||
initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash)
|
||||
|
||||
bios_url = ('https://github.com/yangxiaojuan-loongson/qemu-binary/'
|
||||
'releases/download/binary-files/QEMU_EFI.fd')
|
||||
bios_hash = ('dfc1bfba4853cd763b9d392d0031827e8addbca8')
|
||||
'releases/download/2024-05-30/QEMU_EFI.fd')
|
||||
bios_hash = ('f4d0966b5117d4cd82327c050dd668741046be69')
|
||||
bios_path = self.fetch_asset(bios_url, asset_hash=bios_hash)
|
||||
|
||||
self.vm.set_console()
|
||||
|
||||
@@ -105,7 +105,6 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
|
||||
libglusterfs-dev:amd64 \
|
||||
libgnutls28-dev:amd64 \
|
||||
libgtk-3-dev:amd64 \
|
||||
libibumad-dev:amd64 \
|
||||
libibverbs-dev:amd64 \
|
||||
libiscsi-dev:amd64 \
|
||||
libjemalloc-dev:amd64 \
|
||||
|
||||
@@ -105,7 +105,6 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
|
||||
libglusterfs-dev:arm64 \
|
||||
libgnutls28-dev:arm64 \
|
||||
libgtk-3-dev:arm64 \
|
||||
libibumad-dev:arm64 \
|
||||
libibverbs-dev:arm64 \
|
||||
libiscsi-dev:arm64 \
|
||||
libjemalloc-dev:arm64 \
|
||||
|
||||
@@ -108,7 +108,6 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
|
||||
libglusterfs-dev:armel \
|
||||
libgnutls28-dev:armel \
|
||||
libgtk-3-dev:armel \
|
||||
libibumad-dev:armel \
|
||||
libibverbs-dev:armel \
|
||||
libiscsi-dev:armel \
|
||||
libjemalloc-dev:armel \
|
||||
|
||||
@@ -105,7 +105,6 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
|
||||
libglusterfs-dev:armhf \
|
||||
libgnutls28-dev:armhf \
|
||||
libgtk-3-dev:armhf \
|
||||
libibumad-dev:armhf \
|
||||
libibverbs-dev:armhf \
|
||||
libiscsi-dev:armhf \
|
||||
libjemalloc-dev:armhf \
|
||||
|
||||
@@ -108,7 +108,6 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
|
||||
libglusterfs-dev:i386 \
|
||||
libgnutls28-dev:i386 \
|
||||
libgtk-3-dev:i386 \
|
||||
libibumad-dev:i386 \
|
||||
libibverbs-dev:i386 \
|
||||
libiscsi-dev:i386 \
|
||||
libjemalloc-dev:i386 \
|
||||
|
||||
@@ -107,7 +107,6 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
|
||||
libglusterfs-dev:mips64el \
|
||||
libgnutls28-dev:mips64el \
|
||||
libgtk-3-dev:mips64el \
|
||||
libibumad-dev:mips64el \
|
||||
libibverbs-dev:mips64el \
|
||||
libiscsi-dev:mips64el \
|
||||
libjemalloc-dev:mips64el \
|
||||
|
||||
@@ -107,7 +107,6 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
|
||||
libglusterfs-dev:mipsel \
|
||||
libgnutls28-dev:mipsel \
|
||||
libgtk-3-dev:mipsel \
|
||||
libibumad-dev:mipsel \
|
||||
libibverbs-dev:mipsel \
|
||||
libiscsi-dev:mipsel \
|
||||
libjemalloc-dev:mipsel \
|
||||
|
||||
@@ -105,7 +105,6 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
|
||||
libglusterfs-dev:ppc64el \
|
||||
libgnutls28-dev:ppc64el \
|
||||
libgtk-3-dev:ppc64el \
|
||||
libibumad-dev:ppc64el \
|
||||
libibverbs-dev:ppc64el \
|
||||
libiscsi-dev:ppc64el \
|
||||
libjemalloc-dev:ppc64el \
|
||||
|
||||
@@ -105,7 +105,6 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
|
||||
libglusterfs-dev:s390x \
|
||||
libgnutls28-dev:s390x \
|
||||
libgtk-3-dev:s390x \
|
||||
libibumad-dev:s390x \
|
||||
libibverbs-dev:s390x \
|
||||
libiscsi-dev:s390x \
|
||||
libjemalloc-dev:s390x \
|
||||
|
||||
@@ -55,7 +55,6 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
|
||||
libglusterfs-dev \
|
||||
libgnutls28-dev \
|
||||
libgtk-3-dev \
|
||||
libibumad-dev \
|
||||
libibverbs-dev \
|
||||
libiscsi-dev \
|
||||
libjemalloc-dev \
|
||||
|
||||
@@ -55,7 +55,6 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
|
||||
libglusterfs-dev \
|
||||
libgnutls28-dev \
|
||||
libgtk-3-dev \
|
||||
libibumad-dev \
|
||||
libibverbs-dev \
|
||||
libiscsi-dev \
|
||||
libjemalloc-dev \
|
||||
|
||||
@@ -47,7 +47,6 @@ packages:
|
||||
- libfdt
|
||||
- libffi
|
||||
- libgcrypt
|
||||
- libibumad
|
||||
- libibverbs
|
||||
- libiscsi
|
||||
- libjemalloc
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
#include "qapi/qmp/qjson.h"
|
||||
#include "qapi/qmp/qlist.h"
|
||||
#include "qapi/qmp/qstring.h"
|
||||
#include "qapi/qmp/qbool.h"
|
||||
|
||||
#define MAX_IRQ 256
|
||||
|
||||
@@ -1471,6 +1472,12 @@ struct MachInfo {
|
||||
char *alias;
|
||||
};
|
||||
|
||||
struct CpuModel {
|
||||
char *name;
|
||||
char *alias_of;
|
||||
bool deprecated;
|
||||
};
|
||||
|
||||
static void qtest_free_machine_list(struct MachInfo *machines)
|
||||
{
|
||||
if (machines) {
|
||||
@@ -1550,6 +1557,82 @@ static struct MachInfo *qtest_get_machines(const char *var)
|
||||
return machines;
|
||||
}
|
||||
|
||||
static struct CpuModel *qtest_get_cpu_models(void)
|
||||
{
|
||||
static struct CpuModel *cpus;
|
||||
QDict *response, *minfo;
|
||||
QList *list;
|
||||
const QListEntry *p;
|
||||
QObject *qobj;
|
||||
QString *qstr;
|
||||
QBool *qbool;
|
||||
QTestState *qts;
|
||||
int idx;
|
||||
|
||||
if (cpus) {
|
||||
return cpus;
|
||||
}
|
||||
|
||||
silence_spawn_log = !g_test_verbose();
|
||||
|
||||
qts = qtest_init_with_env(NULL, "-machine none");
|
||||
response = qtest_qmp(qts, "{ 'execute': 'query-cpu-definitions' }");
|
||||
g_assert(response);
|
||||
list = qdict_get_qlist(response, "return");
|
||||
g_assert(list);
|
||||
|
||||
cpus = g_new0(struct CpuModel, qlist_size(list) + 1);
|
||||
|
||||
for (p = qlist_first(list), idx = 0; p; p = qlist_next(p), idx++) {
|
||||
minfo = qobject_to(QDict, qlist_entry_obj(p));
|
||||
g_assert(minfo);
|
||||
|
||||
qobj = qdict_get(minfo, "name");
|
||||
g_assert(qobj);
|
||||
qstr = qobject_to(QString, qobj);
|
||||
g_assert(qstr);
|
||||
cpus[idx].name = g_strdup(qstring_get_str(qstr));
|
||||
|
||||
qobj = qdict_get(minfo, "alias_of");
|
||||
if (qobj) { /* old machines do not report aliases */
|
||||
qstr = qobject_to(QString, qobj);
|
||||
g_assert(qstr);
|
||||
cpus[idx].alias_of = g_strdup(qstring_get_str(qstr));
|
||||
} else {
|
||||
cpus[idx].alias_of = NULL;
|
||||
}
|
||||
|
||||
qobj = qdict_get(minfo, "deprecated");
|
||||
qbool = qobject_to(QBool, qobj);
|
||||
g_assert(qbool);
|
||||
cpus[idx].deprecated = qbool_get_bool(qbool);
|
||||
}
|
||||
|
||||
qtest_quit(qts);
|
||||
qobject_unref(response);
|
||||
|
||||
silence_spawn_log = false;
|
||||
|
||||
return cpus;
|
||||
}
|
||||
|
||||
bool qtest_has_cpu_model(const char *cpu)
|
||||
{
|
||||
struct CpuModel *cpus;
|
||||
int i;
|
||||
|
||||
cpus = qtest_get_cpu_models();
|
||||
|
||||
for (i = 0; cpus[i].name != NULL; i++) {
|
||||
if (g_str_equal(cpu, cpus[i].name) ||
|
||||
(cpus[i].alias_of && g_str_equal(cpu, cpus[i].alias_of))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void qtest_cb_for_every_machine(void (*cb)(const char *machine),
|
||||
bool skip_old_versioned)
|
||||
{
|
||||
|
||||
@@ -949,6 +949,14 @@ bool qtest_has_machine(const char *machine);
|
||||
*/
|
||||
bool qtest_has_machine_with_env(const char *var, const char *machine);
|
||||
|
||||
/**
|
||||
* qtest_has_cpu_model:
|
||||
* @cpu: The cpu to look for
|
||||
*
|
||||
* Returns: true if the cpu is available in the target binary.
|
||||
*/
|
||||
bool qtest_has_cpu_model(const char *cpu);
|
||||
|
||||
/**
|
||||
* qtest_has_device:
|
||||
* @device: The device to look for
|
||||
|
||||
@@ -125,7 +125,8 @@ static void pc_numa_cpu(const void *data)
|
||||
QTestState *qts;
|
||||
g_autofree char *cli = NULL;
|
||||
|
||||
cli = make_cli(data, "-cpu pentium -machine smp.cpus=8,smp.sockets=2,smp.cores=2,smp.threads=2 "
|
||||
cli = make_cli(data,
|
||||
"-cpu max -machine smp.cpus=8,smp.sockets=2,smp.cores=2,smp.threads=2 "
|
||||
"-numa node,nodeid=0,memdev=ram -numa node,nodeid=1 "
|
||||
"-numa cpu,node-id=1,socket-id=0 "
|
||||
"-numa cpu,node-id=0,socket-id=1,core-id=0 "
|
||||
|
||||
@@ -67,10 +67,29 @@ static void test_cpuid_prop(const void *data)
|
||||
g_free(path);
|
||||
}
|
||||
|
||||
static void add_cpuid_test(const char *name, const char *cmdline,
|
||||
static void add_cpuid_test(const char *name, const char *cpu,
|
||||
const char *cpufeat, const char *machine,
|
||||
const char *property, int64_t expected_value)
|
||||
{
|
||||
CpuidTestArgs *args = g_new0(CpuidTestArgs, 1);
|
||||
char *cmdline;
|
||||
char *save;
|
||||
|
||||
if (!qtest_has_cpu_model(cpu)) {
|
||||
return;
|
||||
}
|
||||
cmdline = g_strdup_printf("-cpu %s", cpu);
|
||||
|
||||
if (cpufeat) {
|
||||
save = cmdline;
|
||||
cmdline = g_strdup_printf("%s,%s", cmdline, cpufeat);
|
||||
g_free(save);
|
||||
}
|
||||
if (machine) {
|
||||
save = cmdline;
|
||||
cmdline = g_strdup_printf("-machine %s %s", machine, cmdline);
|
||||
g_free(save);
|
||||
}
|
||||
args->cmdline = cmdline;
|
||||
args->property = property;
|
||||
args->expected_value = expected_value;
|
||||
@@ -149,12 +168,24 @@ static void test_feature_flag(const void *data)
|
||||
* either "feature-words" or "filtered-features", when running QEMU
|
||||
* using cmdline
|
||||
*/
|
||||
static FeatureTestArgs *add_feature_test(const char *name, const char *cmdline,
|
||||
uint32_t eax, uint32_t ecx,
|
||||
const char *reg, int bitnr,
|
||||
bool expected_value)
|
||||
static void add_feature_test(const char *name, const char *cpu,
|
||||
const char *cpufeat, uint32_t eax,
|
||||
uint32_t ecx, const char *reg,
|
||||
int bitnr, bool expected_value)
|
||||
{
|
||||
FeatureTestArgs *args = g_new0(FeatureTestArgs, 1);
|
||||
char *cmdline;
|
||||
|
||||
if (!qtest_has_cpu_model(cpu)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (cpufeat) {
|
||||
cmdline = g_strdup_printf("-cpu %s,%s", cpu, cpufeat);
|
||||
} else {
|
||||
cmdline = g_strdup_printf("-cpu %s", cpu);
|
||||
}
|
||||
|
||||
args->cmdline = cmdline;
|
||||
args->in_eax = eax;
|
||||
args->in_ecx = ecx;
|
||||
@@ -162,13 +193,17 @@ static FeatureTestArgs *add_feature_test(const char *name, const char *cmdline,
|
||||
args->bitnr = bitnr;
|
||||
args->expected_value = expected_value;
|
||||
qtest_add_data_func(name, args, test_feature_flag);
|
||||
return args;
|
||||
return;
|
||||
}
|
||||
|
||||
static void test_plus_minus_subprocess(void)
|
||||
{
|
||||
char *path;
|
||||
|
||||
if (!qtest_has_cpu_model("pentium")) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Rules:
|
||||
* 1)"-foo" overrides "+foo"
|
||||
* 2) "[+-]foo" overrides "foo=..."
|
||||
@@ -198,6 +233,10 @@ static void test_plus_minus_subprocess(void)
|
||||
|
||||
static void test_plus_minus(void)
|
||||
{
|
||||
if (!qtest_has_cpu_model("pentium")) {
|
||||
return;
|
||||
}
|
||||
|
||||
g_test_trap_subprocess("/x86/cpuid/parsing-plus-minus/subprocess", 0, 0);
|
||||
g_test_trap_assert_passed();
|
||||
g_test_trap_assert_stderr("*Ambiguous CPU model string. "
|
||||
@@ -217,99 +256,105 @@ int main(int argc, char **argv)
|
||||
|
||||
/* Original level values for CPU models: */
|
||||
add_cpuid_test("x86/cpuid/phenom/level",
|
||||
"-cpu phenom", "level", 5);
|
||||
"phenom", NULL, NULL, "level", 5);
|
||||
add_cpuid_test("x86/cpuid/Conroe/level",
|
||||
"-cpu Conroe", "level", 10);
|
||||
"Conroe", NULL, NULL, "level", 10);
|
||||
add_cpuid_test("x86/cpuid/SandyBridge/level",
|
||||
"-cpu SandyBridge", "level", 0xd);
|
||||
"SandyBridge", NULL, NULL, "level", 0xd);
|
||||
add_cpuid_test("x86/cpuid/486/xlevel",
|
||||
"-cpu 486", "xlevel", 0);
|
||||
"486", NULL, NULL, "xlevel", 0);
|
||||
add_cpuid_test("x86/cpuid/core2duo/xlevel",
|
||||
"-cpu core2duo", "xlevel", 0x80000008);
|
||||
"core2duo", NULL, NULL, "xlevel", 0x80000008);
|
||||
add_cpuid_test("x86/cpuid/phenom/xlevel",
|
||||
"-cpu phenom", "xlevel", 0x8000001A);
|
||||
"phenom", NULL, NULL, "xlevel", 0x8000001A);
|
||||
add_cpuid_test("x86/cpuid/athlon/xlevel",
|
||||
"-cpu athlon", "xlevel", 0x80000008);
|
||||
"athlon", NULL, NULL, "xlevel", 0x80000008);
|
||||
|
||||
/* If level is not large enough, it should increase automatically: */
|
||||
/* CPUID[6].EAX: */
|
||||
add_cpuid_test("x86/cpuid/auto-level/phenom/arat",
|
||||
"-cpu 486,arat=on", "level", 6);
|
||||
add_cpuid_test("x86/cpuid/auto-level/486/arat",
|
||||
"486", "arat=on", NULL, "level", 6);
|
||||
/* CPUID[EAX=7,ECX=0].EBX: */
|
||||
add_cpuid_test("x86/cpuid/auto-level/phenom/fsgsbase",
|
||||
"-cpu phenom,fsgsbase=on", "level", 7);
|
||||
"phenom", "fsgsbase=on", NULL, "level", 7);
|
||||
/* CPUID[EAX=7,ECX=0].ECX: */
|
||||
add_cpuid_test("x86/cpuid/auto-level/phenom/avx512vbmi",
|
||||
"-cpu phenom,avx512vbmi=on", "level", 7);
|
||||
"phenom", "avx512vbmi=on", NULL, "level", 7);
|
||||
/* CPUID[EAX=0xd,ECX=1].EAX: */
|
||||
add_cpuid_test("x86/cpuid/auto-level/phenom/xsaveopt",
|
||||
"-cpu phenom,xsaveopt=on", "level", 0xd);
|
||||
"phenom", "xsaveopt=on", NULL, "level", 0xd);
|
||||
/* CPUID[8000_0001].EDX: */
|
||||
add_cpuid_test("x86/cpuid/auto-xlevel/486/3dnow",
|
||||
"-cpu 486,3dnow=on", "xlevel", 0x80000001);
|
||||
"486", "3dnow=on", NULL, "xlevel", 0x80000001);
|
||||
/* CPUID[8000_0001].ECX: */
|
||||
add_cpuid_test("x86/cpuid/auto-xlevel/486/sse4a",
|
||||
"-cpu 486,sse4a=on", "xlevel", 0x80000001);
|
||||
"486", "sse4a=on", NULL, "xlevel", 0x80000001);
|
||||
/* CPUID[8000_0007].EDX: */
|
||||
add_cpuid_test("x86/cpuid/auto-xlevel/486/invtsc",
|
||||
"-cpu 486,invtsc=on", "xlevel", 0x80000007);
|
||||
"486", "invtsc=on", NULL, "xlevel", 0x80000007);
|
||||
/* CPUID[8000_000A].EDX: */
|
||||
add_cpuid_test("x86/cpuid/auto-xlevel/486/npt",
|
||||
"-cpu 486,svm=on,npt=on", "xlevel", 0x8000000A);
|
||||
"486", "svm=on,npt=on", NULL, "xlevel", 0x8000000A);
|
||||
/* CPUID[C000_0001].EDX: */
|
||||
add_cpuid_test("x86/cpuid/auto-xlevel2/phenom/xstore",
|
||||
"-cpu phenom,xstore=on", "xlevel2", 0xC0000001);
|
||||
"phenom", "xstore=on", NULL, "xlevel2", 0xC0000001);
|
||||
/* SVM needs CPUID[0x8000000A] */
|
||||
add_cpuid_test("x86/cpuid/auto-xlevel/athlon/svm",
|
||||
"-cpu athlon,svm=on", "xlevel", 0x8000000A);
|
||||
"athlon", "svm=on", NULL, "xlevel", 0x8000000A);
|
||||
|
||||
|
||||
/* If level is already large enough, it shouldn't change: */
|
||||
add_cpuid_test("x86/cpuid/auto-level/SandyBridge/multiple",
|
||||
"-cpu SandyBridge,arat=on,fsgsbase=on,avx512vbmi=on",
|
||||
"level", 0xd);
|
||||
"SandyBridge", "arat=on,fsgsbase=on,avx512vbmi=on",
|
||||
NULL, "level", 0xd);
|
||||
/* If level is explicitly set, it shouldn't change: */
|
||||
add_cpuid_test("x86/cpuid/auto-level/486/fixed/0xF",
|
||||
"-cpu 486,level=0xF,arat=on,fsgsbase=on,avx512vbmi=on,xsaveopt=on",
|
||||
"level", 0xF);
|
||||
"486",
|
||||
"level=0xF,arat=on,fsgsbase=on,avx512vbmi=on,xsaveopt=on",
|
||||
NULL, "level", 0xF);
|
||||
add_cpuid_test("x86/cpuid/auto-level/486/fixed/2",
|
||||
"-cpu 486,level=2,arat=on,fsgsbase=on,avx512vbmi=on,xsaveopt=on",
|
||||
"level", 2);
|
||||
"486",
|
||||
"level=2,arat=on,fsgsbase=on,avx512vbmi=on,xsaveopt=on",
|
||||
NULL, "level", 2);
|
||||
add_cpuid_test("x86/cpuid/auto-level/486/fixed/0",
|
||||
"-cpu 486,level=0,arat=on,fsgsbase=on,avx512vbmi=on,xsaveopt=on",
|
||||
"level", 0);
|
||||
"486",
|
||||
"level=0,arat=on,fsgsbase=on,avx512vbmi=on,xsaveopt=on",
|
||||
NULL, "level", 0);
|
||||
|
||||
/* if xlevel is already large enough, it shouldn't change: */
|
||||
add_cpuid_test("x86/cpuid/auto-xlevel/phenom/3dnow",
|
||||
"-cpu phenom,3dnow=on,sse4a=on,invtsc=on,npt=on,svm=on",
|
||||
"xlevel", 0x8000001A);
|
||||
"phenom", "3dnow=on,sse4a=on,invtsc=on,npt=on,svm=on",
|
||||
NULL, "xlevel", 0x8000001A);
|
||||
/* If xlevel is explicitly set, it shouldn't change: */
|
||||
add_cpuid_test("x86/cpuid/auto-xlevel/486/fixed/80000002",
|
||||
"-cpu 486,xlevel=0x80000002,3dnow=on,sse4a=on,invtsc=on,npt=on,svm=on",
|
||||
"xlevel", 0x80000002);
|
||||
"486",
|
||||
"xlevel=0x80000002,3dnow=on,sse4a=on,invtsc=on,npt=on,svm=on",
|
||||
NULL, "xlevel", 0x80000002);
|
||||
add_cpuid_test("x86/cpuid/auto-xlevel/486/fixed/8000001A",
|
||||
"-cpu 486,xlevel=0x8000001A,3dnow=on,sse4a=on,invtsc=on,npt=on,svm=on",
|
||||
"xlevel", 0x8000001A);
|
||||
"486",
|
||||
"xlevel=0x8000001A,3dnow=on,sse4a=on,invtsc=on,npt=on,svm=on",
|
||||
NULL, "xlevel", 0x8000001A);
|
||||
add_cpuid_test("x86/cpuid/auto-xlevel/phenom/fixed/0",
|
||||
"-cpu 486,xlevel=0,3dnow=on,sse4a=on,invtsc=on,npt=on,svm=on",
|
||||
"xlevel", 0);
|
||||
"486",
|
||||
"xlevel=0,3dnow=on,sse4a=on,invtsc=on,npt=on,svm=on",
|
||||
NULL, "xlevel", 0);
|
||||
|
||||
/* if xlevel2 is already large enough, it shouldn't change: */
|
||||
add_cpuid_test("x86/cpuid/auto-xlevel2/486/fixed",
|
||||
"-cpu 486,xlevel2=0xC0000002,xstore=on",
|
||||
"xlevel2", 0xC0000002);
|
||||
"486", "xlevel2=0xC0000002,xstore=on",
|
||||
NULL, "xlevel2", 0xC0000002);
|
||||
|
||||
/* Check compatibility of old machine-types that didn't
|
||||
* auto-increase level/xlevel/xlevel2: */
|
||||
if (qtest_has_machine("pc-i440fx-2.7")) {
|
||||
add_cpuid_test("x86/cpuid/auto-level/pc-2.7",
|
||||
"-machine pc-i440fx-2.7 -cpu 486,arat=on,avx512vbmi=on,xsaveopt=on",
|
||||
"level", 1);
|
||||
"486", "arat=on,avx512vbmi=on,xsaveopt=on",
|
||||
"pc-i440fx-2.7", "level", 1);
|
||||
add_cpuid_test("x86/cpuid/auto-xlevel/pc-2.7",
|
||||
"-machine pc-i440fx-2.7 -cpu 486,3dnow=on,sse4a=on,invtsc=on,npt=on,svm=on",
|
||||
"xlevel", 0);
|
||||
"486", "3dnow=on,sse4a=on,invtsc=on,npt=on,svm=on",
|
||||
"pc-i440fx-2.7", "xlevel", 0);
|
||||
add_cpuid_test("x86/cpuid/auto-xlevel2/pc-2.7",
|
||||
"-machine pc-i440fx-2.7 -cpu 486,xstore=on",
|
||||
"486", "xstore=on", "pc-i440fx-2.7",
|
||||
"xlevel2", 0);
|
||||
}
|
||||
/*
|
||||
@@ -319,18 +364,18 @@ int main(int argc, char **argv)
|
||||
*/
|
||||
if (qtest_has_machine("pc-i440fx-2.3")) {
|
||||
add_cpuid_test("x86/cpuid/auto-level7/pc-i440fx-2.3/off",
|
||||
"-machine pc-i440fx-2.3 -cpu Penryn",
|
||||
"Penryn", NULL, "pc-i440fx-2.3",
|
||||
"level", 4);
|
||||
add_cpuid_test("x86/cpuid/auto-level7/pc-i440fx-2.3/on",
|
||||
"-machine pc-i440fx-2.3 -cpu Penryn,erms=on",
|
||||
"Penryn", "erms=on", "pc-i440fx-2.3",
|
||||
"level", 7);
|
||||
}
|
||||
if (qtest_has_machine("pc-i440fx-2.9")) {
|
||||
add_cpuid_test("x86/cpuid/auto-level7/pc-i440fx-2.9/off",
|
||||
"-machine pc-i440fx-2.9 -cpu Conroe",
|
||||
"Conroe", NULL, "pc-i440fx-2.9",
|
||||
"level", 10);
|
||||
add_cpuid_test("x86/cpuid/auto-level7/pc-i440fx-2.9/on",
|
||||
"-machine pc-i440fx-2.9 -cpu Conroe,erms=on",
|
||||
"Conroe", "erms=on", "pc-i440fx-2.9",
|
||||
"level", 10);
|
||||
}
|
||||
|
||||
@@ -341,42 +386,43 @@ int main(int argc, char **argv)
|
||||
*/
|
||||
if (qtest_has_machine("pc-i440fx-2.3")) {
|
||||
add_cpuid_test("x86/cpuid/xlevel-compat/pc-i440fx-2.3",
|
||||
"-machine pc-i440fx-2.3 -cpu SandyBridge",
|
||||
"SandyBridge", NULL, "pc-i440fx-2.3",
|
||||
"xlevel", 0x8000000a);
|
||||
}
|
||||
if (qtest_has_machine("pc-i440fx-2.4")) {
|
||||
add_cpuid_test("x86/cpuid/xlevel-compat/pc-i440fx-2.4/npt-off",
|
||||
"-machine pc-i440fx-2.4 -cpu SandyBridge,",
|
||||
"SandyBridge", NULL, "pc-i440fx-2.4",
|
||||
"xlevel", 0x80000008);
|
||||
add_cpuid_test("x86/cpuid/xlevel-compat/pc-i440fx-2.4/npt-on",
|
||||
"-machine pc-i440fx-2.4 -cpu SandyBridge,svm=on,npt=on",
|
||||
"SandyBridge", "svm=on,npt=on", "pc-i440fx-2.4",
|
||||
"xlevel", 0x80000008);
|
||||
}
|
||||
|
||||
/* Test feature parsing */
|
||||
add_feature_test("x86/cpuid/features/plus",
|
||||
"-cpu 486,+arat",
|
||||
"486", "+arat",
|
||||
6, 0, "EAX", 2, true);
|
||||
add_feature_test("x86/cpuid/features/minus",
|
||||
"-cpu pentium,-mmx",
|
||||
"pentium", "-mmx",
|
||||
1, 0, "EDX", 23, false);
|
||||
add_feature_test("x86/cpuid/features/on",
|
||||
"-cpu 486,arat=on",
|
||||
"486", "arat=on",
|
||||
6, 0, "EAX", 2, true);
|
||||
add_feature_test("x86/cpuid/features/off",
|
||||
"-cpu pentium,mmx=off",
|
||||
"pentium", "mmx=off",
|
||||
1, 0, "EDX", 23, false);
|
||||
|
||||
add_feature_test("x86/cpuid/features/max-plus-invtsc",
|
||||
"-cpu max,+invtsc",
|
||||
"max" , "+invtsc",
|
||||
0x80000007, 0, "EDX", 8, true);
|
||||
add_feature_test("x86/cpuid/features/max-invtsc-on",
|
||||
"-cpu max,invtsc=on",
|
||||
"max", "invtsc=on",
|
||||
0x80000007, 0, "EDX", 8, true);
|
||||
add_feature_test("x86/cpuid/features/max-minus-mmx",
|
||||
"-cpu max,-mmx",
|
||||
"max", "-mmx",
|
||||
1, 0, "EDX", 23, false);
|
||||
add_feature_test("x86/cpuid/features/max-invtsc-on,mmx=off",
|
||||
"-cpu max,mmx=off",
|
||||
"max", "mmx=off",
|
||||
1, 0, "EDX", 23, false);
|
||||
|
||||
return g_test_run();
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user