All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sagi Shahar <sagis@google.com>
To: linux-kselftest@vger.kernel.org,
	Paolo Bonzini <pbonzini@redhat.com>,
	 Shuah Khan <shuah@kernel.org>,
	Sean Christopherson <seanjc@google.com>,
	 Ackerley Tng <ackerleytng@google.com>,
	Ryan Afranji <afranji@google.com>,
	 Andrew Jones <ajones@ventanamicro.com>,
	Isaku Yamahata <isaku.yamahata@intel.com>,
	 Erdem Aktas <erdemaktas@google.com>,
	Rick Edgecombe <rick.p.edgecombe@intel.com>,
	 Sagi Shahar <sagis@google.com>,
	Roger Wang <runanwang@google.com>,
	 Binbin Wu <binbin.wu@linux.intel.com>,
	Oliver Upton <oliver.upton@linux.dev>,
	 "Pratik R. Sampat" <pratikrajesh.sampat@amd.com>,
	Reinette Chatre <reinette.chatre@intel.com>,
	 Ira Weiny <ira.weiny@intel.com>, Chao Gao <chao.gao@intel.com>,
	 Chenyi Qiang <chenyi.qiang@intel.com>
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Subject: [PATCH v12 11/23] KVM: selftests: Set up TDX boot parameters region
Date: Tue, 28 Oct 2025 21:20:37 +0000	[thread overview]
Message-ID: <20251028212052.200523-12-sagis@google.com> (raw)
In-Reply-To: <20251028212052.200523-1-sagis@google.com>

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 <ackerleytng@google.com>
Signed-off-by: Ackerley Tng <ackerleytng@google.com>
Signed-off-by: Sagi Shahar <sagis@google.com>

---------------------------------------------

Changes from v10:
 * Removed code for setting up X86_CR4_OSXMMEXCPT bit. At least for now
   it is not needed and the test pass without it.
---
 .../selftests/kvm/include/x86/tdx/tdx_util.h  |  4 ++
 .../selftests/kvm/lib/x86/tdx/tdx_util.c      | 72 +++++++++++++++++++
 2 files changed, 76 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 ec05bcd59145..dafdc7e46abe 100644
--- a/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h
+++ b/tools/testing/selftests/kvm/include/x86/tdx/tdx_util.h
@@ -12,5 +12,9 @@ static inline bool is_tdx_vm(struct kvm_vm *vm)
 }
 
 void vm_tdx_setup_boot_code_region(struct kvm_vm *vm);
+void vm_tdx_setup_boot_parameters_region(struct kvm_vm *vm, uint32_t nr_runnable_vcpus);
+void vm_tdx_load_common_boot_parameters(struct kvm_vm *vm);
+void vm_tdx_load_vcpu_boot_parameters(struct kvm_vm *vm, struct kvm_vcpu *vcpu);
+void vm_tdx_set_vcpu_entry_point(struct kvm_vcpu *vcpu, void *guest_code);
 
 #endif // SELFTESTS_TDX_TDX_UTIL_H
diff --git a/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c b/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c
index a1cf12de9d56..f3b69923e928 100644
--- a/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c
+++ b/tools/testing/selftests/kvm/lib/x86/tdx/tdx_util.c
@@ -5,10 +5,12 @@
 #include "kvm_util.h"
 #include "processor.h"
 #include "tdx/td_boot.h"
+#include "tdx/td_boot_asm.h"
 #include "tdx/tdx_util.h"
 
 /* Arbitrarily selected to avoid overlaps with anything else */
 #define TD_BOOT_CODE_SLOT	20
+#define TD_BOOT_PARAMETERS_SLOT	21
 
 #define X86_RESET_VECTOR	0xfffffff0ul
 #define X86_RESET_VECTOR_SIZE	16
@@ -52,3 +54,73 @@ void vm_tdx_setup_boot_code_region(struct kvm_vm *vm)
 	hva[1] = 256 - 2 - TD_BOOT_CODE_SIZE;
 	hva[2] = 0xcc;
 }
