From nobody Sun Feb 8 02:56:17 2026 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 51369433B3 for ; Tue, 28 Oct 2025 22:58:54 +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=1761692336; cv=none; b=Ap6A4bw5Vc++mTocc6GcgnP5gx+cyweXiZHDp/rITU9hvv6/KsHbWiSWHPrd56SykN4PY8gQhEV/IwkX6E1SCKH1Fs6S+1QFJIQwylJXDh9G14CyCVlhS+fLt6M/VQ2i0b25G4lypV3YPCp84BE6iB6604mjbNXdIuW5suwLRZ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761692336; c=relaxed/simple; bh=JS15vNThAeh2jui9xeWUCKiqlGy+OUZg2+5NBKAugBA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=T5WPOZmHARVrnKwyrY6+6aRtKqb59RaZ+G4gW9jiw7nbydpnMZzWSvF3k+zucgEwA6j4mAsLAD0y2ecDkCzZVO20VzB0BV6s3mTfA1+AYkDuEgxo5LANUmjzi85kE6htNZBKhNFIwJ97npEkzlsrUlNlyoa+RHixUMJZ04Xolsk= 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=F7Sn5K4V; 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="F7Sn5K4V" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-33428befc08so15040521a91.2 for ; Tue, 28 Oct 2025 15:58:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1761692334; x=1762297134; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=B288Y6TAy0Oj1t/N3Z1wYBH55x8/0e/DLaA7QkeLdXk=; b=F7Sn5K4VbY48l9uBP6f1VJeTzTz6tU14P+eeW5J2R0Wr4GX0J6hnmR6WDb2hcu7wwI Zv83Utu1pM5HOD6Fnmd0yPe10xe2ub6d+yBoxjffXsEQt5cE9HRcrvMv6Tw/Cep+c1XJ Wja4H3XLbGv6p+vhvqFu/rGdkapChbchk/JjNVxVfy5EdCoOTUNcgeA0kCM1viaDjsuB aIZc3rxX+30EHSvvmoKEaNcgcMGi6omuuBeM/rfdZUL+QknLpnsuv29OkFylKYy3s1ax 2kKgD+iQ6J/4Ng6YFK2AIV8vMX0vycGh7JLLagkyogjlRkbqIQ6mLSQDYznQQbKTxuQP jreg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761692334; x=1762297134; h=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=B288Y6TAy0Oj1t/N3Z1wYBH55x8/0e/DLaA7QkeLdXk=; b=J7L7sR/MMBHWi7XCBFi5Un3vpPQhGvBvWLb7lsh6rqJVC3fLRiCCtRvyaZ68dgFVgr EuaTpByEC9Tk9TELB/ndN8m/slyMEEZLGg1/aq0KDFsj1W+potbcXW00juxFfNDpVUKS wNrXgR8b9zbMRiSRPCPd9uxSfu6RszuwM6CDPsqGyt2pXpdi7Edtn+t5j4MvUrANHPHh D3Cy5VAxe6klq4TQAsA4439NgBUeKnrDdOmSDoVhlSmAcLvLO4tzNAxwdxOjb1XLUK/R AR1RnwAuVqVMH3Mpd/eHnc8h46PsxUnCXaRlF3DvcpAHIzBxXi5SsyKTL6r1kxqs12KK rZ1g== X-Forwarded-Encrypted: i=1; AJvYcCW4fnhcm6sCEcTDd04yrmzZeCdR84h8PD+nWTIzUA9oxcKTAmjj6BuDkE8wVFUc/+2YdwQdh9zG0in5eVg=@vger.kernel.org X-Gm-Message-State: AOJu0YyXhzBHTmNV9fE8uOfZ9In9ml+J8Vrfp+vMXEc4OMchiyFDpB1W wg9ud9c+6VwDI+SCMpW0lcdh2QhaoJcxcM/mGHVQGjSLgAdXR/IpnhapPkQTJnX0UyzTS6mvoxf nsHsubwPwNBKaDA== X-Google-Smtp-Source: AGHT+IHUBNt+yVkmaDzMVABj692uUI0JHObl1P4P9tqPjQ42MTaBcOUyDM9YJNfeKyaxLDAtJvc+QR92G8cTPA== X-Received: from pjso22.prod.google.com ([2002:a17:90a:c096:b0:33b:b387:9850]) (user=jmattson job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:586c:b0:330:a454:c31a with SMTP id 98e67ed59e1d1-3403a2f2d62mr821811a91.32.1761692333727; Tue, 28 Oct 2025 15:58:53 -0700 (PDT) Date: Tue, 28 Oct 2025 15:30:39 -0700 In-Reply-To: <20251028225827.2269128-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: <20251028225827.2269128-1-jmattson@google.com> X-Mailer: git-send-email 2.51.1.851.g4ebd6896fd-goog Message-ID: <20251028225827.2269128-2-jmattson@google.com> Subject: [PATCH v2 1/4] KVM: selftests: Use a loop to create guest page tables From: Jim Mattson To: Paolo Bonzini , Shuah Khan , Sean Christopherson , Marc Zyngier , Oliver Upton , Joey Gouly , Suzuki K Poulose , Zenghui Yu , Andrew Jones , Huacai Chen , Bibo Mao , Jim Mattson , "Pratik R. Sampat" , James Houghton , linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev 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 Reviewed-by: Yosry Ahmed --- .../testing/selftests/kvm/lib/x86/processor.c | 25 ++++++++----------- 1 file changed, 11 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 b418502c5ecc..738f2a44083f 100644 --- a/tools/testing/selftests/kvm/lib/x86/processor.c +++ b/tools/testing/selftests/kvm/lib/x86/processor.c @@ -218,8 +218,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); @@ -243,20 +243,17 @@ 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 > PG_LEVEL_4K; + current_level--) { + pte =3D virt_create_upper_pte(vm, pte, vaddr, paddr, + current_level, level); + 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.1.851.g4ebd6896fd-goog From nobody Sun Feb 8 02:56:17 2026 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 DABE836A606 for ; Tue, 28 Oct 2025 22:58:55 +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=1761692337; cv=none; b=U6wYEBd0n5n0IwUcwJa6RW1ILVNeEgCiW6uzQbhRsxaZqgmKQz6PnD6GKIiq3ocvwrEa1Nh6kgDLOp7Urpe9R777vTk3zdesl0NAXCGr5VCGE+zoaYFmHwbLxALm6ui028KuPuFrp8xhUaqmASR4xiN/IASfVt/jp3zn5c+ZV+0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761692337; c=relaxed/simple; bh=9LfQM2hIUlxZZG/asJrlAoGIB42sfh2arlqfx9NqS1s=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=PnyNuuo/R+bCeEVYZkED02lezms7zjKrXZ6UFhWXewbbEq6QjOzhgDh7HnabP/3tPPofFMbzcDZtbeMxpHPEdMBSi8oF/jq46e3vvm9IOPhL7TILqPCEzoP3ne3BlR3jWq282ofLsP7ThQFRP96q2UVPyZEqyGgK+BChYPaQwcI= 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=Gi4jsgAl; 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="Gi4jsgAl" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-26983c4d708so49624725ad.3 for ; Tue, 28 Oct 2025 15:58:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1761692335; x=1762297135; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=LsN+TIOejwkRxcFvSTLIziuR7qVC+NSwlbaa713vCGw=; b=Gi4jsgAl6gOVkt9ckb0Tpv47WFDv0jLavDbPetB/+v0sG2bhtZFpe1WI/M/WmmW7WC f4FkKhiBdhUn8zbSXlC93pS4hQ7lXg9ZlD8WDP0eYY+MdbRo0JOgQ/2tScHAoSI6l7ZE 2xnINzE+JpAH/oE/l7qUPuzmiZe3ptERHe0wMmqmrdzgaAupueUu41kMx6GtppEJUjiH krNp4eynWEijmX+elrszyXel+KEOia8AEdNI+qzfgKL856cnobtRrgjtLRuXz/GJtt6u HEIfhyQNl6bkEtTxPGxFUgR2tVGFYh2eKZiJuTbnepwV5BWr5Y61B/v+OicPGDjVt9T9 fCSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761692335; x=1762297135; h=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=LsN+TIOejwkRxcFvSTLIziuR7qVC+NSwlbaa713vCGw=; b=wgS1yg4qc/ISytlY4qM3fD/wr8QXLPjSk0W3rmoPPu/hgf6dQquKiBbv8JOCyNZrwh nnP5+8XRvuvYwPUYuORz/IfwnjkYvCjGJspyxukLkWBSQxxMSBaF7XjABz1Qgi0RlGri +iVUig7F452mXGKppc0YffldRROia/j4P78lLbhGmfOXEPGydtMOS5G+2pbUq258GA69 YS4kkzElRWYxrlhbU51zIz1a6jpe8vrBYBqfFfMoLy5w02xVvyWZERFWoiSk/zQOaLqa Z6Lmdv19K1b5KK+bBH0HiSwusnZZOAd0c8npar2rYedK9hd7MpZRXqD9/kKBBKtnyznn 8Fag== X-Forwarded-Encrypted: i=1; AJvYcCVV/5GgQpLcwzDFaSGfoS4HWG8x8PlOeveONfUcNEUI0wYBor0y0r5c0gsZRD/bjrAFVYUEJiX8KePblWY=@vger.kernel.org X-Gm-Message-State: AOJu0Yy2P5r1nD7Ojajp96JsPcHK3NKhk5zjw4RlzUeahUnou3tfwyQm snMKZpsWWElk+YS2n0PeEKm9mpN4ROFNQNgf8Aoq4f88mHpO97eypwJny2r2OFR2peeC8ghws1w bkU0tXoxuZnDAEQ== X-Google-Smtp-Source: AGHT+IEMVSuG9lR7nieExZvnnc5AQBFrpxM2bdWmWvBi3SSEzKa00dcCH/wBtXjIXiNue0RQB/h1x65fEm/mgQ== X-Received: from pjvv11.prod.google.com ([2002:a17:90b:588b:b0:33e:3612:2208]) (user=jmattson job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2a86:b0:290:dd1f:3d60 with SMTP id d9443c01a7336-294def5a88amr8429735ad.51.1761692335281; Tue, 28 Oct 2025 15:58:55 -0700 (PDT) Date: Tue, 28 Oct 2025 15:30:40 -0700 In-Reply-To: <20251028225827.2269128-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: <20251028225827.2269128-1-jmattson@google.com> X-Mailer: git-send-email 2.51.1.851.g4ebd6896fd-goog Message-ID: <20251028225827.2269128-3-jmattson@google.com> Subject: [PATCH v2 2/4] KVM: selftests: Use a loop to walk guest page tables From: Jim Mattson To: Paolo Bonzini , Shuah Khan , Sean Christopherson , Marc Zyngier , Oliver Upton , Joey Gouly , Suzuki K Poulose , Zenghui Yu , Andrew Jones , Huacai Chen , Bibo Mao , Jim Mattson , "Pratik R. Sampat" , James Houghton , linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev 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 Reviewed-by: Yosry Ahmed --- .../testing/selftests/kvm/lib/x86/processor.c | 23 ++++++++----------- 1 file changed, 10 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 738f2a44083f..720c678187b5 100644 --- a/tools/testing/selftests/kvm/lib/x86/processor.c +++ b/tools/testing/selftests/kvm/lib/x86/processor.c @@ -307,7 +307,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"); @@ -328,19 +329,15 @@ 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 > PG_LEVEL_4K; + current_level--) { + 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 virt_get_pte(vm, pte, vaddr, PG_LEVEL_4K); } =20 uint64_t *vm_get_page_table_entry(struct kvm_vm *vm, uint64_t vaddr) --=20 2.51.1.851.g4ebd6896fd-goog From nobody Sun Feb 8 02:56:17 2026 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (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 3CF2836B962 for ; Tue, 28 Oct 2025 22:58:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761692339; cv=none; b=rHtvnB7OLG2zcPMW43QlPgoyQ4IxxHpdhCAWxvTehfuCxT/+pLiefQaPQ7712j/I6+afn/GDnuOyW9f3U/zNRy4ldoJWp/Ow38jvvXq512HdiRTthcoNiNQMAzCyjYnc+YU7p3UIhXVIsWLofmBC1/GDk20uHpiJucjT0QbagNI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761692339; c=relaxed/simple; bh=6S5tzR8kzOK7LjG9F9GQo6jk0uAJ9VKQm3dBNs63myU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=TiZh/oYDgOtiAn7jM0FpNPsxm2NiGUXLRaGhxaA4671Qkr+sIf3+vDLlsFBmIGk+ZRQAPxUYqOfDp0Ya8wq1vGl8AEyGhn5gP1xU5SUAHw8kFVsV/2zpswY2XdYV6GuS3OyKkd+gefkAoQWTDeARa5IbgFB2YA+wDgn0ezYbDBI= 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=mo6vsxdv; arc=none smtp.client-ip=209.85.216.73 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="mo6vsxdv" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-32edda89a37so4923094a91.1 for ; Tue, 28 Oct 2025 15:58:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1761692336; x=1762297136; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=Ip0GSPcOf73baSNEbw06pVGhZdDHrjVOI7is0zaeU+I=; b=mo6vsxdvZtIxTLHNOfYNPvz31cHR/F3ZArQjk3u/DrjHBQiAE1NCWlfyrsnDbIyYHf AGBcpKFn/pZc5CyIJ2JWtywGyBHSAFJG+rlytZc/ZwdCPYc/bidxm5LMJLVvHtQLVX6c wyfQMHzT9PKTq0xwr7p0T6EOTy+nIAsv/jjLyTLM8bmWc65oxhxbTRl4MgDv6AmKMnYH rzrEqd9cHOL/rNaXIfpQ5WyikaxE07rqBSRgCSeoHNXRtebV+G3hfwiTnS1ztrDzZ/Qs bG/Qvzi34hdzSqvvh1WwYfQVjsg6P+LHY4u+AT/XsyTjmaqQYyqyuzcfA+lonnt1lSrh /MJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761692336; x=1762297136; h=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=Ip0GSPcOf73baSNEbw06pVGhZdDHrjVOI7is0zaeU+I=; b=gM2tbCicPPhhZhW2to+vnsrqMPSyRFcAwUQHromIu9yfVSV1WrK7EFSS2D2qI/L2oP a4PBc+8AgMJZIAoRSAjABEb+e+tU9L8WU1zILz3sLMIbdr5dcTJaDsw7G270d8+ARwJ/ X/3Xka0p1S0Zj9C9aqHRcTHRh/4epwokjk2SzwyUlw2gtsLtUf1Vh0sZWPo9QPgVFTvc 2QTX3LfbI/L4QtYmG+lNSnVYjJIemA4wdikrweMSM+HEVsexvp0zZ5LqyqXgXzE+p0gJ PiT9go9BKoIEt1oLlHZeYoLV3BTlE5Z3qdyvY07Z4J51ZC8qzsvm869OQvsI7F/faxHj y9yA== X-Forwarded-Encrypted: i=1; AJvYcCVTCtDttTmOCPi1LY0uub6j2fAzuyYg1/0t9qdcdw+QXrdIOCyiV8kVwVtL17iiaIUyAxmWrf3qm5c/Cw0=@vger.kernel.org X-Gm-Message-State: AOJu0Yz6QmJqykgNLi/tu3oz3uCVhGQNNC/WGXYKzGIPK326qkdpxWBu FEgzEfRBUD58JC9g30DUdYeQLhWkAbjhX/FbfE6t/JWf/Q2L0Xlqy+XfJ1Va4Ezbv1BUy/bjZGo 3Mtxjh7ob4BQ5sg== X-Google-Smtp-Source: AGHT+IEocRZ/8v9VtAgKKGORzHoS2iGayjZS+sqTWSEnk3iM6JDQKTWbdjJDm+53lGtYfikxVTGa+6PFwz1akg== X-Received: from pjtf19.prod.google.com ([2002:a17:90a:c293:b0:33b:da89:9788]) (user=jmattson job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1d4c:b0:340:29cf:221f with SMTP id 98e67ed59e1d1-3403a2a3952mr713832a91.33.1761692336600; Tue, 28 Oct 2025 15:58:56 -0700 (PDT) Date: Tue, 28 Oct 2025 15:30:41 -0700 In-Reply-To: <20251028225827.2269128-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: <20251028225827.2269128-1-jmattson@google.com> X-Mailer: git-send-email 2.51.1.851.g4ebd6896fd-goog Message-ID: <20251028225827.2269128-4-jmattson@google.com> Subject: [PATCH v2 3/4] KVM: selftests: Change VM_MODE_PXXV48_4K to VM_MODE_PXXVYY_4K From: Jim Mattson To: Paolo Bonzini , Shuah Khan , Sean Christopherson , Marc Zyngier , Oliver Upton , Joey Gouly , Suzuki K Poulose , Zenghui Yu , Andrew Jones , Huacai Chen , Bibo Mao , Jim Mattson , "Pratik R. Sampat" , James Houghton , linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use 57-bit addresses with 5-level paging on hardware that supports LA57. Continue to use 48-bit addresses with 4-level paging on hardware that doesn't support LA57. Suggested-by: Sean Christopherson Signed-off-by: Jim Mattson --- .../testing/selftests/kvm/include/kvm_util.h | 4 +-- .../selftests/kvm/include/x86/processor.h | 2 +- .../selftests/kvm/lib/arm64/processor.c | 2 +- tools/testing/selftests/kvm/lib/kvm_util.c | 30 ++++++++++--------- .../testing/selftests/kvm/lib/x86/processor.c | 30 +++++++++++-------- tools/testing/selftests/kvm/lib/x86/vmx.c | 6 ++-- 6 files changed, 40 insertions(+), 34 deletions(-) diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing= /selftests/kvm/include/kvm_util.h index d3f3e455c031..8a54a1279d44 100644 --- a/tools/testing/selftests/kvm/include/kvm_util.h +++ b/tools/testing/selftests/kvm/include/kvm_util.h @@ -177,7 +177,7 @@ enum vm_guest_mode { VM_MODE_P40V48_4K, VM_MODE_P40V48_16K, VM_MODE_P40V48_64K, - VM_MODE_PXXV48_4K, /* For 48bits VA but ANY bits PA */ + VM_MODE_PXXVYY_4K, /* For 48-bit or 57-bit VA, depending on host support = */ VM_MODE_P47V64_4K, VM_MODE_P44V64_4K, VM_MODE_P36V48_4K, @@ -219,7 +219,7 @@ extern enum vm_guest_mode vm_mode_default; =20 #elif defined(__x86_64__) =20 -#define VM_MODE_DEFAULT VM_MODE_PXXV48_4K +#define VM_MODE_DEFAULT VM_MODE_PXXVYY_4K #define MIN_PAGE_SHIFT 12U #define ptes_per_page(page_size) ((page_size) / 8) =20 diff --git a/tools/testing/selftests/kvm/include/x86/processor.h b/tools/te= sting/selftests/kvm/include/x86/processor.h index 51cd84b9ca66..57d62a425109 100644 --- a/tools/testing/selftests/kvm/include/x86/processor.h +++ b/tools/testing/selftests/kvm/include/x86/processor.h @@ -1441,7 +1441,7 @@ enum pg_level { PG_LEVEL_2M, PG_LEVEL_1G, PG_LEVEL_512G, - PG_LEVEL_NUM + PG_LEVEL_256T }; =20 #define PG_LEVEL_SHIFT(_level) ((_level - 1) * 9 + 12) diff --git a/tools/testing/selftests/kvm/lib/arm64/processor.c b/tools/test= ing/selftests/kvm/lib/arm64/processor.c index 54f6d17c78f7..d46e4b13b92c 100644 --- a/tools/testing/selftests/kvm/lib/arm64/processor.c +++ b/tools/testing/selftests/kvm/lib/arm64/processor.c @@ -324,7 +324,7 @@ void aarch64_vcpu_setup(struct kvm_vcpu *vcpu, struct k= vm_vcpu_init *init) =20 /* Configure base granule size */ switch (vm->mode) { - case VM_MODE_PXXV48_4K: + case VM_MODE_PXXVYY_4K: TEST_FAIL("AArch64 does not support 4K sized pages " "with ANY-bit physical address ranges"); case VM_MODE_P52V48_64K: diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/sel= ftests/kvm/lib/kvm_util.c index 1a93d6361671..364efd02ad4a 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -201,7 +201,7 @@ const char *vm_guest_mode_string(uint32_t i) [VM_MODE_P40V48_4K] =3D "PA-bits:40, VA-bits:48, 4K pages", [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_PXXVYY_4K] =3D "PA-bits:ANY, VA-bits:48 or 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", @@ -228,7 +228,7 @@ const struct vm_guest_mode_params vm_guest_mode_params[= ] =3D { [VM_MODE_P40V48_4K] =3D { 40, 48, 0x1000, 12 }, [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_PXXVYY_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 }, @@ -310,24 +310,26 @@ struct kvm_vm *____vm_create(struct vm_shape shape) case VM_MODE_P36V47_16K: vm->pgtable_levels =3D 3; break; - case VM_MODE_PXXV48_4K: + case VM_MODE_PXXVYY_4K: #ifdef __x86_64__ kvm_get_cpu_address_width(&vm->pa_bits, &vm->va_bits); kvm_init_vm_address_properties(vm); - /* - * Ignore KVM support for 5-level paging (vm->va_bits =3D=3D 57), - * it doesn't take effect unless a CR4.LA57 is set, which it - * isn't for this mode (48-bit virtual address space). - */ - TEST_ASSERT(vm->va_bits =3D=3D 48 || vm->va_bits =3D=3D 57, - "Linear address width (%d bits) not supported", - vm->va_bits); + pr_debug("Guest physical address width detected: %d\n", vm->pa_bits); - vm->pgtable_levels =3D 4; - vm->va_bits =3D 48; + pr_debug("Guest virtual address width detected: %d\n", + vm->va_bits); + + if (vm->va_bits =3D=3D 57) { + vm->pgtable_levels =3D 5; + } else { + TEST_ASSERT(vm->va_bits =3D=3D 48, + "Unexpected guest virtual address width: %d", + vm->va_bits); + vm->pgtable_levels =3D 4; + } #else - TEST_FAIL("VM_MODE_PXXV48_4K not supported on non-x86 platforms"); + TEST_FAIL("VM_MODE_PXXVYY_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 720c678187b5..40bd69b265ef 100644 --- a/tools/testing/selftests/kvm/lib/x86/processor.c +++ b/tools/testing/selftests/kvm/lib/x86/processor.c @@ -158,10 +158,10 @@ 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_PXXVYY_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; @@ -221,8 +221,8 @@ 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_PXXVYY_4K, + "Unknown or unsupported guest mode: 0x%x", vm->mode); =20 TEST_ASSERT((vaddr % pg_size) =3D=3D 0, "Virtual address not aligned,\n" @@ -307,27 +307,28 @@ static bool vm_is_target_pte(uint64_t *pte, int *leve= l, int current_level) uint64_t *__vm_get_page_table_entry(struct kvm_vm *vm, uint64_t vaddr, int *level) { + int va_width =3D 12 + (vm->pgtable_levels) * 9; 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"); =20 - TEST_ASSERT(*level >=3D PG_LEVEL_NONE && *level < PG_LEVEL_NUM, + TEST_ASSERT(*level >=3D PG_LEVEL_NONE && *level <=3D vm->pgtable_levels, "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_PXXVYY_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", vaddr); /* - * Based on the mode check above there are 48 bits in the vaddr, so - * shift 16 to sign extend the last bit (bit-47), + * Check that the vaddr is a sign-extended va_width value. */ - TEST_ASSERT(vaddr =3D=3D (((int64_t)vaddr << 16) >> 16), - "Canonical check failed. The virtual address is invalid."); + TEST_ASSERT(vaddr =3D=3D + (((int64_t)vaddr << (64 - va_width) >> (64 - va_width))), + "Canonical check failed. The virtual address is invalid."); =20 for (current_level =3D vm->pgtable_levels; current_level > PG_LEVEL_4K; @@ -520,7 +521,8 @@ 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_PXXVYY_4K, + "Unknown or unsupported guest mode: 0x%x", vm->mode); =20 /* Set mode specific system register values. */ vcpu_sregs_get(vcpu, &sregs); @@ -534,6 +536,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..3bb529e8720f 100644 --- a/tools/testing/selftests/kvm/lib/x86/vmx.c +++ b/tools/testing/selftests/kvm/lib/x86/vmx.c @@ -401,11 +401,11 @@ 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_PXXVYY_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.1.851.g4ebd6896fd-goog From nobody Sun Feb 8 02:56:17 2026 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 9AB6836A60D for ; Tue, 28 Oct 2025 22:58:58 +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=1761692340; cv=none; b=eYA0lh0rNpT7iK3FfEDwnNeYBV7OVn1ZFbPCvA9K4tpI18mqm2Y6NNedzPzUAw5fjKWL7Q6vGHdSGla6uFDjZO/GU2ewqJG+IQjvLJ7JIWz2fbfDJVQiCY7xGAaFcpknQBYIfEBJwBn09KPJGuJg6s0aBTXXulj9uYctt2pVxxI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761692340; c=relaxed/simple; bh=93vaNyyTFMuDYRMt2Na8Hg8PCoyUTl7Q8NM8sIET3Q0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=F7R4Ed9F7BxYA5dqXO/MSlA6175JVccDo1Z4x9gMa0ktgZQ/98NvE5T4bORKn6l8h47tmeEERVDpTuzJEH/6LT5T6KpHmWVUhhBnou0muXW1/LrOJIwj9q6HxHwa8fwyunoAEUr8XWqWCQ3TRFXesphqWgF+aMaaHQij+nKIG5k= 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=Kyw5Sz/k; 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="Kyw5Sz/k" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-33bb4d11f5eso6272021a91.3 for ; Tue, 28 Oct 2025 15:58:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1761692338; x=1762297138; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=CXlFQqVkeSJSGq4nf4h9sY1cU7UxsK+01O4a1p4Iox8=; b=Kyw5Sz/kk4eu8lqLBQrGhUdcL6C6w/ToUAmEImqGjoIlpDIFJWY604stq+Q83MYP7p dKTXHxd6gYye79AILnpifTZ4g0CJVxL2fRbR7AWbVv+zXPLdxdZSDVBPu1+QVEJRwktO MJ0Up5srENpEBlRFdWmx/oEDGb1XiU1R1g9DGa3dseSDdx4ExEOTsce3y3xrhehXcswq hYhgoVaSIkRyjL8xRxNXkVrlzU2LMbV79NpLy8E/Tl0WMgRwAOZA08a26y+7FChLe4km iw3z9lntoF1JBHueU4Qphxw0UbaRzCrYRyQIi6KrkGt9HF7kB4l6iZE4+tOAvB+kl2fr 43Ww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761692338; x=1762297138; h=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=CXlFQqVkeSJSGq4nf4h9sY1cU7UxsK+01O4a1p4Iox8=; b=CSU1w/OBC9P2t8Da0d0cdETw5+qDvpDIlUDKqjvhGBqwxDMtnKFAmY5ps/rSCii3Qs MGlE6hzA6ZqW01LdsleIEcI+nvU6tv7LnG3LShifRvtXCNYBDNmBkNppvgXr/+Jb4DVr giZx6ko6+XNXHK95B68joWLqm/Y7nM+nxSDFzH3u4yG6i//5rpVlVcxqkIXnw61RFGa9 hCBAFI23HscLVki+21xj6DLtiGZryen6ygTvahlQRKxJERs4R6IUulw0SRUvaKm/LYMN Efh7+L8GNVVbm6owd7psUHVnqIefRWClIb2fyRxGJA6PKJZW8fKdpDMGo9ip7oC1o9rq H/HQ== X-Forwarded-Encrypted: i=1; AJvYcCXfgib3PbdguAY9U/g3Sl9NhJ3x98aI5W4X9jjJYz3a00OTbewlnFixQAFD5LBv6iGNv6jOyuYHX+o8Ckg=@vger.kernel.org X-Gm-Message-State: AOJu0YyPDEzgepXMbPFweHN1xcO9pHUKyi2irXqeKaIqf9YfrXhE92Vq xhHme0N0diEwysf5fbauagSTAsGPHRQppwVMVItr70pRJuP7ru9aQf+OekwtOHYQpasBvKy8oB3 nWJqS9e+DLQF9Ig== X-Google-Smtp-Source: AGHT+IHe+dJhfOO9m6uEQXw3DM1SrUYb2gIMsEhaThpkWaKsrk/O7HUYRRmxDYScsO608Odc0oikNMx/xTBT8Q== X-Received: from pjbsw13.prod.google.com ([2002:a17:90b:2c8d:b0:33f:e888:4aad]) (user=jmattson job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:586e:b0:340:299f:e244 with SMTP id 98e67ed59e1d1-3403a26906cmr820669a91.12.1761692337855; Tue, 28 Oct 2025 15:58:57 -0700 (PDT) Date: Tue, 28 Oct 2025 15:30:42 -0700 In-Reply-To: <20251028225827.2269128-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: <20251028225827.2269128-1-jmattson@google.com> X-Mailer: git-send-email 2.51.1.851.g4ebd6896fd-goog Message-ID: <20251028225827.2269128-5-jmattson@google.com> Subject: [PATCH v2 4/4] KVM: selftests: Add a VMX test for LA57 nested state From: Jim Mattson To: Paolo Bonzini , Shuah Khan , Sean Christopherson , Marc Zyngier , Oliver Upton , Joey Gouly , Suzuki K Poulose , Zenghui Yu , Andrew Jones , Huacai Chen , Bibo Mao , Jim Mattson , "Pratik R. Sampat" , James Houghton , linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev 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 | 134 ++++++++++++++++++ 2 files changed, 135 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 148d427ff24b..b9279ce4eaab 100644 --- a/tools/testing/selftests/kvm/Makefile.kvm +++ b/tools/testing/selftests/kvm/Makefile.kvm @@ -117,6 +117,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..00c6327d5621 --- /dev/null +++ b/tools/testing/selftests/kvm/x86/vmx_la57_nested_state_test.c @@ -0,0 +1,134 @@ +// 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 first 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) +{ + 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_with_one_vcpu(&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.1.851.g4ebd6896fd-goog