On Wed, Jun 05, 2024 at 12:55:11PM +0530, Ani Sinha wrote:
> Some older cpu models like 486, athlon, pentium, penryn, phenom, core2duo etc
> may not be available in all builds. Check for their availability in qemu 
> before
> running the corresponding tests.

>From an upstream POV this is very much not the case - all CPUs models
are unconditionally built in to QEMU.

This change is being driven RHEL's desire to only ship a small subset
of CPU models, dropping the legacy stuff that's only interesting for
emulation use cases with ancient OS.

> 
> The order of the tests has been altered so that all tests for similar checks
> under a specific cpu is placed together.
> 
> One minor correction. Replaced 'phenom' with '486' in the test
> 'x86/cpuid/auto-level/phenom/arat' matching the cpu used.
> 
> CC: th...@redhat.com
> CC: imamm...@redhat.com
> Signed-off-by: Ani Sinha <anisi...@redhat.com>
> ---
>  tests/qtest/test-x86-cpuid-compat.c | 214 +++++++++++++++++-----------
>  1 file changed, 127 insertions(+), 87 deletions(-)
> 
> diff --git a/tests/qtest/test-x86-cpuid-compat.c 
> b/tests/qtest/test-x86-cpuid-compat.c
> index 6a39454fce..054f9eae47 100644
> --- a/tests/qtest/test-x86-cpuid-compat.c
> +++ b/tests/qtest/test-x86-cpuid-compat.c
> @@ -209,99 +209,135 @@ static void test_plus_minus(void)
>  
>  int main(int argc, char **argv)
>  {
> +    bool has_486, has_athlon, has_conroe;
> +    bool has_core2duo, has_penryn, has_pentium, has_phenom;
> +
>      g_test_init(&argc, &argv, NULL);
>  
> -    g_test_add_func("/x86/cpuid/parsing-plus-minus/subprocess",
> -                    test_plus_minus_subprocess);
> -    g_test_add_func("/x86/cpuid/parsing-plus-minus", test_plus_minus);
> +    has_486 = qtest_has_cpu("486");
> +    has_athlon = qtest_has_cpu("athlon");
> +    has_conroe = qtest_has_cpu("Conroe");
> +    has_core2duo = qtest_has_cpu("core2duo");
> +    has_penryn = qtest_has_cpu("Penryn");
> +    has_pentium = qtest_has_cpu("pentium");
> +    has_phenom = qtest_has_cpu("phenom");
> +
> +    if (has_pentium) {
> +        g_test_add_func("/x86/cpuid/parsing-plus-minus/subprocess",
> +                        test_plus_minus_subprocess);
> +        g_test_add_func("/x86/cpuid/parsing-plus-minus", test_plus_minus);
> +    }
>  
>      /* Original level values for CPU models: */
> -    add_cpuid_test("x86/cpuid/phenom/level",
> -                   "-cpu phenom", "level", 5);
> -    add_cpuid_test("x86/cpuid/Conroe/level",
> -                   "-cpu Conroe", "level", 10);
> +    if (has_486) {
> +        add_cpuid_test("x86/cpuid/486/xlevel",
> +                       "-cpu 486", "xlevel", 0);
> +    }

I think that modifying every test like this is a  very cumbersome
way of doing it, as you're needing to hardcode a particular list
of CPUs to check for, and this list is not neccessarily complete.

Instead, IMHO the add_cpuid_test() method should be changed such
that instead of taking an ARGV string as its 2nd parameter, it
has a "cpu" and a "machine" parameter, with 'machine' being passed
NULL for most of the tests.

IOW, we should be calling

    add_cpuid_test("x86/cpuid/486/xlevel", NULL, "486", "xlevel", 0);

Now the 'add_cpuid_test' method itself, can check the CPU name
that it receives, and turn itself into a no-op if the CPU is
missing. This avoids adding any conditionals here, and will
work correctly no matter what CPUs are present.

> +    if (has_phenom) {
> +        add_cpuid_test("x86/cpuid/phenom/level",
> +                       "-cpu phenom", "level", 5);
> +        add_cpuid_test("x86/cpuid/phenom/xlevel",
> +                       "-cpu phenom", "xlevel", 0x8000001A);
> +    }
> +    if (has_athlon) {
> +        add_cpuid_test("x86/cpuid/athlon/xlevel",
> +                       "-cpu athlon", "xlevel", 0x80000008);
> +    }
> +    if (has_core2duo) {
> +        add_cpuid_test("x86/cpuid/core2duo/xlevel",
> +                       "-cpu core2duo", "xlevel", 0x80000008);
> +    }
> +    if (has_conroe) {
> +        add_cpuid_test("x86/cpuid/Conroe/level",
> +                       "-cpu Conroe", "level", 10);
> +    }
>      add_cpuid_test("x86/cpuid/SandyBridge/level",
>                     "-cpu SandyBridge", "level", 0xd);
> -    add_cpuid_test("x86/cpuid/486/xlevel",
> -                   "-cpu 486", "xlevel", 0);
> -    add_cpuid_test("x86/cpuid/core2duo/xlevel",
> -                   "-cpu core2duo", "xlevel", 0x80000008);
> -    add_cpuid_test("x86/cpuid/phenom/xlevel",
> -                   "-cpu phenom", "xlevel", 0x8000001A);
> -    add_cpuid_test("x86/cpuid/athlon/xlevel",
> -                   "-cpu athlon", "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);
> -    /* CPUID[EAX=7,ECX=0].EBX: */
> -    add_cpuid_test("x86/cpuid/auto-level/phenom/fsgsbase",
> -                   "-cpu phenom,fsgsbase=on", "level", 7);
> -    /* CPUID[EAX=7,ECX=0].ECX: */
> -    add_cpuid_test("x86/cpuid/auto-level/phenom/avx512vbmi",
> -                   "-cpu phenom,avx512vbmi=on", "level", 7);
> -    /* CPUID[EAX=0xd,ECX=1].EAX: */
> -    add_cpuid_test("x86/cpuid/auto-level/phenom/xsaveopt",
> -                   "-cpu phenom,xsaveopt=on", "level", 0xd);
> -    /* CPUID[8000_0001].EDX: */
> -    add_cpuid_test("x86/cpuid/auto-xlevel/486/3dnow",
> -                   "-cpu 486,3dnow=on", "xlevel", 0x80000001);
> -    /* CPUID[8000_0001].ECX: */
> -    add_cpuid_test("x86/cpuid/auto-xlevel/486/sse4a",
> -                   "-cpu 486,sse4a=on", "xlevel", 0x80000001);
> -    /* CPUID[8000_0007].EDX: */
> -    add_cpuid_test("x86/cpuid/auto-xlevel/486/invtsc",
> -                   "-cpu 486,invtsc=on", "xlevel", 0x80000007);
> -    /* CPUID[8000_000A].EDX: */
> -    add_cpuid_test("x86/cpuid/auto-xlevel/486/npt",
> -                   "-cpu 486,svm=on,npt=on", "xlevel", 0x8000000A);
> -    /* CPUID[C000_0001].EDX: */
> -    add_cpuid_test("x86/cpuid/auto-xlevel2/phenom/xstore",
> -                   "-cpu phenom,xstore=on", "xlevel2", 0xC0000001);
> -    /* SVM needs CPUID[0x8000000A] */
> -    add_cpuid_test("x86/cpuid/auto-xlevel/athlon/svm",
> -                   "-cpu athlon,svm=on", "xlevel", 0x8000000A);
> -
> +    if (has_486) {
> +        /* CPUID[6].EAX: */
> +        add_cpuid_test("x86/cpuid/auto-level/486/arat",
> +                       "-cpu 486,arat=on", "level", 6);
> +        /* CPUID[8000_0001].EDX: */
> +        add_cpuid_test("x86/cpuid/auto-xlevel/486/3dnow",
> +                       "-cpu 486,3dnow=on", "xlevel", 0x80000001);
> +        /* CPUID[8000_0001].ECX: */
> +        add_cpuid_test("x86/cpuid/auto-xlevel/486/sse4a",
> +                       "-cpu 486,sse4a=on", "xlevel", 0x80000001);
> +        /* CPUID[8000_0007].EDX: */
> +        add_cpuid_test("x86/cpuid/auto-xlevel/486/invtsc",
> +                       "-cpu 486,invtsc=on", "xlevel", 0x80000007);
> +        /* CPUID[8000_000A].EDX: */
> +        add_cpuid_test("x86/cpuid/auto-xlevel/486/npt",
> +                       "-cpu 486,svm=on,npt=on", "xlevel", 0x8000000A);
> +    }
> +    if (has_phenom) {
> +        /* CPUID[EAX=7,ECX=0].EBX: */
> +        add_cpuid_test("x86/cpuid/auto-level/phenom/fsgsbase",
> +                       "-cpu phenom,fsgsbase=on", "level", 7);
> +        /* CPUID[EAX=7,ECX=0].ECX: */
> +        add_cpuid_test("x86/cpuid/auto-level/phenom/avx512vbmi",
> +                       "-cpu phenom,avx512vbmi=on", "level", 7);
> +        /* CPUID[EAX=0xd,ECX=1].EAX: */
> +        add_cpuid_test("x86/cpuid/auto-level/phenom/xsaveopt",
> +                       "-cpu phenom,xsaveopt=on", "level", 0xd);
> +        /* CPUID[C000_0001].EDX: */
> +        add_cpuid_test("x86/cpuid/auto-xlevel2/phenom/xstore",
> +                       "-cpu phenom,xstore=on", "xlevel2", 0xC0000001);
> +    }
> +    if (has_athlon) {
> +        /* SVM needs CPUID[0x8000000A] */
> +        add_cpuid_test("x86/cpuid/auto-xlevel/athlon/svm",
> +                       "-cpu athlon,svm=on", "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);
>      /* 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);
> -    add_cpuid_test("x86/cpuid/auto-level/486/fixed/2",
> -                   "-cpu 
> 486,level=2,arat=on,fsgsbase=on,avx512vbmi=on,xsaveopt=on",
> -                   "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);
> +    if (has_486) {
> +        add_cpuid_test("x86/cpuid/auto-level/486/fixed/0xF",
> +                       "-cpu 
> 486,level=0xF,arat=on,fsgsbase=on,avx512vbmi=on,xsaveopt=on",
> +                       "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);
> +        add_cpuid_test("x86/cpuid/auto-level/486/fixed/0",
> +                       "-cpu 
> 486,level=0,arat=on,fsgsbase=on,avx512vbmi=on,xsaveopt=on",
> +                       "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);
> +    if (has_phenom) {
> +        add_cpuid_test("x86/cpuid/auto-xlevel/phenom/3dnow",
> +                       "-cpu 
> phenom,3dnow=on,sse4a=on,invtsc=on,npt=on,svm=on",
> +                       "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);
> -    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);
> -    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);
> -
> -    /* 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);
> +    if (has_486) {
> +        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);
> +        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);
> +        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);
> +
> +        /* 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);
> +    }
> +
>  
>      /* Check compatibility of old machine-types that didn't
>       * auto-increase level/xlevel/xlevel2: */
> -    if (qtest_has_machine("pc-i440fx-2.7")) {
> +    if (qtest_has_machine("pc-i440fx-2.7") && has_486) {
>          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);
> @@ -317,7 +353,7 @@ int main(int argc, char **argv)
>       * and the compat code that sets default level shouldn't
>       * disable the auto-level=7 code:
>       */
> -    if (qtest_has_machine("pc-i440fx-2.3")) {
> +    if (qtest_has_machine("pc-i440fx-2.3") && has_penryn) {
>          add_cpuid_test("x86/cpuid/auto-level7/pc-i440fx-2.3/off",
>                         "-machine pc-i440fx-2.3 -cpu Penryn",
>                         "level", 4);
> @@ -325,7 +361,7 @@ int main(int argc, char **argv)
>                         "-machine pc-i440fx-2.3 -cpu Penryn,erms=on",
>                         "level", 7);
>      }
> -    if (qtest_has_machine("pc-i440fx-2.9")) {
> +    if (qtest_has_machine("pc-i440fx-2.9") && has_conroe) {
>          add_cpuid_test("x86/cpuid/auto-level7/pc-i440fx-2.9/off",
>                         "-machine pc-i440fx-2.9 -cpu Conroe",
>                         "level", 10);
> @@ -354,18 +390,22 @@ int main(int argc, char **argv)
>      }
>  
>      /* Test feature parsing */
> -    add_feature_test("x86/cpuid/features/plus",
> -                     "-cpu 486,+arat",
> -                     6, 0, "EAX", 2, true);
> -    add_feature_test("x86/cpuid/features/minus",
> -                     "-cpu pentium,-mmx",
> -                     1, 0, "EDX", 23, false);
> -    add_feature_test("x86/cpuid/features/on",
> -                     "-cpu 486,arat=on",
> -                     6, 0, "EAX", 2, true);
> -    add_feature_test("x86/cpuid/features/off",
> -                     "-cpu pentium,mmx=off",
> -                     1, 0, "EDX", 23, false);
> +    if (has_486) {
> +        add_feature_test("x86/cpuid/features/plus",
> +                         "-cpu 486,+arat",
> +                         6, 0, "EAX", 2, true);
> +        add_feature_test("x86/cpuid/features/on",
> +                         "-cpu 486,arat=on",
> +                         6, 0, "EAX", 2, true);
> +    }
> +    if (has_pentium) {
> +        add_feature_test("x86/cpuid/features/minus",
> +                         "-cpu pentium,-mmx",
> +                         1, 0, "EDX", 23, false);
> +        add_feature_test("x86/cpuid/features/off",
> +                         "-cpu pentium,mmx=off",
> +                         1, 0, "EDX", 23, false);
> +    }
>      add_feature_test("x86/cpuid/features/max-plus-invtsc",
>                       "-cpu max,+invtsc",
>                       0x80000007, 0, "EDX", 8, true);
> -- 
> 2.42.0
> 
> 

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|


Reply via email to