From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) (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 8CE584582E3 for ; Wed, 22 Jul 2026 23:14:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.198 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762061; cv=none; b=VP6pcmPJHLiYPKQqS7OZb1qJU3VmFSOPXYDPjo4FK7rXOX3khR6K0hRxBo8/2KwHt3ICAPBoPmCP7v6D9fmSgrTd7Vq1myiPgZ3j2qy3uVTYaGyS+wgQ6Xe/ySqVDYEKOg2WvrO1evdcOqCBjyJEuFHiqzI0oHnVD2PTFjJ07ns= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762061; c=relaxed/simple; bh=6xK7BW/lODxtVnPAti2SllMF/rRYhYWlPawQZ6OdvSE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=QRJwqFJvFniZdjUmNO+sP5CncC4t+Ca22tXhk+6ylbpHOl03Lu3oPp8h6okxeC/6id3uUanWId2ixUgenPbR31ozzLYAMuad2HyKU8R2/377sUwegs0t7e7aaKjWeHj+OFWwp6L2NrxgvgsHtrouK88puqU5qMWhIMznTliX/sQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--wyihan.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=QzeIpX/2; arc=none smtp.client-ip=209.85.210.198 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--wyihan.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="QzeIpX/2" Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-84c4cd31b51so2791b3a.0 for ; Wed, 22 Jul 2026 16:14:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762057; x=1785366857; darn=lists.linux.dev; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=7Nniw3rM0vx5yQvDpQ3gzLadmFEyXkP7wMFQo59ckcE=; b=QzeIpX/2VPVN/8rfuCCf31Pz67rVL2lQzBh7KFlks0h3z6HKHEE/eypI/0nP1hREWT v+XdToA1cKccbf2Kni87Xd7iRqdrAecPFNMwOuijAwqEhfTKE04Fui7qatgFo48GyxIE tMfw9R48BW9O+RvgqO5zzjVzSoLbBpE/GH1Piwyl2MYvY6/9Ym45eY99YZHLbLfoDbwk DDtD/VwP1Y0uI9o6kLkQqNdFVpGVD9ehJLHTWWkWv3vr6SH2GsE+KOOog/AEPZ8RkpfS EC1JTMFABz1SkkN1RASwbwoh21qFQw2a+N6E4ayoPnhFbwG/Yr9Ix8jFxrtGLvIJG/q+ 8EZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762057; x=1785366857; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=7Nniw3rM0vx5yQvDpQ3gzLadmFEyXkP7wMFQo59ckcE=; b=IBrVaSGx3RxWp1T2cWVwWsPHK/mbbMNdESOWDheJS/V1NXplKjc81aUKhTuTNXvi16 I7/SI0UJv8xOuwS4S9JBoA1Cb3ThWuKz8TzgpE+mILopSWScRlI1Bp+WlcpKejcMG7vZ du1RB5c0IN49Q3jvpnbun9LZBR9wRol9oLJIx0oSGxJKJ+nN9XlQvAs9p0r2n2Kl8tv+ r1Zl74xNBiaXuygHf6kgDrcThMMuMTPAa5WSyhCYonWH3jUKTRsggLEWfB2HcyUsjQfA LrXXgoJ3mpaMII1nVNuHlR6q+0eisZygiknHqr3h+0SagtuG6OyTcX7IXvyal/gylb7F cMWA== X-Forwarded-Encrypted: i=1; AHgh+RqW78qofLaMRCv/oH4Rzmr4gni3pJfsBvXS5uBJsN61TJ/Y3i0DVwZTKgwrO2Jiw7tnF3fPhCm4jZQ5@lists.linux.dev X-Gm-Message-State: AOJu0Yziq+Yrr8MWeX/rjD6BU4A1eFYguYHzqpbffIPzfVU8o+ECiktq ujgHWsm6s5BNXCo/+mv9a8w2DGf2opDbqc69lJdB1Jt3Yvf+dhXPecaLlmxxjvquZpWQ+APKpok 29Hvauw== X-Received: from pgc10.prod.google.com ([2002:a05:6a02:2f8a:b0:c80:1fe6:ac57]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:338c:b0:84a:46ec:3b9c with SMTP id d2e1a72fcca58-84e2e957883mr296813b3a.31.1784762056694; Wed, 22 Jul 2026 16:14:16 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:06 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-coco@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> X-Developer-Key: i=wyihan@google.com; a=ed25519; pk=cRi0fKzS5BMxlHyHY2pJv3w/1zcgfYKr6EYGYppdMYc= X-Developer-Signature: v=1; a=ed25519-sha256; t=1784762054; l=8466; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=2W8WgKYZE6tdsrSJhFkV2BZFvYpKlmme9GBgA9yovX0=; b=jhHS5wsQJnyizLbOK2K2wlB3XhUxpwUS1p60BbJqP/qr3hIV33WL3Xg3dNU5RfDldg3a5+5XC rJdS6X8fh21BBiWhV3RGJxoVb1IIlqdHFdT70DlCHXf8tAfPb3BS2Hh X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-1-15ad654a50db@google.com> Subject: [PATCH v14 01/22] KVM: selftests: Add macros to simplify creating VM shapes for non-default types From: Lisa Wang To: Andrew Jones , Ackerley Tng , Binbin Wu , Chao Gao , Chenyi Qiang , Dave Hansen , Erdem Aktas , Ira Weiny , Isaku Yamahata , Kiryl Shutsemau , linux-kselftest@vger.kernel.org, Paolo Bonzini , "Pratik R. Sampat" , Reinette Chatre , Rick Edgecombe , Roger Wang , Ryan Afranji , Sagi Shahar , Sean Christopherson , Shuah Khan , Xiaoyao Li , Oliver Upton Cc: Jeremiah McReynolds , kvm@vger.kernel.org, linux-coco@lists.linux.dev, linux-kernel@vger.kernel.org, x86@kernel.org, Lisa Wang Content-Type: text/plain; charset="utf-8" From: Sean Christopherson Add VM_TYPE() and __VM_SHAPE() macros to create a vm_shape structure given a type (and mode), and use the macros to define VM_SHAPE_{SEV,SEV_ES,SNP} shapes for x86's SEV family of VM shapes. Providing common infrastructure will avoid having to copy+paste vm_sev_create_with_one_vcpu() for TDX. Use the new SEV+ shapes and drop vm_sev_create_with_one_vcpu(). Opportunistically move the existing VM_SHAPE() (now __VM_SHAPE()) macro below the definitions of VM_MODE_DEFAULT so that all of the SHAPE/TYPE macros are bundled together. No functional change intended. Reviewed-by: Binbin Wu Reviewed-by: Ira Weiny Reviewed-by: Xiaoyao Li Signed-off-by: Sean Christopherson --- tools/testing/selftests/kvm/include/kvm_util.h | 27 ++++++++------- .../testing/selftests/kvm/include/x86/processor.h | 4 +++ tools/testing/selftests/kvm/include/x86/sev.h | 2 -- tools/testing/selftests/kvm/lib/x86/sev.c | 16 --------- tools/testing/selftests/kvm/x86/sev_smoke_test.c | 40 +++++++++++----------- 5 files changed, 39 insertions(+), 50 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h index dc70c6da63fa..2a3923dad570 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -221,18 +221,6 @@ struct vm_shape { kvm_static_assert(sizeof(struct vm_shape) == sizeof(u64)); -#define VM_TYPE_DEFAULT 0 - -#define VM_SHAPE(__mode) \ -({ \ - struct vm_shape shape = { \ - .mode = (__mode), \ - .type = VM_TYPE_DEFAULT \ - }; \ - \ - shape; \ -}) - extern enum vm_guest_mode vm_mode_default; #if defined(__aarch64__) @@ -270,8 +258,23 @@ extern enum vm_guest_mode vm_mode_default; #endif +#define VM_TYPE_DEFAULT 0 + +#define __VM_SHAPE(__mode, __type) \ +({ \ + struct vm_shape shape = { \ + .mode = (__mode), \ + .type = (__type), \ + }; \ + \ + shape; \ +}) + +#define VM_SHAPE(__mode) __VM_SHAPE(__mode, VM_TYPE_DEFAULT) #define VM_SHAPE_DEFAULT VM_SHAPE(VM_MODE_DEFAULT) +#define VM_TYPE(__type) __VM_SHAPE(VM_MODE_DEFAULT, __type) + #define MIN_PAGE_SIZE (1U << MIN_PAGE_SHIFT) #define PTES_PER_MIN_PAGE ptes_per_page(MIN_PAGE_SIZE) diff --git a/tools/testing/selftests/kvm/include/x86/processor.h b/tools/testing/selftests/kvm/include/x86/processor.h index 77f576ee7789..0aa6eecfcbde 100644 --- a/tools/testing/selftests/kvm/include/x86/processor.h +++ b/tools/testing/selftests/kvm/include/x86/processor.h @@ -365,6 +365,10 @@ static inline unsigned int x86_model(unsigned int eax) return ((eax >> 12) & 0xf0) | ((eax >> 4) & 0x0f); } +#define VM_SHAPE_SEV VM_TYPE(KVM_X86_SEV_VM) +#define VM_SHAPE_SEV_ES VM_TYPE(KVM_X86_SEV_ES_VM) +#define VM_SHAPE_SNP VM_TYPE(KVM_X86_SNP_VM) + #define PHYSICAL_PAGE_MASK GENMASK_ULL(51, 12) #define PAGE_SHIFT 12 diff --git a/tools/testing/selftests/kvm/include/x86/sev.h b/tools/testing/selftests/kvm/include/x86/sev.h index 1af44c151d60..944c59dbe510 100644 --- a/tools/testing/selftests/kvm/include/x86/sev.h +++ b/tools/testing/selftests/kvm/include/x86/sev.h @@ -53,8 +53,6 @@ void snp_vm_launch_start(struct kvm_vm *vm, u64 policy); void snp_vm_launch_update(struct kvm_vm *vm); void snp_vm_launch_finish(struct kvm_vm *vm); -struct kvm_vm *vm_sev_create_with_one_vcpu(u32 type, void *guest_code, - struct kvm_vcpu **cpu); void vm_sev_launch(struct kvm_vm *vm, u64 policy, u8 *measurement); kvm_static_assert(SEV_RET_SUCCESS == 0); diff --git a/tools/testing/selftests/kvm/lib/x86/sev.c b/tools/testing/selftests/kvm/lib/x86/sev.c index 93f916903461..95d8520eea34 100644 --- a/tools/testing/selftests/kvm/lib/x86/sev.c +++ b/tools/testing/selftests/kvm/lib/x86/sev.c @@ -158,22 +158,6 @@ void snp_vm_launch_finish(struct kvm_vm *vm) vm_sev_ioctl(vm, KVM_SEV_SNP_LAUNCH_FINISH, &launch_finish); } -struct kvm_vm *vm_sev_create_with_one_vcpu(u32 type, void *guest_code, - struct kvm_vcpu **cpu) -{ - struct vm_shape shape = { - .mode = VM_MODE_DEFAULT, - .type = type, - }; - struct kvm_vm *vm; - struct kvm_vcpu *cpus[1]; - - vm = __vm_create_with_vcpus(shape, 1, 0, guest_code, cpus); - *cpu = cpus[0]; - - return vm; -} - void vm_sev_launch(struct kvm_vm *vm, u64 policy, u8 *measurement) { if (is_sev_snp_vm(vm)) { diff --git a/tools/testing/selftests/kvm/x86/sev_smoke_test.c b/tools/testing/selftests/kvm/x86/sev_smoke_test.c index 1a49ee391586..fe2c438882ae 100644 --- a/tools/testing/selftests/kvm/x86/sev_smoke_test.c +++ b/tools/testing/selftests/kvm/x86/sev_smoke_test.c @@ -104,7 +104,7 @@ static void compare_xsave(u8 *from_host, u8 *from_guest) abort(); } -static void test_sync_vmsa(u32 type, u64 policy) +static void test_sync_vmsa(struct vm_shape shape, u64 policy) { struct kvm_vcpu *vcpu; struct kvm_vm *vm; @@ -114,7 +114,7 @@ static void test_sync_vmsa(u32 type, u64 policy) double x87val = M_PI; struct kvm_xsave __attribute__((aligned(64))) xsave = { 0 }; - vm = vm_sev_create_with_one_vcpu(type, guest_code_xsave, &vcpu); + vm = vm_create_shape_with_one_vcpu(shape, &vcpu, guest_code_xsave); gva = vm_alloc_shared(vm, PAGE_SIZE, KVM_UTIL_MIN_VADDR, MEM_REGION_TEST_DATA); hva = addr_gva2hva(vm, gva); @@ -150,13 +150,13 @@ static void test_sync_vmsa(u32 type, u64 policy) kvm_vm_free(vm); } -static void test_sev(void *guest_code, u32 type, u64 policy) +static void test_sev(void *guest_code, struct vm_shape shape, u64 policy) { struct kvm_vcpu *vcpu; struct kvm_vm *vm; struct ucall uc; - vm = vm_sev_create_with_one_vcpu(type, guest_code, &vcpu); + vm = vm_create_shape_with_one_vcpu(shape, &vcpu, guest_code); /* TODO: Validate the measurement is as expected. */ vm_sev_launch(vm, policy, NULL); @@ -201,12 +201,12 @@ static void guest_shutdown_code(void) __asm__ __volatile__("ud2"); } -static void test_sev_shutdown(u32 type, u64 policy) +static void test_sev_shutdown(struct vm_shape shape, u64 policy) { struct kvm_vcpu *vcpu; struct kvm_vm *vm; - vm = vm_sev_create_with_one_vcpu(type, guest_shutdown_code, &vcpu); + vm = vm_create_shape_with_one_vcpu(shape, &vcpu, guest_shutdown_code); vm_sev_launch(vm, policy, NULL); @@ -218,28 +218,28 @@ static void test_sev_shutdown(u32 type, u64 policy) kvm_vm_free(vm); } -static void test_sev_smoke(void *guest, u32 type, u64 policy) +static void test_sev_smoke(void *guest, struct vm_shape shape, u64 policy) { const u64 xf_mask = XFEATURE_MASK_X87_AVX; - if (type == KVM_X86_SNP_VM) - test_sev(guest, type, policy | SNP_POLICY_DBG); + if (shape.type == KVM_X86_SNP_VM) + test_sev(guest, shape, policy | SNP_POLICY_DBG); else - test_sev(guest, type, policy | SEV_POLICY_NO_DBG); - test_sev(guest, type, policy); + test_sev(guest, shape, policy | SEV_POLICY_NO_DBG); + test_sev(guest, shape, policy); - if (type == KVM_X86_SEV_VM) + if (shape.type == KVM_X86_SEV_VM) return; - test_sev_shutdown(type, policy); + test_sev_shutdown(shape, policy); if (kvm_has_cap(KVM_CAP_XCRS) && (xgetbv(0) & kvm_cpu_supported_xcr0() & xf_mask) == xf_mask) { - test_sync_vmsa(type, policy); - if (type == KVM_X86_SNP_VM) - test_sync_vmsa(type, policy | SNP_POLICY_DBG); + test_sync_vmsa(shape, policy); + if (shape.type == KVM_X86_SNP_VM) + test_sync_vmsa(shape, policy | SNP_POLICY_DBG); else - test_sync_vmsa(type, policy | SEV_POLICY_NO_DBG); + test_sync_vmsa(shape, policy | SEV_POLICY_NO_DBG); } } @@ -247,13 +247,13 @@ int main(int argc, char *argv[]) { TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_SEV)); - test_sev_smoke(guest_sev_code, KVM_X86_SEV_VM, 0); + test_sev_smoke(guest_sev_code, VM_SHAPE_SEV, 0); if (kvm_cpu_has(X86_FEATURE_SEV_ES)) - test_sev_smoke(guest_sev_es_code, KVM_X86_SEV_ES_VM, SEV_POLICY_ES); + test_sev_smoke(guest_sev_es_code, VM_SHAPE_SEV_ES, SEV_POLICY_ES); if (kvm_cpu_has(X86_FEATURE_SEV_SNP)) - test_sev_smoke(guest_snp_code, KVM_X86_SNP_VM, snp_default_policy()); + test_sev_smoke(guest_snp_code, VM_SHAPE_SNP, snp_default_policy()); return 0; } -- 2.55.0.229.g6434b31f56-goog