+
+void vm_tdx_setup_boot_parameters_region(struct kvm_vm *vm, uint32_t nr_runnable_vcpus)
+{
+	size_t boot_params_size =
+		sizeof(struct td_boot_parameters) +
+		nr_runnable_vcpus * sizeof(struct td_per_vcpu_parameters);
+	int npages = DIV_ROUND_UP(boot_params_size, PAGE_SIZE);
+	vm_paddr_t gpa;
+
+	vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS,
+				    TD_BOOT_PARAMETERS_GPA,
+				    TD_BOOT_PARAMETERS_SLOT, npages,
+				    KVM_MEM_GUEST_MEMFD);
+	gpa = vm_phy_pages_alloc(vm, npages, TD_BOOT_PARAMETERS_GPA, TD_BOOT_PARAMETERS_SLOT);
+	TEST_ASSERT(gpa == TD_BOOT_PARAMETERS_GPA, "Failed vm_phy_pages_alloc\n");
+
+	virt_map(vm, TD_BOOT_PARAMETERS_GPA, TD_BOOT_PARAMETERS_GPA, npages);
+}
+
+void vm_tdx_load_common_boot_parameters(struct kvm_vm *vm)
+{
+	struct td_boot_parameters *params =
+		addr_gpa2hva(vm, TD_BOOT_PARAMETERS_GPA);
+	uint32_t cr4;
+
+	TEST_ASSERT_EQ(vm->mode, VM_MODE_PXXV48_4K);
+
+	cr4 = kvm_get_default_cr4();
+
+	/* TDX spec 11.6.2: CR4 bit MCE is fixed to 1 */
+	cr4 |= X86_CR4_MCE;
+
+	/* TDX spec 11.6.2: CR4 bit VMXE and SMXE are fixed to 0 */
+	cr4 &= ~(X86_CR4_VMXE | X86_CR4_SMXE);
+
+	/* Set parameters! */
+	params->cr0 = kvm_get_default_cr0();
+	params->cr3 = vm->pgd;
+	params->cr4 = cr4;
+	params->idtr.base = vm->arch.idt;
+	params->idtr.limit = kvm_get_default_idt_limit();
+	params->gdtr.base = vm->arch.gdt;
+	params->gdtr.limit = kvm_get_default_gdt_limit();
+
+	TEST_ASSERT(params->cr0 != 0, "cr0 should not be 0");
+	TEST_ASSERT(params->cr3 != 0, "cr3 should not be 0");
+	TEST_ASSERT(params->cr4 != 0, "cr4 should not be 0");
+	TEST_ASSERT(params->gdtr.base != 0, "gdt base address should not be 0");
+	TEST_ASSERT(params->idtr.base != 0, "idt base address should not be 0");
+}
+
+void vm_tdx_load_vcpu_boot_parameters(struct kvm_vm *vm, struct kvm_vcpu *vcpu)
+{
+	struct td_boot_parameters *params =
+		addr_gpa2hva(vm, TD_BOOT_PARAMETERS_GPA);
+	struct td_per_vcpu_parameters *vcpu_params =
+		&params->per_vcpu[vcpu->id];
+
+	vcpu_params->esp_gva = kvm_allocate_vcpu_stack(vm);
+}
+
+void vm_tdx_set_vcpu_entry_point(struct kvm_vcpu *vcpu, void *guest_code)
+{
+	struct td_boot_parameters *params =
+		addr_gpa2hva(vcpu->vm, TD_BOOT_PARAMETERS_GPA);
+	struct td_per_vcpu_parameters *vcpu_params =
+		&params->per_vcpu[vcpu->id];
+
+	vcpu_params->guest_code = (uint64_t)guest_code;
+}
-- 
2.51.1.851.g4ebd6896fd-goog


  parent reply	other threads:[~2025-10-28 21:21 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-28 21:20 [PATCH v12 00/23] TDX KVM selftests Sagi Shahar
2025-10-28 21:20 ` [PATCH v12 01/23] KVM: selftests: Add macros so simplify creating VM shapes for non-default types Sagi Shahar
2025-10-29  1:13   ` Ira Weiny
2025-10-29  6:57   ` Binbin Wu
2025-10-31  3:42   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 02/23] KVM: selftests: Allocate pgd in virt_map() as necessary Sagi Shahar
2025-10-31  3:51   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 03/23] KVM: selftests: Expose functions to get default sregs values Sagi Shahar
2025-10-29  1:40   ` Ira Weiny
2025-10-31  3:43   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 04/23] KVM: selftests: Expose function to allocate guest vCPU stack Sagi Shahar
2025-10-29 13:24   ` Ira Weiny
2025-10-31  3:52   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 05/23] KVM: selftests: Update kvm_init_vm_address_properties() for TDX Sagi Shahar
2025-10-29 15:22   ` Ira Weiny
2025-10-31  3:53   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 06/23] KVM: selftests: Expose segment definitons to assembly files Sagi Shahar
2025-10-31  3:54   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 07/23] KVM: selftests: Add kbuild definitons Sagi Shahar
2025-10-29  7:43   ` Binbin Wu
2025-10-29 15:46     ` Ira Weiny
2025-10-29 15:55   ` Ira Weiny
2025-10-31  3:56   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 08/23] KVM: selftests: Define structs to pass parameters to TDX boot code Sagi Shahar
2025-10-29 16:37   ` Reinette Chatre
2025-10-30 14:20     ` Sean Christopherson
2025-10-31  4:01   ` Reinette Chatre
2025-11-26 22:32   ` Ira Weiny
2025-12-01 20:28     ` Ira Weiny
2025-10-28 21:20 ` [PATCH v12 09/23] KVM: selftests: Add " Sagi Shahar
2025-10-28 21:20 ` [PATCH v12 10/23] KVM: selftests: Set up TDX boot code region Sagi Shahar
2025-10-28 21:20 ` Sagi Shahar [this message]
2025-10-29  8:52   ` [PATCH v12 11/23] KVM: selftests: Set up TDX boot parameters region Binbin Wu
2025-10-29 21:01   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 12/23] KVM: selftests: Add helper to initialize TDX VM Sagi Shahar
2025-10-29 21:16   ` Ira Weiny
2025-10-29 23:01     ` Reinette Chatre
2025-10-30  1:25   ` Binbin Wu
2025-10-31  4:06   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 13/23] KVM: selftests: TDX: Use KVM_TDX_CAPABILITIES to validate TDs' attribute configuration Sagi Shahar
2025-10-29 21:19   ` Ira Weiny
2025-10-30  1:35   ` Binbin Wu
2025-10-28 21:20 ` [PATCH v12 14/23] KVM: selftests: Add helpers to init TDX memory and finalize VM Sagi Shahar
2025-10-29 21:27   ` Ira Weiny
2025-10-30  2:32   ` Binbin Wu
2025-10-31 15:58   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 15/23] KVM: selftests: Call TDX init when creating a new TDX vm Sagi Shahar
2025-10-30 22:20   ` Ira Weiny
2025-10-31 16:03   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 16/23] KVM: selftests: Setup memory regions for TDX on vm creation Sagi Shahar
2025-10-29 13:18   ` Ira Weiny
2025-10-30  6:01     ` Binbin Wu
2025-10-28 21:20 ` [PATCH v12 17/23] KVM: selftests: Call KVM_TDX_INIT_VCPU when creating a new TDX vcpu Sagi Shahar
2025-10-30  6:15   ` Binbin Wu
2025-10-28 21:20 ` [PATCH v12 18/23] KVM: selftests: Set entry point for TDX guest code Sagi Shahar
2025-10-31 16:03   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 19/23] KVM: selftests: Finalize TD memory as part of kvm_arch_vm_finalize_vcpus Sagi Shahar
2025-10-31 13:10   ` Ira Weiny
2025-10-31 16:05   ` Reinette Chatre
2025-10-28 21:20 ` [PATCH v12 20/23] KVM: selftests: Add support for TDX TDCALL from guest Sagi Shahar
2025-10-31 14:11   ` Ira Weiny
2025-10-31 15:15     ` Sean Christopherson
2025-10-31 15:58       ` Sagi Shahar
2025-10-31 16:12         ` Sean Christopherson
2025-10-31 16:01       ` Sean Christopherson
2025-10-28 21:20 ` [PATCH v12 21/23] KVM: selftests: Add wrapper for TDX MMIO " Sagi Shahar
2025-10-31 14:21   ` Ira Weiny
2025-10-28 21:20 ` [PATCH v12 22/23] KVM: selftests: Add ucall support for TDX Sagi Shahar
2025-10-31 14:38   ` Ira Weiny
2025-10-31 15:55   ` Sean Christopherson
2025-10-28 21:20 ` [PATCH v12 23/23] KVM: selftests: Add TDX lifecycle test Sagi Shahar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20251028212052.200523-12-sagis@google.com \
    --to=sagis@google.com \
    --cc=ackerleytng@google.com \
    --cc=afranji@google.com \
    --cc=ajones@ventanamicro.com \
    --cc=binbin.wu@linux.intel.com \
    --cc=chao.gao@intel.com \
    --cc=chenyi.qiang@intel.com \
    --cc=erdemaktas@google.com \
    --cc=ira.weiny@intel.com \
    --cc=isaku.yamahata@intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=oliver.upton@linux.dev \
    --cc=pbonzini@redhat.com \
    --cc=pratikrajesh.sampat@amd.com \
    --cc=reinette.chatre@intel.com \
    --cc=rick.p.edgecombe@intel.com \
    --cc=runanwang@google.com \
    --cc=seanjc@google.com \
    --cc=shuah@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.