From patchwork Fri Jun 21 12:32:25 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Ene X-Patchwork-Id: 13707532 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B5878C27C4F for ; Fri, 21 Jun 2024 12:32:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type:Cc:To:From: Subject:Message-ID:References:Mime-Version:In-Reply-To:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=25Ic4MRU2k7NJP2f+gMGQe2Juiq+UKR6YPOc7ZYN4C4=; b=MnA0PG7XMr+wMHyBg2m3GBSTPd IEJnmFohz97/bnUE4OhDvo1ADF6a2y/OIbxsuZnomWJIOFKXA6Tf1E55tWEg2+P6Lm7jKcKHdf7qj dPXFE9Q/H1ZmTP0ryVq7RNO7/nwMjuqPW2qlVcQ75xrUqrPFkfjorjB2W/5/KF3+dyG2FkNM21pFG 7R0oCuzTmq+94kvVwVTRBI1n7N4Sc5qTCD2SSs9r/xbYll/wPJSeKzO8iwR9weW7yHiTBua95faSo 4Ihyu6WCsx8Jze+Sl745xxjBeBvF8vkJ8GiJrP/G+gH9MzJO9GBOLnKGGWQ/f2DVH0wX25FWa93cT SM+v9uHA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sKdRc-0000000999M-3qrr; Fri, 21 Jun 2024 12:32:44 +0000 Received: from mail-yw1-x114a.google.com ([2607:f8b0:4864:20::114a]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sKdRZ-00000009961-1w43 for linux-arm-kernel@lists.infradead.org; Fri, 21 Jun 2024 12:32:42 +0000 Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-63bb7fb3229so34661087b3.2 for ; Fri, 21 Jun 2024 05:32:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1718973160; x=1719577960; darn=lists.infradead.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=25Ic4MRU2k7NJP2f+gMGQe2Juiq+UKR6YPOc7ZYN4C4=; b=jHUlNMJziYNxIur/VkMB+XmWzV3w6g3zGyHyRm2q1QRJHpHpmUZkkPSonJPN2uucvW 5wOcGSjU4c6ziaFcgKFmjCfpYhCm78RkeO0/PpDsKb6EHhU4yHrDHJFnHuSBKajkHH5q tEy1kXeLqMxuHV2IkSLCyM9oclRLuZWA/3Yk5GXXMg3z50tOooA9ghRp8rbfM/SyZd1P 0zD2JmEwgV+On8VpCTVVkVbIytzjsTXLrN+vIlQCPj+IzpuBCUWYsdJOcx1SKEfyhhtE lI2NzN94QEIYJ/624ocdGF9dUSeYb5kASK8iM/WqV1I64BruA5/42jMq+RQJ2Ebc8LsM 78ww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718973160; x=1719577960; 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=25Ic4MRU2k7NJP2f+gMGQe2Juiq+UKR6YPOc7ZYN4C4=; b=AiXSRGGHv8nCtuQQStxuCy0a0nITFjeWq0cxnKxBQyFbS32MDzYPS2+CaWPq7U/ouH p+ZQ/A8Ll/rTq1AASA1i5Dw7MKtfp/rDxHIwk0YM6EECAiqfQDtzvGBZC6FSzpLvJpc2 /4Mq6NeN5Z1CFZfoxn8sQM+K5waWDK6SC2+2jyWSYiavP0rkMPMG8T9iKh7PNvCa3uU3 rWWjDzoAxi6b95OXs3RhzovZ3TK97mEL+RurC3H//yRc94OXdCF3kCgwHlTjo9ObofOE ODaz//NeGKovpyHSyIiShPFGgiidQgLD5p8nlN8zbe2dSXyTybyBm8cZwYJdjoQ25oUA YuGw== X-Forwarded-Encrypted: i=1; AJvYcCV5FHAjPKNqMoXTWYCAfokU2nldtnP/HpeZNFYgJ4MnGQuKdhsRGqjgdrTVc1E9O4hxveBbU1WepPRccYWv7G/c4ahQYWTNWMloFz9N8Dg1n2bihAY= X-Gm-Message-State: AOJu0Ywp1Iit3ucuCeAZvs3U6i8aoJDEasePsnDDgTj0qrFo6WpPZpPx MR+BeER+yo+fSuhfCnGEvM8l9iGN0zf3QLTLBuXgNglc2Y4oYA6m61qw9NI96/u3jZ0q6J1pAXu r7ezwV39tCcwtNynDXluQxkCSOw== X-Google-Smtp-Source: AGHT+IH53+5umEtnQUZLfthMpVgy/4eLzcSoA4+oyiYt9jWf+dLgnKlVM+ZCqYhVt+ZaBFR3R5+UiqwV2rm52Qcsq78= X-Received: from sebkvm.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:cd5]) (user=sebastianene job=sendgmr) by 2002:a05:690c:7441:b0:627:c0ac:a9e7 with SMTP id 00721157ae682-63a8f5246b3mr17861817b3.5.1718973159572; Fri, 21 Jun 2024 05:32:39 -0700 (PDT) Date: Fri, 21 Jun 2024 12:32:25 +0000 In-Reply-To: <20240621123230.1085265-1-sebastianene@google.com> Mime-Version: 1.0 References: <20240621123230.1085265-1-sebastianene@google.com> X-Mailer: git-send-email 2.45.2.741.gdbec12cfda-goog Message-ID: <20240621123230.1085265-2-sebastianene@google.com> Subject: [PATCH v7 1/6] KVM: arm64: Move pagetable definitions to common header From: Sebastian Ene To: akpm@linux-foundation.org, alexghiti@rivosinc.com, ankita@nvidia.com, ardb@kernel.org, catalin.marinas@arm.com, christophe.leroy@csgroup.eu, james.morse@arm.com, vdonnefort@google.com, mark.rutland@arm.com, maz@kernel.org, oliver.upton@linux.dev, rananta@google.com, ryan.roberts@arm.com, sebastianene@google.com, shahuang@redhat.com, suzuki.poulose@arm.com, will@kernel.org, yuzenghui@huawei.com Cc: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel-team@android.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240621_053241_672815_D993D833 X-CRM114-Status: GOOD ( 11.16 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org In preparation for using the stage-2 definitions in ptdump, move some of these macros in the common header. Signed-off-by: Sebastian Ene --- arch/arm64/include/asm/kvm_pgtable.h | 42 ++++++++++++++++++++++++++++ arch/arm64/kvm/hyp/pgtable.c | 42 ---------------------------- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/arch/arm64/include/asm/kvm_pgtable.h b/arch/arm64/include/asm/kvm_pgtable.h index 19278dfe7978..03f4c3d7839c 100644 --- a/arch/arm64/include/asm/kvm_pgtable.h +++ b/arch/arm64/include/asm/kvm_pgtable.h @@ -59,6 +59,48 @@ typedef u64 kvm_pte_t; #define KVM_PHYS_INVALID (-1ULL) +#define KVM_PTE_LEAF_ATTR_LO GENMASK(11, 2) + +#define KVM_PTE_LEAF_ATTR_LO_S1_ATTRIDX GENMASK(4, 2) +#define KVM_PTE_LEAF_ATTR_LO_S1_AP GENMASK(7, 6) +#define KVM_PTE_LEAF_ATTR_LO_S1_AP_RO \ + ({ cpus_have_final_cap(ARM64_KVM_HVHE) ? 2 : 3; }) +#define KVM_PTE_LEAF_ATTR_LO_S1_AP_RW \ + ({ cpus_have_final_cap(ARM64_KVM_HVHE) ? 0 : 1; }) +#define KVM_PTE_LEAF_ATTR_LO_S1_SH GENMASK(9, 8) +#define KVM_PTE_LEAF_ATTR_LO_S1_SH_IS 3 +#define KVM_PTE_LEAF_ATTR_LO_S1_AF BIT(10) + +#define KVM_PTE_LEAF_ATTR_LO_S2_MEMATTR GENMASK(5, 2) +#define KVM_PTE_LEAF_ATTR_LO_S2_S2AP_R BIT(6) +#define KVM_PTE_LEAF_ATTR_LO_S2_S2AP_W BIT(7) +#define KVM_PTE_LEAF_ATTR_LO_S2_SH GENMASK(9, 8) +#define KVM_PTE_LEAF_ATTR_LO_S2_SH_IS 3 +#define KVM_PTE_LEAF_ATTR_LO_S2_AF BIT(10) + +#define KVM_PTE_LEAF_ATTR_HI GENMASK(63, 50) + +#define KVM_PTE_LEAF_ATTR_HI_SW GENMASK(58, 55) + +#define KVM_PTE_LEAF_ATTR_HI_S1_XN BIT(54) + +#define KVM_PTE_LEAF_ATTR_HI_S2_XN BIT(54) + +#define KVM_PTE_LEAF_ATTR_HI_S1_GP BIT(50) + +#define KVM_PTE_LEAF_ATTR_S2_PERMS (KVM_PTE_LEAF_ATTR_LO_S2_S2AP_R | \ + KVM_PTE_LEAF_ATTR_LO_S2_S2AP_W | \ + KVM_PTE_LEAF_ATTR_HI_S2_XN) + +#define KVM_INVALID_PTE_OWNER_MASK GENMASK(9, 2) +#define KVM_MAX_OWNER_ID 1 + +/* + * Used to indicate a pte for which a 'break-before-make' sequence is in + * progress. + */ +#define KVM_INVALID_PTE_LOCKED BIT(10) + static inline bool kvm_pte_valid(kvm_pte_t pte) { return pte & KVM_PTE_VALID; diff --git a/arch/arm64/kvm/hyp/pgtable.c b/arch/arm64/kvm/hyp/pgtable.c index 9e2bbee77491..c3e9d77bba23 100644 --- a/arch/arm64/kvm/hyp/pgtable.c +++ b/arch/arm64/kvm/hyp/pgtable.c @@ -17,48 +17,6 @@ #define KVM_PTE_TYPE_PAGE 1 #define KVM_PTE_TYPE_TABLE 1 -#define KVM_PTE_LEAF_ATTR_LO GENMASK(11, 2) - -#define KVM_PTE_LEAF_ATTR_LO_S1_ATTRIDX GENMASK(4, 2) -#define KVM_PTE_LEAF_ATTR_LO_S1_AP GENMASK(7, 6) -#define KVM_PTE_LEAF_ATTR_LO_S1_AP_RO \ - ({ cpus_have_final_cap(ARM64_KVM_HVHE) ? 2 : 3; }) -#define KVM_PTE_LEAF_ATTR_LO_S1_AP_RW \ - ({ cpus_have_final_cap(ARM64_KVM_HVHE) ? 0 : 1; }) -#define KVM_PTE_LEAF_ATTR_LO_S1_SH GENMASK(9, 8) -#define KVM_PTE_LEAF_ATTR_LO_S1_SH_IS 3 -#define KVM_PTE_LEAF_ATTR_LO_S1_AF BIT(10) - -#define KVM_PTE_LEAF_ATTR_LO_S2_MEMATTR GENMASK(5, 2) -#define KVM_PTE_LEAF_ATTR_LO_S2_S2AP_R BIT(6) -#define KVM_PTE_LEAF_ATTR_LO_S2_S2AP_W BIT(7) -#define KVM_PTE_LEAF_ATTR_LO_S2_SH GENMASK(9, 8) -#define KVM_PTE_LEAF_ATTR_LO_S2_SH_IS 3 -#define KVM_PTE_LEAF_ATTR_LO_S2_AF BIT(10) - -#define KVM_PTE_LEAF_ATTR_HI GENMASK(63, 50) - -#define KVM_PTE_LEAF_ATTR_HI_SW GENMASK(58, 55) - -#define KVM_PTE_LEAF_ATTR_HI_S1_XN BIT(54) - -#define KVM_PTE_LEAF_ATTR_HI_S2_XN BIT(54) - -#define KVM_PTE_LEAF_ATTR_HI_S1_GP BIT(50) - -#define KVM_PTE_LEAF_ATTR_S2_PERMS (KVM_PTE_LEAF_ATTR_LO_S2_S2AP_R | \ - KVM_PTE_LEAF_ATTR_LO_S2_S2AP_W | \ - KVM_PTE_LEAF_ATTR_HI_S2_XN) - -#define KVM_INVALID_PTE_OWNER_MASK GENMASK(9, 2) -#define KVM_MAX_OWNER_ID 1 - -/* - * Used to indicate a pte for which a 'break-before-make' sequence is in - * progress. - */ -#define KVM_INVALID_PTE_LOCKED BIT(10) - struct kvm_pgtable_walk_data { struct kvm_pgtable_walker *walker; From patchwork Fri Jun 21 12:32:26 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Ene X-Patchwork-Id: 13707535 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 62880C27C4F for ; Fri, 21 Jun 2024 12:33:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type:Cc:To:From: Subject:Message-ID:References:Mime-Version:In-Reply-To:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=EzGBq5ThBYn0maeOuexDoW9RxvarTIzzo7wMG3lfRiU=; b=vRml5Dx1++R7jKuW9ii7LnfzbK fatL4DoUjryetf9msY1DO6ycE6ChXiLphRxQl7xAPp2n4swIriGSTR/swrTEV/fN+ZfCfVsVDn7ig 2bz4dZK9JXXXLRT8ZfmNvdx1ardEMWjdgQTpkmV8l6GnAe7FgzVLVDT4RW39I0ko06x8RYFocYTB0 3wUlrXUtpDtyi6U2GxbJk/sIiz8xZq9gTtlrtA/PlLFU+1W0UCHLIdAv1ahzQ3G+k5VwNCftnMsr1 d0caGOP31Oe49hHkQR5sFv9SZ6uNtrvy3JC6Ldvv9wg6VExQJoXFSgRR6/g+8heGizpQdDH0TQwEC LvblR41w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sKdRu-000000099HK-1F2X; Fri, 21 Jun 2024 12:33:02 +0000 Received: from mail-yb1-xb4a.google.com ([2607:f8b0:4864:20::b4a]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sKdRb-00000009977-2oj8 for linux-arm-kernel@lists.infradead.org; Fri, 21 Jun 2024 12:32:46 +0000 Received: by mail-yb1-xb4a.google.com with SMTP id 3f1490d57ef6-dff189c7e65so3474751276.1 for ; Fri, 21 Jun 2024 05:32:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1718973162; x=1719577962; darn=lists.infradead.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=EzGBq5ThBYn0maeOuexDoW9RxvarTIzzo7wMG3lfRiU=; b=uqzhyiEP65GTosL0nT21Yg24i6/uiogB/260hNjz1c2a5R84XL64fMy7zdmoyAv0K9 f0rIjxd3BF3zK9Ch3yY6e4bLFcBuKv/hh6afI/XV8v4nm0g0EmoKYusOpEyAItM6U9nn tLTcm3hBvlVF7iuAA7cnA/jA1OvFkwwum6j/ppvNNZdYDPr3aPVc+sdetpVIzh9DjmHK hrNQ4lbM4wEGrqo3qNGcJbfH5JBDpydmI5DQNiZlX4Q4F2fnzVI/hogYnN1HBNuZ8+wq mFKOOCUf9ueGmStSTOAT+G8CdnQtPbujEL6pgliXJ7+1rVLHfVioqYDGuX+ORw65Hg4D xKow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718973162; x=1719577962; 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=EzGBq5ThBYn0maeOuexDoW9RxvarTIzzo7wMG3lfRiU=; b=YTMWUk2v333pyqCFm5gVo+TFES2Ax3LhyplmuEsh1wrnpsaLzJwLXU+wkGcHJ8WWge RLYZ8BylfAEzC+ibV97IY0XCBf0TsbdVkBC2ucZf5N5+3pKuuUaSJmzBAQKzeqhgAdTF jLPRuktbpXqFNPiI3orFwjj025TrIvg4dP1qbwPoRnsztXp62pbiy87otTCig8YB7aQ+ k20UZWysQBp/urGpzbL+24qltlBwiFwaVxtf//I+/VdCnRO9KLaEl1FPD9RoH/LVuT7w VpK2RbAzJErg7HBmYDAKCFXA1yZK0/4KbhtBSbOE2/1owPPfCnu0l56Wu+vJ9QpXeNST WrOA== X-Forwarded-Encrypted: i=1; AJvYcCVXcgAvSN0cY9tbEU0SwUn03y1LhqD/elcxXbL30WwoHAYOy9kyId1sej9AGT4VOXMbF4kuQpUIRs5VJQqb0Pzjydx1x1AAv+LPbvTLAl9ap5TdOVY= X-Gm-Message-State: AOJu0YzYvyxHNlJ26Atwjy3Wmjoj7j5u7vyy2YrZ6OswkNf6w+dIpMdL gJEZguqGbfakCILhQHzvlWCocwC1bSY4q3goutgM+P6KzCqjiGhKcSKNyWmjx9SmaJYFTU0iOd7 QJa52OwSaJqkdNhCZNt1/wtm9Hg== X-Google-Smtp-Source: AGHT+IEHWLyl6fNJBxDvAZcuJW3n20nBcPn6CejMK+alB517jSqTAiCeKZNxc0fP6fdgpnKzvHbq34eXpiFJ6ppcopE= X-Received: from sebkvm.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:cd5]) (user=sebastianene job=sendgmr) by 2002:a25:943:0:b0:dff:2f78:a5d7 with SMTP id 3f1490d57ef6-e02be130582mr1340535276.5.1718973162032; Fri, 21 Jun 2024 05:32:42 -0700 (PDT) Date: Fri, 21 Jun 2024 12:32:26 +0000 In-Reply-To: <20240621123230.1085265-1-sebastianene@google.com> Mime-Version: 1.0 References: <20240621123230.1085265-1-sebastianene@google.com> X-Mailer: git-send-email 2.45.2.741.gdbec12cfda-goog Message-ID: <20240621123230.1085265-3-sebastianene@google.com> Subject: [PATCH v7 2/6] arm64: ptdump: Expose the attribute parsing functionality From: Sebastian Ene To: akpm@linux-foundation.org, alexghiti@rivosinc.com, ankita@nvidia.com, ardb@kernel.org, catalin.marinas@arm.com, christophe.leroy@csgroup.eu, james.morse@arm.com, vdonnefort@google.com, mark.rutland@arm.com, maz@kernel.org, oliver.upton@linux.dev, rananta@google.com, ryan.roberts@arm.com, sebastianene@google.com, shahuang@redhat.com, suzuki.poulose@arm.com, will@kernel.org, yuzenghui@huawei.com Cc: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel-team@android.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240621_053243_820965_C22F2A27 X-CRM114-Status: GOOD ( 18.08 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Reuse the descriptor parsing functionality to keep the same output format as the original ptdump code. In order for this to happen, move the state tracking objects into a common header. Signed-off-by: Sebastian Ene --- arch/arm64/include/asm/ptdump.h | 41 ++++++++++++++++++++++++++++++++- arch/arm64/mm/ptdump.c | 37 ++--------------------------- 2 files changed, 42 insertions(+), 36 deletions(-) diff --git a/arch/arm64/include/asm/ptdump.h b/arch/arm64/include/asm/ptdump.h index 5b1701c76d1c..c550b2afcab7 100644 --- a/arch/arm64/include/asm/ptdump.h +++ b/arch/arm64/include/asm/ptdump.h @@ -9,6 +9,7 @@ #include #include +#include struct addr_marker { unsigned long start_address; @@ -21,14 +22,52 @@ struct ptdump_info { unsigned long base_addr; }; +struct prot_bits { + u64 mask; + u64 val; + const char *set; + const char *clear; +}; + +struct pg_level { + const struct prot_bits *bits; + char name[4]; + int num; + u64 mask; +}; + +/* + * The page dumper groups page table entries of the same type into a single + * description. It uses pg_state to track the range information while + * iterating over the pte entries. When the continuity is broken it then + * dumps out a description of the range. + */ +struct pg_state { + struct ptdump_state ptdump; + struct seq_file *seq; + const struct addr_marker *marker; + const struct mm_struct *mm; + unsigned long start_address; + int level; + u64 current_prot; + bool check_wx; + unsigned long wx_pages; + unsigned long uxn_pages; +}; + void ptdump_walk(struct seq_file *s, struct ptdump_info *info); +void note_page(struct ptdump_state *pt_st, unsigned long addr, int level, + u64 val); #ifdef CONFIG_PTDUMP_DEBUGFS #define EFI_RUNTIME_MAP_END DEFAULT_MAP_WINDOW_64 void __init ptdump_debugfs_register(struct ptdump_info *info, const char *name); #else static inline void ptdump_debugfs_register(struct ptdump_info *info, const char *name) { } -#endif +#endif /* CONFIG_PTDUMP_DEBUGFS */ +#else +static inline void note_page(void *pt_st, unsigned long addr, + int level, u64 val) { } #endif /* CONFIG_PTDUMP_CORE */ #endif /* __ASM_PTDUMP_H */ diff --git a/arch/arm64/mm/ptdump.c b/arch/arm64/mm/ptdump.c index 6986827e0d64..e370b7a945de 100644 --- a/arch/arm64/mm/ptdump.c +++ b/arch/arm64/mm/ptdump.c @@ -38,32 +38,6 @@ seq_printf(m, fmt); \ }) -/* - * The page dumper groups page table entries of the same type into a single - * description. It uses pg_state to track the range information while - * iterating over the pte entries. When the continuity is broken it then - * dumps out a description of the range. - */ -struct pg_state { - struct ptdump_state ptdump; - struct seq_file *seq; - const struct addr_marker *marker; - const struct mm_struct *mm; - unsigned long start_address; - int level; - u64 current_prot; - bool check_wx; - unsigned long wx_pages; - unsigned long uxn_pages; -}; - -struct prot_bits { - u64 mask; - u64 val; - const char *set; - const char *clear; -}; - static const struct prot_bits pte_bits[] = { { .mask = PTE_VALID, @@ -143,13 +117,6 @@ static const struct prot_bits pte_bits[] = { } }; -struct pg_level { - const struct prot_bits *bits; - char name[4]; - int num; - u64 mask; -}; - static struct pg_level pg_level[] __ro_after_init = { { /* pgd */ .name = "PGD", @@ -221,8 +188,8 @@ static void note_prot_wx(struct pg_state *st, unsigned long addr) st->wx_pages += (addr - st->start_address) / PAGE_SIZE; } -static void note_page(struct ptdump_state *pt_st, unsigned long addr, int level, - u64 val) +void note_page(struct ptdump_state *pt_st, unsigned long addr, int level, + u64 val) { struct pg_state *st = container_of(pt_st, struct pg_state, ptdump); static const char units[] = "KMGTPE"; From patchwork Fri Jun 21 12:32:27 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Ene X-Patchwork-Id: 13707534 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E8E66C2BA1A for ; Fri, 21 Jun 2024 12:33:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type:Cc:To:From: Subject:Message-ID:References:Mime-Version:In-Reply-To:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=CfipnPazTooSWljHtj0QKg/sbCS/LwM8w5FGtvn8eIw=; b=ieAA0bd6OAHOXzu3dcTSay3qRn nUmvH5gQ3GVqTQxYTSXsabz4odILk4Hz43FpkzNsl/p+GXID2tzDEt6qPhwkP2ExVgA6I3p6nHTyb +v2SQVH4uPvT4vpIbbwyFWTxGYThwTIE5E9PtSGeSJsqwhRNU8EgbEJkZR6qvwnh5gjBHa4hE1nQO YUTwr7Jjc+IaYx5Pkj8qkABXudNkW4ap1grjoBtUKMxm8NxbuD1w5sEgevgyDFLaHhi8mOpwYNXdL 0E+X3B0IYz6Mho5YaHxCb3ORpfO3q1dHb5nElzZ55QMkoHsanZAPML6UjR/lF9hvGnBa/Lxmy5JPI T78FkUOQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sKdRv-000000099IC-2J3E; Fri, 21 Jun 2024 12:33:03 +0000 Received: from mail-wm1-x349.google.com ([2a00:1450:4864:20::349]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sKdRe-0000000999P-3uhc for linux-arm-kernel@lists.infradead.org; Fri, 21 Jun 2024 12:32:48 +0000 Received: by mail-wm1-x349.google.com with SMTP id 5b1f17b1804b1-421811b92bcso13641565e9.0 for ; Fri, 21 Jun 2024 05:32:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1718973164; x=1719577964; darn=lists.infradead.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=CfipnPazTooSWljHtj0QKg/sbCS/LwM8w5FGtvn8eIw=; b=m6cRLPEq/UhglyZeMjAG2rT4zSCMpX92ampo0K//QoHyyFtCmbSfXWN3ZF4J3J2RZg u8bar+ooCWRCnFXBIV4uz3epc2WBOIZR/I0YKxxsPxEt7luen3mLIKe6kkXHV3cPuF05 jFv7yjt01BuxYptaCJDKTpfGERj4Mh7hGbckYIx5YItgvfaE+ZrAe0I3R50h3cOszNu/ u16tLBWQvH7TT/Y0Ei88WrKJluHSNGs9nFtDAW8wHNPkCREKM9LLSAherLEfIWTO73sN N3FM9orFaQj8+Nx0/nISgIGOuCfbucxOrgWAK0uYLU4mTJ8sZ74kwVaZb0soDbo+g5oA 8ceQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718973164; x=1719577964; 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=CfipnPazTooSWljHtj0QKg/sbCS/LwM8w5FGtvn8eIw=; b=lC4b7Xi4+tpAJZb//Gqic3xXgjieBcwhO1sp17BrauAaCx78Wf8ZoWbHeR8g3kfiny gBDqRY6yjtuZz5se1S0OFF9BS49/Zp61FtHHjzVu/f8weXwUWNs/i5BurSXtp9t3FC08 /trvTO83J3AgxmB89ikaYVkt42yQso7RhuUtGkCm9ogsottNcpcU97v4Ztxr0vhVgnv2 3H3t/c8mAKZ3L7n0b5eRwMAfvsY68zRQM5y4GYoAnAcdj8Y9I3ILWxpDQlClHxSyXwnN f2mucIMnfEzSVzuo0jRXy0I3bsul/FyOGKcBwUH8NSgTWVJ7wczoHiynHutmX/lnCrvD kWng== X-Forwarded-Encrypted: i=1; AJvYcCXnByZrIWhiQfLg9Puhlb5lctALdoIenEcNyQZz6gkCdRsirOUeGhnd0rTS19oHCOsf93PT/8C3y3DYfcrXtBsgwK/UD9gElHhfkOU/G2fUVPzPfAo= X-Gm-Message-State: AOJu0YwIErZZCsVI1kGpz/od7I6B8i6jpHh8BKBg3XHe0IMRh5JQNCrN 6ydD79QtdtHkkq2Ge35nA0S/BHdki2p631CfoEkiUcYo/PoGR++dy56UjRTnHbiWwkaT5uh69FQ RsQ1iT7ij0ikss152PCT1ojy/vg== X-Google-Smtp-Source: AGHT+IGRdi8iCVedSAjQTPJq6auLk/a0anHCRS31CgRh12LvFMpWeGYnx6ArZlAwPEeWqjlBpzoOnFCppGjHDAYrqfw= X-Received: from sebkvm.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:cd5]) (user=sebastianene job=sendgmr) by 2002:a05:600c:3b9f:b0:421:7dc3:9a0c with SMTP id 5b1f17b1804b1-4247529a86bmr593065e9.3.1718973164436; Fri, 21 Jun 2024 05:32:44 -0700 (PDT) Date: Fri, 21 Jun 2024 12:32:27 +0000 In-Reply-To: <20240621123230.1085265-1-sebastianene@google.com> Mime-Version: 1.0 References: <20240621123230.1085265-1-sebastianene@google.com> X-Mailer: git-send-email 2.45.2.741.gdbec12cfda-goog Message-ID: <20240621123230.1085265-4-sebastianene@google.com> Subject: [PATCH v7 3/6] arm64: ptdump: Use the mask from the state structure From: Sebastian Ene To: akpm@linux-foundation.org, alexghiti@rivosinc.com, ankita@nvidia.com, ardb@kernel.org, catalin.marinas@arm.com, christophe.leroy@csgroup.eu, james.morse@arm.com, vdonnefort@google.com, mark.rutland@arm.com, maz@kernel.org, oliver.upton@linux.dev, rananta@google.com, ryan.roberts@arm.com, sebastianene@google.com, shahuang@redhat.com, suzuki.poulose@arm.com, will@kernel.org, yuzenghui@huawei.com Cc: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel-team@android.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240621_053247_325107_131CFFE6 X-CRM114-Status: GOOD ( 17.77 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Printing the descriptor attributes requires accessing a mask which has a different set of attributes for stage-2. In preparation for adding support for the stage-2 pagetables dumping, use the mask from the local context and not from the globally defined pg_level array. Store a pointer to the pg_level array in the ptdump state structure. This will allow us to extract the mask which is wrapped in the pg_level array and use it for descriptor parsing in the note_page. Signed-off-by: Sebastian Ene --- arch/arm64/include/asm/ptdump.h | 1 + arch/arm64/mm/ptdump.c | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/arch/arm64/include/asm/ptdump.h b/arch/arm64/include/asm/ptdump.h index c550b2afcab7..a4125d8d5a32 100644 --- a/arch/arm64/include/asm/ptdump.h +++ b/arch/arm64/include/asm/ptdump.h @@ -44,6 +44,7 @@ struct pg_level { */ struct pg_state { struct ptdump_state ptdump; + struct pg_level *pg_level; struct seq_file *seq; const struct addr_marker *marker; const struct mm_struct *mm; diff --git a/arch/arm64/mm/ptdump.c b/arch/arm64/mm/ptdump.c index e370b7a945de..9637a6415ea7 100644 --- a/arch/arm64/mm/ptdump.c +++ b/arch/arm64/mm/ptdump.c @@ -192,6 +192,7 @@ void note_page(struct ptdump_state *pt_st, unsigned long addr, int level, u64 val) { struct pg_state *st = container_of(pt_st, struct pg_state, ptdump); + struct pg_level *pg_info = st->pg_level; static const char units[] = "KMGTPE"; u64 prot = 0; @@ -201,7 +202,7 @@ void note_page(struct ptdump_state *pt_st, unsigned long addr, int level, level = 0; if (level >= 0) - prot = val & pg_level[level].mask; + prot = val & pg_info[level].mask; if (st->level == -1) { st->level = level; @@ -227,10 +228,10 @@ void note_page(struct ptdump_state *pt_st, unsigned long addr, int level, unit++; } pt_dump_seq_printf(st->seq, "%9lu%c %s", delta, *unit, - pg_level[st->level].name); - if (st->current_prot && pg_level[st->level].bits) - dump_prot(st, pg_level[st->level].bits, - pg_level[st->level].num); + pg_info[st->level].name); + if (st->current_prot && pg_info[st->level].bits) + dump_prot(st, pg_info[st->level].bits, + pg_info[st->level].num); pt_dump_seq_puts(st->seq, "\n"); if (addr >= st->marker[1].start_address) { @@ -262,6 +263,7 @@ void ptdump_walk(struct seq_file *s, struct ptdump_info *info) .seq = s, .marker = info->markers, .mm = info->mm, + .pg_level = &pg_level[0], .level = -1, .ptdump = { .note_page = note_page, @@ -297,6 +299,7 @@ bool ptdump_check_wx(void) { 0, NULL}, { -1, NULL}, }, + .pg_level = &pg_level[0], .level = -1, .check_wx = true, .ptdump = { From patchwork Fri Jun 21 12:32:28 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Ene X-Patchwork-Id: 13707536 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E6568C2BA1A for ; Fri, 21 Jun 2024 12:33:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type:Cc:To:From: Subject:Message-ID:References:Mime-Version:In-Reply-To:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=9U3k9tuiLiLPQI9AWIU2sX6N77nYvdH988sCBf+PvC0=; b=J24POwszkA673utWfy4tWILaJ3 Lsu9CSRmh5d66eAA/2X+qFtJIsJyPs/NpDdMlOr8s5fGfaptZgL5VFgOYr/yjl/jJPDiQ1tlfPtiM 2izg/+rw9wgiTPAwLHjTztqYU8o1puqJVcIx3rH9huLSiI1Xo7Qmnt6gsnbsdFzLfirIdDmIx4aU4 kf/3a/ExQM/u7qE5h7f6+BEIan3ODUQoiCfx/0BgA0QsaFgVHIpZgkOAGmbTxSRpDAwe0GDZ7jpvU W8aWAEe7BZv1yr+iifEPDUb0D1fv7Gf66FfV78Fc6IjneruTneFuGUP5z5C/OR2qKXmybrNW0za3n w7Jx8aRw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sKdRx-000000099K5-40bn; Fri, 21 Jun 2024 12:33:05 +0000 Received: from mail-wm1-x349.google.com ([2a00:1450:4864:20::349]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sKdRh-000000099Af-45yF for linux-arm-kernel@lists.infradead.org; Fri, 21 Jun 2024 12:32:51 +0000 Received: by mail-wm1-x349.google.com with SMTP id 5b1f17b1804b1-42476eda16cso17273745e9.2 for ; Fri, 21 Jun 2024 05:32:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1718973167; x=1719577967; darn=lists.infradead.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=9U3k9tuiLiLPQI9AWIU2sX6N77nYvdH988sCBf+PvC0=; b=uiKW3oUHx3M4bSfLATSMuQOvCd0Q+jn3j4lp60B/R6PHAaEa/c1OLJGIKUH8zRq+kc /1tHWOUN/S/Jqq9jFF9aT+vmRncALy8KcldSWCmWtmvUDDqrA4xBnlugZqW9CeRFI35N ry8q1hzqoKVsl2xq/vyKZcXsshLfkEPCvrJFO7p1LCGLB7fgcV29FKtzTAmZ9iiNUfVS OZI8K2ZJqP+kEle/DXrBQc92GAPUnwZxBM1SuPPik1v/4PbvBCvzJFlu0Yybml1vKA9J vAj8turMAa2Gx/wLb5jVi7+hD70yWPnaP2qZfjMJSOAFCY4RntxgHkBHNkJyn+I0p/VV E1qA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718973167; x=1719577967; 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=9U3k9tuiLiLPQI9AWIU2sX6N77nYvdH988sCBf+PvC0=; b=WQBEc6iSyAarv0m7mMxDsr11FyvhZ0+dANpGSeypTEnT9SqU8iwEjvSFVm6t0IZMN/ 8Ri745DrMKPi58Wj606ylEp4zOZf6uYjfA/SmO9LzmunSUYMsi4P1JODLjedf1geg7yV PI6QCqca6nFBORNXXdpZo6Uf3MnwUOHWWKF09zaOtMx6tjemoU/EAy7cG3LMMcM0qK43 nCrAYFlu0r+fYSn/yfwsMTDCV4lxs1bxAUzARbw8IupXhx9jHGmGk5vo94213a+URfY3 LcK7ETIM9r3ALOiqhBy9kOLtlshNFj2JMoiL8zYU/F5W3/smQpwCVCl/ypLNAgJ9x0Ck fX7g== X-Forwarded-Encrypted: i=1; AJvYcCWamqiQIwrjohGEjBeKE0NQc9Tke9XoihbFgd52FjX0lmRIS9auMGORgecILvngUbZlUgVdjITame2B8Yv8r0xD6gWRTKQ5YUGapxhldKrTJjNLinQ= X-Gm-Message-State: AOJu0Yy2khz0jEC8Yk3UY96PCzeJyoOxxTg6RsxsCBBhk7zRSc+UIHZE bahXqjWUU3TieX1v4IimR9LqQVnAE+xattJNKrCh18LLjjjTSME8fdZiqz0jvy6bM61vXXS6gCq xSbT7A3QqM5RXd/C0xe+K+/3G4g== X-Google-Smtp-Source: AGHT+IG3jjLLcKVegMc4vyKOfpAyq0Mm/2rzRvjshonLnHB/hIPzh7SyEtIPV2JFArbLo1dzzIgE39ZKxihe/rCGybM= X-Received: from sebkvm.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:cd5]) (user=sebastianene job=sendgmr) by 2002:a05:600c:1c01:b0:424:813e:73c7 with SMTP id 5b1f17b1804b1-424813e750emr123495e9.2.1718973166688; Fri, 21 Jun 2024 05:32:46 -0700 (PDT) Date: Fri, 21 Jun 2024 12:32:28 +0000 In-Reply-To: <20240621123230.1085265-1-sebastianene@google.com> Mime-Version: 1.0 References: <20240621123230.1085265-1-sebastianene@google.com> X-Mailer: git-send-email 2.45.2.741.gdbec12cfda-goog Message-ID: <20240621123230.1085265-5-sebastianene@google.com> Subject: [PATCH v7 4/6] KVM: arm64: Register ptdump with debugfs on guest creation From: Sebastian Ene To: akpm@linux-foundation.org, alexghiti@rivosinc.com, ankita@nvidia.com, ardb@kernel.org, catalin.marinas@arm.com, christophe.leroy@csgroup.eu, james.morse@arm.com, vdonnefort@google.com, mark.rutland@arm.com, maz@kernel.org, oliver.upton@linux.dev, rananta@google.com, ryan.roberts@arm.com, sebastianene@google.com, shahuang@redhat.com, suzuki.poulose@arm.com, will@kernel.org, yuzenghui@huawei.com Cc: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel-team@android.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240621_053250_062401_131FE566 X-CRM114-Status: GOOD ( 22.99 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org While arch/*/mem/ptdump handles the kernel pagetable dumping code, introduce KVM/ptdump which shows the guest stage-2 pagetables. The separation is necessary because most of the definitions from the stage-2 pagetable reside in the KVM path and we will be invoking functionality **specific** to KVM. When a guest is created, register a new file entry under the guest debugfs dir which allows userspace to show the contents of the guest stage-2 pagetables when accessed. Signed-off-by: Sebastian Ene --- arch/arm64/kvm/Kconfig | 14 ++++++ arch/arm64/kvm/Makefile | 1 + arch/arm64/kvm/arm.c | 2 + arch/arm64/kvm/kvm_ptdump.h | 20 ++++++++ arch/arm64/kvm/ptdump.c | 91 +++++++++++++++++++++++++++++++++++++ 5 files changed, 128 insertions(+) create mode 100644 arch/arm64/kvm/kvm_ptdump.h create mode 100644 arch/arm64/kvm/ptdump.c diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig index 58f09370d17e..99e4a82e141d 100644 --- a/arch/arm64/kvm/Kconfig +++ b/arch/arm64/kvm/Kconfig @@ -65,4 +65,18 @@ config PROTECTED_NVHE_STACKTRACE If unsure, or not using protected nVHE (pKVM), say N. +config PTDUMP_STAGE2_DEBUGFS + bool "Present the stage-2 pagetables to debugfs" + depends on KVM + select PTDUMP_CORE + default n + help + Say Y here if you want to show the stage-2 kernel pagetables + layout in a debugfs file. This information is only useful for kernel developers + who are working in architecture specific areas of the kernel. + It is probably not a good idea to enable this feature in a production + kernel. + + If in doubt, say N. + endif # VIRTUALIZATION diff --git a/arch/arm64/kvm/Makefile b/arch/arm64/kvm/Makefile index a6497228c5a8..f6ef4140b20a 100644 --- a/arch/arm64/kvm/Makefile +++ b/arch/arm64/kvm/Makefile @@ -24,6 +24,7 @@ kvm-y += arm.o mmu.o mmio.o psci.o hypercalls.o pvtime.o \ kvm-$(CONFIG_HW_PERF_EVENTS) += pmu-emul.o pmu.o kvm-$(CONFIG_ARM64_PTR_AUTH) += pauth.o +kvm-$(CONFIG_PTDUMP_STAGE2_DEBUGFS) += ptdump.o always-y := hyp_constants.h hyp-constants.s diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index 59716789fe0f..310abc612965 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -45,6 +45,7 @@ #include #include #include +#include static enum kvm_mode kvm_mode = KVM_MODE_DEFAULT; @@ -216,6 +217,7 @@ vm_fault_t kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf) void kvm_arch_create_vm_debugfs(struct kvm *kvm) { kvm_sys_regs_create_debugfs(kvm); + kvm_ptdump_guest_register(kvm); } static void kvm_destroy_mpidr_data(struct kvm *kvm) diff --git a/arch/arm64/kvm/kvm_ptdump.h b/arch/arm64/kvm/kvm_ptdump.h new file mode 100644 index 000000000000..0a62b0e2908c --- /dev/null +++ b/arch/arm64/kvm/kvm_ptdump.h @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) Google, 2024 + * Author: Sebastian Ene + */ + +#ifndef __KVM_PTDUMP_H +#define __KVM_PTDUMP_H + +#include +#include + + +#ifdef CONFIG_PTDUMP_STAGE2_DEBUGFS +void kvm_ptdump_guest_register(struct kvm *kvm); +#else +static inline void kvm_ptdump_guest_register(struct kvm *kvm) {} +#endif /* CONFIG_PTDUMP_STAGE2_DEBUGFS */ + +#endif /* __KVM_PTDUMP_H */ diff --git a/arch/arm64/kvm/ptdump.c b/arch/arm64/kvm/ptdump.c new file mode 100644 index 000000000000..36dc7662729f --- /dev/null +++ b/arch/arm64/kvm/ptdump.c @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Debug helper used to dump the stage-2 pagetables of the system and their + * associated permissions. + * + * Copyright (C) Google, 2024 + * Author: Sebastian Ene + */ +#include +#include +#include + +#include +#include + + +static int kvm_ptdump_visitor(const struct kvm_pgtable_visit_ctx *ctx, + enum kvm_pgtable_walk_flags visit) +{ + struct pg_state *st = ctx->arg; + struct ptdump_state *pt_st = &st->ptdump; + + note_page(pt_st, ctx->addr, ctx->level, ctx->old); + return 0; +} + +static int kvm_ptdump_show_common(struct seq_file *m, + struct kvm_pgtable *pgtable, + struct pg_state *parser_state) +{ + struct kvm_pgtable_walker walker = (struct kvm_pgtable_walker) { + .cb = kvm_ptdump_visitor, + .arg = parser_state, + .flags = KVM_PGTABLE_WALK_LEAF, + }; + + parser_state->level = -1; + parser_state->start_address = 0; + + return kvm_pgtable_walk(pgtable, 0, BIT(pgtable->ia_bits), &walker); +} + +static int kvm_ptdump_guest_show(struct seq_file *m, void *unused) +{ + struct kvm *kvm = m->private; + struct kvm_s2_mmu *mmu = &kvm->arch.mmu; + struct pg_state parser_state = {0}; + int ret; + + write_lock(&kvm->mmu_lock); + ret = kvm_ptdump_show_common(m, mmu->pgt, &parser_state); + write_unlock(&kvm->mmu_lock); + + return ret; +} + +static int kvm_ptdump_guest_open(struct inode *m, struct file *file) +{ + struct kvm *kvm = m->i_private; + int ret; + + if (!kvm_get_kvm_safe(kvm)) + return -ENOENT; + + ret = single_open(file, kvm_ptdump_guest_show, m->i_private); + if (ret < 0) + kvm_put_kvm(kvm); + + return ret; +} + +static int kvm_ptdump_guest_close(struct inode *m, struct file *file) +{ + struct kvm *kvm = m->i_private; + + kvm_put_kvm(kvm); + return single_release(m, file); +} + +static const struct file_operations kvm_ptdump_guest_fops = { + .open = kvm_ptdump_guest_open, + .read = seq_read, + .llseek = seq_lseek, + .release = kvm_ptdump_guest_close, +}; + +void kvm_ptdump_guest_register(struct kvm *kvm) +{ + debugfs_create_file("stage2_page_tables", 0400, kvm->debugfs_dentry, + kvm, &kvm_ptdump_guest_fops); +} From patchwork Fri Jun 21 12:32:29 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Ene X-Patchwork-Id: 13707537 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id ABD6CC27C4F for ; Fri, 21 Jun 2024 12:33:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type:Cc:To:From: Subject:Message-ID:References:Mime-Version:In-Reply-To:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=deelu2OWT9FEv+OHF2wJoMlx2ZjM7Mxt+Yz0Us1bWBA=; b=TAM5dB4pTldYsKDFyEbJ7/hsxw 87X0uObKnrbquE6fWXC/DWC6dzI++Hnkl0HBPX3qRSPv86SMJFDR+mq02pe1FC6fPah56MzAohuTR yV5vYA23vmStREnG5TXugfRePE1+FNBHQ3qc4im/bgIrMgpmbgCv23gplSYyaNjp+SRYHSX7B/z3w UIX3EREhSemXrn7ih/q4BdRc/fBGNzrNaxH/B5tnStyKQv+8fIDUeUNYmXxEEhBEPBK/SceAg5+TV lDjI9F3vnyNrtRoqsMofwTjAS6wqfU4dDS197lHclXDZU+oiQgm4a0LFRQKBlzmxxzXtCDY9EXt8i 9xb3QjmA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sKdS0-000000099Lz-34XK; Fri, 21 Jun 2024 12:33:08 +0000 Received: from mail-wm1-x34a.google.com ([2a00:1450:4864:20::34a]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sKdRj-000000099Bj-1QrU for linux-arm-kernel@lists.infradead.org; Fri, 21 Jun 2024 12:32:53 +0000 Received: by mail-wm1-x34a.google.com with SMTP id 5b1f17b1804b1-421eed70e30so15577325e9.1 for ; Fri, 21 Jun 2024 05:32:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1718973169; x=1719577969; darn=lists.infradead.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=deelu2OWT9FEv+OHF2wJoMlx2ZjM7Mxt+Yz0Us1bWBA=; b=kx8V61hw+W8E6hQMu0mw8ZKeqL+/reYFw8+a4QMXWfJGRYlbL9Tc4AqZb7Zw0u50OQ epboG7bR02oS6wb+b2x0KCB3GdAr9VKOCNoSi6QWwBDAyalg+cOKKKqxF0wH1VAAIoEo IyntX9Yr7uHpNFWB6t7cLVIBu/V0xTzXxVCf05oEsr62vzYWtgfb9fsV/DUxu1SBU6g2 KqnxddDbTlkMokBNvlEAFH8E3UUl5r9ogmgBpJYUm5M2AppDzPDndn/gVDwfirgGTV8L NnlQ842dsvVcIrd+kjlOarfm1IUufb692FAbUkGBZBCIoGEkklmyEUeP/FMWGS+chjo7 k8Wg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718973169; x=1719577969; 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=deelu2OWT9FEv+OHF2wJoMlx2ZjM7Mxt+Yz0Us1bWBA=; b=SlN00WVt6U5YTW5lEJWvfJa1ogR7296ARJeKJHevjcVNIDC91xD8vmX92hNYUqtzKp 8kIzAz6mXrAebvc3bBls1VjiExSMxyoEMR2jtPNPYet4qjFhDBEWYGjdkJyWXLPGihc0 Q+OYX45fR+p30tQ5Y79ij/V351xkVPFgh/bnU6DcK4falQh12cHdibysiZeVSz8QAdU2 an8Fa+uvN1RbjrXkT28xX1PeKzZbkFKw3HTFego9wIvWnDGKFNA1Qjyd98Xyo06X0Mj8 xnKSZ3ut/c77xxs3YLrCgvqrtTIWalGyMnYcmgXZ2rI1T21BTH9A0EAYHsIv6riZ9/lI ji1g== X-Forwarded-Encrypted: i=1; AJvYcCVp9GEQE148bAFSYmRmVm7E2yx+wykvXaFjXBe8PNreCoV0uFqf0jdOUA1/a89Nv+C9JhODVwW6J70JAl92kQH1ZIQZ5LRZGsGY2I4SAGA5XBZMGD8= X-Gm-Message-State: AOJu0Yz8pe9eUfPWZAGnTzq76P8ple5OOLGygHl4C5IwPSBYaQGKAjlC VapgJP+M+PRfNkHqq6cpYOQ9R65eE1i52lwJ0hSr+GSHa8gE710+Nm/cNX/ErMFhyc86ZYf8FOA BxrjXkoJYdmWoyyxM6r5N996n3g== X-Google-Smtp-Source: AGHT+IHdWV0c0tNGcbnVQuL2QhywOpmCGIzwP0O008XRxIGeQJFB+pSrOMj5h9yiI1GGvgsz9dT8lw3c+AUlnHcJArc= X-Received: from sebkvm.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:cd5]) (user=sebastianene job=sendgmr) by 2002:a05:600c:3582:b0:424:7669:910a with SMTP id 5b1f17b1804b1-4247669952amr1919215e9.2.1718973169043; Fri, 21 Jun 2024 05:32:49 -0700 (PDT) Date: Fri, 21 Jun 2024 12:32:29 +0000 In-Reply-To: <20240621123230.1085265-1-sebastianene@google.com> Mime-Version: 1.0 References: <20240621123230.1085265-1-sebastianene@google.com> X-Mailer: git-send-email 2.45.2.741.gdbec12cfda-goog Message-ID: <20240621123230.1085265-6-sebastianene@google.com> Subject: [PATCH v7 5/6] KVM: arm64: Initialize the ptdump parser with stage-2 attributes From: Sebastian Ene To: akpm@linux-foundation.org, alexghiti@rivosinc.com, ankita@nvidia.com, ardb@kernel.org, catalin.marinas@arm.com, christophe.leroy@csgroup.eu, james.morse@arm.com, vdonnefort@google.com, mark.rutland@arm.com, maz@kernel.org, oliver.upton@linux.dev, rananta@google.com, ryan.roberts@arm.com, sebastianene@google.com, shahuang@redhat.com, suzuki.poulose@arm.com, will@kernel.org, yuzenghui@huawei.com Cc: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel-team@android.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240621_053251_536474_8F2D1FD6 X-CRM114-Status: GOOD ( 18.51 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Define a set of attributes used by the ptdump parser to display the properties of a guest memory region covered by a pagetable descriptor. Build a description of the pagetable levels and initialize the parser with this configuration. Signed-off-by: Sebastian Ene --- arch/arm64/kvm/ptdump.c | 143 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 137 insertions(+), 6 deletions(-) diff --git a/arch/arm64/kvm/ptdump.c b/arch/arm64/kvm/ptdump.c index 36dc7662729f..cc1d4fdddc6e 100644 --- a/arch/arm64/kvm/ptdump.c +++ b/arch/arm64/kvm/ptdump.c @@ -14,6 +14,61 @@ #include +#define MARKERS_LEN (2) +#define KVM_PGTABLE_MAX_LEVELS (KVM_PGTABLE_LAST_LEVEL + 1) + +struct kvm_ptdump_guest_state { + struct kvm *kvm; + struct pg_state parser_state; + struct addr_marker ipa_marker[MARKERS_LEN]; + struct pg_level level[KVM_PGTABLE_MAX_LEVELS]; + struct ptdump_range range[MARKERS_LEN]; +}; + +static const struct prot_bits stage2_pte_bits[] = { + { + .mask = PTE_VALID, + .val = PTE_VALID, + .set = " ", + .clear = "F", + }, { + .mask = KVM_PTE_LEAF_ATTR_HI_S2_XN | PTE_VALID, + .val = KVM_PTE_LEAF_ATTR_HI_S2_XN | PTE_VALID, + .set = "XN", + .clear = " ", + }, { + .mask = KVM_PTE_LEAF_ATTR_LO_S2_S2AP_R | PTE_VALID, + .val = KVM_PTE_LEAF_ATTR_LO_S2_S2AP_R | PTE_VALID, + .set = "R", + .clear = " ", + }, { + .mask = KVM_PTE_LEAF_ATTR_LO_S2_S2AP_W | PTE_VALID, + .val = KVM_PTE_LEAF_ATTR_LO_S2_S2AP_W | PTE_VALID, + .set = "W", + .clear = " ", + }, { + .mask = KVM_PTE_LEAF_ATTR_LO_S2_AF | PTE_VALID, + .val = KVM_PTE_LEAF_ATTR_LO_S2_AF | PTE_VALID, + .set = "AF", + .clear = " ", + }, { + .mask = PTE_NG, + .val = PTE_NG, + .set = "FnXS", + .clear = " ", + }, { + .mask = PTE_CONT | PTE_VALID, + .val = PTE_CONT | PTE_VALID, + .set = "CON", + .clear = " ", + }, { + .mask = PTE_TABLE_BIT, + .val = PTE_TABLE_BIT, + .set = " ", + .clear = "BLK", + }, +}; + static int kvm_ptdump_visitor(const struct kvm_pgtable_visit_ctx *ctx, enum kvm_pgtable_walk_flags visit) { @@ -40,15 +95,79 @@ static int kvm_ptdump_show_common(struct seq_file *m, return kvm_pgtable_walk(pgtable, 0, BIT(pgtable->ia_bits), &walker); } +static int kvm_ptdump_build_levels(struct pg_level *level, u32 start_lvl) +{ + static const char * const level_names[] = {"PGD", "PUD", "PMD", "PTE"}; + u32 i = 0; + u64 mask = 0; + + if (start_lvl > 2) { + pr_err("invalid start_lvl %u\n", start_lvl); + return -EINVAL; + } + + for (i = 0; i < ARRAY_SIZE(stage2_pte_bits); i++) + mask |= stage2_pte_bits[i].mask; + + for (i = start_lvl; i < KVM_PGTABLE_MAX_LEVELS; i++) { + strscpy(level[i].name, level_names[i], sizeof(level[i].name)); + + level[i].num = ARRAY_SIZE(stage2_pte_bits); + level[i].bits = stage2_pte_bits; + level[i].mask = mask; + } + + if (start_lvl > 0) + strscpy(level[start_lvl].name, level_names[0], sizeof(level_names[0])); + + return 0; +} + +static struct kvm_ptdump_guest_state +*kvm_ptdump_parser_init(struct kvm *kvm) +{ + struct kvm_ptdump_guest_state *st; + struct kvm_s2_mmu *mmu = &kvm->arch.mmu; + struct kvm_pgtable *pgtable = mmu->pgt; + int ret; + + st = kzalloc(sizeof(struct kvm_ptdump_guest_state), GFP_KERNEL_ACCOUNT); + if (!st) + return NULL; + + ret = kvm_ptdump_build_levels(&st->level[0], pgtable->start_level); + if (ret) + goto free_with_state; + + st->ipa_marker[0].name = "Guest IPA"; + st->ipa_marker[1].start_address = BIT(pgtable->ia_bits); + st->range[0].end = BIT(pgtable->ia_bits); + + st->kvm = kvm; + st->parser_state = (struct pg_state) { + .marker = &st->ipa_marker[0], + .level = -1, + .pg_level = &st->level[0], + .ptdump.range = &st->range[0], + }; + + return st; +free_with_state: + kfree(st); + return NULL; +} + static int kvm_ptdump_guest_show(struct seq_file *m, void *unused) { - struct kvm *kvm = m->private; + struct kvm_ptdump_guest_state *st = m->private; + struct kvm *kvm = st->kvm; struct kvm_s2_mmu *mmu = &kvm->arch.mmu; - struct pg_state parser_state = {0}; int ret; + st->parser_state.seq = m; + write_lock(&kvm->mmu_lock); - ret = kvm_ptdump_show_common(m, mmu->pgt, &parser_state); + ret = kvm_ptdump_show_common(m, mmu->pgt, &st->parser_state); write_unlock(&kvm->mmu_lock); return ret; @@ -57,22 +176,34 @@ static int kvm_ptdump_guest_show(struct seq_file *m, void *unused) static int kvm_ptdump_guest_open(struct inode *m, struct file *file) { struct kvm *kvm = m->i_private; + struct kvm_ptdump_guest_state *st; int ret; if (!kvm_get_kvm_safe(kvm)) return -ENOENT; - ret = single_open(file, kvm_ptdump_guest_show, m->i_private); - if (ret < 0) - kvm_put_kvm(kvm); + st = kvm_ptdump_parser_init(kvm); + if (!st) { + ret = -ENOMEM; + goto free_with_kvm_ref; + } + + ret = single_open(file, kvm_ptdump_guest_show, st); + if (!ret) + return 0; + kfree(st); +free_with_kvm_ref: + kvm_put_kvm(kvm); return ret; } static int kvm_ptdump_guest_close(struct inode *m, struct file *file) { struct kvm *kvm = m->i_private; + void *st = ((struct seq_file *)file->private_data)->private; + kfree(st); kvm_put_kvm(kvm); return single_release(m, file); } From patchwork Fri Jun 21 12:32:30 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Ene X-Patchwork-Id: 13707538 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id CC1B4C2BA1A for ; Fri, 21 Jun 2024 12:33:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type:Cc:To:From: Subject:Message-ID:References:Mime-Version:In-Reply-To:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=GaoTyRJP5MVoQ4Wx1amDUxzz/OCpulWviUJ5XDAG08I=; b=GeD0tQF767CJC+9+52cVuV3pQC Wxx1vxdZv43M2tOdDYKLxNxEta/FWRx/tJFRRTpg1jk4NZhMWOCTtUZ/jjmtdf0elml3ZiNUvivBA 4mCuSDI2gtbvcbYak2+ydwBTyGCA5QejfhYWhDj3Dj06BVjU30PCC8cI8w3MJR3gYI15R6cXsB6Nw WUoPL+QA2T8ORZVL//Pz4SXclEaoD7DQkN0HYHU3/RpcwLQhNel07WqGfkfYtGgRvN26VXSP1Kiav G5vjzRsDanSNWsC9S726ghQp8p2AwoDXJ5AE+vmXEMgdJ8rl10SomOInFlAvPP2WX0rfneFUOLDeK NvkhTHrw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sKdS2-000000099N5-1VBI; Fri, 21 Jun 2024 12:33:10 +0000 Received: from mail-yw1-x1149.google.com ([2607:f8b0:4864:20::1149]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sKdRl-000000099DB-0G3f for linux-arm-kernel@lists.infradead.org; Fri, 21 Jun 2024 12:32:54 +0000 Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-62f4a831dd8so33347007b3.3 for ; Fri, 21 Jun 2024 05:32:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1718973171; x=1719577971; darn=lists.infradead.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=GaoTyRJP5MVoQ4Wx1amDUxzz/OCpulWviUJ5XDAG08I=; b=QFMGRr/WgZbQM7vuT9ghDEr7cg67YoPoRBzw6G2ofQQvis0+hW8DiVSsKx+jdc0izZ nV/LNWfp/fbE3fkaaTRcJOT54NeGDq6RO9jyWZfzzv81FVhBQTkcGAAvRqM2As32ZsTG 0RZNMwO2aEc7HX0MofiheaieQqkbyj9JDIDOKSzoa2C9O9DBt3u9fzi6cw7JE44+NWQT KV20xFaheg5uOGiRuYAlipqmFrYx3WgGgMTXDD/JyvKIrJXjMk4V8lW91ceH2oAMUD06 t2/msYOGvJKZ8QneeC4uBevZQaw9l9drazCPE36SGoyHA3NjezI4E6YxOlRqYho6+tX5 GDSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718973171; x=1719577971; 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=GaoTyRJP5MVoQ4Wx1amDUxzz/OCpulWviUJ5XDAG08I=; b=tbmMrKMEX/W9jnop9FQYvEdaCwMj09IbvC6VsDnHD5bT5pHrBhIQSD0nXAfkuWfmzf sCl95BZuJ47kLiQ7hg/ea78FtGUFZN3k/LTOL1FemQMAyKnohvKBLOS1P36YnTbWnYeC JD5EUSzZ/DeAA9Y6savyCR5qNuevtC1JFiifDPxVVQbN7anL1JpY5YaXhFAKAwOwBjyQ 8TxCxPT3nwI7hduQJyUnp3avWa5DuQZ4hw5gFhZykYctjcUf6POBpr3OrtrnFsnHCYGB IUEhxeGMJ3UqOGcRKhiTX+m0Gh2QpUf1xNDFkg5hMiJ4Vne0EW/bRXF7qDg9d9wQnS4w YdXw== X-Forwarded-Encrypted: i=1; AJvYcCW4/JRu3g+Wguhu9A1dg+CovtnB4W8ZFjZzsgEHwit5usH/0BjwETrfRZ1BZ2Hxsbskjdi/ZCC4ER3OcDs8xgSJwJ+C91Y4owSvpKNl7Bk6P6H1csw= X-Gm-Message-State: AOJu0Yy+WMJyA65d8ZWcs/KP5X6ABSgrafyGtyztXCQF0Qyia4nlziqA X+jHgYTiJYq1QV71x3FdrArHnIGQGPTD6h/qQ7+HqVOmJIB42+BuWKqe1JV8OmDdKcQV8ttSkKB A9YanvVbev/jpJIFHsVD3Id744w== X-Google-Smtp-Source: AGHT+IGj7AHqrKDUhBWO+SmknG8+pCJKbMlt4EBG61XGF63G72cpdFy+hwEXTIOexf21bNWp4h0sUsTwv0bTgFiHF64= X-Received: from sebkvm.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:cd5]) (user=sebastianene job=sendgmr) by 2002:a05:6902:2b12:b0:dfa:7278:b4c4 with SMTP id 3f1490d57ef6-e02be18dd87mr1713995276.4.1718973171319; Fri, 21 Jun 2024 05:32:51 -0700 (PDT) Date: Fri, 21 Jun 2024 12:32:30 +0000 In-Reply-To: <20240621123230.1085265-1-sebastianene@google.com> Mime-Version: 1.0 References: <20240621123230.1085265-1-sebastianene@google.com> X-Mailer: git-send-email 2.45.2.741.gdbec12cfda-goog Message-ID: <20240621123230.1085265-7-sebastianene@google.com> Subject: [PATCH v7 6/6] KVM: arm64: Expose guest stage-2 pagetable config to debugfs From: Sebastian Ene To: akpm@linux-foundation.org, alexghiti@rivosinc.com, ankita@nvidia.com, ardb@kernel.org, catalin.marinas@arm.com, christophe.leroy@csgroup.eu, james.morse@arm.com, vdonnefort@google.com, mark.rutland@arm.com, maz@kernel.org, oliver.upton@linux.dev, rananta@google.com, ryan.roberts@arm.com, sebastianene@google.com, shahuang@redhat.com, suzuki.poulose@arm.com, will@kernel.org, yuzenghui@huawei.com Cc: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel-team@android.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240621_053253_194696_51FE5886 X-CRM114-Status: GOOD ( 13.85 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Make the start level and the IPA bits properties available in the virtual machine debugfs directory. Make sure that the KVM structure doesn't disappear behind our back and keep a reference to the KVM struct while these files are opened. Signed-off-by: Sebastian Ene --- arch/arm64/kvm/ptdump.c | 50 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/arch/arm64/kvm/ptdump.c b/arch/arm64/kvm/ptdump.c index cc1d4fdddc6e..17649e3cbc8f 100644 --- a/arch/arm64/kvm/ptdump.c +++ b/arch/arm64/kvm/ptdump.c @@ -215,8 +215,58 @@ static const struct file_operations kvm_ptdump_guest_fops = { .release = kvm_ptdump_guest_close, }; +static int kvm_pgtable_debugfs_show(struct seq_file *m, void *unused) +{ + const struct file *file = m->file; + struct kvm_pgtable *pgtable = m->private; + + if (!strcmp(file_dentry(file)->d_iname, "ipa_range")) + seq_printf(m, "%2u\n", pgtable->ia_bits); + else if (!strcmp(file_dentry(file)->d_iname, "stage2_levels")) + seq_printf(m, "%1d\n", pgtable->start_level); + return 0; +} + +static int kvm_pgtable_debugfs_open(struct inode *m, struct file *file) +{ + struct kvm *kvm = m->i_private; + struct kvm_s2_mmu *mmu; + struct kvm_pgtable *pgtable; + int ret; + + if (!kvm_get_kvm_safe(kvm)) + return -ENOENT; + + mmu = &kvm->arch.mmu; + pgtable = mmu->pgt; + + ret = single_open(file, kvm_pgtable_debugfs_show, pgtable); + if (ret < 0) + kvm_put_kvm(kvm); + return ret; +} + +static int kvm_pgtable_debugfs_close(struct inode *m, struct file *file) +{ + struct kvm *kvm = m->i_private; + + kvm_put_kvm(kvm); + return single_release(m, file); +} + +static const struct file_operations kvm_pgtable_debugfs_fops = { + .open = kvm_pgtable_debugfs_open, + .read = seq_read, + .llseek = seq_lseek, + .release = kvm_pgtable_debugfs_close, +}; + void kvm_ptdump_guest_register(struct kvm *kvm) { debugfs_create_file("stage2_page_tables", 0400, kvm->debugfs_dentry, kvm, &kvm_ptdump_guest_fops); + debugfs_create_file("ipa_range", 0400, kvm->debugfs_dentry, kvm, + &kvm_pgtable_debugfs_fops); + debugfs_create_file("stage2_levels", 0400, kvm->debugfs_dentry, + kvm, &kvm_pgtable_debugfs_fops); }