[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kvm
Subject:    Re: [kvm-unit-tests PATCH 2/2] x86: svm: Add test for L2 change of CR4.OSXSAVE
From:       Paolo Bonzini <pbonzini () redhat ! com>
Date:       2020-10-31 13:55:25
Message-ID: ff7e75cf-02ed-5abf-a30f-73f9e9c0516b () redhat ! com
[Download RAW message or body]

On 29/10/20 18:10, Jim Mattson wrote:
> If L1 allows L2 to modify CR4.OSXSAVE, then L0 kvm recalculates the
> guest's CPUID.01H:ECX.OSXSAVE bit when the L2 guest changes
> CR4.OSXSAVE via MOV-to-CR4. Verify that kvm also recalculates this
> CPUID bit when loading L1's CR4 from the save.cr4 field of the
> hsave area.
> 
> Signed-off-by: Jim Mattson <jmattson@google.com>
> Reviewed-by: Ricardo Koller <ricarkol@google.com>
> Reviewed-by: Peter Shier <pshier@google.com>
> ---
>  x86/svm_tests.c | 35 +++++++++++++++++++++++++++++++++++
>  1 file changed, 35 insertions(+)
> 
> diff --git a/x86/svm_tests.c b/x86/svm_tests.c
> index 3b0424a..e2455c8 100644
> --- a/x86/svm_tests.c
> +++ b/x86/svm_tests.c
> @@ -1917,6 +1917,40 @@ static bool reg_corruption_check(struct svm_test *test)
>   * v2 tests
>   */
>  
> +/*
> + * Ensure that kvm recalculates the L1 guest's CPUID.01H:ECX.OSXSAVE
> + * after VM-exit from an L2 guest that sets CR4.OSXSAVE to a different
> + * value than in L1.
> + */
> +
> +static void svm_cr4_osxsave_test_guest(struct svm_test *test)
> +{
> +	write_cr4(read_cr4() & ~X86_CR4_OSXSAVE);
> +}
> +
> +static void svm_cr4_osxsave_test(void)
> +{
> +	if (!this_cpu_has(X86_FEATURE_XSAVE)) {
> +		report_skip("XSAVE not detected");
> +		return;
> +	}
> +
> +	if (!(read_cr4() & X86_CR4_OSXSAVE)) {
> +		unsigned long cr4 = read_cr4() | X86_CR4_OSXSAVE;
> +
> +		write_cr4(cr4);
> +		vmcb->save.cr4 = cr4;
> +	}
> +
> +	report(cpuid_osxsave(), "CPUID.01H:ECX.XSAVE set before VMRUN");
> +
> +	test_set_guest(svm_cr4_osxsave_test_guest);
> +	report(svm_vmrun() == SVM_EXIT_VMMCALL,
> +	       "svm_cr4_osxsave_test_guest finished with VMMCALL");
> +
> +	report(cpuid_osxsave(), "CPUID.01H:ECX.XSAVE set after VMRUN");
> +}
> +
>  static void basic_guest_main(struct svm_test *test)
>  {
>  }
> @@ -2301,6 +2335,7 @@ struct svm_test svm_tests[] = {
>      { "reg_corruption", default_supported, reg_corruption_prepare,
>        default_prepare_gif_clear, reg_corruption_test,
>        reg_corruption_finished, reg_corruption_check },
> +    TEST(svm_cr4_osxsave_test),
>      TEST(svm_guest_state_test),
>      { NULL, NULL, NULL, NULL, NULL, NULL, NULL }
>  };
> 

Queued both, thanks.

Paolo

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic