From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) (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 8C3AA4582E0 for ; Wed, 22 Jul 2026 23:14:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762060; cv=none; b=UBR6TB4JgzFCTHjgtQs8g2pw++DAIriFQcLqLxlikzQhf/gC2hd1TjxI+bsIxajcCsfTPBW6gOxrPLP1i/dH0/wF+x9RLKbm2fORkCClsM6epGf4YZZQX0bjx0FQt7rOCNf5UBz0puaatjTaJGnxvAWcclYAmgJUX2e49KbkXqk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762060; c=relaxed/simple; bh=6xK7BW/lODxtVnPAti2SllMF/rRYhYWlPawQZ6OdvSE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Z0UVnj9vPFkftA0oqoeAdZjlC7kM06vGTwimt/O9PVUAMB6wA5icaUJSciKFqB04x2C0HerqYeCnSvTbnh3/uJLL99iUqgrzlWsgSL7WsLYb+OS4XTiABsmAsM25jaO+AuR1yd7ds85+B/Bp7xTdvliIGkMh3p2s+Khn+xwe9WM= 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=nuP5VHqc; arc=none smtp.client-ip=209.85.210.197 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="nuP5VHqc" Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-84c4cd31b51so2789b3a.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=vger.kernel.org; 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=nuP5VHqcii+QOq4tEAKTO6h93QwKtTJ9P5I1Dv2B8kMi+tJ0i8zxW+VRyHv34d8SXY E9eeqjwHXVCgV15pIZB/7ltUjdAhZSW5jHLvJYEqhw91oTKbZhkGpocPkP7QTgfz2Lir ESNAXJIY2k9CiZmi9zLZTSxmUP/NSqLuUU7q4ZJqBSGXJbAC8GNy8poUCPkCFkQpFTAt wTKPFBZUa2dxoNaAO2oWBh5wyE+ML8aguUWrgn1aPUJ8sRWzcUe6z+wwwWba7CFwXKkc +OgYLOrK6eE3GsHe9zRayxrjF4YyEBSRXhhUvtEy67eUj9PfGhGySyEpP4d0w8WG7Tw5 3iVQ== 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=jrSoGhEiKh7FqaOqK5uP6UfJFzNsxfp8kOVzNODQeK3y2uLdzl8jJhrvgEDlIJaIs4 +qF2i72UKEmBcyihM3U4YVpZqTelDsDRvxtNev9QabeBttGQIFB4iqR8GvypyusWB3lp 3bxBWqZSOutIMDQO1snVcTgOYiYAPExX2s+4lbYCJn2Wwf070CcGzOQnm8TIfauN8mFO VU1Mqz8SJH0QGh4AVwAPIvAbwsEifLsaNzzwecTdwFgzITGa0k1R41Byk7Q3Wj2buh43 QVr30L/7rem8DcrzdigYrzMqJwCFI8nYsH+A279tjJDh88Bft7uovFhJ6pToG3/brAUG MzIQ== X-Forwarded-Encrypted: i=1; AHgh+RrlzDmRBKcKoNBgB+aGgAF8KjE62Mp+WMERw4ofmrN8gyfi5TPJg1t0bdkGH4YchQkQvb1tyiqvqAi63/w=@vger.kernel.org X-Gm-Message-State: AOJu0YxmVv3pQDtC0XJ5V/m6ZctS7ExfDQ1Ym4Yin+veagtFdU2xhmRO D5xCjWjfGobbslnNt3sg9StkAj0sPKPWlMKy6OLbP58bjgKYTVKHz1wk0ZfvFX0HRTlAecW9jX8 68ydDEw== 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-kernel@vger.kernel.org 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" Content-Transfer-Encoding: quoted-printable 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 { =20 kvm_static_assert(sizeof(struct vm_shape) =3D=3D sizeof(u64)); =20 -#define VM_TYPE_DEFAULT 0 - -#define VM_SHAPE(__mode) \ -({ \ - struct vm_shape shape =3D { \ - .mode =3D (__mode), \ - .type =3D VM_TYPE_DEFAULT \ - }; \ - \ - shape; \ -}) - extern enum vm_guest_mode vm_mode_default; =20 #if defined(__aarch64__) @@ -270,8 +258,23 @@ extern enum vm_guest_mode vm_mode_default; =20 #endif =20 +#define VM_TYPE_DEFAULT 0 + +#define __VM_SHAPE(__mode, __type) \ +({ \ + struct vm_shape shape =3D { \ + .mode =3D (__mode), \ + .type =3D (__type), \ + }; \ + \ + shape; \ +}) + +#define VM_SHAPE(__mode) __VM_SHAPE(__mode, VM_TYPE_DEFAULT) #define VM_SHAPE_DEFAULT VM_SHAPE(VM_MODE_DEFAULT) =20 +#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) =20 diff --git a/tools/testing/selftests/kvm/include/x86/processor.h b/tools/te= sting/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); } =20 +#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) =20 #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); =20 -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); =20 kvm_static_assert(SEV_RET_SUCCESS =3D=3D 0); diff --git a/tools/testing/selftests/kvm/lib/x86/sev.c b/tools/testing/self= tests/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); } =20 -struct kvm_vm *vm_sev_create_with_one_vcpu(u32 type, void *guest_code, - struct kvm_vcpu **cpu) -{ - struct vm_shape shape =3D { - .mode =3D VM_MODE_DEFAULT, - .type =3D type, - }; - struct kvm_vm *vm; - struct kvm_vcpu *cpus[1]; - - vm =3D __vm_create_with_vcpus(shape, 1, 0, guest_code, cpus); - *cpu =3D 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/testi= ng/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(); } =20 -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 =3D M_PI; struct kvm_xsave __attribute__((aligned(64))) xsave =3D { 0 }; =20 - vm =3D vm_sev_create_with_one_vcpu(type, guest_code_xsave, &vcpu); + vm =3D vm_create_shape_with_one_vcpu(shape, &vcpu, guest_code_xsave); gva =3D vm_alloc_shared(vm, PAGE_SIZE, KVM_UTIL_MIN_VADDR, MEM_REGION_TEST_DATA); hva =3D addr_gva2hva(vm, gva); @@ -150,13 +150,13 @@ static void test_sync_vmsa(u32 type, u64 policy) kvm_vm_free(vm); } =20 -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; =20 - vm =3D vm_sev_create_with_one_vcpu(type, guest_code, &vcpu); + vm =3D vm_create_shape_with_one_vcpu(shape, &vcpu, guest_code); =20 /* 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"); } =20 -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; =20 - vm =3D vm_sev_create_with_one_vcpu(type, guest_shutdown_code, &vcpu); + vm =3D vm_create_shape_with_one_vcpu(shape, &vcpu, guest_shutdown_code); =20 vm_sev_launch(vm, policy, NULL); =20 @@ -218,28 +218,28 @@ static void test_sev_shutdown(u32 type, u64 policy) kvm_vm_free(vm); } =20 -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 =3D XFEATURE_MASK_X87_AVX; =20 - if (type =3D=3D KVM_X86_SNP_VM) - test_sev(guest, type, policy | SNP_POLICY_DBG); + if (shape.type =3D=3D 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); =20 - if (type =3D=3D KVM_X86_SEV_VM) + if (shape.type =3D=3D KVM_X86_SEV_VM) return; =20 - test_sev_shutdown(type, policy); + test_sev_shutdown(shape, policy); =20 if (kvm_has_cap(KVM_CAP_XCRS) && (xgetbv(0) & kvm_cpu_supported_xcr0() & xf_mask) =3D=3D xf_mask) { - test_sync_vmsa(type, policy); - if (type =3D=3D KVM_X86_SNP_VM) - test_sync_vmsa(type, policy | SNP_POLICY_DBG); + test_sync_vmsa(shape, policy); + if (shape.type =3D=3D 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); } } =20 @@ -247,13 +247,13 @@ int main(int argc, char *argv[]) { TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_SEV)); =20 - test_sev_smoke(guest_sev_code, KVM_X86_SEV_VM, 0); + test_sev_smoke(guest_sev_code, VM_SHAPE_SEV, 0); =20 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); =20 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()); =20 return 0; } --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) (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 1CDDA459AD1 for ; Wed, 22 Jul 2026 23:14:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.71 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762060; cv=none; b=R2hUSwaXKMz7AZd76aRf3F8ncrfAhjC9Bpcb3EGd3ULO6oW3bnpzG2eL+ckf2GkU8h3I0zB/KjZ99BCLiIt5HCO7n27om8qzfYwKi0q6p4tJTpQJsb7mS2ptrXqSOGL3cXLp/tJVaIteAXABj4iRuO7p1il/PzpQuGzgd7wEPtg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762060; c=relaxed/simple; bh=HSUijWFM1BPOVfLPb88yrHGkaYxU/9q3xS5FLa0HHK4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=fc+cVH2XzaITZT1PBvcy0JENDN7sO0qxoNoxX9YqqkH6QT2PIyeQ0DkDHeuO8kRHxPEfj57vTq1t0Jb4AhuRJaCDjbEZSKeuWIHKTeqIWMvMkYPaBnerGafRz+Lp2YwCrxp+7BAfo+O2TrVGZxhpV0v1iJ2XY+Z2CJnZiWt+V0k= 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=vp8dI9tL; arc=none smtp.client-ip=209.85.216.71 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="vp8dI9tL" Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-38ec0f510a9so31640a91.2 for ; Wed, 22 Jul 2026 16:14:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762058; x=1785366858; darn=vger.kernel.org; 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=56NrxXkv0UVjMvjOx9by9wvi/d3mOyqzIaOMJLt53IU=; b=vp8dI9tL3yCcspxfIsku19170PagevuikLeeGNzNAwKlmO3mKFo4qR36AR4/DV0OR2 FUpOv4uPQsqDvKQdzsbcNpkFWvKV8m8DfLF006I//gXT8F/EotZEMFTYlXPulgzucjk/ XMjy2ln/e+VdhZvDk0/qRzXMbKpStJihAZ34+SaqaRIjwEQAovsvPcz/d1BK/fDSQyYt bFeE7Q+S3ayp5FjMDVXIMcqaZuFkxlvFfslPmuS57ib6Tf7koFizDYT/sI1WonbdaGGW 7V1Rv8yUYIF9sYbWQk9qra8pux+D0xDZ0NsPDedMEFVFD+UWmTwZzpvT4BXhG3NgZ9ft xsTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762058; x=1785366858; 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=56NrxXkv0UVjMvjOx9by9wvi/d3mOyqzIaOMJLt53IU=; b=Tiv7Y7EppVLiv8xph2T5IrY73JttFwwKtIahU8/rb4QDWMygRWxbDgLzILSo7uAV/5 T4oGVKCShmdkBdG5GZPftM5zemRPbhgfIecjdSikF3coLfpN8lrTPz2UmEwtglFjPwop rJa1bVcg21oBr5ZgPvlwCU8kscAV+N66JB22cWO5vmlYilhaEmjGwmNxCshhlbjIqHaD Psam9RZFY69Gw9O/zHfz4b7D3ZHZ0IBxs5uC9rVWEy/v77/pGm4cQQOR8qvk9XROdJMl ekpcAPCmYyx4Oa2zRAaWNxgw2tLgVDB20Ggbrjc88uY6qjt5znmwe8OZRYQ8cB0sV+Ne xuCw== X-Forwarded-Encrypted: i=1; AHgh+Rr3yZzIR+0nBVwFOoESwLldDLeUyy/xMO2ISNpJEu4ITj69jRxUfex4lnI5mayQksT8XIIMqUi3NG7KkBQ=@vger.kernel.org X-Gm-Message-State: AOJu0YyirKf/Fs/jQNqiIlUHy6oKWtmaWbHBlcy/FT5ArOFqsTYD6Jx2 38MfaAM+Zf6ehrWoaP8PiB+ovYn9IfXU/BcmsSQC8vjIRX37WJIwvJDzR4apWsEm9g3YVt0IwWt lCqH1lQ== X-Received: from pgjf8.prod.google.com ([2002:a63:dc48:0:b0:c85:db34:d7a]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:a120:b0:3c3:7d12:a98c with SMTP id adf61e73a8af0-3c44b1e9a44mr575991637.52.1784762058127; Wed, 22 Jul 2026 16:14:18 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:07 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=2831; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=nMhWICLdSh2frl7tfIaV4/PZJX0MLcCDKg8/gFmmfRA=; b=DaBxIbGI4Q0JBXmDhiTdq0R4HtbImm2MoSdd8eyphcWciY2zj/Me0FR8j6E77p6MHWfkCdI9m uxtlRF4MdCVArlmm+NgiqHHnt0Vm2NLFNdYXiXh739s5M6YknSSRwMS X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-2-15ad654a50db@google.com> Subject: [PATCH v14 02/22] KVM: selftests: Update kvm_init_vm_address_properties() for TDX 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 , Adrian Hunter Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Isaku Yamahata Initialize the TDX S-bit and the GPA tag mask in kvm_init_vm_address_properties() for TDX VMs, similar to how the C-bit is initialized for SEV VMs. The TDX S-bit is used to distinguish between shared and private guest physical addresses. Its position is determined by the guest physical address width, which is either 48 or 52 bits for current TDX implementations. Reviewed-by: Binbin Wu Co-developed-by: Adrian Hunter Signed-off-by: Adrian Hunter Signed-off-by: Isaku Yamahata Co-developed-by: Sagi Shahar Signed-off-by: Sagi Shahar Reviewed-by: Ira Weiny Signed-off-by: Lisa Wang Reviewed-by: Xiaoyao Li --- tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h | 14 ++++++++++++++ tools/testing/selftests/kvm/lib/x86/processor.c | 12 ++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h b/tools= /testing/selftests/kvm/include/x86/tdx/tdx_util.h new file mode 100644 index 000000000000..f647e6ca6b34 --- /dev/null +++ b/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef SELFTESTS_TDX_TDX_UTIL_H +#define SELFTESTS_TDX_TDX_UTIL_H + +#include + +#include "kvm_util.h" + +static inline bool is_tdx_vm(struct kvm_vm *vm) +{ + return vm->type =3D=3D KVM_X86_TDX_VM; +} + +#endif /* SELFTESTS_TDX_TDX_UTIL_H */ diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testin= g/selftests/kvm/lib/x86/processor.c index b51467d70f6e..b68ad1dc7e02 100644 --- a/tools/testing/selftests/kvm/lib/x86/processor.c +++ b/tools/testing/selftests/kvm/lib/x86/processor.c @@ -11,6 +11,7 @@ #include "smm.h" #include "svm_util.h" #include "sev.h" +#include "tdx/tdx_util.h" #include "vmx.h" =20 #ifndef NUM_INTERRUPTS @@ -1311,12 +1312,19 @@ void kvm_get_cpu_address_width(unsigned int *pa_bit= s, unsigned int *va_bits) =20 void kvm_init_vm_address_properties(struct kvm_vm *vm) { + u32 gpa_bits =3D kvm_cpu_property(X86_PROPERTY_GUEST_MAX_PHY_ADDR); + + vm->arch.sev_fd =3D -1; + if (is_sev_vm(vm)) { vm->arch.sev_fd =3D open_sev_dev_path_or_exit(); vm->arch.c_bit =3D BIT_ULL(this_cpu_property(X86_PROPERTY_SEV_C_BIT)); vm->gpa_tag_mask =3D vm->arch.c_bit; - } else { - vm->arch.sev_fd =3D -1; + } else if (is_tdx_vm(vm)) { + TEST_ASSERT(gpa_bits =3D=3D 48 || gpa_bits =3D=3D 52, + "TDX: bad X86_PROPERTY_GUEST_MAX_PHY_ADDR value: %u", gpa_bits); + vm->arch.s_bit =3D BIT_ULL(gpa_bits - 1); + vm->gpa_tag_mask =3D vm->arch.s_bit; } } =20 --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pg1-f197.google.com (mail-pg1-f197.google.com [209.85.215.197]) (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 2B9DD459ACE for ; Wed, 22 Jul 2026 23:14:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762062; cv=none; b=XXsACMx9ij2StHdwgqpxiOqwJsoO9rXHSpIkaqcB4sMSxnt87f/gYzyxgv1JQ1t0vJiAOvmTNNRbI2q4K7wrGYiv0+OReS7Gb2yj4q+m0EITSoqO2oEbRrR23xjMtdweAhgLCfL0NB2F3y3AgQm3xxxCzc5zYqb0/w/xCiZsRPE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762062; c=relaxed/simple; bh=Su8BLXrmP/U6RRB63g2rSdhJdPNX+A4jtFkTGIzKLgc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=XoRvMKe/tBhN+nlKZ+DwZaxczdEfZue8bUqMfZo86NPQFRJlz4AGJ24SMaYwmwe2MFYWbcyTTBNwLAO7MnS+dSFFkEX+XDTZc5cgfitatfXM9VLlD8TZ1OP7vS2cpPw8HGsnteWhnJ16zR2JnAuL2lng+fQ7q+2IWBqqHQ6XNgU= 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=uG8Gl0Mf; arc=none smtp.client-ip=209.85.215.197 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="uG8Gl0Mf" Received: by mail-pg1-f197.google.com with SMTP id 41be03b00d2f7-cb5cc1e13f8so69481a12.3 for ; Wed, 22 Jul 2026 16:14:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762059; x=1785366859; darn=vger.kernel.org; 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=TsEVnqgXZZ/AnSWixFUfO9+Yk/+wAM9+eYelUJZ+lPc=; b=uG8Gl0MfkNyoTx4L7iC+TgQFSw7o4KcJyoncTbQFOQnvMUljaAJLWGrpROllDBcyf5 8bw19GdhlluJLJwDkRxFNVCoDSRak8/d15iCZlWEKUK+G6jLEwSAJE92PTqllPoWOfHK P3sJncnttEBgD+2PWiUMkG0ZHoEracwtgAgRVKTW6B6ttNHdZyQlfZB8HMQ7oYjpseaX tENezMg50zD/znTsxjZk6fYa8EdFPC8SGb83bqT7q5a0lcWQxC7Xoz+yR1Xy89ZkETLr +WZrT8WUwjOZ+gK37mjarP5ABz4Uok+DobM+W5W07Gxmi5u2IJQb4yhjz+8PXdRG47Q+ YCWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762059; x=1785366859; 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=TsEVnqgXZZ/AnSWixFUfO9+Yk/+wAM9+eYelUJZ+lPc=; b=beG+pn1JhjnNG/TxaD/bFaADUh9/ACMSZXyrglXAWExQh1xMf69NXdbitLIB3wjFBo ejItyQP161f8arJ7/gWBI6v6OyW0N1+5IDfuOOmqY1O6xTweJoOsUT2C4Uv7P2YFS/RW WfcFruRN/eMslOep8nZQr+QMAziZ/6BDiWqaW6mbjNpkxsmCFtTg0ajZN9wVs8MG/xxm RvBQQojUOFM6mTedKj/ADOnwUKXhKaGeXc9YxGYHdtZOXv/eD9V6U6TLNcPyNyACS24V 5GzpWdK5ZpEtA0Ko9tZpWt6S9EKQsi/IF6rNsX9vp9SZoqoP08ZpuQHHAvITjrvqhuQs Legw== X-Forwarded-Encrypted: i=1; AHgh+RrnQaOEdZfWecqacBLAX6xl92tPJwnlr9pvmDusAOts8nVUkPSDDhItrgrPxWviTmNsCf53RiSlEpKYLSI=@vger.kernel.org X-Gm-Message-State: AOJu0YxZxvw/yL8YuyGCkWBdVLkrM4G5sxt64vCTwtQZYaziTM1DoY4I HSvGsBQnQBup4qEVRVUwQHwqsIndwmMkGxODphrSM+gVUYinI8R1HB21GrOoafU1+CUifC0mOtb IUioGjQ== X-Received: from pgbcw4.prod.google.com ([2002:a05:6a02:4284:b0:cbb:9724:677b]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:7344:b0:3c0:b3f7:e5c9 with SMTP id adf61e73a8af0-3c44b18ce4cmr557300637.36.1784762059075; Wed, 22 Jul 2026 16:14:19 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:08 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=9069; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=Y2c8cQDQcYfZUmkmmHn+9/G0qzpE1QbcUacmPC0a2l4=; b=FateLGKQC6st/No2fH5ELk5cOWTV6qpPd1FaM3hoLgtkcAB9pEuBxbqMiFZ5ocnYjA8yUIFju wvV7NulFc/mBWhw0ESe+Fz96gC94ZwIz3aWBkSQf2iNrC883DviGsGQ X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-3-15ad654a50db@google.com> Subject: [PATCH v14 03/22] KVM: selftests: Initialize the TDX VM 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" Content-Transfer-Encoding: quoted-printable From: Sagi Shahar Add tdx_init_vm() to handle the mandatory VM-level initialization sequence required for Intel TDX. For TDX, the guest's CPUID configuration must be "sealed" during KVM_TDX_INIT_VM before any vCPUs are created. This is necessary because the TDX hardware directly virtualizes CPUID and includes the configuration in the guest's initial security measurement. The helper calculates the required CPUID values by filtering the host- supported bits (kvm_get_supported_cpuid) against the "directly configurable" bits reported by KVM_TDX_CAPABILITIES, ensuring compliance with the strict requirements of the TDH.MNG.INIT SEAMCALL. Co-developed-by: Isaku Yamahata Signed-off-by: Isaku Yamahata Co-developed-by: Rick Edgecombe Signed-off-by: Rick Edgecombe Signed-off-by: Sagi Shahar Reviewed-by: Ira Weiny Signed-off-by: Lisa Wang --- tools/testing/selftests/kvm/Makefile.kvm | 1 + .../testing/selftests/kvm/include/x86/processor.h | 2 + .../selftests/kvm/include/x86/tdx/tdx_util.h | 35 ++++++ tools/testing/selftests/kvm/lib/x86/processor.c | 21 +++- tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c | 120 +++++++++++++++++= ++++ 5 files changed, 175 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selft= ests/kvm/Makefile.kvm index e5769268936a..3f98d1c6488c 100644 --- a/tools/testing/selftests/kvm/Makefile.kvm +++ b/tools/testing/selftests/kvm/Makefile.kvm @@ -27,6 +27,7 @@ LIBKVM_x86 +=3D lib/x86/pmu.c LIBKVM_x86 +=3D lib/x86/processor.c LIBKVM_x86 +=3D lib/x86/sev.c LIBKVM_x86 +=3D lib/x86/svm.c +LIBKVM_x86 +=3D lib/x86/tdx/tdx_util.c LIBKVM_x86 +=3D lib/x86/ucall.c LIBKVM_x86 +=3D lib/x86/vmx.c =20 diff --git a/tools/testing/selftests/kvm/include/x86/processor.h b/tools/te= sting/selftests/kvm/include/x86/processor.h index 0aa6eecfcbde..76180dfaffea 100644 --- a/tools/testing/selftests/kvm/include/x86/processor.h +++ b/tools/testing/selftests/kvm/include/x86/processor.h @@ -956,6 +956,8 @@ static inline void vcpu_xcrs_set(struct kvm_vcpu *vcpu,= struct kvm_xcrs *xcrs) vcpu_ioctl(vcpu, KVM_SET_XCRS, xcrs); } =20 +const struct kvm_cpuid_entry2 *__get_cpuid_entry(const struct kvm_cpuid2 *= cpuid, + u32 function, u32 index); const struct kvm_cpuid_entry2 *get_cpuid_entry(const struct kvm_cpuid2 *cp= uid, u32 function, u32 index); const struct kvm_cpuid2 *kvm_get_supported_cpuid(void); diff --git a/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h b/tools= /testing/selftests/kvm/include/x86/tdx/tdx_util.h index f647e6ca6b34..eb8602dce0bc 100644 --- a/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h +++ b/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h @@ -11,4 +11,39 @@ static inline bool is_tdx_vm(struct kvm_vm *vm) return vm->type =3D=3D KVM_X86_TDX_VM; } =20 +/* + * TDX ioctls + * Use underscores to avoid collisions with struct member names. + */ +#define __tdx_vm_ioctl(vm, cmd, _flags, arg) \ +({ \ + u64 r; \ + \ + union { \ + struct kvm_tdx_cmd c; \ + unsigned long raw; \ + } tdx_cmd =3D { .c =3D { \ + .id =3D (cmd), \ + .flags =3D (u32)(_flags), \ + .data =3D (u64)(arg), \ + } }; \ + \ + r =3D __vm_ioctl(vm, KVM_MEMORY_ENCRYPT_OP, &tdx_cmd.raw); \ + r ?: tdx_cmd.c.hw_error; \ +}) + +#define tdx_vm_ioctl(vm, cmd, flags, arg) \ +({ \ + u64 ret =3D __tdx_vm_ioctl(vm, cmd, flags, arg); \ + \ + if (ret) { \ + TEST_ASSERT(!ret, \ + "%s failed, rc: 0x%llx errno: %i (%s)", \ + #cmd, (unsigned long long)ret, \ + errno, strerror(errno)); \ + } \ +}) + +void tdx_init_vm(struct kvm_vm *vm, u64 attributes); + #endif /* SELFTESTS_TDX_TDX_UTIL_H */ diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testin= g/selftests/kvm/lib/x86/processor.c index b68ad1dc7e02..7d23344854cc 100644 --- a/tools/testing/selftests/kvm/lib/x86/processor.c +++ b/tools/testing/selftests/kvm/lib/x86/processor.c @@ -802,6 +802,9 @@ void kvm_arch_vm_post_create(struct kvm_vm *vm, unsigne= d int nr_vcpus) vm_sev_ioctl(vm, KVM_SEV_INIT2, &init); } =20 + if (is_tdx_vm(vm)) + tdx_init_vm(vm, 0); + r =3D __vm_ioctl(vm, KVM_GET_TSC_KHZ, NULL); TEST_ASSERT(r > 0, "KVM_GET_TSC_KHZ did not provide a valid TSC frequency= ."); guest_tsc_khz =3D r; @@ -1328,8 +1331,8 @@ void kvm_init_vm_address_properties(struct kvm_vm *vm) } } =20 -const struct kvm_cpuid_entry2 *get_cpuid_entry(const struct kvm_cpuid2 *cp= uid, - u32 function, u32 index) +const struct kvm_cpuid_entry2 *__get_cpuid_entry(const struct kvm_cpuid2 *= cpuid, + u32 function, u32 index) { int i; =20 @@ -1339,11 +1342,21 @@ const struct kvm_cpuid_entry2 *get_cpuid_entry(cons= t struct kvm_cpuid2 *cpuid, return &cpuid->entries[i]; } =20 - TEST_FAIL("CPUID function 0x%x index 0x%x not found ", function, index); - return NULL; } =20 +const struct kvm_cpuid_entry2 *get_cpuid_entry(const struct kvm_cpuid2 *cp= uid, + u32 function, u32 index) +{ + const struct kvm_cpuid_entry2 *entry; + + entry =3D __get_cpuid_entry(cpuid, function, index); + if (!entry) + TEST_FAIL("CPUID function 0x%x index 0x%x not found ", function, index); + + return entry; +} + #define X86_HYPERCALL(inputs...) \ ({ \ u64 r; \ diff --git a/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c b/tools/tes= ting/selftests/kvm/lib/x86/tdx/tdx_util.c new file mode 100644 index 000000000000..e1ffb67a106c --- /dev/null +++ b/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include "processor.h" +#include "tdx/tdx_util.h" + +static struct kvm_tdx_capabilities *tdx_read_capabilities(struct kvm_vm *v= m) +{ + static struct kvm_tdx_capabilities *tdx_cap; + int nr_cpuid_configs =3D 4; + int rc =3D -1; + int i; + + if (tdx_cap) + return tdx_cap; + + do { + nr_cpuid_configs *=3D 2; + + tdx_cap =3D realloc(tdx_cap, sizeof(*tdx_cap) + + (sizeof(struct kvm_cpuid_entry2) * nr_cpuid_configs)); + TEST_ASSERT(tdx_cap, + "Could not allocate memory for tdx capability nr_cpuid_configs %d\n= ", + nr_cpuid_configs); + + tdx_cap->cpuid.nent =3D nr_cpuid_configs; + rc =3D __tdx_vm_ioctl(vm, KVM_TDX_CAPABILITIES, 0, tdx_cap); + } while (rc < 0 && errno =3D=3D E2BIG); + + TEST_ASSERT(rc =3D=3D 0, "KVM_TDX_CAPABILITIES failed: %d %d", + rc, errno); + + pr_debug("tdx_cap: supported_attrs: 0x%016llx\n" + "tdx_cap: supported_xfam 0x%016llx\n", + tdx_cap->supported_attrs, tdx_cap->supported_xfam); + + for (i =3D 0; i < tdx_cap->cpuid.nent; i++) { + const struct kvm_cpuid_entry2 *config =3D &tdx_cap->cpuid.entries[i]; + + pr_debug("cpuid config[%d]: leaf 0x%x sub_leaf 0x%x eax 0x%08x ebx 0x%08= x ecx 0x%08x edx 0x%08x\n", + i, config->function, config->index, + config->eax, config->ebx, config->ecx, config->edx); + } + + return tdx_cap; +} + +/* + * Filter CPUID based on TDX supported capabilities + * + * Input Args: + * vm - Virtual Machine + * cpuid_data - CPUID fields to filter + * + * Output Args: None + * + * Return: None + * + * For each CPUID leaf, filter out unsupported bits based on the capabilit= ies + * reported by the TDX module + */ +static void tdx_filter_cpuid(struct kvm_vm *vm, + struct kvm_cpuid2 *cpuid_data) +{ + struct kvm_tdx_capabilities *tdx_cap; + const struct kvm_cpuid_entry2 *config; + struct kvm_cpuid_entry2 *e; + int i; + + tdx_cap =3D tdx_read_capabilities(vm); + + i =3D 0; + while (i < cpuid_data->nent) { + e =3D cpuid_data->entries + i; + config =3D __get_cpuid_entry(&tdx_cap->cpuid, e->function, e->index); + + if (!config) { + int left =3D cpuid_data->nent - i - 1; + + if (left > 0) + memmove(cpuid_data->entries + i, + cpuid_data->entries + i + 1, + sizeof(*cpuid_data->entries) * left); + cpuid_data->nent--; + continue; + } + + e->eax &=3D config->eax; + e->ebx &=3D config->ebx; + e->ecx &=3D config->ecx; + e->edx &=3D config->edx; + + i++; + } +} + +void tdx_init_vm(struct kvm_vm *vm, u64 attributes) +{ + struct kvm_tdx_init_vm *init_vm; + const struct kvm_cpuid2 *tmp; + struct kvm_cpuid2 *cpuid; + + tmp =3D kvm_get_supported_cpuid(); + + cpuid =3D allocate_kvm_cpuid2(tmp->nent); + memcpy(cpuid, tmp, kvm_cpuid2_size(tmp->nent)); + tdx_filter_cpuid(vm, cpuid); + + init_vm =3D calloc(1, sizeof(*init_vm) + + sizeof(init_vm->cpuid.entries[0]) * cpuid->nent); + TEST_ASSERT(init_vm, "init_vm allocation failed"); + + memcpy(&init_vm->cpuid, cpuid, kvm_cpuid2_size(cpuid->nent)); + free(cpuid); + + init_vm->attributes =3D attributes; + + tdx_vm_ioctl(vm, KVM_TDX_INIT_VM, 0, init_vm); + + free(init_vm); +} --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) (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 3659E459AE5 for ; Wed, 22 Jul 2026 23:14:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.71 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762063; cv=none; b=fKq0Ir1h4QAnj7490caS3y+GcZcJgclvBEj/aOOA1SBPq3unpzQ9M4vq8MxMpr3X8vq+hFMdXH6GDZh9G3UlgctB7cxCJ6ri2udgkY5K7d+zLww0o6a712Q5HuWumDYWiUAyHEmzK59oqLIbgyHECqjPdcqwJY5lnB2IT9K/0I4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762063; c=relaxed/simple; bh=rn7lIDTWcxoiO6D4/Cdhdy8K/SysdSX/CMUU+rwcLOI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=fIRqSteaf0pkEgktYsZlHV0MmZtGcCx3PjLY6kccS31g8+5bLLoKCJWtUaWh0+8t72y+V4U5+ov/itPL+5JL2bcr/O9LWZpNt2ou68NKlX9o5y8fAbari6U7khvMoP2mpGaA/gbbdZ+uefn9v7YqJXe/VwYErvkmhovk2zW3/b4= 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=sYz4lIaB; arc=none smtp.client-ip=209.85.216.71 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="sYz4lIaB" Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-381abcccbf4so15070a91.3 for ; Wed, 22 Jul 2026 16:14:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762060; x=1785366860; darn=vger.kernel.org; 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=oVBS289J/Z2jqIHEMCM1gipu2UkhJ+nCd+Y4BOZxwFE=; b=sYz4lIaBhgjKh7P3vwVIFuVgDh3ncPe1Fj5pPCCxZtxtEGWAkKedIyMqlneLSloW7w Qh2Sa+SrqTVgL8vdbAqFGazOanHFfgp4sr9I/4rtqx3DIWEbPeXXo6RxRqaznr8jEpur S/se+zby5hWNDlKUiYcezukt+oV/PaKR/tDGTlq+8VMcqvls+I6IBvwEgmdkOGZRjVL7 vmnRf7Iokk+qwsAXxuMC5tyJdFjO0LIwAD3pA5zxcaGfuU9TCYvsI2+t8AtIUXFlPSfX oehei4WcHwJipZNPNv7S891MTdiG4qsntOkfuTTBI33eG7WUZWQWnK0gho94jvm4FJd9 DVgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762060; x=1785366860; 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=oVBS289J/Z2jqIHEMCM1gipu2UkhJ+nCd+Y4BOZxwFE=; b=iZYySCuW4GS4HCEOCgaCWWOd746ATyzYRz7LVkS2iZknTn8+piX04hX69YhJ88wMAb qyt8kRRra+bLnuAKeJnXT1XYr5p+W8+4ztOBLoYZSvZpqkYn1iTvIp9mQuKiLtXMVkef IicyysFruNaEIini8XRSgAzdy9TIjmSZ7/FDpHKIGHjuj4X5EjknwfnA6jnkCzhFpodm bugpe/29ATKSnmfIAjc+3YgVeGd5qYpOwfj3JoIxCe/dduQ8eva9BlGcwClSCcYt4vol J7dETWuvyQUYs8FchBMQUUfF5QWAeH1/2JesdaxwpYNhKBHE0ZKs0qV2j2OJQE38DCih O2Hg== X-Forwarded-Encrypted: i=1; AHgh+RohraKsKgnaruuTpzLwt/ohCxv8iJUYvNC3SzK2Glfz6C1hNT+16vPxNwJ7NwpyVrFq15paKjvwuZi4YpM=@vger.kernel.org X-Gm-Message-State: AOJu0Yww0ABzCVVfYC3df9peZbuoSKOpUBc9z1SAeZTv0hYifFwLYagm 24RgJTZ+JakXcjIiKG/L/p9m3TVVyuuQ08QbaVvn1oMm8rFdn33jjfDziFOUUZO2pPuBrEI6PVU xzKooEg== X-Received: from pjq11.prod.google.com ([2002:a17:90b:560b:b0:384:aeb6:624c]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:184c:b0:37f:9ce1:735a with SMTP id 98e67ed59e1d1-38ec658e892mr709493a91.27.1784762060184; Wed, 22 Jul 2026 16:14:20 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:09 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=1765; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=bOj/gnaWbqCSO1dw0E/Ufv9dZGd8nQXtcW3IYQ+RbjE=; b=Fwd4fvyFJukTctt1WNFLyHmWmkoUi+2SW/wiXay2xsIEBRQnOVDGm6MjuzZw7NYD7fl7HIlgs 4ynYSy6pNK1DYAyNeNpv3ljZihaRfmzv4bmj+B2fCdI0PwJSdaRXzqC X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-4-15ad654a50db@google.com> Subject: [PATCH v14 04/22] KVM: selftests: TDX: Use KVM_TDX_CAPABILITIES to validate TDs' attribute configuration 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" Content-Transfer-Encoding: quoted-printable From: Isaku Yamahata Make sure that all the attributes enabled by the test are reported as supported by both the TDX module and KVM. KVM filters out the attributes not supported by itself. This also exercises the KVM_TDX_CAPABILITIES ioctl. Signed-off-by: Isaku Yamahata Co-developed-by: Sagi Shahar Signed-off-by: Sagi Shahar Reviewed-by: Binbin Wu Reviewed-by: Ira Weiny Signed-off-by: Lisa Wang Reviewed-by: Xiaoyao Li --- tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c b/tools/tes= ting/selftests/kvm/lib/x86/tdx/tdx_util.c index e1ffb67a106c..c01a26567b73 100644 --- a/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c +++ b/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c @@ -93,6 +93,16 @@ static void tdx_filter_cpuid(struct kvm_vm *vm, } } =20 +static void tdx_check_attributes(struct kvm_vm *vm, u64 attributes) +{ + struct kvm_tdx_capabilities *tdx_cap; + + tdx_cap =3D tdx_read_capabilities(vm); + + /* Make sure all the attributes are reported as supported */ + TEST_ASSERT_EQ(attributes & tdx_cap->supported_attrs, attributes); +} + void tdx_init_vm(struct kvm_vm *vm, u64 attributes) { struct kvm_tdx_init_vm *init_vm; @@ -112,6 +122,8 @@ void tdx_init_vm(struct kvm_vm *vm, u64 attributes) memcpy(&init_vm->cpuid, cpuid, kvm_cpuid2_size(cpuid->nent)); free(cpuid); =20 + tdx_check_attributes(vm, attributes); + init_vm->attributes =3D attributes; =20 tdx_vm_ioctl(vm, KVM_TDX_INIT_VM, 0, init_vm); --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) (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 2AE794582E3 for ; Wed, 22 Jul 2026 23:14:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.200 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762064; cv=none; b=kBn3D2rfZwFtT9P8FsxPdOAD5YC9QA3NOoD+8bEDmwmQ2PFOJxTwydG8Fw1hh/3wMLk0kSGrzia3tQvqO/zN+ice0wPHQ7pzYTCuWPu7IJ2+l26ZmqUKD3kBhzwpjTCJ4RzQ1FGw9P+yDK8+3klegeggL5szNZqz8iao06sAXNA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762064; c=relaxed/simple; bh=V9qPB5Q4LeTwwvk34bhwRSUabO8T9Mew6hfZ0GpdBnk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=YTiCYWlTajsguVGbOyuXXmQmilgsXYMqLyI4F9FSZl5h4jOeq9O+bb2/doyoNeH1I+b8AHIoYuaAZd9wMocmXVs6Xm7F951HMv6qmxlCumLk11ByBS5fiJkvUOYorXIfIlP6iwdJIWeva315DQyQXaa2UWC+Dvo0JgY8CXNsDvM= 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=MQ7/rICu; arc=none smtp.client-ip=209.85.214.200 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="MQ7/rICu" Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2ccafc5e82cso539545ad.3 for ; Wed, 22 Jul 2026 16:14:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762061; x=1785366861; darn=vger.kernel.org; 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=yww/CCbtIflA6zUbBX2detwduDGeaD8MIEWbRdLgMx8=; b=MQ7/rICuZ5tevD/do6XilgmMUwtue9mAcDsPWPUzN7rV/SRPMDD/yJeTMTrIkG5yDD QdrVp4wRHcDV3wBHs/cC75JCv5d0wytIvAAs5L+bZa/v86D2BItA6XJkx/ifJsI3BmL2 wfDPNdiHhET+r0KOi3qwE9f2oMDsGWY/Jdj2d4MXYzzGQ0pAcdMhmU0s1ov/u86Ln73J Wn7wLoqWPo3UyzdHFe87SPhv/fDiRJTZ7+BYzdM8KUbvJmw499HhSosOVSkjvSnqJlph Tm+Cq0HH9CYvKcNMt0LUhSjcHtpI7o89oMAXcr16y1MSJX2gDl2TMhe3BYOolNdh3FFC FS3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762061; x=1785366861; 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=yww/CCbtIflA6zUbBX2detwduDGeaD8MIEWbRdLgMx8=; b=XnpskBVsyzKeOhG/q1sS0nzZhPXfw+QsbFkGjptZm7I2pkbUR5G4FJQ+rkOS4undBV 8sGvsbhMc6qSW4nJ/gLxCD4+x9m8Hpo4fHW4A9mJlgBh/fj7Pq08M5GFhgZJpPsAD9Y8 wocj9/msAso3n49vkC7n3tJXh3dYolhG4+IrrBjN/bCwTakbUR5puumAf3+v568XQYNL pwMFF6Q0edx/JX99oIHs06o+MnR0kVIaDOdO4L7NLtHxjURGFmfqkSmhGV9StAuwHIzx YUiihR2xXoPviqC3685VzrlysDV6cOyesuULWquzXdw9OtRy9E7rVz6LGQgMUQDlWxBG /DaA== X-Forwarded-Encrypted: i=1; AHgh+RqYDhzc7I6Ch/FXU48d0V9qp9ByMTNx2qJlnK6iWdhiKwEl3lUIiQNlDimTFQB6CYexf0mAtWx6B8asje4=@vger.kernel.org X-Gm-Message-State: AOJu0YwlOr71aecqJuh7MKg5RFkVkI8xJKbqRni+orKLkLfUXK8T+vUE sXPCWoCOx6Uui9YSeiDq94hO39VkNWz701HA88/eItZsWZu+azNWch42sx7MI4GEnKHCyiHgr82 rdD2spw== X-Received: from plnf15.prod.google.com ([2002:a17:903:1a6f:b0:2ce:9b49:d497]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2282:b0:2c9:c083:cd50 with SMTP id d9443c01a7336-2cfa6b799eamr10224075ad.17.1784762061199; Wed, 22 Jul 2026 16:14:21 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:10 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=1838; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=iBqKDnsWg3oJX07267DkscrYgDO1smB3E8LEOAOLwOM=; b=Eoo9zVSr1brvaXAAlLApyWhjCV/awTaposcKMi9eCntr2ggtwIKJiEjKuGir3mLOZ4sBhl9vE GprFiY/y/m7BBdR+gvsyOWCgXotCwSuYxjNlbN0yhmUn0oEjnUD3Yhg X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-5-15ad654a50db@google.com> Subject: [PATCH v14 05/22] KVM: selftests: Expose segment definitions to assembly files 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" Content-Transfer-Encoding: quoted-printable From: Sagi Shahar Move kernel segment definitions to a separate file which can be included from assembly files. Reviewed-by: Ira Weiny Reviewed-by: Binbin Wu Signed-off-by: Sagi Shahar Signed-off-by: Lisa Wang Reviewed-by: Xiaoyao Li --- tools/testing/selftests/kvm/include/x86/processor_asm.h | 12 ++++++++++++ tools/testing/selftests/kvm/lib/x86/processor.c | 5 +---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/kvm/include/x86/processor_asm.h b/tool= s/testing/selftests/kvm/include/x86/processor_asm.h new file mode 100644 index 000000000000..713b6bc0aeb7 --- /dev/null +++ b/tools/testing/selftests/kvm/include/x86/processor_asm.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Used for storing defines used by both c and assembly code. + */ +#ifndef SELFTEST_KVM_PROCESSOR_ASM_H +#define SELFTEST_KVM_PROCESSOR_ASM_H + +#define KERNEL_CS 0x8 +#define KERNEL_DS 0x10 +#define KERNEL_TSS 0x18 + +#endif /* SELFTEST_KVM_PROCESSOR_ASM_H */ diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testin= g/selftests/kvm/lib/x86/processor.c index 7d23344854cc..97acc5aaf7b7 100644 --- a/tools/testing/selftests/kvm/lib/x86/processor.c +++ b/tools/testing/selftests/kvm/lib/x86/processor.c @@ -8,6 +8,7 @@ #include "kvm_util.h" #include "pmu.h" #include "processor.h" +#include "processor_asm.h" #include "smm.h" #include "svm_util.h" #include "sev.h" @@ -18,10 +19,6 @@ #define NUM_INTERRUPTS 256 #endif =20 -#define KERNEL_CS 0x8 -#define KERNEL_DS 0x10 -#define KERNEL_TSS 0x18 - gva_t exception_handlers; bool host_cpu_is_amd; bool host_cpu_is_intel; --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pg1-f197.google.com (mail-pg1-f197.google.com [209.85.215.197]) (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 4EBE2459AD7 for ; Wed, 22 Jul 2026 23:14:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762065; cv=none; b=tO3NF/A6gYUv2J2SkMvVWfM3mbbdJUgo6FESEeQdwRWmjz0vt+6+YbjDtYCsxeWc6V/k3M1jFk2jHaHu1wbm0jyZhAUpZStvgnyfqYVrEVnsQ7LdwQ7xW6uvPjkf3ZCde4Zr6XX2AJvjzGcepPXk49K/L67x+CmMTGXOpxEWYSQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762065; c=relaxed/simple; bh=MN5wgOlznVkl+BjeEs809JtcBQkMpu0tStRwIcnoZBo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=lF7virq1IntXHiUnPrK+GaUyQm4OHliFIf+7qziK2ahRNCSLdF47nI4eLmOh095/CS2fYNNvTQ81uAitRElKDX6eq1LQvAcCK62+PSqFv55G3zK0h8KFUlbE9p5tXlndVewCrCnAfBbjV214P7dHGaI2EP8/rFCwYVj5a0B2gkA= 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=WjzhSAUw; arc=none smtp.client-ip=209.85.215.197 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="WjzhSAUw" Received: by mail-pg1-f197.google.com with SMTP id 41be03b00d2f7-c89704da8c7so114804a12.0 for ; Wed, 22 Jul 2026 16:14:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762062; x=1785366862; darn=vger.kernel.org; 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=HNI6BG2rRalx1BcQoBnUKDa+4TlUreIqsReX1yE6FOI=; b=WjzhSAUwj4CugvxBARKuulkAurDs2RyzMe+Z+FXWLD3KT3wFr9jfyg56AAEQVYEW91 dsBkDOUBIgw9wopVb2YgTHqi2i3SIt8VTYywy3VVjkTPqka02Or5f+HLEqaw7V7lS8d7 V6OXasDQZKySOqdiGOAGrw7fE7pSIKUwNQH2oLzeiE4nTWILJ2AMnDcdwFINluTCVHLC 5uiHAFE38dtTtf+q54ay4tDXuT6uLLrX0nI+e8HzmC4jf2a7yTX8nV/7k6Y9RAL5+KMX ahRNNqh75uhz12URuj9gpwTgorFuOktmHBighWmKZVMmvy9xLbmcGOTHXgE2oCW6bgEt WW8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762062; x=1785366862; 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=HNI6BG2rRalx1BcQoBnUKDa+4TlUreIqsReX1yE6FOI=; b=V0TKWjVI9RPGeY4AqZPn3H8oowr20hao7SZSfmjSdbAi+S33eLSkEp8LEcg4IUvjxa 0z77ZIr6o4JwqsKb+HcKpgZodqIbh7OvOzQqb1e/UnKm+33ImY9uV8hzanpRL/89Z0qz W1Z8/QhjOT7FlulrDNbJ5l7hf078CjcCYelMnJZOzlacMQRlI18Stq0Ylg0sj2mbDhte BKJFUmFkjKJ8L/YBCoSBGRJADNeSwjrYly8tsOdCxz6XwBaJ9vr8iO2j6Nvc41Rdgnap 3ZtiwL6VU42v5hqZ/FiSwHjFvgjVegzNEhkutOMsWWCPwJ7pMuGek7IlQ3aWJluDX60z t4sQ== X-Forwarded-Encrypted: i=1; AHgh+RpoH/FWT4NXhjymfaX/4PFylKvqOchiSbgeeyVsvC2BcQJAQGaoXvbjAreAz+z0vk7KP86zan4l1PidXBw=@vger.kernel.org X-Gm-Message-State: AOJu0Yz99oqG4/9fPYs7MvaD1iDmSpv+kaYcoLiEIGhaZZubg2Pxzzb8 tg6agrqBXleODq3EdnQo0VvT/A0568y9QQ2C0LfiCyw5i9ysO0/HbS7Vq8i+4lXCTz2GYqmjOFC h3NrRJQ== X-Received: from pgwa20.prod.google.com ([2002:a65:6554:0:b0:cbb:8579:3a63]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:a126:b0:3b4:6a23:6ba with SMTP id adf61e73a8af0-3c44b006725mr571413637.26.1784762062177; Wed, 22 Jul 2026 16:14:22 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:11 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=1555; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=wrBgxcBhN/sZNPJ4zdjh5E9TZDvM2h5ZX0OmgmcUlbY=; b=pXNTGhmG23eBH63uL+CND3RgVZfyXWaFctbAQm1rlxi8q9M8bq0fBhJEGtUE8Z5gi0YpU6n+x X3QsHJ5xnycBbH61MAUbN2eDF74a28NFjTpw/W/gm1ZCAXb5BZVZ3dR X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-6-15ad654a50db@google.com> Subject: [PATCH v14 06/22] tools: include: Add kbuild.h for assembly structure offsets 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" Content-Transfer-Encoding: quoted-printable From: Sagi Shahar Add the Kbuild macros needed to enable the filechk_offsets mechanism to generate C header files containing structure member offset information. Tools depending on assembly code that operate on structures have to hardcode the offsets of structure members. The Kbuild infrastructure can instead generate C header files with these offsets automatically, allowing them to be included in assembly code as symbolic constants. For example, the TDX guest boot code requires access to parameters passed in the C structure (struct td_boot_parameters). This header provides the macros needed to extract these offsets from C code and expose them to assembly, ensuring the two remain synchronized. Signed-off-by: Sagi Shahar Reviewed-by: Ira Weiny Signed-off-by: Lisa Wang Reviewed-by: Binbin Wu --- tools/include/linux/kbuild.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tools/include/linux/kbuild.h b/tools/include/linux/kbuild.h new file mode 100644 index 000000000000..957fd55cd159 --- /dev/null +++ b/tools/include/linux/kbuild.h @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __TOOLS_LINUX_KBUILD_H +#define __TOOLS_LINUX_KBUILD_H + +#define DEFINE(sym, val) \ + asm volatile("\n.ascii \"->" #sym " %0 " #val "\"" : : "i" (val)) + +#define OFFSET(sym, str, mem) \ + DEFINE(sym, __builtin_offsetof(struct str, mem)) + +#endif /* __TOOLS_LINUX_KBUILD_H */ --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (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 52EC645D5DF for ; Wed, 22 Jul 2026 23:14:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762066; cv=none; b=T5/7uaIQondYbkyOOBuRCqe28IdsrppkWtoBVHz+wVue5mvIGiAsk5W7WwDOWcF5fZhX2TOhE0OC1g8FO/kpbsjjuE2589Du+cq5AIwdHDtmW/yAH+8h5hWaQvho/KfonyoryTK8Vsk7PrZlj++JGrG73uQlzH/Vlrc0sZE1mr0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762066; c=relaxed/simple; bh=tGPVY6sBJCD5ODqi/JcZObKjVFlIB/iTqLcMXmlR1CQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=HbkZ81Sqn6sNQjzDZtPmuqy0LAIE26gzO4R5XKO7TqwvpMx2CCr0IiPQj3worMfULXyz2KmnUHp+3Rmi1nEQkYWJ3/AkSyb7lTf4D3AZFIg23PA/Iv6VdTtb5kFjIZc7kZPCnlFx/oWSua+hAmnn8KtOFu0FvTayp5x7O3uUkg8= 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=QlWpVUoH; arc=none smtp.client-ip=209.85.214.197 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="QlWpVUoH" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2cae455cf6dso645815ad.2 for ; Wed, 22 Jul 2026 16:14:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762063; x=1785366863; darn=vger.kernel.org; h=content-transfer-encoding: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=ZXtKi3prXzI9bnKg4KG5F9D+G4t68ydomgijLza5cNY=; b=QlWpVUoHxAx7bLmqfx8T0vCN7gqbQnXdBAyXxomhlMnLHUGCdR5RVC2THCRHijTSay WEz6sG6ylpcscg1Z9EI0ryE/lHr4707BIBZlXI8zADcd0ucGY0mIul5ldHdxrV7I7EIj Q7Q2KxaDMzT5fM9PfeJmt0Jh1bufrYpiFyQyHXX6IgXNY3bRkbZsl7hpgPT+zC1m3Goy rGADyOttO3SiiiJM6UBar/IfHQLBZ7qsUx32i+0Ski5bVGmch2Ywx/JALoWd0F+eNpbv vYy88znUgmJBB8T4V82s8XwlVjBxdawqdh9yx3+GU+pdVtLGXjoYSUIJC6GPBKb5sWfr PUqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762063; x=1785366863; h=content-transfer-encoding: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=ZXtKi3prXzI9bnKg4KG5F9D+G4t68ydomgijLza5cNY=; b=ZXfONp2+Ya9kxE2CGS7A+A2kN0ZRLtOiax7fYIKOayjDOxlQ6KxnHWacUw+cOl+M1I ooWWPOE00NWu6OSBjEbAENlSUbd/zC8TtwA6Z4ovWJnnFGsrC+m1ITm9KhQFzJtdICUz dCcKrVKdMXK89Eb/E+y86kbTKjFR/RM6FWeeTvtT+AjIXNowGK3AA+GtcrZ3wcGrUo+q WJW7UjvwLvSSkh9ZYjKAmPGFNHlq4ytRMRXRAP9wLLlGhWLd1DL+TH8xFdFjlOvITLGJ 4OPWwDgKHJujWAoCljazIJliuNcZ9Kro5tCioYJHbyIfg1DXUVopx9jhlfF7etSjKu93 hObQ== X-Forwarded-Encrypted: i=1; AHgh+RqA1XgiN2DiTXPKFE9RNuFKAL06DqPIH9E+aEZcjswVF7UdSpt1xvBbD7mtR0dtGf1A2cKhFgSk6r1z1Ns=@vger.kernel.org X-Gm-Message-State: AOJu0YztTdMP1yg0JMwmNoy8sI4VaO7SXAgqitBjj2coO9E1TcZfqMok 2KO5MAd8ZO/F6PgKHXGCKgmWQMWtLKY0ZdIA5rPuU3DOchnGLasWC/aFO0JdO14mUt2VEIMbLd2 SovDNfw== X-Received: from plbay4.prod.google.com ([2002:a17:902:8b84:b0:2c7:ec09:a994]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:e5ce:b0:2ca:62e:cc4f with SMTP id d9443c01a7336-2cfa74906e5mr8381875ad.23.1784762063095; Wed, 22 Jul 2026 16:14:23 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:12 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=8964; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=5DLFVEwonkGQ01AW+lgmee7VMjb7ZOlGC//SgKMZPcE=; b=BZA+bqe0o8aDGQKDmitMHWk7S+wqKxsR3MfL0QUVoGCVyhiOZtmYNN0oYiQlYhGLFYCLFUSWp FxOSymUZnqQBgePDsQ1hPo8abSch7ZsWEXnAct+tygNwV/4g+GQFYZC X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-7-15ad654a50db@google.com> Subject: [PATCH v14 07/22] KVM: selftests: Introduce structures for TDX guest boot parameters 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" Content-Transfer-Encoding: quoted-printable From: Sagi Shahar Introduce `td_boot_parameters` and `td_per_vcpu_parameters`, and export their offsets to assembly via the kbuild infrastructure. TDX guest registers are private and must be initialized by guest-side assembly. These structures allow the assembly code to retrieve boot parameters and index into per-vCPU data based on the vCPU ID, while keeping host and guest definitions synchronized. Use kbuild.h to expose the offsets into the structs from c code to assembly code. Reviewed-by: Binbin Wu Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng Signed-off-by: Sagi Shahar Co-developed-by: Lisa Wang Signed-off-by: Lisa Wang --- tools/testing/selftests/kvm/.gitignore | 3 +- tools/testing/selftests/kvm/Makefile.kvm | 29 +++++++++- .../selftests/kvm/include/x86/tdx/td_boot.h | 66 ++++++++++++++++++= ++++ .../selftests/kvm/lib/x86/tdx/td_boot_offsets.c | 21 +++++++ 4 files changed, 116 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/kvm/.gitignore b/tools/testing/selftes= ts/kvm/.gitignore index 1d41a046a7bf..eef6055242b2 100644 --- a/tools/testing/selftests/kvm/.gitignore +++ b/tools/testing/selftests/kvm/.gitignore @@ -9,4 +9,5 @@ !config !settings !Makefile -!Makefile.kvm \ No newline at end of file +!Makefile.kvm +include/x86/**/*_offsets.h \ No newline at end of file diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selft= ests/kvm/Makefile.kvm index 3f98d1c6488c..397afebbb34b 100644 --- a/tools/testing/selftests/kvm/Makefile.kvm +++ b/tools/testing/selftests/kvm/Makefile.kvm @@ -19,6 +19,8 @@ LIBKVM +=3D lib/userfaultfd_util.c =20 LIBKVM_STRING +=3D lib/string_override.c =20 +LIBKVM_ASM_DEFS +=3D lib/x86/tdx/td_boot_offsets.c + LIBKVM_x86 +=3D lib/x86/apic.c LIBKVM_x86 +=3D lib/x86/handlers.S LIBKVM_x86 +=3D lib/x86/hyperv.c @@ -261,6 +263,10 @@ OVERRIDE_TARGETS =3D 1 include ../lib.mk include ../cgroup/lib/libcgroup.mk =20 +# Enable Kbuild tools. +include $(top_srcdir)/scripts/Kbuild.include +include $(top_srcdir)/scripts/Makefile.lib + INSTALL_HDR_PATH =3D $(top_srcdir)/usr LINUX_HDR_PATH =3D $(INSTALL_HDR_PATH)/include/ LINUX_TOOL_INCLUDE =3D $(top_srcdir)/tools/include @@ -273,15 +279,24 @@ CFLAGS +=3D -Wall -Wstrict-prototypes -Wuninitialized= -O2 -g -std=3Dgnu99 \ -fno-stack-protector -fno-PIE -fno-strict-aliasing \ -I$(LINUX_TOOL_INCLUDE) -I$(LINUX_TOOL_ARCH_INCLUDE) \ -I$(LINUX_HDR_PATH) -Iinclude -I$(/dev/null; echo "$$?"),0) CFLAGS +=3D -march=3Dx86-64-v2 endif + +KVM_GEN_HDRS :=3D $(patsubst lib/x86/%.c, $(OUTPUT)/include/x86/%.h, $(fil= ter lib/x86/%, $(LIBKVM_ASM_DEFS))) +$(shell mkdir -p $(sort $(dir $(KVM_GEN_HDRS)))) +$(KVM_GEN_HDRS): GUARD =3D $(shell echo $(*F) | tr a-z A-Z | tr '.' '_') +$(KVM_GEN_HDRS): $(OUTPUT)/include/x86/%.h: $(OUTPUT)/lib/x86/%.s FORCE + $(call filechk,offsets,__$(GUARD)_H__) endif + ifeq ($(ARCH),arm64) tools_dir :=3D $(top_srcdir)/tools arm64_tools_dir :=3D $(tools_dir)/arch/arm64/tools/ @@ -314,6 +329,7 @@ LIBKVM_S :=3D $(filter %.S,$(LIBKVM)) LIBKVM_C_OBJ :=3D $(patsubst %.c, $(OUTPUT)/%.o, $(LIBKVM_C)) LIBKVM_S_OBJ :=3D $(patsubst %.S, $(OUTPUT)/%.o, $(LIBKVM_S)) LIBKVM_STRING_OBJ :=3D $(patsubst %.c, $(OUTPUT)/%.o, $(LIBKVM_STRING)) +LIBKVM_ASM_DEFS_OBJ +=3D $(patsubst %.c, $(OUTPUT)/%.s, $(LIBKVM_ASM_DEFS)) LIBKVM_OBJS =3D $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ) $(LIBKVM_STRING_OBJ) $(LIB= CGROUP_O) SPLIT_TEST_GEN_PROGS :=3D $(patsubst %, $(OUTPUT)/%, $(SPLIT_TESTS)) SPLIT_TEST_GEN_OBJ :=3D $(patsubst %, $(OUTPUT)/$(ARCH)/%.o, $(SPLIT_TESTS= )) @@ -339,7 +355,9 @@ $(SPLIT_TEST_GEN_OBJ): $(OUTPUT)/$(ARCH)/%.o: $(ARCH)/%= .c $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@ =20 EXTRA_CLEAN +=3D $(GEN_HDRS) \ + $(KVM_GEN_HDRS) \ $(LIBKVM_OBJS) \ + $(LIBKVM_ASM_DEFS_OBJ) \ $(SPLIT_TEST_GEN_OBJ) \ $(TEST_DEP_FILES) \ $(TEST_GEN_OBJ) \ @@ -351,6 +369,9 @@ $(LIBKVM_C_OBJ): $(OUTPUT)/%.o: %.c $(GEN_HDRS) $(LIBKVM_S_OBJ): $(OUTPUT)/%.o: %.S $(GEN_HDRS) $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@ =20 +$(LIBKVM_ASM_DEFS_OBJ): $(OUTPUT)/%.s: %.c FORCE + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -S $< -o $@ + # Compile the string overrides as freestanding to prevent the compiler from # generating self-referential code, e.g. without "freestanding" the compil= er may # "optimize" memcmp() by invoking memcmp(), thus causing infinite recursio= n. @@ -359,11 +380,15 @@ $(LIBKVM_STRING_OBJ): $(OUTPUT)/%.o: %.c =20 $(shell mkdir -p $(sort $(dir $(TEST_GEN_PROGS)))) $(SPLIT_TEST_GEN_OBJ): $(GEN_HDRS) +$(LIBKVM_OBJS): $(KVM_GEN_HDRS) $(TEST_GEN_PROGS): $(LIBKVM_OBJS) $(TEST_GEN_PROGS_EXTENDED): $(LIBKVM_OBJS) $(TEST_GEN_OBJ): $(GEN_HDRS) =20 -cscope: include_paths =3D $(LINUX_TOOL_INCLUDE) $(LINUX_HDR_PATH) include = lib .. +FORCE: + +cscope: include_paths =3D $(LINUX_TOOL_INCLUDE) $(LINUX_HDR_PATH) include = lib .. \ + $(wildcard $(sort $(dir $(KVM_GEN_HDRS)))) cscope: $(RM) cscope.* (find $(include_paths) -name '*.h' \ diff --git a/tools/testing/selftests/kvm/include/x86/tdx/td_boot.h b/tools/= testing/selftests/kvm/include/x86/tdx/td_boot.h new file mode 100644 index 000000000000..bf2282931d49 --- /dev/null +++ b/tools/testing/selftests/kvm/include/x86/tdx/td_boot.h @@ -0,0 +1,66 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef SELFTEST_TDX_TD_BOOT_H +#define SELFTEST_TDX_TD_BOOT_H + +#include +#include + +/* + * Layout for boot section (not to scale) + * + * GPA + * _________________________________ 0x1_0000_0000 (4GB) + * | Boot code trampoline | + * |___________________________|____ 0x0_ffff_fff0: Reset vector (16B belo= w 4GB) + * | Boot code | + * |___________________________|____ td_boot will be copied here, so that = the + * | | jmp to td_boot is exactly at the rese= t vector + * | Empty space | + * | | + * |=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80| + * | | + * | | + * | Boot parameters | + * | | + * | | + * |___________________________|____ 0x0_ffff_0000: TD_BOOT_PARAMETERS_GPA + */ + +/* + * The exact memory layout for LGDT or LIDT instructions. + */ +struct __packed td_boot_parameters_dtr { + u16 limit; + u32 base; +}; + +/* + * Allows each vCPU to be initialized with different rip and esp. + */ +struct td_per_vcpu_parameters { + u32 esp_gva; + u64 guest_code; +}; + +/* + * Boot parameters for the TD. + * + * Unlike a regular VM, KVM cannot set registers such as esp, eip, etc + * before boot, so to run selftests, these registers' values have to be + * initialized by the TD. + * + * This struct is loaded in TD private memory at TD_BOOT_PARAMETERS_GPA. + * + * The TD boot code will read off parameters from this struct and set up t= he + * vCPU for executing selftests. + */ +struct td_boot_parameters { + u32 cr0; + u32 cr3; + u32 cr4; + struct td_boot_parameters_dtr gdtr; + struct td_boot_parameters_dtr idtr; + struct td_per_vcpu_parameters per_vcpu[]; +}; + +#endif /* SELFTEST_TDX_TD_BOOT_H */ diff --git a/tools/testing/selftests/kvm/lib/x86/tdx/td_boot_offsets.c b/to= ols/testing/selftests/kvm/lib/x86/tdx/td_boot_offsets.c new file mode 100644 index 000000000000..7f76a3585b99 --- /dev/null +++ b/tools/testing/selftests/kvm/lib/x86/tdx/td_boot_offsets.c @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-2.0 +#define COMPILE_OFFSETS + +#include + +#include "tdx/td_boot.h" + +static void __attribute__((used)) common(void) +{ + OFFSET(TD_BOOT_PARAMETERS_CR0, td_boot_parameters, cr0); + OFFSET(TD_BOOT_PARAMETERS_CR3, td_boot_parameters, cr3); + OFFSET(TD_BOOT_PARAMETERS_CR4, td_boot_parameters, cr4); + OFFSET(TD_BOOT_PARAMETERS_GDT, td_boot_parameters, gdtr); + OFFSET(TD_BOOT_PARAMETERS_IDT, td_boot_parameters, idtr); + OFFSET(TD_BOOT_PARAMETERS_PER_VCPU, td_boot_parameters, per_vcpu); + OFFSET(TD_PER_VCPU_PARAMETERS_ESP_GVA, td_per_vcpu_parameters, esp_gva); + OFFSET(TD_PER_VCPU_PARAMETERS_GUEST_CODE, td_per_vcpu_parameters, + guest_code); + DEFINE(SIZEOF_TD_PER_VCPU_PARAMETERS, + sizeof(struct td_per_vcpu_parameters)); +} --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (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 F20AC45D5E9 for ; Wed, 22 Jul 2026 23:14:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762067; cv=none; b=Fzq1rmRvyFvraE0XGfoS6BB26x19hgt6pg1xYAFQiMtzo2ljEhmWbfSxQ/unErM2F80Zk7eZTSrUBYnCVBDzNySqEBSyCAmUKdHP27Mq0PsWFxCzXnC1S4MfBEJ/YwctWQttY5c0BCh3zXcAn6z6FYRBbu6yA5+MpH+jC5u3W1g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762067; c=relaxed/simple; bh=2nZtselLGRQA+iGH9lWqBntxKtAC+MyMjj+0gP5igAE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=YDsmD7m6rfDVyOiWGtziCIVA+y6z7yd9qJhxX9NnvedKStYwfkBqZfodrU2akrfWdFSxq7/G81BkNXGFfTH2dCbtkWHXFpxbP8i3hZIfWoWsw2+YJCBbwR5SbUIBGU2iqY0ft6PvgvhmthA4Ab4++XoL/UW4/XDVOwU/A1p7J50= 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=kPJq7J+s; arc=none smtp.client-ip=209.85.214.199 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="kPJq7J+s" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2cacd6d37edso910445ad.0 for ; Wed, 22 Jul 2026 16:14:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762064; x=1785366864; darn=vger.kernel.org; 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=BHjIow7FRD/o8g9hVMX5NwnfmgyNmUnSSABYjO98n7Y=; b=kPJq7J+sxIMSOzmcu7SgGsNP1k+B6WrpwIme1+k1C7ercWnma2ugL7Ggl6aqOu6OAC Oxkh42+sXEzqC5eQKau9pirjlTYsLwEnbRlpcwwQAS9LeQjqVRTSOtlHYg5T4Kn/iVOE Q1IheUY7ed7RZGtVZ1TzOHuxF3gzRY4XYZg8hdBfzEQidGMtU/EAUwYwcDdSYBMqnetE bc+S/+vcKBTaBnDJ8eXHLPXPPqZsECVX2bp7uPMkpbp3JL2ETtaxnNzDIz+5wqW7c6xS FBnDYKiyAGq6SH9aDVJDPZHlKfGUqSqEpl/SZjmHwrvc7qRCvljQ6qbRtS+My/MPG+pk RdhA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762064; x=1785366864; 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=BHjIow7FRD/o8g9hVMX5NwnfmgyNmUnSSABYjO98n7Y=; b=PkTOY30s5rXrVZ9BzwmPpzClj4pyAYUmBcOTB6ZWKjutCyrgaIupGhWrUfPCB18m2w ADKG1SZNvPftrZVioiKYEB90RGu0zroUT7s6hQ+qJ7qcbvwznY9duNsGqv6c6MxkDr1s s90HAO7Ct3cz0wA1l0s5WzXBF6IqSq+WJA+aUZ02F5Df9tdmpT26kZrjGk3nLo0SGkH0 W+qRwvjQyr1w05ZmZ79kkTW1ncjXRJBn5uWxAdBVYshgYnlwjHBDa0nfz1+TahGv35U4 MMC1WQ1HwmFvVCpxRzkk6s36WmhbiH90vRyFb6fhcwx3cv68XtsaCYMyY8Pf5g3wL8Y2 nxaQ== X-Forwarded-Encrypted: i=1; AHgh+RqS8T2qfUkC6lmk831nJ9DgC7DQ02IsocQeyODylq4ilCmeqdk+sh74/osqo0wj0sdCgkmWicn0xRGbqUk=@vger.kernel.org X-Gm-Message-State: AOJu0Yz5kpm+njNvHwsaHe5fRJ/1/dYVyuoTokGTk+11+b/LytRAEuxJ m0JpLYlbRWVSgT4yqk4a2JmYFzdIHj7+aX5MMWEAcAdrlKg9k0+IAc/ma6fTeBd1KzzHypycQEd J0lMtXA== X-Received: from plpo3.prod.google.com ([2002:a17:903:3e03:b0:2ca:b8f5:2d26]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:f681:b0:2c9:cf5d:d9bc with SMTP id d9443c01a7336-2cfa74b13famr9003555ad.35.1784762064085; Wed, 22 Jul 2026 16:14:24 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:13 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=4661; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=nkYYec/Kj5J9dGXmWp9KVDsgzg3Lhpo8ptfotZieFvo=; b=9nFbAkjgrBrpCjn1Htarcq44COVIT6r0M3Rh5Jfk4tBIFtZ1wfV4g+2qidhFCsL4BlNEev3HK Api70IZ2v1/C4QZZOUqpmTSCmkTjRWxdeF7Q51i0ohVbAV/vVczBAXO X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-8-15ad654a50db@google.com> Subject: [PATCH v14 08/22] KVM: selftests: Add TDX boot code 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" Content-Transfer-Encoding: quoted-printable From: Erdem Aktas Add code to boot a TDX test VM. Since TDX registers are inaccessible to KVM, the boot code loads the relevant values from memory into the registers before jumping to the guest code. Reviewed-by: Binbin Wu Signed-off-by: Erdem Aktas Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng Co-developed-by: Sagi Shahar Signed-off-by: Sagi Shahar Signed-off-by: Lisa Wang --- tools/testing/selftests/kvm/Makefile.kvm | 1 + .../selftests/kvm/include/x86/tdx/td_boot.h | 22 ++++++-- tools/testing/selftests/kvm/lib/x86/tdx/td_boot.S | 61 ++++++++++++++++++= ++++ 3 files changed, 81 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selft= ests/kvm/Makefile.kvm index 397afebbb34b..645d9aac61db 100644 --- a/tools/testing/selftests/kvm/Makefile.kvm +++ b/tools/testing/selftests/kvm/Makefile.kvm @@ -32,6 +32,7 @@ LIBKVM_x86 +=3D lib/x86/svm.c LIBKVM_x86 +=3D lib/x86/tdx/tdx_util.c LIBKVM_x86 +=3D lib/x86/ucall.c LIBKVM_x86 +=3D lib/x86/vmx.c +LIBKVM_x86 +=3D lib/x86/tdx/td_boot.S =20 LIBKVM_arm64 +=3D lib/arm64/gic.c LIBKVM_arm64 +=3D lib/arm64/gic_v3.c diff --git a/tools/testing/selftests/kvm/include/x86/tdx/td_boot.h b/tools/= testing/selftests/kvm/include/x86/tdx/td_boot.h index bf2282931d49..89cf6c3485be 100644 --- a/tools/testing/selftests/kvm/include/x86/tdx/td_boot.h +++ b/tools/testing/selftests/kvm/include/x86/tdx/td_boot.h @@ -2,9 +2,6 @@ #ifndef SELFTEST_TDX_TD_BOOT_H #define SELFTEST_TDX_TD_BOOT_H =20 -#include -#include - /* * Layout for boot section (not to scale) * @@ -24,7 +21,19 @@ * | | * | | * |___________________________|____ 0x0_ffff_0000: TD_BOOT_PARAMETERS_GPA + * + * TD_BOOT_PARAMETERS_GPA is arbitrarily chosen to + * + * + be within the 4GB address space + * + provide enough contiguous memory for the struct td_boot_parameters su= ch + * that there is one struct td_per_vcpu_parameters for KVM_MAX_VCPUS */ +#define TD_BOOT_PARAMETERS_GPA 0xffff0000 + +#if !defined(__ASSEMBLY__) && !defined(__ASSEMBLER__) + +#include +#include =20 /* * The exact memory layout for LGDT or LIDT instructions. @@ -63,4 +72,11 @@ struct td_boot_parameters { struct td_per_vcpu_parameters per_vcpu[]; }; =20 +void td_boot(void); +void td_boot_code_end(void); + +#define TD_BOOT_CODE_SIZE (td_boot_code_end - td_boot) + +#endif /* !defined(__ASSEMBLY__) && !defined(__ASSEMBLER__) */ + #endif /* SELFTEST_TDX_TD_BOOT_H */ diff --git a/tools/testing/selftests/kvm/lib/x86/tdx/td_boot.S b/tools/test= ing/selftests/kvm/lib/x86/tdx/td_boot.S new file mode 100644 index 000000000000..bca9a4c3d8f8 --- /dev/null +++ b/tools/testing/selftests/kvm/lib/x86/tdx/td_boot.S @@ -0,0 +1,61 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include "tdx/td_boot.h" +#include "tdx/td_boot_offsets.h" +#include "processor_asm.h" + +.code32 + +.globl td_boot +td_boot: + /* + * In this procedure, edi is used as a temporary register. + * Paging is turned off. + */ + cli + + movl $TD_BOOT_PARAMETERS_GPA, %ebx + + /* + * Find the address of struct td_per_vcpu_parameters for this + * vCPU based on esi (TDX spec: initialized with vCPU id). Put + * struct address into register for indirect addressing. + */ + movl $SIZEOF_TD_PER_VCPU_PARAMETERS, %eax + mul %esi + leal TD_BOOT_PARAMETERS_PER_VCPU(%ebx), %edi + addl %edi, %eax + + /* Setup stack. */ + movl TD_PER_VCPU_PARAMETERS_ESP_GVA(%eax), %esp + + /* Setup GDT. */ + leal TD_BOOT_PARAMETERS_GDT(%ebx), %edi + lgdt (%edi) + + /* Setup IDT. */ + leal TD_BOOT_PARAMETERS_IDT(%ebx), %edi + lidt (%edi) + + /* + * Set up control registers (There are no instructions to mov from + * memory to control registers, hence use edi as a scratch register). + */ + movl TD_BOOT_PARAMETERS_CR4(%ebx), %edi + movl %edi, %cr4 + movl TD_BOOT_PARAMETERS_CR3(%ebx), %edi + movl %edi, %cr3 + movl TD_BOOT_PARAMETERS_CR0(%ebx), %edi + movl %edi, %cr0 + + /* Switching to 64bit mode after ljmp and then jump to guest code */ + ljmp $(KERNEL_CS),$1f +1: + jmp *TD_PER_VCPU_PARAMETERS_GUEST_CODE(%eax) + +/* Leave marker so size of td_boot code can be computed. */ +.globl td_boot_code_end +td_boot_code_end: + +/* Disable executable stack. */ +.section .note.GNU-stack,"",%progbits --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (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 25477459AEB for ; Wed, 22 Jul 2026 23:14:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762068; cv=none; b=jp9HH1y7PPv5PEK/i8dU+TV/F9K7c7zTO5vhxc/K4KJzWOg5uUpJ25lBVGYH4mvgXtfZphuN3SFV1yAn170k8c4FWpdxSARzpKlZ6PMS6AD4KAlzDJbeGxm3J6WGOFtdsgOVVuNVx2zGuxbk/Y0y6sinwvWa2HD4+G8NODIKF5Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762068; c=relaxed/simple; bh=nq+rGQSjfz69WWYgD4OukIBKqsD4IMbB46h0B8wIBqw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=kz9oTVUC40BhAPGlGj8mKRLw2qld6csyGkZ7XgRqM3X60PYw++EfW0NXINq4XTU7pbxX6Q5FfLmJ34eXDMPzYJ+LXqry0GGWR7srkRvYIe41JbqN5E0d5VcXtbQcYvwAd3JQI9jbXT4ZtUK12BgRfw0UarEEjOXfeBzUQUhqF2s= 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=WBzvq7mC; arc=none smtp.client-ip=209.85.214.197 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="WBzvq7mC" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2cc77a6943eso1831315ad.0 for ; Wed, 22 Jul 2026 16:14:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762065; x=1785366865; darn=vger.kernel.org; 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=IBwwN+PCRRt/xqJfZcQgxZJHRiT6JnsNy2fU/hkSPUs=; b=WBzvq7mCTjjAitnw8v9QVpcMl5dPzd/n0r6WItbTwt2x7aqDj02u5Qh1F7xSL3CzSp VMpKovIEGUs7RQT3LSfiQrc9uRYVk9TpEPWOpxpzN9RZmMDV+zk8zGwzUH9JfRA9qbTk KVOSlmB/hmlbXyQHbdrwiry4Onrlr8of2qMCcmtpOl8eAaKWcMLpCBgme8myTzOfLJoG 7/9zRvf0IW3nm19Wego6U1/Cz1Z+IAeEkj4ptv8lY9a6MTxnOd2dDOUrxRW+mCiuW1AR HhIp92TVIbtA/rh2ZpY75GowVjbiq5gd/E7te+UlSCbE43MbxmH5LNU/6ZB5j1w65TSG rFmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762065; x=1785366865; 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=IBwwN+PCRRt/xqJfZcQgxZJHRiT6JnsNy2fU/hkSPUs=; b=cV5lAj6itbv2BAjjdw4CVX/PKQf+Edsanfu9lLrICjUm3y0HaZVOKxfLksWPADjd0h FDM/u2hxtcfsmxvfT98cWVyaF9cHKrPpNN/8+hk5Z2VLXKmJgg3i3QgCISv6mRZYXJlP OKk6w4LZ+MSQvnuJMV3MYNthDTxU9IbdUA56HZLykrYuElITwNQDtySTdINBr48p1oJI L8ZTewnSEnDU40yKovZbJb7T2gHgYOKD6o5qm6BIRMDxHSVYhWhKVeSp6J2TftkNLXnw KKP+HPOhc6rvdZrfmD8StaSb3XuYlhm3EVG8lxNznSfsGIVsqn4BWPoXzvclsn4p6W3T pzbQ== X-Forwarded-Encrypted: i=1; AHgh+Rq2/6me0F79il9Lim1Yb/586zUhoPVtLFBt63QUlOwZSl0sxgysoLwV19zxXt5PPWrksKIq6tGf8h/4kDU=@vger.kernel.org X-Gm-Message-State: AOJu0YwV/wmSSXnhR8vkWDYeAEdtB/WYL/fw1ZzKVslOsHUoLiJvJjCq JP1w1klUpgoyF/rfT+ooETKo/s6ryz/b7/M2XWlGFhDCczjephLMhJdhzApLAIccW26VwYvtgAP G4BY6Rg== X-Received: from plgg20.prod.google.com ([2002:a17:902:c394:b0:2cb:14cf:72dc]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:1210:b0:2cc:aa36:c046 with SMTP id d9443c01a7336-2cfa71d950emr9446725ad.14.1784762065042; Wed, 22 Jul 2026 16:14:25 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:14 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=3389; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=bhsiRn8lBZBv3P1/M5hjiDEL+wbuc6DIjb+dyuyxMZk=; b=MjwJBpXr5slFqnNqNoqMOAbg5ESdyMWxsErXuis54CiqGGeWsfipYNb7xccaJwXQKWLISTVgd dWxezMqwjNfAHbOaYj52U89ipH/VMVqUmb4NRZY66JG1If0B76bbxuX X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-9-15ad654a50db@google.com> Subject: [PATCH v14 09/22] KVM: selftests: Expose functions to get default sregs values 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" Content-Transfer-Encoding: quoted-printable From: Sagi Shahar TDX can't set sregs values directly using KVM_SET_SREGS. Expose the default values of certain sregs used by TDX VMs so they can be set manually. Reviewed-by: Binbin Wu Signed-off-by: Sagi Shahar Reviewed-by: Ira Weiny Signed-off-by: Lisa Wang --- .../testing/selftests/kvm/include/x86/processor.h | 35 ++++++++++++++++++= ++++ tools/testing/selftests/kvm/lib/x86/processor.c | 20 ++++--------- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/tools/testing/selftests/kvm/include/x86/processor.h b/tools/te= sting/selftests/kvm/include/x86/processor.h index 76180dfaffea..7e00c9414595 100644 --- a/tools/testing/selftests/kvm/include/x86/processor.h +++ b/tools/testing/selftests/kvm/include/x86/processor.h @@ -29,6 +29,10 @@ extern u64 guest_tsc_khz; #define MAX_NR_CPUID_ENTRIES 100 #endif =20 +#ifndef NUM_INTERRUPTS +#define NUM_INTERRUPTS 256 +#endif + #define NONCANONICAL 0xaaaaaaaaaaaaaaaaull =20 /* Forced emulation prefix, used to invoke the emulator unconditionally. */ @@ -1564,4 +1568,35 @@ u64 *tdp_get_pte(struct kvm_vm *vm, u64 l2_gpa); =20 bool sys_clocksource_is_based_on_tsc(void); =20 +static inline u16 kvm_get_default_idt_limit(void) +{ + return NUM_INTERRUPTS * sizeof(struct idt_entry) - 1; +} + +static inline u16 kvm_get_default_gdt_limit(void) +{ + return getpagesize() - 1; +} + +static inline u64 kvm_get_default_cr0(void) +{ + return X86_CR0_PE | X86_CR0_NE | X86_CR0_PG; +} + +static inline u64 kvm_get_default_cr4(int pgtable_levels) +{ + u64 cr4 =3D X86_CR4_PAE | X86_CR4_OSFXSR; + + if (kvm_cpu_has(X86_FEATURE_XSAVE)) + cr4 |=3D X86_CR4_OSXSAVE; + if (pgtable_levels =3D=3D 5) + cr4 |=3D X86_CR4_LA57; + return cr4; +} + +static inline u64 kvm_get_default_efer(void) +{ + return EFER_LME | EFER_LMA | EFER_NX; +} + #endif /* SELFTEST_KVM_PROCESSOR_H */ diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testin= g/selftests/kvm/lib/x86/processor.c index 97acc5aaf7b7..ad75e19bb3a2 100644 --- a/tools/testing/selftests/kvm/lib/x86/processor.c +++ b/tools/testing/selftests/kvm/lib/x86/processor.c @@ -15,10 +15,6 @@ #include "tdx/tdx_util.h" #include "vmx.h" =20 -#ifndef NUM_INTERRUPTS -#define NUM_INTERRUPTS 256 -#endif - gva_t exception_handlers; bool host_cpu_is_amd; bool host_cpu_is_intel; @@ -647,17 +643,13 @@ static void vcpu_init_sregs(struct kvm_vm *vm, struct= kvm_vcpu *vcpu) vcpu_sregs_get(vcpu, &sregs); =20 sregs.idt.base =3D vm->arch.idt; - sregs.idt.limit =3D NUM_INTERRUPTS * sizeof(struct idt_entry) - 1; + sregs.idt.limit =3D kvm_get_default_idt_limit(); sregs.gdt.base =3D vm->arch.gdt; - sregs.gdt.limit =3D getpagesize() - 1; - - sregs.cr0 =3D X86_CR0_PE | X86_CR0_NE | X86_CR0_PG; - sregs.cr4 |=3D X86_CR4_PAE | X86_CR4_OSFXSR; - if (kvm_cpu_has(X86_FEATURE_XSAVE)) - sregs.cr4 |=3D X86_CR4_OSXSAVE; - if (vm->mmu.pgtable_levels =3D=3D 5) - sregs.cr4 |=3D X86_CR4_LA57; - sregs.efer |=3D (EFER_LME | EFER_LMA | EFER_NX); + sregs.gdt.limit =3D kvm_get_default_gdt_limit(); + + sregs.cr0 =3D kvm_get_default_cr0(); + sregs.cr4 |=3D kvm_get_default_cr4(vm->mmu.pgtable_levels); + sregs.efer |=3D kvm_get_default_efer(); =20 kvm_seg_set_unusable(&sregs.ldt); kvm_seg_set_kernel_code_64bit(&sregs.cs); --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (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 E1A9246A616 for ; Wed, 22 Jul 2026 23:14:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762068; cv=none; b=kE2OsNC5dj5msbT7+eH7fTn7gJ4Yz+YQWOjhtE3B1HDGYVyqpxPEicznyxPwsfQ7FkjELbC3XddLHks1cKDA4g05Ten+1tBH6ADtyQxNGFx/BYD4wVRKjYCmyAE/1/XDenGcpbvcZi+iDo38Sdw6/Qj74PoeFlB/J+MMRrhcqoY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762068; c=relaxed/simple; bh=uMJpVpNeOdwMaxoQvFL9M1BthKdmt9TO/QVPx01YhrU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=dfj94QQ9VvNZBOEoKM5Zy2PzphcD2AtMADfgjPokpYluZLc/PZflm+xHSyv/YEPKjsr5Fd/EJQ3O2+//yT2e/NEjxfzCt6mzDqFacp3jEMPSYdzITdexiER+SikAT4nQEmgZmGBIQDywB83uB5Kt0zDWi3JVHQQT/iFEcc9I9lI= 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=SCq5WiWH; arc=none smtp.client-ip=209.85.214.197 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="SCq5WiWH" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2ccafc5e82cso540275ad.3 for ; Wed, 22 Jul 2026 16:14:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762066; x=1785366866; darn=vger.kernel.org; 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=OZfCfgCc362FDxQaAsRRtIxEbjY1lDj4dpO1uwBrjGg=; b=SCq5WiWHsOoltgQDgaxa1fRSKLqzKoprHOL2hVS+1bkkYNZNpKXu3XkB5pl1slYwZ5 lqXU7l24SZoZfofS3jRBMLY1/huDh+zVj6/00NMALXYpHklymdObzSQs5UV0MJhfQVX4 3ELVtY4mTxLthG+S0yZkzyIiM6zWm4df+nGjtCOBwW8YB5qd7/IK8hDpuJ93GNf3ZnoL gYnWDLHRiHfc3IT3ltN363HAf9z2RYLYMy9weNBxzyD5hoyYXitu0EZCGrmcY3rxZpXf tgyMXDykpK9Z5mforwGavN2Fx1G9p4jbNpsdP7sAduMc3AuWIYfAWpcHSR2Xcpuql6sD 8hkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762066; x=1785366866; 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=OZfCfgCc362FDxQaAsRRtIxEbjY1lDj4dpO1uwBrjGg=; b=d9PveOedBG+nKjbscp85afqMbdLO1SZIqPtu2g9MPS93zUqsnFt4/v67z2z4+hutKJ lSEXYmzuZwaVzIUTHW8Rbp6p8CpoRnzAMbm9m/OhkDwMcL4DVBApMahAbgbLD7kP5c8S zBnGl6xkOAVAfoMoSqmkxvmVztkxaxRvIFQGWpPjUBMc5ofxiNcwxW0yMR5xXt4ern+q v0OIARYEpn73Ql7iIWqMOvT8agPd+HDKfJAjYc+AgCpayyccU0aZUzVxAFeaCDdw3kKQ ETLXIE/EP8iZWUiDYNWZmS4n7c0sRxOaeKdHO6kXZQis95GH3Vrey19oKLkbvhXid1SR scOA== X-Forwarded-Encrypted: i=1; AHgh+RqcnGyRg1wDIjT6uHYi13FdtzzI5q0Uw8m+A1nFr6Z6PECV/q4GU2dJXYkQEJizH3xwF5Z9FilTN+OgU3o=@vger.kernel.org X-Gm-Message-State: AOJu0Yztk34wrmmMGxHLxhWxUxdmDKqKWe2EDUyurHvgflhi8uZAhQSK tpjE9I4tDUI+5D3lMKaksyBxipGlFawaFOoZU7vNrweZsZU+rtxipabWBTWDQbgo8ozjnZpNCk2 rUTzJUg== X-Received: from plcm9.prod.google.com ([2002:a17:902:f209:b0:2cf:7342:ecfb]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ea05:b0:2c9:e9c7:2b59 with SMTP id d9443c01a7336-2cfa6c7569cmr9933285ad.35.1784762065950; Wed, 22 Jul 2026 16:14:25 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:15 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=4623; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=a5KKFZL0jXGvpSn59PVTTvyWAfVdsMJYuj2P3eOP+Iw=; b=VdXm08FD+Hm10IK7Q5OZXwNMUpOOjkshSUyqDMR+d/KSpGqd1+jni0/d7dOk78ipzaMlLxJiw 0I1AF/Dt+V/Dg0QnyN/jHpUlnCREVUpaq6w4xZAzE19Ka/Ixq8U1Fo+ X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-10-15ad654a50db@google.com> Subject: [PATCH v14 10/22] KVM: selftests: Set up TDX boot code region 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" Content-Transfer-Encoding: quoted-printable From: Sagi Shahar Add memory for TDX boot code in a separate memslot. Use virt_map() to get identity map in this memory region to allow for seamless transition from paging disabled to paging enabled code. Copy the boot code into the memory region and set up the reset vector at this point. While it's possible to separate the memory allocation and boot code initialization into separate functions, having all the calculations for memory size and offsets in one place simplifies the code and avoids duplications. Handcode the reset vector as suggested by Sean Christopherson. Reviewed-by: Binbin Wu Suggested-by: Sean Christopherson Co-developed-by: Erdem Aktas Signed-off-by: Erdem Aktas Signed-off-by: Sagi Shahar Signed-off-by: Lisa Wang --- .../selftests/kvm/include/x86/tdx/tdx_util.h | 1 + tools/testing/selftests/kvm/lib/x86/processor.c | 4 +- tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c | 46 ++++++++++++++++++= ++++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h b/tools= /testing/selftests/kvm/include/x86/tdx/tdx_util.h index eb8602dce0bc..642ffa010da3 100644 --- a/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h +++ b/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h @@ -45,5 +45,6 @@ static inline bool is_tdx_vm(struct kvm_vm *vm) }) =20 void tdx_init_vm(struct kvm_vm *vm, u64 attributes); +void tdx_vm_setup_boot_code_region(struct kvm_vm *vm); =20 #endif /* SELFTESTS_TDX_TDX_UTIL_H */ diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testin= g/selftests/kvm/lib/x86/processor.c index ad75e19bb3a2..f93953777ca1 100644 --- a/tools/testing/selftests/kvm/lib/x86/processor.c +++ b/tools/testing/selftests/kvm/lib/x86/processor.c @@ -791,8 +791,10 @@ void kvm_arch_vm_post_create(struct kvm_vm *vm, unsign= ed int nr_vcpus) vm_sev_ioctl(vm, KVM_SEV_INIT2, &init); } =20 - if (is_tdx_vm(vm)) + if (is_tdx_vm(vm)) { tdx_init_vm(vm, 0); + tdx_vm_setup_boot_code_region(vm); + } =20 r =3D __vm_ioctl(vm, KVM_GET_TSC_KHZ, NULL); TEST_ASSERT(r > 0, "KVM_GET_TSC_KHZ did not provide a valid TSC frequency= ."); diff --git a/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c b/tools/tes= ting/selftests/kvm/lib/x86/tdx/tdx_util.c index c01a26567b73..d64d153d19e2 100644 --- a/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c +++ b/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c @@ -1,8 +1,54 @@ // SPDX-License-Identifier: GPL-2.0-only =20 #include "processor.h" +#include "tdx/td_boot.h" #include "tdx/tdx_util.h" =20 +/* Arbitrarily selected to avoid overlaps with anything else */ +#define TD_BOOT_CODE_SLOT 20 + +#define X86_RESET_VECTOR 0xfffffff0ul +#define X86_RESET_VECTOR_SIZE 16 + +void tdx_vm_setup_boot_code_region(struct kvm_vm *vm) +{ + size_t total_code_size =3D TD_BOOT_CODE_SIZE + X86_RESET_VECTOR_SIZE; + gpa_t boot_code_gpa =3D X86_RESET_VECTOR - TD_BOOT_CODE_SIZE; + gpa_t alloc_gpa =3D round_down(boot_code_gpa, PAGE_SIZE); + size_t nr_pages =3D DIV_ROUND_UP(total_code_size, PAGE_SIZE); + const u64 gmem_flags =3D 0; + gpa_t gpa; + u8 *hva; + + vm_mem_add(vm, VM_MEM_SRC_SHMEM, alloc_gpa, TD_BOOT_CODE_SLOT, + nr_pages, KVM_MEM_GUEST_MEMFD, -1, 0, gmem_flags); + + gpa =3D vm_phy_pages_alloc(vm, nr_pages, alloc_gpa, TD_BOOT_CODE_SLOT); + TEST_ASSERT(gpa =3D=3D alloc_gpa, "Failed vm_phy_pages_alloc\n"); + + virt_map(vm, alloc_gpa, alloc_gpa, nr_pages); + hva =3D addr_gpa2hva(vm, boot_code_gpa); + memcpy(hva, td_boot, TD_BOOT_CODE_SIZE); + + hva +=3D TD_BOOT_CODE_SIZE; + TEST_ASSERT(hva =3D=3D addr_gpa2hva(vm, X86_RESET_VECTOR), + "Expected RESET vector at hva 0x%lx, got %lx", + (unsigned long)addr_gpa2hva(vm, X86_RESET_VECTOR), (unsigned long)hv= a); + + /* + * Handcode "JMP rel8" at the RESET vector to jump back to the TD boot + * code, as there are only 16 bytes at the RESET vector before RIP will + * wrap back to zero. Insert a trailing int3 so that the vCPU crashes in + * case the JMP somehow falls through. Note! The target address is + * relative to the end of the instruction! + */ + TEST_ASSERT(TD_BOOT_CODE_SIZE + 2 <=3D 128, + "TD boot code not addressable by 'JMP rel8'"); + hva[0] =3D 0xeb; + hva[1] =3D 256 - 2 - TD_BOOT_CODE_SIZE; + hva[2] =3D 0xcc; +} + static struct kvm_tdx_capabilities *tdx_read_capabilities(struct kvm_vm *v= m) { static struct kvm_tdx_capabilities *tdx_cap; --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) (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 CD9CD46AA8C for ; Wed, 22 Jul 2026 23:14:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.200 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762069; cv=none; b=KWEdZFw5QopUg0zRdMECt4XbGi9bM0XPsVC2hmewZiKrybiHeYQ9vIafkIVGMummYE/sCyXe8cevMXRBFtygFKLGKxGFBkE6rab1bsZjLlNe4gVv2DGaTPstRHjOh2kpqeBcV0g0Zi7+VREGb29rIXl8gR3TWGgcgt/LRJ9vLE8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762069; c=relaxed/simple; bh=zZzVrLnqgX5NCe2uXFsKt1T0XrTCHMmVN/7IIfMKdPo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=MwPN+SgMVbHw3pivlW3yBul/1JJ/vyubM0EqhO3ilJEUz7pgcCK/GLZTSPRKCKiI0W9Pula4SGAssiCe7xxcch1kyP5oM+sGcFTkloieVzI7kn8KFKXXuMARErEFYFp20ezVHFnkAD5gENI1LCJ7sfap3eTPksMGcG0lEYEvcy4= 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=GC8NWR4y; arc=none smtp.client-ip=209.85.210.200 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="GC8NWR4y" Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-84a251c2e3eso7489591b3a.1 for ; Wed, 22 Jul 2026 16:14:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762067; x=1785366867; darn=vger.kernel.org; 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=lGDAjh7yFH3A4fNogRP5xVRIbvOG+E+4bwq+sQxTTxs=; b=GC8NWR4ycFpgpS9b0eo3Aw67k0+pNnJ8jKzVFjpWXiM+VhkCKXdtnXyiA+Ui07suAe eXqvg5efpYAy1xnfa9iTjBZbdLkmeSLXSBVkaBiWi1bIroN4xKWsz9P/7LFN94n6kIRR UfIBMseC6qf6nYb6LdErfFJtmsoOO1+m5xEmXerbc6IZhMMkXC/C+BUkhYXPsdc7zxNh Rdo6IKVR2w1N1sX3jMNR+gEiz8uR+l9zFzGTerawIDxiTo5/oN3IlPaEIMjWAFVLQlYk resO/8+0KsXPe4OHIdZZQCFtmOPzywShchFdhuKWUqQfNXh57co5TF7LS1kkRItKfWyO eBNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762067; x=1785366867; 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=lGDAjh7yFH3A4fNogRP5xVRIbvOG+E+4bwq+sQxTTxs=; b=nBJ1lsPXSff/Q6QuBNvAIYWWNUUSe/vM0z9/ZTd6KjE3VElLjyBBU+KvM0lbvl9OBI r56Wy/IkY9gMSgSsrInUKf+22o70Qm8fiu2zyMp+Zlyg8VgLZM9E4xexluLi8oxo7SlN VQxuQAuGGiFOCG2GnDFq2LlL++CBGtrbv0UIeRKD3c34EKC95R9+jVCvZr2ULWA23ucr ZoVnvtRfu2m6lhzmLBbmo21wl7pZAkPeYDuYSlqVizZPi76k39jXaLLd3IKrbkFE+dtG 3GHfFHmB+9NnN3Yxaxmws3I9j9ZozmtOcLAyMwcroeqOcI0QgM/kefXrYzuOhgdDHtX7 xgIw== X-Forwarded-Encrypted: i=1; AHgh+Rrr/IZEPZygv2nCO80JjPvGAqjEVVL6vSw1oWCVE03fps2sW6ZuojwqZL8fw0cEA+6UmE98spm4dR3XG2w=@vger.kernel.org X-Gm-Message-State: AOJu0Yxjy2dXYwmYkipcaqa4eb0hMlZ7CabaCrpxgf6tfJ2DmNvw/bVJ QKMazpfMfiTIMBD9WNitBazPkK2Gl1a5sbTL+ufwount+zxows00bZx59ObUvfyoqDa0Lr1Si/i D5XmKqg== X-Received: from pgcv17.prod.google.com ([2002:a05:6a02:5311:b0:c93:59ff:8d6d]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:4a97:b0:3a2:c9a1:2c26 with SMTP id adf61e73a8af0-3c44c95c87bmr312696637.7.1784762066939; Wed, 22 Jul 2026 16:14:26 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:16 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=4491; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=P3owxtLsKMvv9okvSM89mKMQ3BM4k0MGM2Mh0dCe1uA=; b=62zD9UnHJb4hBmlcuiUbSAkoiFlVPJ3RSH5zmYrf06sE+0OJIjaJyfs2g2w8mdcK2zLz//sYZ 22kl9844njFBc+NDTJGIfUGPRgvH/RX3v53+wzJP4N/ROQjc6Ddq2rK X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-11-15ad654a50db@google.com> Subject: [PATCH v14 11/22] KVM: selftests: Set up TDX boot parameters region 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" Content-Transfer-Encoding: quoted-printable From: Sagi Shahar Allocate memory for TDX boot parameters and define the utility functions necessary to fill this memory with the boot parameters. Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng Signed-off-by: Sagi Shahar Signed-off-by: Lisa Wang --- .../selftests/kvm/include/x86/tdx/tdx_util.h | 2 + tools/testing/selftests/kvm/lib/x86/processor.c | 2 + tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c | 51 ++++++++++++++++++= ++++ 3 files changed, 55 insertions(+) diff --git a/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h b/tools= /testing/selftests/kvm/include/x86/tdx/tdx_util.h index 642ffa010da3..f5003cbaa106 100644 --- a/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h +++ b/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h @@ -46,5 +46,7 @@ static inline bool is_tdx_vm(struct kvm_vm *vm) =20 void tdx_init_vm(struct kvm_vm *vm, u64 attributes); void tdx_vm_setup_boot_code_region(struct kvm_vm *vm); +void tdx_vm_setup_boot_parameters_region(struct kvm_vm *vm, u32 nr_runnabl= e_vcpus); +void tdx_vm_load_common_boot_parameters(struct kvm_vm *vm); =20 #endif /* SELFTESTS_TDX_TDX_UTIL_H */ diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testin= g/selftests/kvm/lib/x86/processor.c index f93953777ca1..748c6041f8bf 100644 --- a/tools/testing/selftests/kvm/lib/x86/processor.c +++ b/tools/testing/selftests/kvm/lib/x86/processor.c @@ -794,6 +794,8 @@ void kvm_arch_vm_post_create(struct kvm_vm *vm, unsigne= d int nr_vcpus) if (is_tdx_vm(vm)) { tdx_init_vm(vm, 0); tdx_vm_setup_boot_code_region(vm); + tdx_vm_setup_boot_parameters_region(vm, nr_vcpus); + tdx_vm_load_common_boot_parameters(vm); } =20 r =3D __vm_ioctl(vm, KVM_GET_TSC_KHZ, NULL); diff --git a/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c b/tools/tes= ting/selftests/kvm/lib/x86/tdx/tdx_util.c index d64d153d19e2..2ce8c297f7ed 100644 --- a/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c +++ b/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c @@ -6,6 +6,7 @@ =20 /* Arbitrarily selected to avoid overlaps with anything else */ #define TD_BOOT_CODE_SLOT 20 +#define TD_BOOT_PARAMETERS_SLOT 21 =20 #define X86_RESET_VECTOR 0xfffffff0ul #define X86_RESET_VECTOR_SIZE 16 @@ -49,6 +50,56 @@ void tdx_vm_setup_boot_code_region(struct kvm_vm *vm) hva[2] =3D 0xcc; } =20 +void tdx_vm_setup_boot_parameters_region(struct kvm_vm *vm, u32 nr_runnabl= e_vcpus) +{ + size_t boot_params_size =3D + sizeof(struct td_boot_parameters) + + nr_runnable_vcpus * sizeof(struct td_per_vcpu_parameters); + int npages =3D DIV_ROUND_UP(boot_params_size, PAGE_SIZE); + const u64 gmem_flags =3D 0; + gpa_t gpa; + + vm_mem_add(vm, VM_MEM_SRC_SHMEM, TD_BOOT_PARAMETERS_GPA, + TD_BOOT_PARAMETERS_SLOT, npages, + KVM_MEM_GUEST_MEMFD, -1, 0, gmem_flags); + gpa =3D vm_phy_pages_alloc(vm, npages, TD_BOOT_PARAMETERS_GPA, TD_BOOT_PA= RAMETERS_SLOT); + TEST_ASSERT(gpa =3D=3D TD_BOOT_PARAMETERS_GPA, "Failed vm_phy_pages_alloc= \n"); + + virt_map(vm, TD_BOOT_PARAMETERS_GPA, TD_BOOT_PARAMETERS_GPA, npages); +} + +void tdx_vm_load_common_boot_parameters(struct kvm_vm *vm) +{ + struct td_boot_parameters *params =3D + addr_gpa2hva(vm, TD_BOOT_PARAMETERS_GPA); + u32 cr4; + + cr4 =3D kvm_get_default_cr4(vm->mmu.pgtable_levels); + + /* TDX spec 11.6.2: CR4 bit MCE is fixed to 1 */ + cr4 |=3D X86_CR4_MCE; + + /* TDX spec 11.6.2: CR4 bit VMXE and SMXE are fixed to 0 */ + cr4 &=3D ~(X86_CR4_VMXE | X86_CR4_SMXE); + + /* Set parameters! */ + params->cr0 =3D kvm_get_default_cr0(); + TEST_ASSERT(vm->mmu.pgd < (1ULL << 32), + "PGD must be within 32-bit address space for 32-bit boot code"); + params->cr3 =3D vm->mmu.pgd; + params->cr4 =3D cr4; + params->idtr.base =3D vm->arch.idt; + params->idtr.limit =3D kvm_get_default_idt_limit(); + params->gdtr.base =3D vm->arch.gdt; + params->gdtr.limit =3D kvm_get_default_gdt_limit(); + + TEST_ASSERT(params->cr0 !=3D 0, "cr0 should not be 0"); + TEST_ASSERT(params->cr3 !=3D 0, "cr3 should not be 0"); + TEST_ASSERT(params->cr4 !=3D 0, "cr4 should not be 0"); + TEST_ASSERT(params->gdtr.base !=3D 0, "gdt base address should not be 0"); + TEST_ASSERT(params->idtr.base !=3D 0, "idt base address should not be 0"); +} + static struct kvm_tdx_capabilities *tdx_read_capabilities(struct kvm_vm *v= m) { static struct kvm_tdx_capabilities *tdx_cap; --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (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 D3B4246C4D7 for ; Wed, 22 Jul 2026 23:14:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762070; cv=none; b=gLPfF7+HqjdQI09JUAFwVjfSTHFfKT0i6wTlo4Nm4rTL0xt2MnwlEAwFW/PAMFUCwoyq9xbGL/TiR+MFjHTLKqsLK3RRRR7yC5duHRJpLI8OSzL2ptk/Bi67ZeIPxWTYM7eoC6uhUoLcGqaXBFP7o90EWWLSn/AcINc+zYc0NDs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762070; c=relaxed/simple; bh=4m9jJUUx20HUvUYZ55bE2QIcvUUJfZhkkL8moJZpJhE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=b9BWXSIBEHOkI3x7dSkDvbdBJJ7smVkHCAu/uYplBG6+i9IK/8jgBN61XyMVLSiRtft8qiVBQuKW+Bh4T5w3FC2cFMhI2ES8k6oTsVLGlfi6jQaF4nRyfPjeUiq2j0wnmQWK+DKv0sutE+OP/ydRPN30hywFuyMJt7Ldtrg3tLw= 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=XETFDfpV; arc=none smtp.client-ip=209.85.214.199 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="XETFDfpV" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2cca3673560so902715ad.1 for ; Wed, 22 Jul 2026 16:14:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762068; x=1785366868; darn=vger.kernel.org; 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=tzvQ8jRcrNAd6P68kZVjEL1nagqI7IcvfUtkmDMDbV0=; b=XETFDfpV9M2/0uzLta/jTFq6ldAjOcf4iRYrzCTp7g2MwUeZPrK5o38hdIdYRY0zCa SaBaOBG9VDYPdzs3l3XLDmhGDRraTDGrsPkA3DpepgzlmzLsaxtQRwbSigIB0wDmGCqy n0fHGY6f2nir2v/jt8mj2rQ6h1Wa0245WFucFyy0pvnMJU+q2eLS/EDIkroqjV70f8BH ix+pcu+fqu4QOznWu/htTP3nWdi0EagVm/Q0U6PEJRV4M2kbxLRjT333YASBXidfXl6o z4sk+l8oyhzZ1zWyOzOapwMAm8OwfaaT4h37jwZBMkYRA5EWbaRJ7g9eEllvdgj4Z45v +niQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762068; x=1785366868; 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=tzvQ8jRcrNAd6P68kZVjEL1nagqI7IcvfUtkmDMDbV0=; b=fZbTE7O7lOXod3LLIsqwfBBoi/N+Aq3MLNGpuRvYOYZQzFKnXO3Q2nzocJocdXiQ3o S8JBIbqtoXJAuVOiHkdiyyN9iQ14WQ+2ds6CAPxbNliM2hf76LS87PPsOawaEpZs3yDi f5En5VimApl4CLmWcLheilsK3BVpQMuxha8ZVaf5riHr7gFZYMCD6SbFdG3Xre9LJF/C yNGJ6JWrYtZ+wggBUTGr179dg+tUkJK0sqZ21Ny4EQpgADFz1gI0L5/eQrhIGBjj9aMz xCyTUNmZGvk721EvXh5nymRlUuK+Syy5noXMkhhvsEZWNV25/PCH3+w9oCerL9SwP62X KwcQ== X-Forwarded-Encrypted: i=1; AHgh+RoafWzgjoUqq8gISuv7T9hONCvN8NcTX21FCNd9nZNx7cU+8lmrnb08x29vjx9/AA9NqeauBbtVm7BBmgI=@vger.kernel.org X-Gm-Message-State: AOJu0Yz/A/xLGQnQBPid75P5ZoJj/87K0uX6jeIie4bsrUZVS0SLB9eh feEBApaDVZ2kFXvupVSjnQqpQoXXgugDIJ3RrMEiaRnfJIDVd1alL1IC1Rhohv4zeQ4DEJGiKvR qEJlnVA== X-Received: from plhy6.prod.google.com ([2002:a17:902:d646:b0:2cb:97d4:2e28]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:fd88:b0:2ce:d1dc:1e1 with SMTP id d9443c01a7336-2cfa71ab679mr9360555ad.39.1784762067858; Wed, 22 Jul 2026 16:14:27 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:17 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=1977; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=4m9jJUUx20HUvUYZ55bE2QIcvUUJfZhkkL8moJZpJhE=; b=jg8wnH2/CuGyuZGXQUBITd5uixrwtWUIbt5Ngu1T63Xs2cmb4aRxg1YCojWtxgBJjdBYsn5Qr fz0QSonWIMsDUWf1LLIMyq278xjq2VOm5swBjhdtOOYYCIHx35W0MT/ X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-12-15ad654a50db@google.com> Subject: [PATCH v14 12/22] KVM: selftests: Require guest_memfd for TDX VMs 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" Content-Transfer-Encoding: quoted-printable Force guest_memfd for TDX VMs. KVM supports guest_memfd for TDX private memory. Without in-place conversion supports, all pages default attributes are private. Thus, set page to "shared" for shared pages. Signed-off-by: Lisa Wang --- tools/testing/selftests/kvm/lib/kvm_util.c | 2 +- tools/testing/selftests/kvm/lib/ucall_common.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 0b9d2d383bfa..4a48c4b42095 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -472,7 +472,7 @@ void kvm_set_files_rlimit(u32 nr_vcpus) static bool is_guest_memfd_required(struct vm_shape shape) { #ifdef __x86_64__ - return shape.type =3D=3D KVM_X86_SNP_VM; + return (shape.type =3D=3D KVM_X86_SNP_VM || shape.type =3D=3D KVM_X86_TDX= _VM); #else return false; #endif diff --git a/tools/testing/selftests/kvm/lib/ucall_common.c b/tools/testing= /selftests/kvm/lib/ucall_common.c index 029ce21f9f2f..c03dfc763172 100644 --- a/tools/testing/selftests/kvm/lib/ucall_common.c +++ b/tools/testing/selftests/kvm/lib/ucall_common.c @@ -27,6 +27,7 @@ static struct ucall_header *ucall_pool; =20 void ucall_init(struct kvm_vm *vm, gpa_t mmio_gpa) { + struct userspace_mem_region *region; struct ucall_header *hdr; struct ucall *uc; gva_t gva; @@ -37,6 +38,13 @@ void ucall_init(struct kvm_vm *vm, gpa_t mmio_gpa) hdr =3D (struct ucall_header *)addr_gva2hva(vm, gva); memset(hdr, 0, sizeof(*hdr)); =20 + region =3D vm_get_mem_region(vm, MEM_REGION_DATA); + if (region->region.flags & KVM_MEM_GUEST_MEMFD) { + size_t aligned_sz =3D align_up(sizeof(*hdr), vm->page_size); + + vm_mem_set_shared(vm, addr_gva2gpa(vm, gva), aligned_sz); + } + for (i =3D 0; i < KVM_MAX_VCPUS; ++i) { uc =3D &hdr->ucalls[i]; uc->hva =3D uc; --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (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 2F9894749D5 for ; Wed, 22 Jul 2026 23:14:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762083; cv=none; b=QWdMoeTwNPIoNejueOWWv11cbZyX9YAev++lT4I6fQN6DIicemEBdWmwbc7/CbQAFUw+NVJMmHrDoovary6/HBC/BTjD0zwFdZ6zCCoBrHoMYYjAWonJase4Fr8U+dmtilqgqKjDQCf/ScyoR+nEiqKlOxCzSYko2Fuk1LIzCoA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762083; c=relaxed/simple; bh=VFBJ0t/KYzCs2iOyhhGs1fkC9wa+psmJ3ukTJr6kCV8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=GDeuGX1cl2itfk6iSHN7QpiDKWHDYyfueXctlcjNiOYY6bsaOGYa56WHa+ghk0MrUZmJdUWLhXJkuRMVGKGr7LP6bnjOmTrduqdoWEmOHzjP113Efrf394BBF5jv3suJKNRcBfP2Eimp+IrSX0MX5++vvVcosh9FhYAK1ettQu0= 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=D5ilMUO7; arc=none smtp.client-ip=209.85.214.199 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="D5ilMUO7" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2cf6acd760cso588855ad.3 for ; Wed, 22 Jul 2026 16:14:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762081; x=1785366881; darn=vger.kernel.org; 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=hvtcY/6dFCZntPWOUjpqqoF1u1G6R7N65DKzf2Q1vxo=; b=D5ilMUO7jh7HTP9H9xBl5GS6adDer7y6ilUCe49DaAXTsZMNe0jl+K2OYx/HLCtzxj BpwJORpgXlKtkvLctpdW/DP9yWxbeRo33vdCXtXSKmmxqcHFU5XZZgPui5o4EUh+yLCl G09ywhqx3g7fb4vN0rfUkrQiRsqiKrUvddJFKqj6QNwOli1kWbTa5eB3U3gdXejLwW+4 nHR4Z6tYuFP1Ef4y79GbYPHbFLsgt6HZQgp1tw+KMM2oXBhA63QI8acuA0PYFsIGd+a2 8wUiZziZv5xpdHgTDeqXLWOqxvn5ScpRks8L8HV9d2ejgwUcXm8Ro0mheemd3nh1Fsbn C+EQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762081; x=1785366881; 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=hvtcY/6dFCZntPWOUjpqqoF1u1G6R7N65DKzf2Q1vxo=; b=ZSaJFzk+VnSwko/yE/Wvz/DESetQV/q8D81meoev2/az+QgacLjgVyhJ8rbXePNoi/ 10NjKBcLUMya23MsOHyOqJFJWB+l9kBTjXLsEsHSHR4umKr96WLnKBhD+ukOd1xZNlIP KzN2rMikPJUSs9F+SZkvnTSZS59rEPp/P03QAhCesgkbUXDHfOUhFSBG/Y8KA/8MP/YF ZCVX2QWzgdScYt2UkCPPtxoFTaTAcsPJ7U4FGh9psGqApWmzpYaNwnuwaN1tJfGTitXF 6eGfEeEvPM8Y+wt3aM1KOSwiVbGjp/GXD+SAge6nt/9GDf9SWL30vopkunnUDMImIbYm 7LpA== X-Forwarded-Encrypted: i=1; AHgh+RrK1BtNUP2QkWgQhYjMP53QLLzk1bwdnlYdRxT7PWtaYlnPF3rBH8ozLAswxyoAah1GwhhfDZ/fdbqbV5o=@vger.kernel.org X-Gm-Message-State: AOJu0YywYAqMIaNqYKiNNeSoVG3R9v1ELoK4TKj4AvHokPnOOerLB4+D zPiqxOxIfeIzoFtr8vGFvV078qxYDqpMbM9qwSpJSJ+093tCovcs4+AfS2wSvuegZbBHxKiINWv tyMfGnQ== X-Received: from plbms3.prod.google.com ([2002:a17:903:ac3:b0:2ca:e163:e0c8]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:e748:b0:2c9:b8b7:5d27 with SMTP id d9443c01a7336-2cfa6a4f988mr10057535ad.1.1784762068777; Wed, 22 Jul 2026 16:14:28 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:18 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=3672; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=VFBJ0t/KYzCs2iOyhhGs1fkC9wa+psmJ3ukTJr6kCV8=; b=VhHaHVb0I75TaoDJIEAtXtpsU7m6/ncrsMDtWYFpT14qUn134qFdM73dltqi2aFGrCgNQByvn fazU2D+Dgo1Bd/meIx1oMboFmwZ2EQQh9HMJmeWqDkUPlBKETqAPkub X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-13-15ad654a50db@google.com> Subject: [PATCH v14 13/22] KVM: selftests: Support guest_memfd in-place conversion 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" Content-Transfer-Encoding: quoted-printable Set the memory region as shared if guest_memfd in-place conversion is support, so that the KVM selftest framework functions can populate mmap()-ed guest_memfd memory the same way memory from other memory providers are populated. For CoCo VMs, pages that need to be private are explicitly set to private before executing the VM. Signed-off-by: Lisa Wang --- tools/testing/selftests/kvm/lib/kvm_util.c | 20 ++++++++++++++----= -- tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c | 8 ++++++-- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 4a48c4b42095..e547ea341ff7 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -484,8 +484,10 @@ struct kvm_vm *__vm_create(struct vm_shape shape, u32 = nr_runnable_vcpus, u64 nr_pages =3D vm_nr_pages_required(shape.mode, nr_runnable_vcpus, nr_extra_pages); struct userspace_mem_region *slot0; + u64 gmem_flags =3D 0; struct kvm_vm *vm; - int i, flags; + int flags =3D 0; + int i; =20 kvm_set_files_rlimit(nr_runnable_vcpus); =20 @@ -495,14 +497,20 @@ struct kvm_vm *__vm_create(struct vm_shape shape, u32= nr_runnable_vcpus, vm =3D ____vm_create(shape); =20 /* - * Force GUEST_MEMFD for the primary memory region if necessary, e.g. - * for CoCo VMs that require GUEST_MEMFD backed private memory. + * Force GUEST_MEMFD for the primary memory region if necessary, and + * initialize it as shared if in-place conversion is support, so the + * selftest framework can populate it exactly like other memory + * providers. */ - flags =3D 0; - if (is_guest_memfd_required(shape)) + if (is_guest_memfd_required(shape)) { flags |=3D KVM_MEM_GUEST_MEMFD; + if (kvm_has_gmem_attributes) + gmem_flags |=3D GUEST_MEMFD_FLAG_INIT_SHARED | + GUEST_MEMFD_FLAG_MMAP; + } =20 - vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, 0, 0, nr_pages, fla= gs); + vm_mem_add(vm, VM_MEM_SRC_ANONYMOUS, 0, 0, nr_pages, flags, + -1, 0, gmem_flags); for (i =3D 0; i < NR_MEM_REGIONS; i++) vm->memslots[i] =3D 0; =20 diff --git a/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c b/tools/tes= ting/selftests/kvm/lib/x86/tdx/tdx_util.c index 2ce8c297f7ed..5bbe51ad0f66 100644 --- a/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c +++ b/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c @@ -17,10 +17,12 @@ void tdx_vm_setup_boot_code_region(struct kvm_vm *vm) gpa_t boot_code_gpa =3D X86_RESET_VECTOR - TD_BOOT_CODE_SIZE; gpa_t alloc_gpa =3D round_down(boot_code_gpa, PAGE_SIZE); size_t nr_pages =3D DIV_ROUND_UP(total_code_size, PAGE_SIZE); - const u64 gmem_flags =3D 0; + u64 gmem_flags =3D 0; gpa_t gpa; u8 *hva; =20 + if (kvm_has_gmem_attributes) + gmem_flags |=3D GUEST_MEMFD_FLAG_INIT_SHARED | GUEST_MEMFD_FLAG_MMAP; vm_mem_add(vm, VM_MEM_SRC_SHMEM, alloc_gpa, TD_BOOT_CODE_SLOT, nr_pages, KVM_MEM_GUEST_MEMFD, -1, 0, gmem_flags); =20 @@ -56,9 +58,11 @@ void tdx_vm_setup_boot_parameters_region(struct kvm_vm *= vm, u32 nr_runnable_vcpu sizeof(struct td_boot_parameters) + nr_runnable_vcpus * sizeof(struct td_per_vcpu_parameters); int npages =3D DIV_ROUND_UP(boot_params_size, PAGE_SIZE); - const u64 gmem_flags =3D 0; + u64 gmem_flags =3D 0; gpa_t gpa; =20 + if (kvm_has_gmem_attributes) + gmem_flags |=3D GUEST_MEMFD_FLAG_INIT_SHARED | GUEST_MEMFD_FLAG_MMAP; vm_mem_add(vm, VM_MEM_SRC_SHMEM, TD_BOOT_PARAMETERS_GPA, TD_BOOT_PARAMETERS_SLOT, npages, KVM_MEM_GUEST_MEMFD, -1, 0, gmem_flags); --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pg1-f197.google.com (mail-pg1-f197.google.com [209.85.215.197]) (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 CC325470127 for ; Wed, 22 Jul 2026 23:14:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762075; cv=none; b=Cjn9crOxmj6shcLGiLloDs/I+H5Vfs+Jpxbc0njSqgE9pW+B11e897z5DfoilC+bYL1h/0ND8KqROjqt59XMt4ftbqQEo5e2fUKgcrqqthap/G6GGDdj9YAeRHn+fx1BJO4UY1yKqL2NdS4t+wb61qJ9zP1aNGzynP3jj/6sm88= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762075; c=relaxed/simple; bh=RSswLO4sPBgFvowrW2cB2ZwYWDNA3GkGtc6qyyhOGRE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=AzM3weQ30tZozJkF5v57j4LR+BHEbv0F41SVLzCeaUJNlwTlhWosVs8WSfV/MNIJJqMXGEqWRnA45TJdBtoVTgMwVJl9g1IZxOGN7w0IuGDb2AZbiY9OqatikEE3b0CKs+J2Ud4/8ZguPsIsra7BfxZ6qXHqJE65YcxPq8vxTqQ= 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=ksZ3rwdD; arc=none smtp.client-ip=209.85.215.197 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="ksZ3rwdD" Received: by mail-pg1-f197.google.com with SMTP id 41be03b00d2f7-cbb92868263so88957a12.2 for ; Wed, 22 Jul 2026 16:14:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762072; x=1785366872; darn=vger.kernel.org; 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=lwqV7gcRQG0nFUaQrTilJBRN8gkgEZ+YbIjfOqZXofI=; b=ksZ3rwdD+A6r1aVl+jEKuJx0zTs/E161KCsJwGNDnsKpAXJOmTwjnaL8bKoRLb3a0q UIAkgO7QPZyYkOW7ADEW8QTRgPlOC49X1InS4F7y2HWA7Rrf1fVy09KqvtcbJQBjqnrI Ub3Rlw4Jy6OiTvyLuVT/AAqM2dC8hyzHfMutGAHtgcT6Qo0epJj7x3NiVTKywdFJ2wKX Y32lIMnkBKcWpBoPmxlAs3hLUsDUB/tVutz1vvyRn+EmFn5pMeyGkLVl+e/2SyPWJ8CS kxyYh1FnESz3RBHnyAK6jDfQ/rUCC+Yr6SSkS4CLP1rk+E9YwsI+m6Evkt4x0Pk75Zgh 8t6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762072; x=1785366872; 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=lwqV7gcRQG0nFUaQrTilJBRN8gkgEZ+YbIjfOqZXofI=; b=LTxSiWar86wxaq/Dr2WqWdvydAEXKkdYMx0luc/0UxeP5eC0Kti28Qo/kmWaENQOaK id+cyfEu1Ks5leUyTUoutteddgIkyyjNtJI2BPAkBlxIhes1FQhUZTee63vXr2zgR3H5 AhhnnwSPa6xU5t4rXTaginMWAnAXRv7kCbkiU8OsSPoHZS+axZ+sGpm1tNl9GZ3tOq9R M7kTouk5kHv6pskPRQ6FERR8tI6R5pl2aA8/z9gw2wKHbHYej7LYTk53I7tiIciIpSre RcOnABkA/pjIZEfxx5hOgE4n5jpPHmC/9WcXhffGSGhIw//iXXsnr4sxRnhCA2VQgE/M QK4Q== X-Forwarded-Encrypted: i=1; AHgh+RpjwAu1lljAB9mwKvCUVhF8XwnZQ+KFDWswrUHMz6zPjFAjQGLsU4d0XWI0l2IACkG0T5dHCJeo9RraE24=@vger.kernel.org X-Gm-Message-State: AOJu0YyeGKeX3RMjX1LNTa0EMrXmFhlcCGmKBM7SjTZ21uIMFkQVlWQZ /4QzZr8Mkf3Dr6XnRgy7fnv/IHGPCn/zp7v3kGh3OQMqEKGuuS/cy4jMhcT6Ccnj/3B9x4UJ8Dg nzhw5JQ== X-Received: from pgr15.prod.google.com ([2002:a63:114f:0:b0:c96:4c5b:dcb8]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:72a0:b0:3b5:4fff:fa0f with SMTP id adf61e73a8af0-3c44afb58dbmr533802637.14.1784762071639; Wed, 22 Jul 2026 16:14:31 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:19 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=3023; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=rHXAM3z5iBMuIUFttYkcIVu3B5Hjw4iTtMgyHIwbXEU=; b=620Ll51aNeaTFs40pgGcJMM6v44aJCfl+IG/XbXAFX+HpW8LoMl5/r7FljDHnt5RWx9ADE6zE Pxy7Ld/XSGrD5r0tZuuzzywD4RXSEEQkLna8RP4etzM0nq25p37vQud X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-14-15ad654a50db@google.com> Subject: [PATCH v14 14/22] KVM: selftests: Expose function to allocate vCPU stack 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" Content-Transfer-Encoding: quoted-printable From: Sagi Shahar Introduce kvm_allocate_vcpu_stack() to allocate a vCPU's stack in preparation for TDX to allocate a vCPU's stack and initialize its stack pointer. TDX VMs' registers are protected state and cannot be initialized using the KVM_SET_REGS ioctl() that is used for normal VMs. A TDX vCPU's stack address will be a property of the TDX specific boot code that initializes the vCPUs' stack pointers at boot. Reviewed-by: Binbin Wu Signed-off-by: Sagi Shahar Reviewed-by: Ira Weiny Signed-off-by: Lisa Wang --- tools/testing/selftests/kvm/include/x86/processor.h | 2 ++ tools/testing/selftests/kvm/lib/x86/processor.c | 16 +++++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/kvm/include/x86/processor.h b/tools/te= sting/selftests/kvm/include/x86/processor.h index 7e00c9414595..ff3219edab44 100644 --- a/tools/testing/selftests/kvm/include/x86/processor.h +++ b/tools/testing/selftests/kvm/include/x86/processor.h @@ -1144,6 +1144,8 @@ static inline void vcpu_clear_cpuid_feature(struct kv= m_vcpu *vcpu, vcpu_set_or_clear_cpuid_feature(vcpu, feature, false); } =20 +gva_t kvm_allocate_vcpu_stack(struct kvm_vm *vm); + u64 vcpu_get_msr(struct kvm_vcpu *vcpu, u64 msr_index); int _vcpu_set_msr(struct kvm_vcpu *vcpu, u64 msr_index, u64 msr_value); =20 diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testin= g/selftests/kvm/lib/x86/processor.c index 748c6041f8bf..8f8bb90fec35 100644 --- a/tools/testing/selftests/kvm/lib/x86/processor.c +++ b/tools/testing/selftests/kvm/lib/x86/processor.c @@ -813,12 +813,9 @@ void vcpu_arch_set_entry_point(struct kvm_vcpu *vcpu, = void *guest_code) vcpu_regs_set(vcpu, ®s); } =20 -struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, u32 vcpu_id) +gva_t kvm_allocate_vcpu_stack(struct kvm_vm *vm) { - struct kvm_mp_state mp_state; - struct kvm_regs regs; gva_t stack_gva; - struct kvm_vcpu *vcpu; =20 stack_gva =3D __vm_alloc(vm, DEFAULT_STACK_PGS * getpagesize(), DEFAULT_GUEST_STACK_VADDR_MIN, MEM_REGION_DATA); @@ -838,6 +835,15 @@ struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, u= 32 vcpu_id) "__vm_alloc() did not provide a page-aligned address"); stack_gva -=3D 8; =20 + return stack_gva; +} + +struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, u32 vcpu_id) +{ + struct kvm_mp_state mp_state; + struct kvm_vcpu *vcpu; + struct kvm_regs regs; + vcpu =3D __vm_vcpu_add(vm, vcpu_id); vcpu_init_cpuid(vcpu, kvm_get_supported_cpuid()); vcpu_init_sregs(vm, vcpu); @@ -846,7 +852,7 @@ struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, u3= 2 vcpu_id) /* Setup guest general purpose registers */ vcpu_regs_get(vcpu, ®s); regs.rflags =3D regs.rflags | 0x2; - regs.rsp =3D stack_gva; + regs.rsp =3D kvm_allocate_vcpu_stack(vm); vcpu_regs_set(vcpu, ®s); =20 /* Setup the MP state */ --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) (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 095F1476CDC for ; Wed, 22 Jul 2026 23:14:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.200 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762091; cv=none; b=nVeSgSb/HocmIWheOO4BK2cGBoodVIh2KApDDi5LTihxpBTN6nb39SI0AGc5LgwCZaDKxokUiC10QLlzKgXjAuk7ys0mhtygMqE+UfWAonDvQfBFMpC6qQnNTrrScrQTQa42QKp0NfJQJiGmfNR3NfcuCFnTEHBNpBusbPInlJY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762091; c=relaxed/simple; bh=85nJ9/hYOiJ96H11w7YE6HgvAK/atu2QWkFdBC4kTTk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=LfmsVVKYId5d3wuerV+bcZaf83La5GMQL6DNwoREuWmXYJxYuaUDSmg7bwZRlhJMM1H46KUQCOzqlbigytyK9gs74ahDAXmIwryrT+/xscp0CQDCVyfDLli43Aps518tCeW3/a0TcJkXaqP9ClXKGTqthCHk4TNtZ72ctb6/lks= 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=sM+MjPkA; arc=none smtp.client-ip=209.85.214.200 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="sM+MjPkA" Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2ccb6823efcso468755ad.0 for ; Wed, 22 Jul 2026 16:14:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762089; x=1785366889; darn=vger.kernel.org; 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=fZLWKI1tlBYiW8AamRHdf/1OfHZxF/vT4pGO9bOW1EQ=; b=sM+MjPkAzYO8RBeo4MfUuoKz+PDLNGMrME7HF5M98S8mE0JW1fIxAFPqOa7Tozpyjk Vm8Armv7TAZBIQNEBynqYGOHFgRwD1ge/W3kNu+yyYL6T0VSnvsmpgBh8RzcsJ3As2lk 35DfT7QXWl5cjGws67w+PPne+WFK15J8DzT0f1ZN080n1aKi2gh3sp38UmcUulW1OrE8 HM2vNUrgkqW/Gh4xmwzl21e2sUg91jjkWj9eC35p6DV/KiOIY7QoKR7OZBKcEHPVrWyo N5sj9cgwSKlTVNUJNRtKzPLqhnU7eKIE/cCYzF3ch6qP3nhCBxSeWVHkjhaqEUC+V3uD eXOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762089; x=1785366889; 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=fZLWKI1tlBYiW8AamRHdf/1OfHZxF/vT4pGO9bOW1EQ=; b=mOX8XgPYQMZaC9j+7tyCemIK+3JEXfkJJH5hbplLXUqsH4ugH28OLCsTxrlJCHOFyn s4qowmZMAKH8cIUrvsOGFEeBiSINhlKZq/w2OG5GzNaSwR41/pw4N2U8ZRAiawDF1afU C+Q//XyjXNou1zBdrTxZ5JvhywTj/mUovo+U6HiX5Zd93YmeFEI/2pk5+EATGlk8US1m 6MIjs3rSwBcW9j01C8DVGhv33PnSvNYbMlKTwjzV6+2gZabopzjOyYBc25FeavmBzn0h HDOf2nis31e9ajG/9iw6ovP4xsGon/ueM+jvxvUl0TxIrFAODrYB5m6XVyX0Bthfo93U ijlA== X-Forwarded-Encrypted: i=1; AHgh+RpxWRoxsynal3jkFe/5YxU6CH7jRwfQkygbGt5i0c/iaUxqagOyMkQ6ySNybWU/9bsXOVO2LvaSwnkGnDU=@vger.kernel.org X-Gm-Message-State: AOJu0YzTswZmmj2Vmv8Eq9UeicQbK+jBpZZAe6ghP9LKUYxPhIcTnWRT pO/ea1a00SAsPVuJRWkNriYQt9Qu6K51hxQEAwIjyBn1TtPjq2aMOCmhmKMwEHIC+Teio2As2vU dzGPxww== X-Received: from plbku3.prod.google.com ([2002:a17:903:2883:b0:2bf:8db:4516]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ecd0:b0:2c6:9f6a:9f6f with SMTP id d9443c01a7336-2cfa6c66734mr9553835ad.28.1784762072595; Wed, 22 Jul 2026 16:14:32 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:20 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=3521; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=xqpuRNldDHsQw4caqxUrdj/Q5OmHfnukgRI/kPmbKvA=; b=lro9gw6spAzyLdUzV3VuSRQIK+ZItJCg11HfLCf1lzHdMGraZlgSyxEOVHfijLoItxsnTtGLy nqcpK0M8FOyAze6f36y/Zonp0LYbMf4Ht+uI3WjVyWGfhWGCj7xCKum X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-15-15ad654a50db@google.com> Subject: [PATCH v14 15/22] KVM: selftests: Call KVM_TDX_INIT_VCPU when creating a new TDX vcpu 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" Content-Transfer-Encoding: quoted-printable From: Sagi Shahar TDX VMs need to issue the KVM_TDX_INIT_VCPU ioctl for each vcpu after vcpu creation. Since the cpuids for TD are managed by the TDX module, read the values virtualized for the TD using KVM_TDX_GET_CPUID and set them in kvm using KVM_SET_CPUID2 so that kvm has an accurate view of the VM cpuid values. Signed-off-by: Sagi Shahar Signed-off-by: Lisa Wang --- .../selftests/kvm/include/x86/tdx/tdx_util.h | 21 ++++++++++++++ tools/testing/selftests/kvm/lib/x86/processor.c | 33 ++++++++++++++++--= ---- 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h b/tools= /testing/selftests/kvm/include/x86/tdx/tdx_util.h index f5003cbaa106..07e7f5c90329 100644 --- a/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h +++ b/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h @@ -44,6 +44,27 @@ static inline bool is_tdx_vm(struct kvm_vm *vm) } \ }) =20 +#define __tdx_vcpu_ioctl(vcpu, cmd, _flags, arg) \ +({ \ + union { \ + struct kvm_tdx_cmd c; \ + unsigned long raw; \ + } tdx_cmd =3D { .c =3D { \ + .id =3D (cmd), \ + .flags =3D (u32)(_flags), \ + .data =3D (u64)(arg), \ + } }; \ + \ + __vcpu_ioctl(vcpu, KVM_MEMORY_ENCRYPT_OP, &tdx_cmd.raw); \ +}) + +#define tdx_vcpu_ioctl(vcpu, cmd, flags, arg) \ +({ \ + int ret =3D __tdx_vcpu_ioctl(vcpu, cmd, flags, arg); \ + TEST_ASSERT(!ret, "%s failed, errno: %d (%s)", \ + #cmd, errno, strerror(errno)); \ +}) + void tdx_init_vm(struct kvm_vm *vm, u64 attributes); void tdx_vm_setup_boot_code_region(struct kvm_vm *vm); void tdx_vm_setup_boot_parameters_region(struct kvm_vm *vm, u32 nr_runnabl= e_vcpus); diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testin= g/selftests/kvm/lib/x86/processor.c index 8f8bb90fec35..f6a2aa6b86a4 100644 --- a/tools/testing/selftests/kvm/lib/x86/processor.c +++ b/tools/testing/selftests/kvm/lib/x86/processor.c @@ -838,6 +838,17 @@ gva_t kvm_allocate_vcpu_stack(struct kvm_vm *vm) return stack_gva; } =20 +static void tdx_vcpu_init(struct kvm_vm *vm, struct kvm_vcpu *vcpu) +{ + struct kvm_cpuid2 *cpuid; + + cpuid =3D allocate_kvm_cpuid2(MAX_NR_CPUID_ENTRIES); + tdx_vcpu_ioctl(vcpu, KVM_TDX_GET_CPUID, 0, cpuid); + vcpu_init_cpuid(vcpu, cpuid); + free(cpuid); + tdx_vcpu_ioctl(vcpu, KVM_TDX_INIT_VCPU, 0, NULL); +} + struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, u32 vcpu_id) { struct kvm_mp_state mp_state; @@ -845,15 +856,21 @@ struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, = u32 vcpu_id) struct kvm_regs regs; =20 vcpu =3D __vm_vcpu_add(vm, vcpu_id); - vcpu_init_cpuid(vcpu, kvm_get_supported_cpuid()); - vcpu_init_sregs(vm, vcpu); - vcpu_init_xcrs(vm, vcpu); =20 - /* Setup guest general purpose registers */ - vcpu_regs_get(vcpu, ®s); - regs.rflags =3D regs.rflags | 0x2; - regs.rsp =3D kvm_allocate_vcpu_stack(vm); - vcpu_regs_set(vcpu, ®s); + if (is_tdx_vm(vm)) { + tdx_vcpu_init(vm, vcpu); + } else { + vcpu_init_cpuid(vcpu, kvm_get_supported_cpuid()); + + vcpu_init_sregs(vm, vcpu); + vcpu_init_xcrs(vm, vcpu); + + /* Setup guest general purpose registers */ + vcpu_regs_get(vcpu, ®s); + regs.rflags =3D regs.rflags | 0x2; + regs.rsp =3D kvm_allocate_vcpu_stack(vm); + vcpu_regs_set(vcpu, ®s); + } =20 /* Setup the MP state */ mp_state.mp_state =3D 0; --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (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 7FD2445D5C9 for ; Wed, 22 Jul 2026 23:14:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762076; cv=none; b=orlqp+7gpKms4I5HTlFFGXfg/1foCp4sjfKeuYcYRPIGtbN4Aba8qPLaDuVacdwDqOu50mAa4Mj03fsEF+yTWzfLCIfxdJV5Csvp7OuR1sWN/UhFvQjXMDsdRsDCuGyp8g6CQRtgDTAjDGKTDAQYBGOIRBNNN/B+KNQbkFoI0B4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762076; c=relaxed/simple; bh=wI5qPNx3qO7Pa3sc6McN5K8dBR/xnHmQ0Ews33+IkIc=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=gb1S7zPjy9kVGJmwGrKeegKhq4VezKk/zA1EU+NwGH1H8u5uGpbPPLRsFKwxifyqZsrPoxYl/XhbypLE/qN/5STvb/Mf+hv2nl2eTNBdrOtUS5UgQmpL4+sxG846DKtTwFNfRQGi31vIbwMvePLKjZw79KD6kXO36AhekDBrDdg= 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=v5wMbhGm; arc=none smtp.client-ip=209.85.214.197 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="v5wMbhGm" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2cca5e0a0c9so980185ad.1 for ; Wed, 22 Jul 2026 16:14:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762074; x=1785366874; darn=vger.kernel.org; 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=LZ5vfks9CA54LzjCooza2MQltMm+528uOQzkjWAogGs=; b=v5wMbhGmXs2/0N7ktQaWjKM+Dezi9qFeRXS4p2UHalZRqzPz4xw+4/z6320SmH4Fjg Ps4Q/5PDdZDqgxCXlKHPJypuHOm09hx4O0/qqoFLdTKy/8GZ9Cpu+JLX3JBmnR/WotzC BpmvpDi1lhgHLM9ISvhnHRgSbme3PZcGmv0V9+BWMiFhdYY901i9hrao0jEJj64kmnPG dez5fg8ueRc1zeTu/RqHHu8hNNecu2HK4E28+VIE+jWH2iiJQdhGjKLsv5If6fm9MDe9 qV+iUeicNyrnO3rbQm7J10pVzGDjO/ZCZyHHzPaGgeHKz2qg+ffb6giPS1I6xahs+kBA nVjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762074; x=1785366874; 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=LZ5vfks9CA54LzjCooza2MQltMm+528uOQzkjWAogGs=; b=CR8/P/SEgs69vuMEqv5+bOpT6yJ2CCBJawBZsc+lzgFUr7S1kB7tQT6ORVBAf4ygY0 FnnlrelmR3tlw/6qb5hWgE1rt7F45XS19naS32hhXLNeE0wOttESqO+o4U28se1N/4ZC 4pKxvpAWjZXK5JUb7EVyTIXb3HJWEyKNnlArrIavRzNNd+1Nek/NhMeuMiH/9sLwd1vE CePLj0DAuM8VeJcFoT2P3/YxWAbTC5QsElMT3lJ/TqYeovWjoAlgOq/5wJ6vHas+9+Cv OGcZOgpSa1+l+JnsqUxrS4eXoVLIgdGcGedXEg37z1oE+m33QacLWSmbTcCwH5P6u6SH 4w1Q== X-Forwarded-Encrypted: i=1; AHgh+RoCODC6waMYIFE+3SUWqyoovDyCdhZDG2AyRljbhMdkli7cwsHfehAHzrw+K/ePRKHIv3MbBQbDfIqT5Bs=@vger.kernel.org X-Gm-Message-State: AOJu0YxlqJcW/HjXOqj15exNNDxk2pqba7GvbrSCvjGNhnwOTY7ac6Ur FqUZa6TdrMJVpXDjpH4waStlsk/nfYS+LuLmbBVX8PaPUebgnEDn8DvEsLPGm+znQU8JPMZ+4Fy Fvu00Mg== X-Received: from plca6.prod.google.com ([2002:a17:903:4686:b0:2cc:da2c:8084]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:3806:b0:2cc:77f3:a927 with SMTP id d9443c01a7336-2cfa6c5df36mr9033925ad.26.1784762073649; Wed, 22 Jul 2026 16:14:33 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:21 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=2818; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=RCPDHzz3Momw9Jz6CWV7zruC6Eq0eGpKm4HWeSEZlV4=; b=XS2k1u22QABaJXBMqTzGiV+lo9tOPgOHujvv63hal4jsD2hzEPcFI8h8CpqNYG2H+rR3H7kYr l4HGH4aj1eVCCVON/9fqJ/XBd9H1vXzNNoi1bpcCeOxmdFamL9ax6m9 X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-16-15ad654a50db@google.com> Subject: [PATCH v14 16/22] KVM: selftests: Load per-vCPU guest stack in TDX boot parameters 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" Content-Transfer-Encoding: quoted-printable From: Sagi Shahar Allocate a guest stack for each vCPU and record the GVA in the TDX boot parameters region to allow proper vCPU initialization. Co-developed-by: Ackerley Tng Signed-off-by: Ackerley Tng Signed-off-by: Sagi Shahar Signed-off-by: Lisa Wang Reviewed-by: Binbin Wu --- tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h | 1 + tools/testing/selftests/kvm/lib/x86/processor.c | 2 ++ tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c | 10 ++++++++++ 3 files changed, 13 insertions(+) diff --git a/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h b/tools= /testing/selftests/kvm/include/x86/tdx/tdx_util.h index 07e7f5c90329..93ce6e1ad2c8 100644 --- a/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h +++ b/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h @@ -69,5 +69,6 @@ void tdx_init_vm(struct kvm_vm *vm, u64 attributes); void tdx_vm_setup_boot_code_region(struct kvm_vm *vm); void tdx_vm_setup_boot_parameters_region(struct kvm_vm *vm, u32 nr_runnabl= e_vcpus); void tdx_vm_load_common_boot_parameters(struct kvm_vm *vm); +void tdx_vcpu_load_boot_parameters(struct kvm_vm *vm, struct kvm_vcpu *vcp= u); =20 #endif /* SELFTESTS_TDX_TDX_UTIL_H */ diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testin= g/selftests/kvm/lib/x86/processor.c index f6a2aa6b86a4..5e415c6577b8 100644 --- a/tools/testing/selftests/kvm/lib/x86/processor.c +++ b/tools/testing/selftests/kvm/lib/x86/processor.c @@ -847,6 +847,8 @@ static void tdx_vcpu_init(struct kvm_vm *vm, struct kvm= _vcpu *vcpu) vcpu_init_cpuid(vcpu, cpuid); free(cpuid); tdx_vcpu_ioctl(vcpu, KVM_TDX_INIT_VCPU, 0, NULL); + + tdx_vcpu_load_boot_parameters(vm, vcpu); } =20 struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, u32 vcpu_id) diff --git a/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c b/tools/tes= ting/selftests/kvm/lib/x86/tdx/tdx_util.c index 5bbe51ad0f66..3c3ac6c7ce40 100644 --- a/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c +++ b/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c @@ -104,6 +104,16 @@ void tdx_vm_load_common_boot_parameters(struct kvm_vm = *vm) TEST_ASSERT(params->idtr.base !=3D 0, "idt base address should not be 0"); } =20 +void tdx_vcpu_load_boot_parameters(struct kvm_vm *vm, struct kvm_vcpu *vcp= u) +{ + struct td_boot_parameters *params =3D + addr_gpa2hva(vm, TD_BOOT_PARAMETERS_GPA); + struct td_per_vcpu_parameters *vcpu_params =3D + ¶ms->per_vcpu[vcpu->id]; + + vcpu_params->esp_gva =3D kvm_allocate_vcpu_stack(vm); +} + static struct kvm_tdx_capabilities *tdx_read_capabilities(struct kvm_vm *v= m) { static struct kvm_tdx_capabilities *tdx_cap; --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.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 A044E45D5EB for ; Wed, 22 Jul 2026 23:14:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762079; cv=none; b=JiX/cahzF8eHh/ByamfClWqhOFSOB4loRtHBZ+PchgxlGOH5mFcMRyJiTaDMXKCMQATFLSmQRGjyB5mTbUlbA9cmyliyZVb6ctNgoz9TusRm/TEpuJa90YyPM96CrkZfd8cDrVXNlTQJJMR1KmnwjGo7jqAnOeVLcGp/YN0Yr0E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762079; c=relaxed/simple; bh=jpR9xtsvpa/RjBQ8wnCwKk/x2/b0KiCTZGNnNI5CsfE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=mu8+q9MndFErNNWRlLBTPSb9ioU3Oo1vsTUBLgNVZdTpEjg69Cg6eLigs/+mGEMEM2ZfZDD7FeiTwyjL6Ib6e7NV431PvadK+MFMYGNb1hLOMoTdNiDLqmg0DhpC/IrlCapwnrCkarYe8iObssC+eJ9HffHUScyUBhrTQJiLp1M= 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=ZGNz5egO; arc=none smtp.client-ip=209.85.214.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="ZGNz5egO" Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2cacf17c7e0so652745ad.0 for ; Wed, 22 Jul 2026 16:14:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762076; x=1785366876; darn=vger.kernel.org; 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=h/BhsDx/NrVOxcO3ExGYsFuYgkeOvxYZ93mj2rERXwA=; b=ZGNz5egOAowiJq/cKB/R674OkEzfC0Hc5y0WcI0QOnQUQE7aFck6vkAiPznBY90a1b nZdCG4OdlvlX6phR9DWsWDphylwcC18Tgl7H0Rb9UtucwyYSdqkUSFaLh2zbsdhd9EfM DqZpVTogY8IEwnU3HHqsTNn63MPGLhtAt+JPRvCst2HXpZdQSHhzBdlIOuRYPFo1LWBS 1kS2STwiFFPVW5aWiUwCJEnhPy3fGncxs6MXfIYdP/1Lw81X+f87EihdxJW9hS9Tlknz 4p/Etl7RTyk7GCsPraK1wYKPT68PcOjiIX6u8jq7gtJOfz/TnnhTtViiDk8Fh2WQ5V3m FQ4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762076; x=1785366876; 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=h/BhsDx/NrVOxcO3ExGYsFuYgkeOvxYZ93mj2rERXwA=; b=JFlW7l+9x/lY10E4apUMooDEOsjZ93NXq7Ng3u0n6tJBQs6T0G5RfDYt79IbDh0Kxk /XrxjQQjLlsxXC3RQwQ5pf72KgcBBhimQT218+dpWrlR5JXMtLhZxkgPelGggNUBZYs3 PNFVqXCPGS+iS0y0Dc1BL/P67RYiouGJrhb44ccG+RvZN1cxy1kPBp/ire5zuFPw0qfz rTdqfrl8kgl4QIxwMsNfuroRjhT0454H4DLs0AR5U1/dVfRe4F8+PJrokNjttQpyYZR8 i5x2skhRZij5cR+AL4esYNQqRxJdHH0YSeOUAclvvJnpQMDENV4Ilf1mD2CGuPJhuEcJ AixQ== X-Forwarded-Encrypted: i=1; AHgh+Rpe5JrdSvLLpTxbwJFESLTYduVTMA4kY4RVmCFBRnnDdeO5f2LwAxywxE53+mWuon5Qrc3VOR+uxtrn/tY=@vger.kernel.org X-Gm-Message-State: AOJu0YyWx2Nd1+Z5OfojK1P4n5/6CW6LIJB8+1nqjyEp9RgSjYlT/RLs KH+/Zbl8vRsfArrYFIhwCZ77kHkEkAHc4tJk8QiHdLO+Y+zxBD+ZcQTICgq1sVrPwL10+0WpECm 0AM3Tqg== X-Received: from plcl21.prod.google.com ([2002:a17:902:e2d5:b0:2ca:5d68:247c]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:e544:b0:2cf:8131:75f3 with SMTP id d9443c01a7336-2cfa6a558e5mr9703405ad.7.1784762074619; Wed, 22 Jul 2026 16:14:34 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:22 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=3002; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=/f3t5qAAcjcel6oyHhPMCidPw1Nejh4ZBp7/fc5KqHM=; b=NQPWIjycJ+6xb4w0LTnFIA7Ko3LQ1ujfT5ISJno2PAeSTeWTXp/i4m3eMhUFBPNaSX7sc4prV AvAdTcIn6trCzFRLDIDTpJu/5gKDNMpvrzmGRQqT0HaRbKzLREq3ekg X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-17-15ad654a50db@google.com> Subject: [PATCH v14 17/22] KVM: selftests: Set entry point for TDX guest code 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" Content-Transfer-Encoding: quoted-printable From: Sagi Shahar Since the rip register is inaccessible for TDX VMs, we need a different way to set the guest entry point for TDX VMs. This is done by writing the guest code address to a predefined location in the guest memory and loading it into rip as part of the TDX boot code. Signed-off-by: Sagi Shahar Signed-off-by: Lisa Wang --- tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h | 1 + tools/testing/selftests/kvm/lib/x86/processor.c | 10 +++++++--- tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c | 10 ++++++++++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h b/tools= /testing/selftests/kvm/include/x86/tdx/tdx_util.h index 93ce6e1ad2c8..307e2c0bc9c9 100644 --- a/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h +++ b/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h @@ -70,5 +70,6 @@ void tdx_vm_setup_boot_code_region(struct kvm_vm *vm); void tdx_vm_setup_boot_parameters_region(struct kvm_vm *vm, u32 nr_runnabl= e_vcpus); void tdx_vm_load_common_boot_parameters(struct kvm_vm *vm); void tdx_vcpu_load_boot_parameters(struct kvm_vm *vm, struct kvm_vcpu *vcp= u); +void tdx_vcpu_set_entry_point(struct kvm_vcpu *vcpu, void *guest_code); =20 #endif /* SELFTESTS_TDX_TDX_UTIL_H */ diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testin= g/selftests/kvm/lib/x86/processor.c index 5e415c6577b8..4b97a9a1bb5e 100644 --- a/tools/testing/selftests/kvm/lib/x86/processor.c +++ b/tools/testing/selftests/kvm/lib/x86/processor.c @@ -808,9 +808,13 @@ void vcpu_arch_set_entry_point(struct kvm_vcpu *vcpu, = void *guest_code) { struct kvm_regs regs; =20 - vcpu_regs_get(vcpu, ®s); - regs.rip =3D (unsigned long) guest_code; - vcpu_regs_set(vcpu, ®s); + if (is_tdx_vm(vcpu->vm)) { + tdx_vcpu_set_entry_point(vcpu, guest_code); + } else { + vcpu_regs_get(vcpu, ®s); + regs.rip =3D (unsigned long)guest_code; + vcpu_regs_set(vcpu, ®s); + } } =20 gva_t kvm_allocate_vcpu_stack(struct kvm_vm *vm) diff --git a/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c b/tools/tes= ting/selftests/kvm/lib/x86/tdx/tdx_util.c index 3c3ac6c7ce40..be63d8652a02 100644 --- a/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c +++ b/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c @@ -114,6 +114,16 @@ void tdx_vcpu_load_boot_parameters(struct kvm_vm *vm, = struct kvm_vcpu *vcpu) vcpu_params->esp_gva =3D kvm_allocate_vcpu_stack(vm); } =20 +void tdx_vcpu_set_entry_point(struct kvm_vcpu *vcpu, void *guest_code) +{ + struct td_boot_parameters *params =3D + addr_gpa2hva(vcpu->vm, TD_BOOT_PARAMETERS_GPA); + struct td_per_vcpu_parameters *vcpu_params =3D + ¶ms->per_vcpu[vcpu->id]; + + vcpu_params->guest_code =3D (u64)guest_code; +} + static struct kvm_tdx_capabilities *tdx_read_capabilities(struct kvm_vm *v= m) { static struct kvm_tdx_capabilities *tdx_cap; --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) (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 EBCEA47127C for ; Wed, 22 Jul 2026 23:14:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.200 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762079; cv=none; b=gYhvFbCABVfl706M7vMS+CnmormqfPRtiNfsISio06lV+Aa0AyYsNB5koi5Q7rOwKM3JXRfB1twlhKFDIo28TLaKhoMQWL8roZWBzkJlGzJntMhm6Or11BpRBu8f9gzXh8y5j2tgTNHWZ+MczUo8whMalMG+EzNgU832O+KNWLA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762079; c=relaxed/simple; bh=C2Lgd2bjrR01cgtK5z0m5n4bvOQy3kz4DS6yFHHKVvY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=T+ewmdZksHBqSWnwPUKO2KcUzxVDiW1z7CuqS7uuz99JBXiAg7fgVTtX7FIFnLjmzW3QLutbYJTQo9W0pADEqcRDbP9TlTngbbyw4LGlBNi+ONjqTpFAW+8RdLxvW96WvBMl/+Z1TXQi6gFffaZK8GCREL5KJ2xNlnTvM4eSZ8c= 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=i6eaXI9c; arc=none smtp.client-ip=209.85.214.200 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="i6eaXI9c" Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2cee1ec30f2so506715ad.3 for ; Wed, 22 Jul 2026 16:14:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762076; x=1785366876; darn=vger.kernel.org; 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=XNZd91+mo5o4oegz4xZP/Z+TCzb0UFRc92DILYArhCE=; b=i6eaXI9cG9QBdXTShzD+5IRyGibsYRay9DxRoNL2cIeR0C8mEXKVXjuoJER7ENtvMD 9c8fHz1ApCP/SOkjEI7Nzv+3h2xMnMTl5X/YLIQqD4KOenSkur/TxjwWc60UOb+Dh/A1 Nby0mkToscZkb5LhGlq4jSUr5DgOcbZIb7Bxh+Fem5RPtAOYPqT3Q+cnIFFgB3LWErpa AID2L0DFuxaFHd5hfuqfFc8jMFWRiTvUzLebT9Q+K553ncLNl6XAAN6xP5/SHXqXFCZI vBAdaMPF/u1PSt3H04m8lFEpTmL6EUYkO+QtqzcXEDlqe40QutGbmKu9AZB7gL2GAA5E rmhg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762076; x=1785366876; 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=XNZd91+mo5o4oegz4xZP/Z+TCzb0UFRc92DILYArhCE=; b=HpMjy4IwjsYIS1Vc/754WKsf46Mr5VpOw9SvhBsp4InLxp/kU+Cv6vCqAAjWkvHEBD sSnH9MrJPd73QpHHKGifodMt+mexCr0DrsNKeJLHytmSgkLPn7pYRqEE7eIZr0DBimgP enlTd8edihCQaFyieF+AvXkncRuLQbzvSktj01H1Nbv2+HqIj0oxsn5cTUgG9VVKlyjg mAFlWQ9V5DPze0lZEEs21y5mbANeIZj4QaKLOGrfzqRre3Fe1b0VecEofYnM3r9LIXK4 mebr+czwt+VbCLBBXN+Kh+p9icDU3arsaCMCscHH6bUtJR62a0xVvZ3I7Nxg3KwPaJxZ iaCw== X-Forwarded-Encrypted: i=1; AHgh+RoOPTEeracM0ZHzP1sFxRxDabfO5PsyH3j5YT0V5X91zbdbJzrCnngb6KhwOH6bLyNQoniGTIC9iGzv/dE=@vger.kernel.org X-Gm-Message-State: AOJu0YyGq4BsYSAPiO5++B4Q0dKyP+IhzMr6IsQM0wwjuU/g9I1RCqu3 E8iaa1qJmJEUrEGUCqcVV0ufeLEHOlB1R/j7tx7TNaaQF3s00X5vTnBboWOsCGazYn+xG8d0cCD tlizt8g== X-Received: from plbmp15.prod.google.com ([2002:a17:902:fd0f:b0:2cf:2c71:64bd]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2c08:b0:2c1:ea95:8297 with SMTP id d9443c01a7336-2cfa6a560cemr9965915ad.7.1784762075897; Wed, 22 Jul 2026 16:14:35 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:23 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=4116; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=mszFJBolFZ3EeT/w/UfjhdbhJ7NRQ2ZbBHD1RZXRdfA=; b=RWRWEHuu6HLzQSUjkNtKQAU3uFQqOM5gWQjxuE3PUW8aH1xfIjbJfzO6A3P/zXGcuHCDOw3wK V4s8uFtQ2A6AkDAyW9OflMI1SPi9f59poJqSKHTDHQ/8Tp7deaDKOef X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-18-15ad654a50db@google.com> Subject: [PATCH v14 18/22] KVM: selftests: Add helpers to init TDX memory and finalize VM 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" Content-Transfer-Encoding: quoted-printable From: Ackerley Tng TDX protected memory needs to be measured and encrypted before it can be used by the guest. Traverse the VM's memory regions and initialize all the protected ranges by calling KVM_TDX_INIT_MEM_REGION. Once all the memory is initialized, the VM can be finalized by calling KVM_TDX_FINALIZE_VM. Signed-off-by: Ackerley Tng Co-developed-by: Erdem Aktas Signed-off-by: Erdem Aktas Co-developed-by: Sagi Shahar Signed-off-by: Sagi Shahar Reviewed-by: Binbin Wu Reviewed-by: Ira Weiny Co-developed-by: Lisa Wang Signed-off-by: Lisa Wang --- .../selftests/kvm/include/x86/tdx/tdx_util.h | 2 + tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c | 63 ++++++++++++++++++= ++++ 2 files changed, 65 insertions(+) diff --git a/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h b/tools= /testing/selftests/kvm/include/x86/tdx/tdx_util.h index 307e2c0bc9c9..35f0b2b7ac40 100644 --- a/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h +++ b/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h @@ -72,4 +72,6 @@ void tdx_vm_load_common_boot_parameters(struct kvm_vm *vm= ); void tdx_vcpu_load_boot_parameters(struct kvm_vm *vm, struct kvm_vcpu *vcp= u); void tdx_vcpu_set_entry_point(struct kvm_vcpu *vcpu, void *guest_code); =20 +void tdx_vm_finalize(struct kvm_vm *vm); + #endif /* SELFTESTS_TDX_TDX_UTIL_H */ diff --git a/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c b/tools/tes= ting/selftests/kvm/lib/x86/tdx/tdx_util.c index be63d8652a02..831b0e5160df 100644 --- a/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c +++ b/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c @@ -1,5 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only =20 +#include + #include "processor.h" #include "tdx/td_boot.h" #include "tdx/tdx_util.h" @@ -251,3 +253,64 @@ void tdx_init_vm(struct kvm_vm *vm, u64 attributes) =20 free(init_vm); } + +static void tdx_init_mem_region(struct kvm_vm *vm, void *source_pages, + u64 gpa, u64 size) +{ + u32 flags =3D KVM_TDX_MEASURE_MEMORY_REGION; + struct kvm_tdx_init_mem_region mem_region =3D { + .source_addr =3D (u64)source_pages, + .gpa =3D gpa, + .nr_pages =3D size / PAGE_SIZE, + }; + struct kvm_vcpu *vcpu; + + vcpu =3D list_first_entry_or_null(&vm->vcpus, struct kvm_vcpu, list); + + TEST_ASSERT(size && IS_ALIGNED(size, PAGE_SIZE), + "Cannot add partial pages to the guest memory.\n"); + TEST_ASSERT(IS_ALIGNED((u64)source_pages, PAGE_SIZE), + "Source memory buffer is not page aligned\n"); + tdx_vcpu_ioctl(vcpu, KVM_TDX_INIT_MEM_REGION, flags, &mem_region); +} + +static void tdx_load_private_memory(struct kvm_vm *vm) +{ + struct userspace_mem_region *region; + int ctr; + + hash_for_each(vm->regions.slot_hash, ctr, region, slot_node) { + const struct sparsebit *protected_pages =3D region->protected_phy_pages; + const gpa_t gpa_base =3D region->region.guest_phys_addr; + const u64 hva_base =3D region->region.userspace_addr; + const sparsebit_idx_t lowest_page_in_region =3D gpa_base >> vm->page_shi= ft; + void *source_pages =3D NULL; + sparsebit_idx_t i, j; + + if (!sparsebit_any_set(protected_pages)) + continue; + + TEST_ASSERT(region->region.guest_memfd !=3D -1, + "TD private memory must be backed by guest_memfd"); + + sparsebit_for_each_set_range(protected_pages, i, j) { + const u64 size_to_load =3D (j - i + 1) * vm->page_size; + const u64 offset =3D + (i - lowest_page_in_region) * vm->page_size; + const u64 hva =3D hva_base + offset; + const u64 gpa =3D gpa_base + offset; + + if (!kvm_has_gmem_attributes) + source_pages =3D (void *)hva; + + vm_mem_set_private(vm, gpa, size_to_load); + tdx_init_mem_region(vm, source_pages, gpa, size_to_load); + } + } +} + +void tdx_vm_finalize(struct kvm_vm *vm) +{ + tdx_load_private_memory(vm); + tdx_vm_ioctl(vm, KVM_TDX_FINALIZE_VM, 0, NULL); +} --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) (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 077A8471430 for ; Wed, 22 Jul 2026 23:14:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762079; cv=none; b=auZSAGvuw850dk6RUiJwCfCBb7SjOuWVJYBLRJIOLn2xY6H4eNEVlwiDAcsaFHQjGs38pnLk++Siv2W264g+lELvrbf9rVI3/qO7CnedIlEmhsLIPY7mZAVmxiVW3IFnpftB4WT1Ze2kTBed7X1iWKBrxIOez3qRQgSegLB3gd8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762079; c=relaxed/simple; bh=uLTnwqcKeWPbvmmCIr/K2/dvE3UjNBQWRlFbYisxcX4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=O0/ekReApVxVSidkeJV44D0Wt/SrgsfCK8QTR7TD8FAIG+dJOEO8WFYQQGXYTC+qJHSzs6XsXOLLrXx/yFN+mDOlSNFsgFuBuonSU4kXnms6dAVTjmeYCGX3eYTxEkcQKblyoRbcK290OE5IWq7s0C2subOJstg8dAZssBHx4oQ= 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=a+PdaBEc; arc=none smtp.client-ip=209.85.210.197 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="a+PdaBEc" Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-84c4cd31b51so3002b3a.0 for ; Wed, 22 Jul 2026 16:14:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762077; x=1785366877; darn=vger.kernel.org; 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=XTOm8OHTnD3CNXmOQdLQqFIFqpZnnwkDQGUQ6GB1D8M=; b=a+PdaBEcnFal/iLeTnnu/bzu5Lm4oLYFqwX67lc6o4cmOOd+qt7MaqNDn4u4rT2nen 0U7bWX06f7l+xgZQOJgm4AcS+2RODZPPiVlji6rCc5IlsDqHRErp8rmogjdrNl4iolzL cOF8GfPZ17KJo59GQOfC9bHbNKyL8WnGWd9pdLGQ/CnvB/6QwRgmVP9TE/vOo+HdNYfr q7mILyjF47SfBxZbzaVLQpfxrTHH/22x/uONF8pIw264pYNaEi99qeeU+QnmXPUaph78 RF3cl3G9MOHP+bZZc8kiuoUGsmbGPYY7vKuhOHIhTdNExhw1j04ndJmxgtYWNTi2P1zA eSRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762077; x=1785366877; 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=XTOm8OHTnD3CNXmOQdLQqFIFqpZnnwkDQGUQ6GB1D8M=; b=Dcomgnt/TF6z1D3LWZmSDVFT+cWC4b1wwIjT1fAS99Z4crzcMFoNc0tcIKNRRR88wo erOdrBWskHfjs+KSi7JFkDLJhhS3wG9Hn2J1URcjCwly8/467K/A7zppxSnD6vTTOsBN rXbnLlNPjPbCxwszxjEXfBXF04kp+TNk8it/APA2XL0FoIqSwA5WmRLSZQusJO2l9uWc bDGLysA0B7d3IH9yrwd8XLzKZK7fC+Hvx9Jy/DHYCG1hWAGGmxGgT6NiWdyxDr1XjuIz 13fBjQhADvDECvXsfY5NdtarqgC+pxi9qDbrq6Fuz9YWcvINeEULTLscYRq+9PNRi9be n1vg== X-Forwarded-Encrypted: i=1; AHgh+RoSdIki3eirXMjz45HcybjGHzPrMGerGn0oDPFAz8ifQAH+IIad8ul2bJ5oc2EwKn2K2Bw0Gmx5yxzYiUw=@vger.kernel.org X-Gm-Message-State: AOJu0Yz57m4wvzxKLqKkrGwkW86QWA6VqJhwSmbWtq8EVnSDksQDrVYg Hb9/t3jmvY0C7vBDeC1oCd/dekXUMaeGKGv8S5oVykBh/FKS1aSpBZMyK4Q9gxCdF3H5PyofrY0 Le4PJOw== X-Received: from pgge1.prod.google.com ([2002:a63:db01:0:b0:c99:aff5:7085]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:17a2:b0:3bf:ee42:192 with SMTP id adf61e73a8af0-3c44c95687fmr237545637.6.1784762076814; Wed, 22 Jul 2026 16:14:36 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:24 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=924; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=yyC4ok9Gt079Udujw0BAUtyTS1qt2jUAvdMSgkP9oBs=; b=YeT84Sa2s65ilrpiII4nei9gR+v8wtHB4zZkk41ORFiKELmdh1JFZMwUT8mna4O7S+2CS2dqi KxXOEWTWIPxAuemKnyLgH0/dUr1jhw1cs/O7LBZKHeibqJp7k9kfEac X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-19-15ad654a50db@google.com> Subject: [PATCH v14 19/22] KVM: selftests: Finalize TD memory as part of kvm_arch_vm_finalize_vcpus 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" Content-Transfer-Encoding: quoted-printable From: Sagi Shahar Finalize TDX VM after creation to make it runnable. Signed-off-by: Sagi Shahar Reviewed-by: Ira Weiny Signed-off-by: Lisa Wang --- tools/testing/selftests/kvm/lib/x86/processor.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testin= g/selftests/kvm/lib/x86/processor.c index 4b97a9a1bb5e..8319ae3d9fe6 100644 --- a/tools/testing/selftests/kvm/lib/x86/processor.c +++ b/tools/testing/selftests/kvm/lib/x86/processor.c @@ -1489,6 +1489,12 @@ bool kvm_arch_has_default_irqchip(void) return true; } =20 +void kvm_arch_vm_finalize_vcpus(struct kvm_vm *vm) +{ + if (is_tdx_vm(vm)) + tdx_vm_finalize(vm); +} + void setup_smram(struct kvm_vm *vm, struct kvm_vcpu *vcpu, u64 smram_gpa, const void *smi_handler, size_t handler_size) { --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (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 8510147124C for ; Wed, 22 Jul 2026 23:14:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762080; cv=none; b=GbXQ9OMl3lGUfrnNL9n2AqsNji+dee8fQXPHMz6qayEUnvPf53fJ6kpAgO0eTaBJTlEGgulMNDh5qzT78DPlkwOIuRXpB/TNWOX4P/ZJdNEOamOWBqHSwhtLOAwg7ro6w0yAaOCndAWdjZCaNdZ3bQ0xwVzEt8GtltRt2or/DOU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762080; c=relaxed/simple; bh=J2jP33MsvXzcPyd71zMa34BP+SHntkFHO92tJSH/otQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=TzikJ29ZJ10mIa0pH0hxCdK0Ylv0H0lVRYk5Wp5HI/PMs8iUvL3mpYW3ih3lM28u1LiSz9lAeuEQGBNlGnMq3hN5NVfZEYAU/CgvkXVQxu5TsN9vw3HnNbIrDrAk5W/SwdfpGNlp0E+vYS9QiwD8p20fLa/xb9MsZqf7331ytSc= 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=foecDQCp; arc=none smtp.client-ip=209.85.214.199 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="foecDQCp" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2cceabd70f5so1426875ad.1 for ; Wed, 22 Jul 2026 16:14:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762078; x=1785366878; darn=vger.kernel.org; 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=OE9BObxgnpVBtB0susWSfoNAQmdWjz8VkVFbMsNsCVk=; b=foecDQCpaALgNr1xMmroZEUQ6VJH5GJFriLyTDXMHEI6REry4HNYgTYQdn3fRW+Gvi IGQ1Q99am0//xJVarzpihKuWw1IDMwhRllTtifL60FWKd9eBxydyoyl3L7OvWpZ28ouA /S3MAGUx0jp80A46JUhOXKvJzfnn+kcGDWsLgeF1ykxhhHB2ITAQfzo0A7fCZGxivUio +pPe6E0hE+9Ai5NV0gY1LpVcP51N8dw+bFQ8bkyF6MNkvKehpcevoCPSfT85gVQlJUJe XwViD+AvMmLSFm6edvBrlpp2amdWZMdrgjhmXNwPYSIhtGhMtIBRaN3FiVKh6e5o2aa6 hP+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762078; x=1785366878; 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=OE9BObxgnpVBtB0susWSfoNAQmdWjz8VkVFbMsNsCVk=; b=BAAQEf87neE0YBuoxGQHHOb0RkFsQ7uPFRH/rFNvvJBcoS/UK0XBjZCYFpjIBToOTt vABnfgYsGVZIkc16HzbhCm7md30/zLkT+UB53ZGKjkimj/RjsYiSyzl4xE898FmUV6c5 McHjSSntIhj4pnSI3nMGuohIGCZbUZI2xfUH3soT2KbnvVpvBF6ursi2AwjM2vPhdbqc 8tQS2SdMsy+m2wsSML0LTk8RzMokTSWLXkJ03dDdWFziA8p9JJhke023UJ2uD60+368E zVY4Wva1CfEzGYHfKM4DU09qOQxsIRuEe5ZtJcphc2hWy3ZOB/V+GyfKiXs/xUMGC2hb V/KQ== X-Forwarded-Encrypted: i=1; AHgh+RqqlRe5RMiEJwkiJ6qRd4Cwcj+LMbtJXbGBNuE6a2ROrzzpQubZtvPm6OV+VXDIPbCG48KyOZXASeNEUzs=@vger.kernel.org X-Gm-Message-State: AOJu0Yxv+EqKucaQ3O9xd9Lj5qfzoM4S9loFTxOIIWl5Phz782XBQ1nK BXHuM1THrUQBnadZmdKUYxhZA/1bAT5/En/vSrexryM6pR0qwOKOBHT8twsH4MbGRvMfJtCBKgX JUTNlQA== X-Received: from pggh14.prod.google.com ([2002:a63:c00e:0:b0:c9e:142c:425e]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:748a:b0:3c3:bb13:438 with SMTP id adf61e73a8af0-3c44b0504bcmr554799637.32.1784762077746; Wed, 22 Jul 2026 16:14:37 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:25 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=3161; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=LhPITB0/P3+C8fkpUXhj3CMOp+sdIRyRL+NpJnysUVU=; b=KwG/mq0dqAwUImRbDSEcbPFdl15WaqHL4VOTMgbqjf6a4Ej+o01Emqg1/da9WwWbbYyH6qqAZ KDHbmghfo96Bij8EdsXBK7NyAbD5HONradFoDKSUxowWKqebJozW8wK X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-20-15ad654a50db@google.com> Subject: [PATCH v14 20/22] KVM: selftests: Implement MMIO WRITE for the TDX VM 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" Content-Transfer-Encoding: quoted-printable From: Erdem Aktas Implement the tdx_mmio_write() to allow TDX VMs to request MMIO emulation. Follow the Intel Guest-Hypervisor Communication Interface (GHCI) spec to the minimum extent that a spec-abiding TDX module will pass the request to KVM. Skip implementing the #VE handler as described in the GHCI spec to reduce selftests dependency. To perform emulated I/O, VMs use the TDG.VP.VMCALL instruction to request MMIO. Signed-off-by: Erdem Aktas Co-developed-by: Sagi Shahar Signed-off-by: Sagi Shahar Co-developed-by: Lisa Wang Signed-off-by: Lisa Wang --- tools/testing/selftests/kvm/Makefile.kvm | 1 + tools/testing/selftests/kvm/include/x86/tdx/tdx.h | 17 +++++++++++ tools/testing/selftests/kvm/lib/x86/tdx/tdx.S | 37 +++++++++++++++++++= ++++ 3 files changed, 55 insertions(+) diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selft= ests/kvm/Makefile.kvm index 645d9aac61db..28b33ed8c2e6 100644 --- a/tools/testing/selftests/kvm/Makefile.kvm +++ b/tools/testing/selftests/kvm/Makefile.kvm @@ -33,6 +33,7 @@ LIBKVM_x86 +=3D lib/x86/tdx/tdx_util.c LIBKVM_x86 +=3D lib/x86/ucall.c LIBKVM_x86 +=3D lib/x86/vmx.c LIBKVM_x86 +=3D lib/x86/tdx/td_boot.S +LIBKVM_x86 +=3D lib/x86/tdx/tdx.S =20 LIBKVM_arm64 +=3D lib/arm64/gic.c LIBKVM_arm64 +=3D lib/arm64/gic_v3.c diff --git a/tools/testing/selftests/kvm/include/x86/tdx/tdx.h b/tools/test= ing/selftests/kvm/include/x86/tdx/tdx.h new file mode 100644 index 000000000000..6355a30bb47f --- /dev/null +++ b/tools/testing/selftests/kvm/include/x86/tdx/tdx.h @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef SELFTEST_KVM_TDX_TDX_H +#define SELFTEST_KVM_TDX_TDX_H + +#include + +#define TDG_VP_VMCALL_VE_REQUEST_MMIO 48 +#define TDVMCALL_MMIO_WRITE 1 + +u64 __tdcall(u64 leaf, u64 r12, u64 r13, u64 r14, u64 r15); + +static inline u64 tdx_mmio_write(u64 address, u32 size, u64 data_in) +{ + return __tdcall(TDG_VP_VMCALL_VE_REQUEST_MMIO, size, + TDVMCALL_MMIO_WRITE, address, data_in); +} +#endif /* SELFTEST_KVM_TDX_TDX_H */ diff --git a/tools/testing/selftests/kvm/lib/x86/tdx/tdx.S b/tools/testing/= selftests/kvm/lib/x86/tdx/tdx.S new file mode 100644 index 000000000000..dff48a3624a1 --- /dev/null +++ b/tools/testing/selftests/kvm/lib/x86/tdx/tdx.S @@ -0,0 +1,37 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +.globl __tdcall +/* + * u64 __tdcall(u64 leaf, u64 r12, u64 r13, u64 r14, u64 r15) + */ +__tdcall: + push %r12 + push %r13 + push %r14 + push %r15 + + /* Map C ABI fast arguments to TDX GHCI payload registers */ + /* RDI=3Dleaf, RSI=3Dr12, RDX=3Dr13, RCX=3Dr14, R8=3Dr15 */ + + mov %rdi, %r11 + mov %rsi, %r12 + mov %rdx, %r13 + mov %rcx, %r14 + mov %r8, %r15 + + /* TDCALL boilerplate */ + mov $0, %rax + mov $0xFC00, %rcx /* Expose R10-R15 */ + mov $0, %r10 + + /* tdcall instruction */ + .byte 0x66, 0x0f, 0x01, 0xcc + + /* Extract status */ + mov %r10, %rax + + pop %r15 + pop %r14 + pop %r13 + pop %r12 + ret --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (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 C6045388392 for ; Wed, 22 Jul 2026 23:15:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762103; cv=none; b=XLBN9RLBZ4cG2XFGGGZc8m/5XoNWkmQfRBrlYvaCW5q7EOGY5CO/pl3U+t+66YmQV++VVbx9tEPUKEU9tLUm5nP6yEscHuRKpCYp9pVg3/bqZc4LBxxy9jliTiMuFtRT+/hOEWNKSvtlHAVW4zMr7MN6zx4FCPrEZymyLypDB7I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762103; c=relaxed/simple; bh=Mt5Lh8+8kiaK6W3VjPfbBEwiyc60WE+BOpoJvPyUsrE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ItzUIVyJZmZmmK/3ezjhFfy2kVqwjSqEfMKSB+rMP0JCZYXeh0YBYWF2z2rS/78uc6TWzCTZDs2CdgfXcsEVTM8wbF5/6JJ6WVBqzFaPaFJKOlbLEQSFWRDZ7wCyth/ZAN+b28dNjXSJZo/v5N0zZ+Zuwbmg8dmcAg7fVPhunDk= 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=bpbxXw0o; arc=none smtp.client-ip=209.85.214.197 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="bpbxXw0o" Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2ccb6823efcso470705ad.0 for ; Wed, 22 Jul 2026 16:15:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762101; x=1785366901; darn=vger.kernel.org; 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=npQwrp8dxwBrq6gTxtnOVCzjkW4oB/ew6/3QNAsGhNI=; b=bpbxXw0oGaA+tiR+zn/p47h23T/ZbVWRcFyRxVUZK67zQJj+X6w2B6SIHZnti6u5fb sBu6LqGzCz2F+KcAGIrPLKBCTC0pSCuFaewHBtXAGrfAOowlo2h1rxZ8eDSCUkaxKDD7 /o8VEOEtmKCY+KSHNDjxBHOyAeQ+1LJiOHlFsn8C0g+WkYAKxQEb9G+diR1fvnpfUDrz 9TZOm4d2eyydefDjTNtBN8LPr8DBWU8/rxDdCa1jcVswJoZVWGLi8VP2O3l5eEKmxX/6 iRSJ5yqHoX2zSU1jyf34O/u8t+BbHknUIpDbmkr89RCP5jZ2yZgL3UoLyiSbNoFGXdYa WH+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762101; x=1785366901; 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=npQwrp8dxwBrq6gTxtnOVCzjkW4oB/ew6/3QNAsGhNI=; b=MC/fg0oq4K2lq0FGENNZcCyRPlxFqaA2lToiSRkWJZjdV83WyFf9CuZoQ+N7X3i8HX ehA5q6fIPKdFjmq1UNbPv5rFzLNYZJCesbL9TWUskTI3o9322ojoMwIC5zSKXcj1CJd1 m1W+n6zjo3wYNPfTm5dzRVKJqvrAkodV/4kktkCV3dmYOetYFnVJXae5UtCkCM7UJ7Rv gCtGRuimcX6qAsMa3EYARrD2YdLHDPmljQeMyg41kD8NiEHekxOEr/boBJ/WhbTlT00g GCknvlZd+/e+JoBGjAQ4s5akbstwP1ovAFJP74piFmg8IMJLRe8XUabGzFXL0yLgjii4 YWJw== X-Forwarded-Encrypted: i=1; AHgh+RqHcV/3lfcKJtlxoua33obnu879uq+VTAilXTgglIZtsyQqfSr4jvB1oKfhZI4xiyJ98H9jpNzu7lWLH48=@vger.kernel.org X-Gm-Message-State: AOJu0YxpCM8vJiUzsrTDBmiUqWappKpwuzqlHenqYQIlOCSsixHtQBx7 KHVVuNtMSFTe/0uD1CH2UpE81savAvC8drbEeRIyoxVPjpiCzMqqiTJow7SnHxy51kDF7ykNKPM JQGq02g== X-Received: from plld11.prod.google.com ([2002:a17:902:728b:b0:2c8:7ed:acf4]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:dac7:b0:2c7:ebfb:618f with SMTP id d9443c01a7336-2cfa6b73a76mr9771635ad.14.1784762078730; Wed, 22 Jul 2026 16:14:38 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:26 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=3287; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=7diizuo3ArwKIH9Jsi5ICyi9zc8nAkbP5tj3yujaUxE=; b=r/IDcKTeYPBvxZo+9sWeP0LiVNW/DOX6AaP68XXLFLG4gDOoC2whw6k/TQoOk3j3a00HlfP8h 0OI5SVbn2efDnVqhQHLtWLQ/eyVISA6/dT0Nlv7T+BBa01oHO7mNOiZ X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-21-15ad654a50db@google.com> Subject: [PATCH v14 21/22] KVM: selftests: Add ucall support for TDX 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" Content-Transfer-Encoding: quoted-printable From: Ackerley Tng Implement TDX ucall using TDCALL-based MMIO to pass the ucall address from the VM to the host. In standard KVM selftests, ucall uses a PIO instruction as a trigger to exit to the host, which then retrieves the ucall address by reading the guest's RDI register. This approach is incompatible with TDX because the host cannot access guest registers. Furthermore, PIO exits only expose 4 bytes of immediate data, which is insufficient for a 8-byte ucall address. By using TDCALL-based MMIO, the VM can share the full 8-byte address in a single exit without refactoring the common ucall framework and other non-x86 architectures. Signed-off-by: Ackerley Tng Co-developed-by: Sagi Shahar Signed-off-by: Sagi Shahar Co-developed-by: Lisa Wang Signed-off-by: Lisa Wang --- tools/testing/selftests/kvm/include/x86/ucall.h | 6 ----- tools/testing/selftests/kvm/lib/x86/ucall.c | 33 +++++++++++++++++++++= ++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/kvm/include/x86/ucall.h b/tools/testin= g/selftests/kvm/include/x86/ucall.h index 0e4950041e3e..7e54ec2c1a45 100644 --- a/tools/testing/selftests/kvm/include/x86/ucall.h +++ b/tools/testing/selftests/kvm/include/x86/ucall.h @@ -2,12 +2,6 @@ #ifndef SELFTEST_KVM_UCALL_H #define SELFTEST_KVM_UCALL_H =20 -#include "kvm_util.h" - #define UCALL_EXIT_REASON KVM_EXIT_IO =20 -static inline void ucall_arch_init(struct kvm_vm *vm, gpa_t mmio_gpa) -{ -} - #endif diff --git a/tools/testing/selftests/kvm/lib/x86/ucall.c b/tools/testing/se= lftests/kvm/lib/x86/ucall.c index e7dd5791959b..7a954b2d0bdd 100644 --- a/tools/testing/selftests/kvm/lib/x86/ucall.c +++ b/tools/testing/selftests/kvm/lib/x86/ucall.c @@ -5,11 +5,35 @@ * Copyright (C) 2018, Red Hat, Inc. */ #include "kvm_util.h" +#include "tdx/tdx.h" +#include "tdx/tdx_util.h" =20 #define UCALL_PIO_PORT ((u16)0x1000) =20 +/* HPET address is guaranteed to be unused for ucall MMIO */ +#define UCALL_MMIO_GPA 0xfed00000 + +static u8 vm_type; +static gpa_t ucall_mmio_gpa; + +void ucall_arch_init(struct kvm_vm *vm, gpa_t mmio_gpa) +{ + vm_type =3D vm->type; + sync_global_to_guest(vm, vm_type); + + if (is_tdx_vm(vm)) { + ucall_mmio_gpa =3D UCALL_MMIO_GPA | vm->arch.s_bit; + sync_global_to_guest(vm, ucall_mmio_gpa); + } +} + void ucall_arch_do_ucall(gva_t uc) { + if (vm_type =3D=3D KVM_X86_TDX_VM) { + tdx_mmio_write(ucall_mmio_gpa, sizeof(gva_t), uc); + return; + } + /* * FIXME: Revert this hack (the entire commit that added it) once nVMX * preserves L2 GPRs across a nested VM-Exit. If a ucall from L2, e.g. @@ -46,6 +70,15 @@ void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) { struct kvm_run *run =3D vcpu->run; =20 + if (vm_type =3D=3D KVM_X86_TDX_VM) { + if (run->exit_reason =3D=3D KVM_EXIT_MMIO && + run->mmio.phys_addr =3D=3D UCALL_MMIO_GPA && + run->mmio.len =3D=3D sizeof(gva_t) && + run->mmio.is_write) + return (void *)(*((gva_t *)run->mmio.data)); + return NULL; + } + if (run->exit_reason =3D=3D KVM_EXIT_IO && run->io.port =3D=3D UCALL_PIO_= PORT) { struct kvm_regs regs; =20 --=20 2.55.0.229.g6434b31f56-goog From nobody Fri Jul 24 22:18:15 2026 Received: from mail-oa1-f71.google.com (mail-oa1-f71.google.com [209.85.160.71]) (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 8017F476CD2 for ; Wed, 22 Jul 2026 23:14:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.71 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762091; cv=none; b=MEf7T4fP/EOaIvc+8ESL9AhxRaPmX39IvyY+BXnI//WNqtWz+/sNQh4+I2OFEYlX4KF9kVQkOyibjTDdoERwmIwO0zHOIaPCnDhwOk6qcLU9DDCrl3rwhmjpQWWwaTe7A/78GU3cT3H9fAOW0uDAif5b78gezT2fofBObgpHX/c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784762091; c=relaxed/simple; bh=dEFJJlMq+M70+N1PCE1cFxw7PDw8XLhakHATo+3TVD4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Fq5u92PaDMVmE05+0JDRGJAu4GMXZTqi9jkjGwAoZVNCc1TbFe9xVRcp+c6jtVaY7CjqkN4yFwJS5nMe5NGZIGyohgH7VLB2UCC6TpkcQqixqFCAmp9xtWoOtb1Y9iy4a2x8BbzI1HBFEmumAseioPghGLppKWCMFHK8bnhWO0c= 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=BDM+xns0; arc=none smtp.client-ip=209.85.160.71 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="BDM+xns0" Received: by mail-oa1-f71.google.com with SMTP id 586e51a60fabf-455e3cdda0dso10665438fac.1 for ; Wed, 22 Jul 2026 16:14:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1784762088; x=1785366888; darn=vger.kernel.org; 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=tQL53tF2PapsukUeczmauxGQFHV9sfmXX8XsuAYj+nY=; b=BDM+xns09XlhOIiDpiVU99Ew3G9y2Xu7TxUoaXH3ICVyxs0bkkNfx9VBMPL0yHk4vm CY3sAwfZcqkkbz+yaAJREYSxtjSbxT/TKqz6uffuAXAoez7Ee/kmNra2QhiyhKzN7MZS +8eTRe3J6E5wIqqzAMSelJo2SKZKMXfVyz0a3ATD+HaXkeIuGL2rE5Ae8WbU4CHP9xIg c7jfXLLbYJduz+XY4zma/TmnV9MThw4LeSFRbp24SSFSPw6MWgqPgdVQCtrdZeLa5KXA Au6zZ5Dcb+jYOOnyDtqLPj6o8qbBb1GwvIYr1MslW2eQq6ut2WJgQbx0LaD/CNB1yCFS njTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784762088; x=1785366888; 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=tQL53tF2PapsukUeczmauxGQFHV9sfmXX8XsuAYj+nY=; b=ZRqX2fHwnvRwmuBRZWpSCwTa0rzI27yNoLEpM7NLIBnZm2ntzL+zFoxci8r3IJyKsQ xAHPnYc8esKEI48Y9eW2z4tKia7K0JNY2r6WhC4oDA99DMYSnnorn2Lk+Yp+193ivKQk lEIEDXOPlNN5xBblaOKKX1xJZ33hPGUA3XsbVuNI+AQIGjzXwXfRjwuWJKFj15QE8qvS eEPvXH3wqeAg4IvrFNKZvJNuDLB5zhlMh7WIkiLkQ5k6AaxQSUdY09/CgL4IUrg9rsWN Vn+lC0XUtTr6TvPP2FCtr0yYFGt4LSTAaSoAXoDZz2Tbc3lgaAv95Udz3KFybEhDf4Iu vFbQ== X-Forwarded-Encrypted: i=1; AHgh+RoIVfl1YFCaGdQi5qLNIoNZkuANcLURDQK4OxDTGtYAOZnlNjW3+J+kN6pKimwXnK5BnbD+0pUGIndjYhw=@vger.kernel.org X-Gm-Message-State: AOJu0YykqWZa08+ZSHB+eQWQ2L4Qlh0LHXy+vyrjQthThaQpDemczTAU W8TBjUUJYeDnzSKYREn3azfnkbOtOJTBV0geB958VOj6h3ZYIXm4sNTEwPkrwkmFxZ4zjm/UYKU H1NXaew== X-Received: from oadc16.prod.google.com ([2002:a05:6870:c090:b0:451:da82:f574]) (user=wyihan job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6870:e129:b0:452:213:bd4d with SMTP id 586e51a60fabf-457a0cae0d4mr345206fac.17.1784762088069; Wed, 22 Jul 2026 16:14:48 -0700 (PDT) Date: Wed, 22 Jul 2026 23:13:27 +0000 In-Reply-To: <20260722-tdx-selftests-v14-0-15ad654a50db@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org 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=3221; i=wyihan@google.com; s=20260319; h=from:subject:message-id; bh=EDghQmLRkXXdCFENRMd8Fjd6yIqXJ+ept626JTAjPb8=; b=Brj1pdenntimF95GU4mIRWuTYeHMRRoYGeKJxcMpZ6boC0+6awN7/2Vsf/FqnHss7Z8hMG5fA HmeqPWiE68mAKapW6mMKn64bx1KpJnalTsQNc5ntdpavRgpYtzUGPLb X-Mailer: b4 0.14.3 Message-ID: <20260722-tdx-selftests-v14-22-15ad654a50db@google.com> Subject: [PATCH v14 22/22] KVM: selftests: Add TDX lifecycle test 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" Content-Transfer-Encoding: quoted-printable From: Sagi Shahar Adding a test to verify TDX lifecycle by creating a simple TDX VM. Signed-off-by: Sagi Shahar Signed-off-by: Lisa Wang --- tools/testing/selftests/kvm/Makefile.kvm | 1 + .../testing/selftests/kvm/include/x86/processor.h | 1 + .../selftests/kvm/include/x86/tdx/tdx_util.h | 5 ++++ tools/testing/selftests/kvm/x86/tdx_vm_test.c | 33 ++++++++++++++++++= ++++ 4 files changed, 40 insertions(+) diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selft= ests/kvm/Makefile.kvm index 28b33ed8c2e6..3561f9284e6f 100644 --- a/tools/testing/selftests/kvm/Makefile.kvm +++ b/tools/testing/selftests/kvm/Makefile.kvm @@ -167,6 +167,7 @@ TEST_GEN_PROGS_x86 +=3D rseq_test TEST_GEN_PROGS_x86 +=3D steal_time TEST_GEN_PROGS_x86 +=3D system_counter_offset_test TEST_GEN_PROGS_x86 +=3D pre_fault_memory_test +TEST_GEN_PROGS_x86 +=3D x86/tdx_vm_test =20 # Compiled outputs used by test targets TEST_GEN_PROGS_EXTENDED_x86 +=3D x86/nx_huge_pages_test diff --git a/tools/testing/selftests/kvm/include/x86/processor.h b/tools/te= sting/selftests/kvm/include/x86/processor.h index ff3219edab44..fa112a1c1c84 100644 --- a/tools/testing/selftests/kvm/include/x86/processor.h +++ b/tools/testing/selftests/kvm/include/x86/processor.h @@ -372,6 +372,7 @@ static inline unsigned int x86_model(unsigned int eax) #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 VM_SHAPE_TDX VM_TYPE(KVM_X86_TDX_VM) =20 #define PHYSICAL_PAGE_MASK GENMASK_ULL(51, 12) =20 diff --git a/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h b/tools= /testing/selftests/kvm/include/x86/tdx/tdx_util.h index 35f0b2b7ac40..9a882644a48d 100644 --- a/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h +++ b/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h @@ -11,6 +11,11 @@ static inline bool is_tdx_vm(struct kvm_vm *vm) return vm->type =3D=3D KVM_X86_TDX_VM; } =20 +static inline bool is_tdx_supported(void) +{ + return !!(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_TDX_VM)); +} + /* * TDX ioctls * Use underscores to avoid collisions with struct member names. diff --git a/tools/testing/selftests/kvm/x86/tdx_vm_test.c b/tools/testing/= selftests/kvm/x86/tdx_vm_test.c new file mode 100644 index 000000000000..7cdcaf33b585 --- /dev/null +++ b/tools/testing/selftests/kvm/x86/tdx_vm_test.c @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include "processor.h" +#include "kvm_util.h" +#include "tdx/tdx_util.h" +#include "ucall_common.h" +#include "kselftest_harness.h" + +static void guest_code_lifecycle(void) +{ + GUEST_DONE(); +} + +TEST(verify_td_lifecycle) +{ + struct kvm_vcpu *vcpu; + struct kvm_vm *vm; + struct ucall uc; + + vm =3D vm_create_shape_with_one_vcpu(VM_SHAPE_TDX, &vcpu, + guest_code_lifecycle); + + vcpu_run(vcpu); + TEST_ASSERT_EQ(get_ucall(vcpu, &uc), UCALL_DONE); + + kvm_vm_free(vm); +} + +int main(int argc, char **argv) +{ + TEST_REQUIRE(is_tdx_supported()); + return test_harness_run(argc, argv); +} --=20 2.55.0.229.g6434b31f56-goog