Hi Peter,
On 7/9/2024 1:29 PM, Peter Gonda wrote:
> Regression test for ae20eef5 ("KVM: SVM: Update SEV-ES shutdown intercepts
> with more metadata"). Test confirms userspace is correctly indicated of
> a guest shutdown not previous behavior of an EINVAL from KVM_RUN.
>
> Cc: Paolo Bonzini <[email protected]>
> Cc: Sean Christopherson <[email protected]>
> Cc: Alper Gun <[email protected]>
> Cc: Tom Lendacky <[email protected]>
> Cc: Michael Roth <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> Signed-off-by: Peter Gonda <[email protected]>
Tested-by: Pratik R. Sampat <[email protected]>
>
> ---
> .../selftests/kvm/x86_64/sev_smoke_test.c | 26 +++++++++++++++++++
> 1 file changed, 26 insertions(+)
>
> diff --git a/tools/testing/selftests/kvm/x86_64/sev_smoke_test.c
> b/tools/testing/selftests/kvm/x86_64/sev_smoke_test.c
> index 7c70c0da4fb74..04f24d5f09877 100644
> --- a/tools/testing/selftests/kvm/x86_64/sev_smoke_test.c
> +++ b/tools/testing/selftests/kvm/x86_64/sev_smoke_test.c
> @@ -160,6 +160,30 @@ static void test_sev(void *guest_code, uint64_t policy)
> kvm_vm_free(vm);
> }
>
> +static void guest_shutdown_code(void)
> +{
> + __asm__ __volatile__("ud2");
> +}
> +
> +static void test_sev_es_shutdown(void)
> +{
> + struct kvm_vcpu *vcpu;
> + struct kvm_vm *vm;
> +
> + uint32_t type = KVM_X86_SEV_ES_VM;
> +
> + vm = vm_sev_create_with_one_vcpu(type, guest_shutdown_code, &vcpu);
> +
> + vm_sev_launch(vm, SEV_POLICY_ES, NULL);
> +
> + vcpu_run(vcpu);
> + TEST_ASSERT(vcpu->run->exit_reason == KVM_EXIT_SHUTDOWN,
> + "Wanted SHUTDOWN, got %s",
> + exit_reason_str(vcpu->run->exit_reason));
> +
> + kvm_vm_free(vm);
> +}
> +
I guess this case also applies to SNP. So maybe once this patch is
queued up I could spin another patch in my SNP kselftest patch series
that parameterizes this function to test SNP as well.
Thanks!
Pratik
> int main(int argc, char *argv[])
> {
> TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_SEV));
> @@ -171,6 +195,8 @@ int main(int argc, char *argv[])
> test_sev(guest_sev_es_code, SEV_POLICY_ES | SEV_POLICY_NO_DBG);
> test_sev(guest_sev_es_code, SEV_POLICY_ES);
>
> + test_sev_es_shutdown();
> +
> if (kvm_has_cap(KVM_CAP_XCRS) &&
> (xgetbv(0) & XFEATURE_MASK_X87_AVX) ==
> XFEATURE_MASK_X87_AVX) {
> test_sync_vmsa(0);