Received: by 2002:a05:7412:798b:b0:fc:a2b0:25d7 with SMTP id fb11csp679709rdb; Thu, 22 Feb 2024 16:46:38 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCUnL604Q97khgKoXX8m7c7EwkMnmbqkboQ159K4iiWDdGelB4AJ1x9VHNjx/uC46IAVIcf5f86lj2QxSuvetSuy9YAA76RaALsgm8CdWg== X-Google-Smtp-Source: AGHT+IEnAU5jH5Kf1ZDSmFBu6Tuvz0kBAHBehbs5mi6oPn7Mb71lZKNbO2inK4suwMhL89ZH88x4 X-Received: by 2002:a05:6a00:22d3:b0:6e4:ce12:fa7a with SMTP id f19-20020a056a0022d300b006e4ce12fa7amr650249pfj.20.1708649197919; Thu, 22 Feb 2024 16:46:37 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1708649197; cv=pass; d=google.com; s=arc-20160816; b=C26XNZtnnxcYqHEy52avZZ9/Ba1R8rxbkQCS1B8zOwBLjc9QAnfZ0HGUicKR5Y0lfx yq4jOX5+Mly1cxn7UOzqm6500KmlwBCxi7H5xfndpudCJ+ytBdgIaFoN9HspUJ7lD/rx vO29d48Wwz3oizqJeXL9SIjRot3j0/jc40kVREapA3UWSovSwSbj9grNKb9gVSWp8aFD WGaebt/HYjrJvBQzoQWFjHrIyOwT/e/4d7MtBLPX2s1kN+epVo5gklX8nbRIbi9GUHBa TqxerFMhnKx0xYkF8g+z4TSPl99K+MlOXjV9KWWDXx3D0o0Hm061gnhaqGnJj6gIRPOZ OVQA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=cc:to:from:subject:message-id:references:mime-version :list-unsubscribe:list-subscribe:list-id:precedence:in-reply-to:date :reply-to:dkim-signature; bh=Gc43wBFyEWO0ZO0dpPNQ+d7W+GksBMsxe3wuyqOBBYI=; fh=8gEFShNR74zNfeRd7fLdDhxzq4eCNWl/aVGu059FN+s=; b=x6XMx+kH5y4YYv5eMueFTOGi4ZoYuo/dNf88cEK/6nZHpNQJKKZ7vDUukcDwK7N3ip pYvc354qDyvSYXvHJY2W+QYUjnMH0DN9UKgQW1jR2M2i9Zj8LZlDcOmdwB4KtagnbjHM 15COCUaUO22xJfdFDLrlFhATf3UaNOWzHgLS8bQWCdOos8qcQt434ueiJeW8619hsj6o mxklZo+XmfxSS51Eisbb/UiB7ZlovoKPVWliU+G9Rgeq4CVJ0+S1+Lg6P409QolpRA1M zErHQjS5oOqPTsz1nHHttuXOM07HEA0wv2wp9ynl+YYhgiY4/mw6PTHDg+XzdkNWya0g iMSQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=1WZr5fcJ; arc=pass (i=1 spf=pass spfdomain=flex--seanjc.bounces.google.com dkim=pass dkdomain=google.com dmarc=pass fromdomain=google.com); spf=pass (google.com: domain of linux-kernel+bounces-77592-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-77592-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id a17-20020a637051000000b005d8bea05154si10989393pgn.619.2024.02.22.16.46.37 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Feb 2024 16:46:37 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-77592-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=1WZr5fcJ; arc=pass (i=1 spf=pass spfdomain=flex--seanjc.bounces.google.com dkim=pass dkdomain=google.com dmarc=pass fromdomain=google.com); spf=pass (google.com: domain of linux-kernel+bounces-77592-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-77592-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 83A9B286A17 for ; Fri, 23 Feb 2024 00:46:37 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id DFF4018040; Fri, 23 Feb 2024 00:43:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="1WZr5fcJ" Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 14DDB1643E for ; Fri, 23 Feb 2024 00:43:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708649005; cv=none; b=Vf7chFUyhkkSFLCFyojL2xNW+TPOlwJnTlUwBHldzr22qbMI/u86zCU5/ZlkdIJBC4Nk1acHqm/PHxOkm+pwFMio6PngLiAnOFnb/vOR7APRuHP4oZrlgb5CqAEFLGc8uNwpLk3jLZZDqaOfutU2xWQTV+cyoL3Sz0IlBmCtx8A= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708649005; c=relaxed/simple; bh=IcmW1JJZ2UeOOxj+K1S4spEtX6G5KVw3+hJZz8Cf1dQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=I9djLDgeiqEyZDOUVYgbEfsMjy3SwzGTMg9bShpNVGInfvTbVN5u6a3ww4l/aPEdel2bBOxd+p5p6USuIT/8xh3KetheuxzrZUJ1QPWaowmJmHcZsUUAwwAEkd4CDvckos1xpmgdK6J/3UW/4FQMcl6SQcIF0VUA9yhjwyOmPGc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=1WZr5fcJ; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-6e37db1a3a0so226140b3a.3 for ; Thu, 22 Feb 2024 16:43:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1708649003; x=1709253803; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=Gc43wBFyEWO0ZO0dpPNQ+d7W+GksBMsxe3wuyqOBBYI=; b=1WZr5fcJljD5kVFpHfCf45urVVZ6DrdMukd9tGifpXuZbC1emW1lO0Ho68oHn07hFC FMu6Xl+uog8wlF6XHl84X3am+CstFRbWWpsTpGKLiTAdl2Nf9+odW9zlJiyYP+/OC6PB M2ulsV2IF2numMrrLY4ASiiDFU5Z6MqgGkx+7EoZRriMZ5pXQke7rRXZr5/PdSTNVSTn Xq7TpOFiadoa3Ym6IXIp2Eam5ELOmh4TdtSNMqh7Ha7ELMxNcxV2LzMem6cYPjw4n4uw NyXBj57gi9dbLl+kfVdGemXMdqbJZTsCHrt2x0zdnqq8sYHWnuVERexrK2CGzCcUwQ2d SryQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1708649003; x=1709253803; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Gc43wBFyEWO0ZO0dpPNQ+d7W+GksBMsxe3wuyqOBBYI=; b=aLMOxsnvuM6aVuo7JjpJFxvQrmYjhvz2SnQMJn6Cu1Bx0UkdgZ0AFQOOUr2j4MkhNP Hbrz6UX24rU3UR9AvL6R5AzAMCCBXS0WuL0DXj1OzxNVNZtqnYYn4R8n7r5uim3MXjV1 skWQJKOCjJ8Jy8uVo6j7TomSILBGwUws1hDv4t+6/e2wLByaj1noCShBvmLiJbGuPB9c nSwiN6NS39F66+BnPoaIiQZQUSi6EKVRvr7GaweuT+s2scAAgX72Hh/MUZT8XO64OMRA ME+e/hQXlO6Et/6yhulB2SAu+1mSPhmrLZriXvmAQNX3LdejKWO6KJ10Dy617AQT69c8 Fo3Q== X-Forwarded-Encrypted: i=1; AJvYcCVGQjo9FezOMnZzyTkfUkU6jVFb6BGr/oOdu9bW39gD9qsy/nsu8zpKLUrHwZXpF1Z7qG0npvTJMhON8V2VVbOW9DJdIG0ikWPZNzK3 X-Gm-Message-State: AOJu0YwkLfKL9EFZyylCwPc5IiJcXFp0nXE4eEXJb21dNZFPdE3i6WhA AqcAevzki2vn24H8vIdIPTvnaoEY8VZyDdQyz2ey2ABYmhnWDaIVpfGKwIMJNxwl3rDPFvjNB0M MSw== X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a05:6a00:188b:b0:6e4:8b79:f5be with SMTP id x11-20020a056a00188b00b006e48b79f5bemr32117pfh.3.1708649003443; Thu, 22 Feb 2024 16:43:23 -0800 (PST) Reply-To: Sean Christopherson Date: Thu, 22 Feb 2024 16:42:58 -0800 In-Reply-To: <20240223004258.3104051-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240223004258.3104051-1-seanjc@google.com> X-Mailer: git-send-email 2.44.0.rc0.258.g7320e95886-goog Message-ID: <20240223004258.3104051-12-seanjc@google.com> Subject: [PATCH v9 11/11] KVM: selftests: Add a basic SEV-ES smoke test From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Oliver Upton , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Sean Christopherson Cc: kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, Vishal Annapurve , Ackerley Tng , Andrew Jones , Tom Lendacky , Michael Roth , Carlos Bilbao , Peter Gonda , Itaru Kitayama Content-Type: text/plain; charset="UTF-8" Extend sev_smoke_test to also run a minimal SEV-ES smoke test so that it's possible to test KVM's unique VMRUN=>#VMEXIT path for SEV-ES guests without needing a full blown SEV-ES capable VM, which requires a rather absurd amount of properly configured collateral. Punt on proper GHCB and ucall support, and instead use the GHCB MSR protocol to signal test completion. The most important thing at this point is to have _any_ kind of testing of KVM's __svm_sev_es_vcpu_run(). Cc: Tom Lendacky Cc: Michael Roth Cc: Peter Gonda Cc: Carlos Bilbao Signed-off-by: Sean Christopherson --- .../selftests/kvm/include/x86_64/sev.h | 2 ++ .../selftests/kvm/lib/x86_64/processor.c | 2 +- tools/testing/selftests/kvm/lib/x86_64/sev.c | 6 +++- .../selftests/kvm/x86_64/sev_smoke_test.c | 30 +++++++++++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/include/x86_64/sev.h b/tools/testing/selftests/kvm/include/x86_64/sev.h index de5283bef752..8a1bf88474c9 100644 --- a/tools/testing/selftests/kvm/include/x86_64/sev.h +++ b/tools/testing/selftests/kvm/include/x86_64/sev.h @@ -25,6 +25,8 @@ enum sev_guest_state { #define SEV_POLICY_NO_DBG (1UL << 0) #define SEV_POLICY_ES (1UL << 2) +#define GHCB_MSR_TERM_REQ 0x100 + void sev_vm_launch(struct kvm_vm *vm, uint32_t policy); void sev_vm_launch_measure(struct kvm_vm *vm, uint8_t *measurement); void sev_vm_launch_finish(struct kvm_vm *vm); diff --git a/tools/testing/selftests/kvm/lib/x86_64/processor.c b/tools/testing/selftests/kvm/lib/x86_64/processor.c index aa92220bf5da..a33289a5b89a 100644 --- a/tools/testing/selftests/kvm/lib/x86_64/processor.c +++ b/tools/testing/selftests/kvm/lib/x86_64/processor.c @@ -1074,7 +1074,7 @@ void kvm_get_cpu_address_width(unsigned int *pa_bits, unsigned int *va_bits) void kvm_init_vm_address_properties(struct kvm_vm *vm) { - if (vm->subtype == VM_SUBTYPE_SEV) { + if (vm->subtype == VM_SUBTYPE_SEV || vm->subtype == VM_SUBTYPE_SEV_ES) { vm->arch.c_bit = BIT_ULL(this_cpu_property(X86_PROPERTY_SEV_C_BIT)); vm->gpa_tag_mask = vm->arch.c_bit; } diff --git a/tools/testing/selftests/kvm/lib/x86_64/sev.c b/tools/testing/selftests/kvm/lib/x86_64/sev.c index 9f5a3dbb5e65..e248d3364b9c 100644 --- a/tools/testing/selftests/kvm/lib/x86_64/sev.c +++ b/tools/testing/selftests/kvm/lib/x86_64/sev.c @@ -53,6 +53,9 @@ void sev_vm_launch(struct kvm_vm *vm, uint32_t policy) hash_for_each(vm->regions.slot_hash, ctr, region, slot_node) encrypt_region(vm, region); + if (policy & SEV_POLICY_ES) + vm_sev_ioctl(vm, KVM_SEV_LAUNCH_UPDATE_VMSA, NULL); + vm->arch.is_pt_protected = true; } @@ -90,7 +93,8 @@ struct kvm_vm *vm_sev_create_with_one_vcpu(uint32_t policy, void *guest_code, struct vm_shape shape = { .type = VM_TYPE_DEFAULT, .mode = VM_MODE_DEFAULT, - .subtype = VM_SUBTYPE_SEV, + .subtype = policy & SEV_POLICY_ES ? VM_SUBTYPE_SEV_ES : + VM_SUBTYPE_SEV, }; struct kvm_vm *vm; struct kvm_vcpu *cpus[1]; 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 54d72efd9b4d..026779f3ed06 100644 --- a/tools/testing/selftests/kvm/x86_64/sev_smoke_test.c +++ b/tools/testing/selftests/kvm/x86_64/sev_smoke_test.c @@ -12,6 +12,21 @@ #include "linux/psp-sev.h" #include "sev.h" + +static void guest_sev_es_code(void) +{ + /* TODO: Check CPUID after GHCB-based hypercall support is added. */ + GUEST_ASSERT(rdmsr(MSR_AMD64_SEV) & MSR_AMD64_SEV_ENABLED); + GUEST_ASSERT(rdmsr(MSR_AMD64_SEV) & MSR_AMD64_SEV_ES_ENABLED); + + /* + * TODO: Add GHCB and ucall support for SEV-ES guests. For now, simply + * force "termination" to signal "done" via the GHCB MSR protocol. + */ + wrmsr(MSR_AMD64_SEV_ES_GHCB, GHCB_MSR_TERM_REQ); + __asm__ __volatile__("rep; vmmcall"); +} + static void guest_sev_code(void) { GUEST_ASSERT(this_cpu_has(X86_FEATURE_SEV)); @@ -31,6 +46,16 @@ static void test_sev(void *guest_code, uint64_t policy) for (;;) { vcpu_run(vcpu); + if (policy & SEV_POLICY_ES) { + TEST_ASSERT(vcpu->run->exit_reason == KVM_EXIT_SYSTEM_EVENT, + "Wanted SYSTEM_EVENT, got %s", + exit_reason_str(vcpu->run->exit_reason)); + TEST_ASSERT_EQ(vcpu->run->system_event.type, KVM_SYSTEM_EVENT_SEV_TERM); + TEST_ASSERT_EQ(vcpu->run->system_event.ndata, 1); + TEST_ASSERT_EQ(vcpu->run->system_event.data[0], GHCB_MSR_TERM_REQ); + break; + } + switch (get_ucall(vcpu, &uc)) { case UCALL_SYNC: continue; @@ -54,5 +79,10 @@ int main(int argc, char *argv[]) test_sev(guest_sev_code, SEV_POLICY_NO_DBG); test_sev(guest_sev_code, 0); + if (kvm_cpu_has(X86_FEATURE_SEV_ES)) { + test_sev(guest_sev_es_code, SEV_POLICY_ES | SEV_POLICY_NO_DBG); + test_sev(guest_sev_es_code, SEV_POLICY_ES); + } + return 0; } -- 2.44.0.rc0.258.g7320e95886-goog