From nobody Thu Oct 2 10:49:37 2025 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (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 F3AD82F746A for ; Wed, 17 Sep 2025 21:51:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758145873; cv=none; b=gTd8rLa503hY2oVliQnty1BoSJ+mpLiI65lQzcuI74jioJCKFjyBWj0TkO176VGHSs6GGsDI58tnCS0w9PDpT1JmT0s7E3noEBGI7iPvXRB4GK65FGDLJiSrst0lhCDakAngpxyI0fOVr1rtFhkBC8o5a9DF/pBH58ToU2yQur0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758145873; c=relaxed/simple; bh=LqGmDErC+0rvfwTlCCv3MATKWOoGiTAPnRm7qx/uRIQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=jRh78uGn8AtNey8aj5boQvV1OpGuJx92//dUDqhbnGySj87HkC+sbjYwbZ4V0OFwpr5JWor1ph1isxYaMnCGjgTI+d/c/bbUxGgLjOi1DLQjvkecGofTBFVgBbWO/shQ6LW1Lpr8Q3lixVG5FOVA82IWeiMZXQH18ZOz8RNFMD4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jmattson.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=mOuBjO3u; arc=none smtp.client-ip=209.85.210.202 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--jmattson.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="mOuBjO3u" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-777d7c52cc3so465535b3a.2 for ; Wed, 17 Sep 2025 14:51:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1758145871; x=1758750671; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=raX33s8++blO4FFDhhuZ1t5E6VYJ8jLOCEs3GGXrhy4=; b=mOuBjO3uNlzXGe83rw/7pDmuO2CChgbdyCz8NaqLayWeQBsCc/WyAtoOp+hEnVxGGn ulWLdl4GcNKz/6OZFFm2HpXm6Otxs3x+F05aVKYQ6EA17QKROAjkasrAugUgJ5s0dFf2 Yi/b1PokCjFLfClg0NQRStVxg+9HW2IcUxnQ006I8aEWVC5JmHyjYFeRjUDgLyyxO25n PeJnDri2Aa4mM9iRS4DClZ9WuYDatCnwwyNMgofRmCsYmxuEcGOcPmuiqWIlutv0DLQ7 NPps1KlamvGCSEsipKclnxUn0ZuexsYe87NVwDXWKuHNz2VZ4RP7CypzpvxaVbM3Ak6J H/JA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758145871; x=1758750671; h=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; bh=raX33s8++blO4FFDhhuZ1t5E6VYJ8jLOCEs3GGXrhy4=; b=GDTUyV+LulX+5X48FE76a69GbVbRcThiDZFw98s8a9+Izyof3g590QhdOvolWYxSJU WriLCGh3Z17rW6lEec0SIVFRK+DnJhqBj2QgByC3I7Wcl7eT3fYVhvzCc3MmrRsziQaf gE3A4C7BKbQ98tKZrNyVYDBWnS4ES6xb1JoeZf97XpXcxhqc6LoegmtWjzW5FTKyAmPI rcRpplXFGHX+6WJVL5BOKmNZRR+JKn3gDCznPxWAGvJEM2WJHRBqXXAEH1rImLaIrDob Cmqn728wbkx82w8s+sLkcY3mcZMJ69hiuGwx/EOu3/2VS5CLg2thuhoAZxyDFEmEYs7O 7tzw== X-Forwarded-Encrypted: i=1; AJvYcCXej4YO4QC/ldIAHBE/Ou6+7JFG2Qx6riLadqDLhlWgRbZ6pnUl8WkeeMVB+0MITUiKk4Ik5iqMCIgCPF8=@vger.kernel.org X-Gm-Message-State: AOJu0Yyrp/AmkIX3B/LEB4WEc1xdFnqr7OyX0gYl/JdUcoDiExs9YciI Sm08YHNii003P78NIyqn9cJEey2j5SF5ZnkOtKnKLVUgQA9h2nw9Fvqd3pviRgQqSY26p6kNexN /horVUqkGZ0J9CA== X-Google-Smtp-Source: AGHT+IEXHIfe31iHTiPUjWBrijjL9dOd26voZYrj2f7+bWGKHk6sS7I2FWWtoOYTdxUvPxMvYQxGk7MANH51Kg== X-Received: from pfaq4.prod.google.com ([2002:a05:6a00:a884:b0:772:32b1:58f9]) (user=jmattson job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:4328:b0:24e:2cee:9585 with SMTP id adf61e73a8af0-27aa99bdb8fmr5600927637.54.1758145871359; Wed, 17 Sep 2025 14:51:11 -0700 (PDT) Date: Wed, 17 Sep 2025 14:48:37 -0700 In-Reply-To: <20250917215031.2567566-1-jmattson@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250917215031.2567566-1-jmattson@google.com> X-Mailer: git-send-email 2.51.0.470.ga7dc726c21-goog Message-ID: <20250917215031.2567566-2-jmattson@google.com> Subject: [PATCH 1/4] KVM: selftests: Use a loop to create guest page tables From: Jim Mattson To: Paolo Bonzini , Shuah Khan , Sean Christopherson , Bibo Mao , Huacai Chen , Andrew Jones , Claudio Imbrenda , "Pratik R. Sampat" , Kai Huang , Eric Auger , linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Cc: Jim Mattson Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Walk the guest page tables via a loop when creating new mappings, instead of using unique variables for each level of the page tables. This simplifies the code and makes it easier to support 5-level paging in the future. Signed-off-by: Jim Mattson --- .../testing/selftests/kvm/lib/x86/processor.c | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testin= g/selftests/kvm/lib/x86/processor.c index d4c19ac885a9..0238e674709d 100644 --- a/tools/testing/selftests/kvm/lib/x86/processor.c +++ b/tools/testing/selftests/kvm/lib/x86/processor.c @@ -184,8 +184,8 @@ static uint64_t *virt_create_upper_pte(struct kvm_vm *v= m, void __virt_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr, int = level) { const uint64_t pg_size =3D PG_LEVEL_SIZE(level); - uint64_t *pml4e, *pdpe, *pde; - uint64_t *pte; + uint64_t *pte =3D &vm->pgd; + int current_level; =20 TEST_ASSERT(vm->mode =3D=3D VM_MODE_PXXV48_4K, "Unknown or unsupported guest mode, mode: 0x%x", vm->mode); @@ -209,20 +209,14 @@ void __virt_pg_map(struct kvm_vm *vm, uint64_t vaddr,= uint64_t paddr, int level) * Allocate upper level page tables, if not already present. Return * early if a hugepage was created. */ - pml4e =3D virt_create_upper_pte(vm, &vm->pgd, vaddr, paddr, PG_LEVEL_512G= , level); - if (*pml4e & PTE_LARGE_MASK) - return; - - pdpe =3D virt_create_upper_pte(vm, pml4e, vaddr, paddr, PG_LEVEL_1G, leve= l); - if (*pdpe & PTE_LARGE_MASK) - return; - - pde =3D virt_create_upper_pte(vm, pdpe, vaddr, paddr, PG_LEVEL_2M, level); - if (*pde & PTE_LARGE_MASK) - return; + for (current_level =3D vm->pgtable_levels; current_level > 0; current_lev= el--) { + pte =3D virt_create_upper_pte(vm, pte, vaddr, paddr, current_level, leve= l); + if (*pte & PTE_LARGE_MASK) + return; + } =20 /* Fill in page table entry. */ - pte =3D virt_get_pte(vm, pde, vaddr, PG_LEVEL_4K); + pte =3D virt_get_pte(vm, pte, vaddr, PG_LEVEL_4K); TEST_ASSERT(!(*pte & PTE_PRESENT_MASK), "PTE already present for 4k page at vaddr: 0x%lx", vaddr); *pte =3D PTE_PRESENT_MASK | PTE_WRITABLE_MASK | (paddr & PHYSICAL_PAGE_MA= SK); --=20 2.51.0.470.ga7dc726c21-goog From nobody Thu Oct 2 10:49:37 2025 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (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 9E80830DEC0 for ; Wed, 17 Sep 2025 21:51:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758145875; cv=none; b=cOVOG9CKJguG5P0j3pVZqk2+k/HkcR5USHiJvGK6gv5/V8JWVmHoJZ9mcpAvnua9quiasAjlKVZ7q8xNTQY8VHJOkSjUXjw6YG8rysG6lH5yroVgFQHDHhdRAiHv3SOq4+3HTiDZi5XYLr55NH9YyQrzD/KOTYSAGLG3az+O46g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758145875; c=relaxed/simple; bh=fV7d+iMC4cNbWSys5ekBLpLRqjs3hfSfwJ8ddSNU6KM=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=sAa/WwT/0fOcaESBR0S4c8lQHhfWhu9vQ6qCRIhpt6a58vhO+16XQYr21eDai46DVRJj0Lyo6o2CiNR+t0knbM2XnZE5546gmcPRjTPCaT0Iz8UA7bE0GlYidxBfSlN6uHDO6gvog6yMa4TM6Vs+2UEZMIF02ClFuscptJZHZ/I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jmattson.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=z3aa4xQg; arc=none smtp.client-ip=209.85.216.74 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--jmattson.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="z3aa4xQg" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-32e8c800a79so241168a91.0 for ; Wed, 17 Sep 2025 14:51:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1758145873; x=1758750673; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=6ODBCbD440uYvQ8SizIyBgOxXgM+3hzOx7AmPapgbVc=; b=z3aa4xQgQfrkctS0i6sPe9nVXl1EJCSbsu1n8C6siazFdEtDSmc7J3pFYBa225h7tr bmhI8ToKIwhLjRxImcc1IvUfC/NYwi/ZIs0zwyN1Hk3cnQ8TjOpGLrr51uLHGCSz3xl3 n/3xN/4tIbUbwxUcsDi/34Pd4rfIbR/RwYs3nESS9PhPz0AAZRBEnz/PKQgjRe0ET3xi rdeDt5XdClwVVn0kT68DN5zyQ5VSLrsyTKrcVX9GdqYLuP4HWa7pgqfAjbkLv8TuSQXW Fkz/nI0YcsZU5O59Sae4wnd0rrAEEpdNlxIdcl5KCMq4umVi4uUzFJ8gpooubl0S8RbB virg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758145873; x=1758750673; h=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; bh=6ODBCbD440uYvQ8SizIyBgOxXgM+3hzOx7AmPapgbVc=; b=bhGjYMwttxUTa/BYjAidHpxzQhCBDypKDhJYTAufUuhYZCEes97I8GbaJF9baShdyl FKk+nOotLDZhX2U4QjNK2V1sUvKNhwo6BARCtNxYr1r4YOsL4fNvnOk7/z6IUxCpqMxG NZpTzrxHRFESPZlyZ5C/3dTjL0MazB7bXfAxY8vH5xXReVy1SVK/NkyszvkanwNSiwkG LhvPdCk/XZ4UWjIo9iv9Hx03Q3E0j50/P5wtnbjTeTjKFK7EFt0SreQlgQGFR2bVAwQ6 VySWilnJ2V6i+t6hwelQeuOCIJxIeXCRKGEkHHMnQbbWZ1RfE/fsgauCIQrPrzAmVELL b8TQ== X-Forwarded-Encrypted: i=1; AJvYcCXm+r0zwPzbDOU1wd8g/suHWypgHac0JsYCZP5U8NLycncorbM1TTV1f5xvL+9Om8M5E5ptsYbDG+rcKAs=@vger.kernel.org X-Gm-Message-State: AOJu0YxJ1TAF020iLKx8Drq8G3EjdskGo6gPkrMqXmwbL67L/Ya4j1Lg qmUR673accgOvgQgrfI6U8d/5wyM2owkBKSx1/J4B7qoUq03Mpab1lbC0bkhmy+RRx6SzUcu4qj pIMX0sbbDWlSkqA== X-Google-Smtp-Source: AGHT+IEKqExV4mnY2Fu8atlg1uW5FJCAPBPhVFdmQ/waPYSuPzIUgusN63xwE2wudFUpWp9CX3s3sXd5/AY5zA== X-Received: from pjbsv12.prod.google.com ([2002:a17:90b:538c:b0:32e:b87b:6c84]) (user=jmattson job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:39cc:b0:329:f535:6e48 with SMTP id 98e67ed59e1d1-32ee3fa2ccemr4100883a91.36.1758145872774; Wed, 17 Sep 2025 14:51:12 -0700 (PDT) Date: Wed, 17 Sep 2025 14:48:38 -0700 In-Reply-To: <20250917215031.2567566-1-jmattson@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250917215031.2567566-1-jmattson@google.com> X-Mailer: git-send-email 2.51.0.470.ga7dc726c21-goog Message-ID: <20250917215031.2567566-3-jmattson@google.com> Subject: [PATCH 2/4] KVM: selftests: Use a loop to walk guest page tables From: Jim Mattson To: Paolo Bonzini , Shuah Khan , Sean Christopherson , Bibo Mao , Huacai Chen , Andrew Jones , Claudio Imbrenda , "Pratik R. Sampat" , Kai Huang , Eric Auger , linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Cc: Jim Mattson Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Walk the guest page tables via a loop when searching for a PTE, instead of using unique variables for each level of the page tables. This simplifies the code and makes it easier to support 5-level paging in the future. Signed-off-by: Jim Mattson --- .../testing/selftests/kvm/lib/x86/processor.c | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testin= g/selftests/kvm/lib/x86/processor.c index 0238e674709d..433365c8196d 100644 --- a/tools/testing/selftests/kvm/lib/x86/processor.c +++ b/tools/testing/selftests/kvm/lib/x86/processor.c @@ -270,7 +270,8 @@ static bool vm_is_target_pte(uint64_t *pte, int *level,= int current_level) uint64_t *__vm_get_page_table_entry(struct kvm_vm *vm, uint64_t vaddr, int *level) { - uint64_t *pml4e, *pdpe, *pde; + uint64_t *pte =3D &vm->pgd; + int current_level; =20 TEST_ASSERT(!vm->arch.is_pt_protected, "Walking page tables of protected guests is impossible"); @@ -291,19 +292,13 @@ uint64_t *__vm_get_page_table_entry(struct kvm_vm *vm= , uint64_t vaddr, TEST_ASSERT(vaddr =3D=3D (((int64_t)vaddr << 16) >> 16), "Canonical check failed. The virtual address is invalid."); =20 - pml4e =3D virt_get_pte(vm, &vm->pgd, vaddr, PG_LEVEL_512G); - if (vm_is_target_pte(pml4e, level, PG_LEVEL_512G)) - return pml4e; - - pdpe =3D virt_get_pte(vm, pml4e, vaddr, PG_LEVEL_1G); - if (vm_is_target_pte(pdpe, level, PG_LEVEL_1G)) - return pdpe; - - pde =3D virt_get_pte(vm, pdpe, vaddr, PG_LEVEL_2M); - if (vm_is_target_pte(pde, level, PG_LEVEL_2M)) - return pde; + for (current_level =3D vm->pgtable_levels; current_level > 0; current_lev= el--) { + pte =3D virt_get_pte(vm, pte, vaddr, current_level); + if (vm_is_target_pte(pte, level, current_level)) + return pte; + } =20 - return virt_get_pte(vm, pde, vaddr, PG_LEVEL_4K); + return pte; } =20 uint64_t *vm_get_page_table_entry(struct kvm_vm *vm, uint64_t vaddr) --=20 2.51.0.470.ga7dc726c21-goog From nobody Thu Oct 2 10:49:37 2025 Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4951930E85C for ; Wed, 17 Sep 2025 21:51:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758145876; cv=none; b=hgEvAPn1YUzx8z0Bpf74D8rz2Hfd/pmVaGoa/xyz+nUTfqBid2k85R+zBf1zaB35HP1sHweXeNmeUi5+AQDhtlLtR9/o+bNoi/Rr24a1VV6I4TYfd2DXtBylCYkkaoxvWpMg3vNjKBW2nwDbs3MU0/N2iNbq0wZfiYB84hM77BU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758145876; c=relaxed/simple; bh=iuAmp899u8/2zjg7JEkbN+8eGWOiV1+PDEp2ucfo3bo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=uPEQv3z4apb4KJPsiBMjJNV6TXyVpr+1/O9UrE6QAJksce+xFBdOue4S6IoXL6TsKUKz1OTLcKbG6i6TdGsO0Nugg1biNJ6NHH9Usf7PRoC5g3rRhm7612ImO2HG+iGAHvcEjiDa97DU9pgf/j6waMs4EZ5u+osI8zyF+IjQJfI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jmattson.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=JLIK5MZH; arc=none smtp.client-ip=209.85.215.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--jmattson.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="JLIK5MZH" Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-b4fb25c2e56so142421a12.3 for ; Wed, 17 Sep 2025 14:51:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1758145874; x=1758750674; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=QLzLvZWG+ClPdB8sQ82+qcHJiOj3WmonmSKG4nve6Ec=; b=JLIK5MZHBeKRen3fNXV7Sht7/2Iir1By+fOeyx19JLxY+uoqQSF8zWTE00fMwievsU mHCwVm29Bi4ML0PjWm0U9YGllMcko2gbvsOGSJJHh8mOtDK4L6uUGu80yqsGzV6kPZ8J FRH8W2MKORvsKYjMuOIua0tsFpd7k42+vd86GTPf858DUhx1L3TInm4MytZRPi75FmKM STerhSbkjgppVKWj8RmhDL67j9iDCoE+SmcwXIur8ILgsq25CvqOvg7Aq/GiTGigJ9JF DZQ4MO9UL7Q/GbFTG0Vz6Tl/XQ+ItqEx2ItbAw4Y0srqFJ3XJmp1V+pwavzd6Y/r3F7U Kq8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758145874; x=1758750674; h=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; bh=QLzLvZWG+ClPdB8sQ82+qcHJiOj3WmonmSKG4nve6Ec=; b=AMiLyLyClQDWAIyb/miWSDiYfBOrW9WyMT2vOE19tOCEM64hznUZktt2gd2ZyJx4fK ofQxLwrCr0xCcm1ROjPYeYWXtI+q/2LWV9elWjddSvnS/LpXEk5kxV99ZKrCRCtZQlZG RuWp5rH6zXKV+rOYkvdDKDgpZTE/Sln4WmpRkeS/UPm6FUuqC2CFg90kCbK85oVpCVKO u3GLn8wuLrjIi4SlpZuB11uog5ypDgBLf+JKY1QcFU6L1KT2CLFUegf6jMG9Bl3NoaTF 8njoI8H6b5rID+SVNzBOFIVVyHc6zQADgxztyHpwco6QG71oSlNk+ibLQyjTN52sZsfj liyA== X-Forwarded-Encrypted: i=1; AJvYcCWkZ3zaBylCzeRUHY3vGgik9epayst60qpGNq+apkQV9bgImfEelKTbboHE+iNLlaOkJ+r5yGVJBUpSo0s=@vger.kernel.org X-Gm-Message-State: AOJu0YxSnWTtCo0CbJVvLOHs3vHYIuVdwkfaKQa+fgsj6efoYbz+VZiz 6fxFYKMm0GaB+ZqyEmm/ePXntDiN918JF5P1LIyKAwckaRUXjzdvwzRBliHvRVkXb9QLIVLcGTB VM6XtK5oEiouTNQ== X-Google-Smtp-Source: AGHT+IH5Sap/ei/fGQvx7x2RNFtD57XnmWHb91axnrJALJUHyDZUxhwHeWhmKptLbqe+jzHTmP2HVpx/C5MC1A== X-Received: from pjbta13.prod.google.com ([2002:a17:90b:4ecd:b0:32e:879e:cac1]) (user=jmattson job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:db11:b0:25c:2a4c:1ca3 with SMTP id d9443c01a7336-268137f2209mr49570525ad.30.1758145874602; Wed, 17 Sep 2025 14:51:14 -0700 (PDT) Date: Wed, 17 Sep 2025 14:48:39 -0700 In-Reply-To: <20250917215031.2567566-1-jmattson@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250917215031.2567566-1-jmattson@google.com> X-Mailer: git-send-email 2.51.0.470.ga7dc726c21-goog Message-ID: <20250917215031.2567566-4-jmattson@google.com> Subject: [PATCH 3/4] KVM: selftests: Add VM_MODE_PXXV57_4K VM mode From: Jim Mattson To: Paolo Bonzini , Shuah Khan , Sean Christopherson , Bibo Mao , Huacai Chen , Andrew Jones , Claudio Imbrenda , "Pratik R. Sampat" , Kai Huang , Eric Auger , linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Cc: Jim Mattson Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a new VM mode, VM_MODE_PXXV57_4K, to support tests that require 5-level paging on x86. This mode sets up a 57-bit virtual address space and sets CR4.LA57 in the guest. Signed-off-by: Jim Mattson --- .../testing/selftests/kvm/include/kvm_util.h | 1 + tools/testing/selftests/kvm/lib/kvm_util.c | 21 +++++++++++++++++ .../testing/selftests/kvm/lib/x86/processor.c | 23 ++++++++++++------- tools/testing/selftests/kvm/lib/x86/vmx.c | 7 +++--- 4 files changed, 41 insertions(+), 11 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index 23a506d7eca3..b6ea5d966715 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -175,6 +175,7 @@ enum vm_guest_mode { VM_MODE_P40V48_16K, VM_MODE_P40V48_64K, VM_MODE_PXXV48_4K, /* For 48bits VA but ANY bits PA */ + VM_MODE_PXXV57_4K, /* For 48bits VA but ANY bits PA */ VM_MODE_P47V64_4K, VM_MODE_P44V64_4K, VM_MODE_P36V48_4K, diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index c3f5142b0a54..6b0e499c6e91 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -232,6 +232,7 @@ const char *vm_guest_mode_string(uint32_t i) [VM_MODE_P40V48_16K] =3D "PA-bits:40, VA-bits:48, 16K pages", [VM_MODE_P40V48_64K] =3D "PA-bits:40, VA-bits:48, 64K pages", [VM_MODE_PXXV48_4K] =3D "PA-bits:ANY, VA-bits:48, 4K pages", + [VM_MODE_PXXV57_4K] =3D "PA-bits:ANY, VA-bits:57, 4K pages", [VM_MODE_P47V64_4K] =3D "PA-bits:47, VA-bits:64, 4K pages", [VM_MODE_P44V64_4K] =3D "PA-bits:44, VA-bits:64, 4K pages", [VM_MODE_P36V48_4K] =3D "PA-bits:36, VA-bits:48, 4K pages", @@ -259,6 +260,7 @@ const struct vm_guest_mode_params vm_guest_mode_params[= ] =3D { [VM_MODE_P40V48_16K] =3D { 40, 48, 0x4000, 14 }, [VM_MODE_P40V48_64K] =3D { 40, 48, 0x10000, 16 }, [VM_MODE_PXXV48_4K] =3D { 0, 0, 0x1000, 12 }, + [VM_MODE_PXXV57_4K] =3D { 0, 0, 0x1000, 12 }, [VM_MODE_P47V64_4K] =3D { 47, 64, 0x1000, 12 }, [VM_MODE_P44V64_4K] =3D { 44, 64, 0x1000, 12 }, [VM_MODE_P36V48_4K] =3D { 36, 48, 0x1000, 12 }, @@ -358,6 +360,25 @@ struct kvm_vm *____vm_create(struct vm_shape shape) vm->va_bits =3D 48; #else TEST_FAIL("VM_MODE_PXXV48_4K not supported on non-x86 platforms"); +#endif + break; + case VM_MODE_PXXV57_4K: +#ifdef __x86_64__ + kvm_get_cpu_address_width(&vm->pa_bits, &vm->va_bits); + kvm_init_vm_address_properties(vm); + /* + * For 5-level paging, KVM requires LA57 to be enabled, which + * requires a 57-bit virtual address space. + */ + TEST_ASSERT(vm->va_bits =3D=3D 57, + "Linear address width (%d bits) not supported for VM_MODE_PXXV57_4K= ", + vm->va_bits); + pr_debug("Guest physical address width detected: %d\n", + vm->pa_bits); + vm->pgtable_levels =3D 5; + vm->va_bits =3D 57; +#else + TEST_FAIL("VM_MODE_PXXV57_4K not supported on non-x86 platforms"); #endif break; case VM_MODE_P47V64_4K: diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testin= g/selftests/kvm/lib/x86/processor.c index 433365c8196d..d566190ea488 100644 --- a/tools/testing/selftests/kvm/lib/x86/processor.c +++ b/tools/testing/selftests/kvm/lib/x86/processor.c @@ -124,10 +124,11 @@ bool kvm_is_tdp_enabled(void) =20 void virt_arch_pgd_alloc(struct kvm_vm *vm) { - TEST_ASSERT(vm->mode =3D=3D VM_MODE_PXXV48_4K, "Attempt to use " - "unknown or unsupported guest mode, mode: 0x%x", vm->mode); + TEST_ASSERT(vm->mode =3D=3D VM_MODE_PXXV48_4K || + vm->mode =3D=3D VM_MODE_PXXV57_4K, + "Unknown or unsupported guest mode: 0x%x", vm->mode); =20 - /* If needed, create page map l4 table. */ + /* If needed, create the top-level page table. */ if (!vm->pgd_created) { vm->pgd =3D vm_alloc_page_table(vm); vm->pgd_created =3D true; @@ -187,8 +188,9 @@ void __virt_pg_map(struct kvm_vm *vm, uint64_t vaddr, u= int64_t paddr, int level) uint64_t *pte =3D &vm->pgd; int current_level; =20 - TEST_ASSERT(vm->mode =3D=3D VM_MODE_PXXV48_4K, - "Unknown or unsupported guest mode, mode: 0x%x", vm->mode); + TEST_ASSERT(vm->mode =3D=3D VM_MODE_PXXV48_4K || + vm->mode =3D=3D VM_MODE_PXXV57_4K, + "Unknown or unsupported guest mode: 0x%x", vm->mode); =20 TEST_ASSERT((vaddr % pg_size) =3D=3D 0, "Virtual address not aligned,\n" @@ -279,8 +281,9 @@ uint64_t *__vm_get_page_table_entry(struct kvm_vm *vm, = uint64_t vaddr, TEST_ASSERT(*level >=3D PG_LEVEL_NONE && *level < PG_LEVEL_NUM, "Invalid PG_LEVEL_* '%d'", *level); =20 - TEST_ASSERT(vm->mode =3D=3D VM_MODE_PXXV48_4K, "Attempt to use " - "unknown or unsupported guest mode, mode: 0x%x", vm->mode); + TEST_ASSERT(vm->mode =3D=3D VM_MODE_PXXV48_4K || + vm->mode =3D=3D VM_MODE_PXXV57_4K, + "Unknown or unsupported guest mode: 0x%x", vm->mode); TEST_ASSERT(sparsebit_is_set(vm->vpages_valid, (vaddr >> vm->page_shift)), "Invalid virtual address, vaddr: 0x%lx", @@ -481,7 +484,9 @@ static void vcpu_init_sregs(struct kvm_vm *vm, struct k= vm_vcpu *vcpu) { struct kvm_sregs sregs; =20 - TEST_ASSERT_EQ(vm->mode, VM_MODE_PXXV48_4K); + TEST_ASSERT(vm->mode =3D=3D VM_MODE_PXXV48_4K || + vm->mode =3D=3D VM_MODE_PXXV57_4K, + "Unknown or unsupported guest mode: 0x%x", vm->mode); =20 /* Set mode specific system register values. */ vcpu_sregs_get(vcpu, &sregs); @@ -495,6 +500,8 @@ static void vcpu_init_sregs(struct kvm_vm *vm, struct k= vm_vcpu *vcpu) sregs.cr4 |=3D X86_CR4_PAE | X86_CR4_OSFXSR; if (kvm_cpu_has(X86_FEATURE_XSAVE)) sregs.cr4 |=3D X86_CR4_OSXSAVE; + if (vm->pgtable_levels =3D=3D 5) + sregs.cr4 |=3D X86_CR4_LA57; sregs.efer |=3D (EFER_LME | EFER_LMA | EFER_NX); =20 kvm_seg_set_unusable(&sregs.ldt); diff --git a/tools/testing/selftests/kvm/lib/x86/vmx.c b/tools/testing/self= tests/kvm/lib/x86/vmx.c index d4d1208dd023..1b6d4a007798 100644 --- a/tools/testing/selftests/kvm/lib/x86/vmx.c +++ b/tools/testing/selftests/kvm/lib/x86/vmx.c @@ -401,11 +401,12 @@ void __nested_pg_map(struct vmx_pages *vmx, struct kv= m_vm *vm, struct eptPageTableEntry *pt =3D vmx->eptp_hva, *pte; uint16_t index; =20 - TEST_ASSERT(vm->mode =3D=3D VM_MODE_PXXV48_4K, "Attempt to use " - "unknown or unsupported guest mode, mode: 0x%x", vm->mode); + TEST_ASSERT(vm->mode =3D=3D VM_MODE_PXXV48_4K || + vm->mode =3D=3D VM_MODE_PXXV57_4K, + "Unknown or unsupported guest mode: 0x%x", vm->mode); =20 TEST_ASSERT((nested_paddr >> 48) =3D=3D 0, - "Nested physical address 0x%lx requires 5-level paging", + "Nested physical address 0x%lx is > 48-bits and requires 5-level EPT= ", nested_paddr); TEST_ASSERT((nested_paddr % page_size) =3D=3D 0, "Nested physical address not on page boundary,\n" --=20 2.51.0.470.ga7dc726c21-goog From nobody Thu Oct 2 10:49:37 2025 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 951AC30F7E4 for ; Wed, 17 Sep 2025 21:51:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758145878; cv=none; b=stZMjoayk6TXsVZeM9YS6ziVzVJ5Po3NrC8uXOo1U5JeT9H3h+2Ofi6139rLBoKVw8Ye1St2mxSyw8jfojas4UaBxa4z9uC6BkREWnSseqpLM2WlcAyAcLpNLOH4vORcQn8FWwQywSQ5YN5uTgPrLpJuLL54qEiAcA0uD6xpfAI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758145878; c=relaxed/simple; bh=ZHa0B2RyRZZWLlneOhPUdWjyzFgnqipxJK7LB4AWbX0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=fuZrLuzvH27FbjpU0O3zkqg/ztB7DnFi0S9lbmqi8kgpLb4Uh83fCnkYaYQRKmIVW+ze9qim6xkFWxBDoO+N1m6MRpmwzdVRmVHhk2JgvZPLlsJj4pKXbjn5WTdjDo2L5le8uz2MZM6Kj21+Ena0R9cR/tliF0WKPw9uhGi6CZY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jmattson.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=zf/F+8ac; arc=none smtp.client-ip=209.85.214.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--jmattson.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="zf/F+8ac" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2697410e7f9so3768695ad.2 for ; Wed, 17 Sep 2025 14:51:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1758145876; x=1758750676; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=5LPrk/XrebsawKeQuGZAG8oqG4rtdkfDSdLwnedRBtY=; b=zf/F+8acakUrGVvkPqJBm09jHumox5HWGxK10QenjcFR/HEOUrItbbDXG1FbHQF2LU Yn42WGuivoJ8Es0aFhzM9LBGBXfEiSv8gs6D0/SwxsP9Ds9Q1wtpr5+r3eQ6BJkdHiLV 62ySUy9of21fXeKV1pM3tnbIM32f66Gs4D/kyek5iLdvvN4Y+M9Yzu+wfawFA/ly7Tei MLcE/1AWMpNpCMUX51n+FN7afZln7UdVf5qDezlx91VPrq9VwQZ2ndPdhjWigze1wFVl wp7N3gyZG44e5EKUer5rqcnpjNeySjSO0ZfpFslaLNvcq/6MqiYl1CZ9aBw/fFLpH550 ZGTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758145876; x=1758750676; h=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; bh=5LPrk/XrebsawKeQuGZAG8oqG4rtdkfDSdLwnedRBtY=; b=MODDDZ/CcRXwWJHx00g0dIOjmOpy3f14bbDTuPx/SB2w0/IQAcxtkR3FbfGTVhvqkC +nq3V30pd8YdDw2m9wzt57ql8Dwdv2GDwKusX1EE/MDtYyahJHNRDBF67pUCYJdAVrcS zu1f/UvfvCrocHGNVTnkzsH7WyiwSFOf7Sxet5dJmNQY6LK5wVpQo4M/1c7P1jLis46x lBZH/33EA+7ZIT0f8uPs5IwM2lW0drQMFmJCaBkupqSUrpLhxoYSE1XewIySoG/hHlie UobYBXbSqYOmq18Hk+Iht7OQVwUdaEXvocNSveY8Gt7w2nIyDhUfsyPJQUG7g+2qfPSj +Mqg== X-Forwarded-Encrypted: i=1; AJvYcCX8cFI2xlbU9/JQiZSNEmi2lwxkzyUl8PtwCSb+cGacEmn7RM7h7J0RW52b1IyD0bnJGwhyQEEwNBvCGLI=@vger.kernel.org X-Gm-Message-State: AOJu0YyVsYOa3zmxjxgrhgVcrneKLzo/HNV70no5dpI5fgNlpbBLpZcy M8scjRo7sVniYv8O0uaYLsT3OFGEwyJ563qx5IDSd95u5crubASd7qMU4J0sydGluPwHCXi8tVC QbYEbsi5UGo+ioQ== X-Google-Smtp-Source: AGHT+IFoisWsHyss64Oz8zIvxNbXaBwzLk0hgbLNl+OnOjuMwsVc60SyjmWex22OLqE66ILVy9fzMQNhZRGkuA== X-Received: from pjwx7.prod.google.com ([2002:a17:90a:c2c7:b0:327:d54a:8c93]) (user=jmattson job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:38c7:b0:264:3519:80d0 with SMTP id d9443c01a7336-268137f8405mr45310735ad.33.1758145875970; Wed, 17 Sep 2025 14:51:15 -0700 (PDT) Date: Wed, 17 Sep 2025 14:48:40 -0700 In-Reply-To: <20250917215031.2567566-1-jmattson@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250917215031.2567566-1-jmattson@google.com> X-Mailer: git-send-email 2.51.0.470.ga7dc726c21-goog Message-ID: <20250917215031.2567566-5-jmattson@google.com> Subject: [PATCH 4/4] KVM: selftests: Add a VMX test for LA57 nested state From: Jim Mattson To: Paolo Bonzini , Shuah Khan , Sean Christopherson , Bibo Mao , Huacai Chen , Andrew Jones , Claudio Imbrenda , "Pratik R. Sampat" , Kai Huang , Eric Auger , linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org Cc: Jim Mattson Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a selftest that verifies KVM's ability to save and restore nested state when the L1 guest is using 5-level paging and the L2 guest is using 4-level paging. Specifically, canonicality tests of the VMCS12 host-state fields should accept 57-bit virtual addresses. Signed-off-by: Jim Mattson --- tools/testing/selftests/kvm/Makefile.kvm | 1 + .../kvm/x86/vmx_la57_nested_state_test.c | 137 ++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 tools/testing/selftests/kvm/x86/vmx_la57_nested_state_t= est.c diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selft= ests/kvm/Makefile.kvm index 41b40c676d7f..f1958b88ec59 100644 --- a/tools/testing/selftests/kvm/Makefile.kvm +++ b/tools/testing/selftests/kvm/Makefile.kvm @@ -116,6 +116,7 @@ TEST_GEN_PROGS_x86 +=3D x86/vmx_exception_with_invalid_= guest_state TEST_GEN_PROGS_x86 +=3D x86/vmx_msrs_test TEST_GEN_PROGS_x86 +=3D x86/vmx_invalid_nested_guest_state TEST_GEN_PROGS_x86 +=3D x86/vmx_set_nested_state_test +TEST_GEN_PROGS_x86 +=3D x86/vmx_la57_nested_state_test TEST_GEN_PROGS_x86 +=3D x86/vmx_tsc_adjust_test TEST_GEN_PROGS_x86 +=3D x86/vmx_nested_tsc_scaling_test TEST_GEN_PROGS_x86 +=3D x86/apic_bus_clock_test diff --git a/tools/testing/selftests/kvm/x86/vmx_la57_nested_state_test.c b= /tools/testing/selftests/kvm/x86/vmx_la57_nested_state_test.c new file mode 100644 index 000000000000..7c3c4c1c17f6 --- /dev/null +++ b/tools/testing/selftests/kvm/x86/vmx_la57_nested_state_test.c @@ -0,0 +1,137 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * vmx_la57_nested_state_test + * + * Copyright (C) 2025, Google LLC. + * + * Test KVM's ability to save and restore nested state when the L1 guest + * is using 5-level paging and the L2 guest is using 4-level paging. + * + * This test would have failed prior to commit 9245fd6b8531 ("KVM: x86: + * model canonical checks more precisely"). + */ +#include "test_util.h" +#include "kvm_util.h" +#include "processor.h" +#include "vmx.h" + +#define LA57_GS_BASE 0xff2bc0311fb00000ull + +static void l2_guest_code(void) +{ + /* + * Sync with L0 to trigger save/restore. After + * resuming, execute VMCALL to exit back to L1. + */ + GUEST_SYNC(1); + vmcall(); +} + +static void l1_guest_code(struct vmx_pages *vmx_pages) +{ +#define L2_GUEST_STACK_SIZE 64 + unsigned long l2_guest_stack[L2_GUEST_STACK_SIZE]; + u64 guest_cr4; + vm_paddr_t pml5_pa, pml4_pa; + u64 *pml5; + u64 exit_reason; + + /* Set GS_BASE to a value that is only canonical with LA57. */ + wrmsr(MSR_GS_BASE, LA57_GS_BASE); + GUEST_ASSERT(rdmsr(MSR_GS_BASE) =3D=3D LA57_GS_BASE); + + GUEST_ASSERT(vmx_pages->vmcs_gpa); + GUEST_ASSERT(prepare_for_vmx_operation(vmx_pages)); + GUEST_ASSERT(load_vmcs(vmx_pages)); + + prepare_vmcs(vmx_pages, l2_guest_code, + &l2_guest_stack[L2_GUEST_STACK_SIZE]); + + /* + * Set up L2 with a 4-level page table by pointing its CR3 to L1's + * PML4 table and clearing CR4.LA57. This creates the CR4.LA57 + * mismatch that exercises the bug. + */ + pml5_pa =3D get_cr3() & PHYSICAL_PAGE_MASK; + pml5 =3D (u64 *)pml5_pa; + pml4_pa =3D pml5[0] & PHYSICAL_PAGE_MASK; + vmwrite(GUEST_CR3, pml4_pa); + + guest_cr4 =3D vmreadz(GUEST_CR4); + guest_cr4 &=3D ~X86_CR4_LA57; + vmwrite(GUEST_CR4, guest_cr4); + + GUEST_ASSERT(!vmlaunch()); + + exit_reason =3D vmreadz(VM_EXIT_REASON); + GUEST_ASSERT(exit_reason =3D=3D EXIT_REASON_VMCALL); +} + +void guest_code(struct vmx_pages *vmx_pages) +{ + if (vmx_pages) + l1_guest_code(vmx_pages); + + GUEST_DONE(); +} + +int main(int argc, char *argv[]) +{ + vm_vaddr_t vmx_pages_gva =3D 0; + struct kvm_vm *vm; + struct kvm_vcpu *vcpu; + struct kvm_x86_state *state; + struct ucall uc; + int stage; + + TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_VMX)); + TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_LA57)); + TEST_REQUIRE(kvm_has_cap(KVM_CAP_NESTED_STATE)); + + vm =3D vm_create_shape_with_one_vcpu(VM_SHAPE(VM_MODE_PXXV57_4K), &vcpu, + guest_code); + + /* + * L1 needs to read its own PML5 table to set up L2. Identity map + * the PML5 table to facilitate this. + */ + virt_map(vm, vm->pgd, vm->pgd, 1); + + vcpu_alloc_vmx(vm, &vmx_pages_gva); + vcpu_args_set(vcpu, 1, vmx_pages_gva); + + for (stage =3D 1;; stage++) { + vcpu_run(vcpu); + TEST_ASSERT_KVM_EXIT_REASON(vcpu, KVM_EXIT_IO); + + switch (get_ucall(vcpu, &uc)) { + case UCALL_ABORT: + REPORT_GUEST_ASSERT(uc); + /* NOT REACHED */ + case UCALL_SYNC: + break; + case UCALL_DONE: + goto done; + default: + TEST_FAIL("Unknown ucall %lu", uc.cmd); + } + + TEST_ASSERT(uc.args[1] =3D=3D stage, + "Expected stage %d, got stage %lu", stage, (ulong)uc.args[1]); + if (stage =3D=3D 1) { + pr_info("L2 is active; performing save/restore.\n"); + state =3D vcpu_save_state(vcpu); + + kvm_vm_release(vm); + + /* Restore state in a new VM. */ + vcpu =3D vm_recreate_with_one_vcpu(vm); + vcpu_load_state(vcpu, state); + kvm_x86_state_cleanup(state); + } + } + +done: + kvm_vm_free(vm); + return 0; +} --=20 2.51.0.470.ga7dc726c21-goog