From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=217.140.110.172 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793628864; b=pKpshdswkAvHfvyu56m11Ng4CEbGvFK0eTurzhrrXwPMKa59G1CpKh/vVZe/HJyrEUIQ UwCyGxHFRQ2HFseqnCrI2xowJzJcASE/qMDvKFsJwamFqKGXprubciPTgZv+wMYA2oj0F IcJ8DyKGJiwnNLbJdJTdKscaYTxUsZA07H01yfH8NVjQS9ZN13gnctbdu1rLL/KYKwBWa lmO23cnU2SA6+KRkyMBTBTQX+S4rEgX9oPj/zZiJBLjINB1NcPRdDxZWovy/DDpvnShvl XOwWF5FTVad67f29w8bFy9qRLDKZb01pMCDwJo9uo1DwtATUl0k4cK3BTRKBmvxWubw== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793628864; h=DMARC-Filter:Received:Received:DKIM-Signature:From:To:Cc:Subject: Date:Message-ID:X-Mailer:In-Reply-To:References:MIME-Version: Content-Transfer-Encoding; bh=O9l6+4J6Q0JAqhCl13z5dKK4aG9ZFyHBKaMA7d29aaA=; b=XXXn6qMPjAkqTuaR2+WARpFSNYFLgKjkrEFFxKN6rc7mVQUkUmW9eIF6l+QSmW1fWNdQ BWwVIRLqO1Z+5zerCJS+smdc6+MY8nuDKy3Rz8TBmTaasuzjxoBpcCrMpZglvqZQxqgZM 5S3SM0MVBADChASpwte+aeGK4kAd2L9EHgII+9dLBgLFZPKQ/6Ai2lEGzXsRuoBwm9idT JMfSlBAO9HzcgJfw0ZqP6WXUFnTMEBUbO0MZGYJJqNFxl/Sfaqw5akK7ImOCxDzNXW2LF xdJQ5ZUPwt9MHlP9GpBRbT74Em/hFAaKIWBU4xCMl8O7SSbdWGaYGofhr3Yjg0mBwRg== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=foss header.b=ihkfHa+L; arc=none smtp.remote-ip=217.140.110.172 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 32FB0606A334; Mon, 2 Nov 2026 14:14:24 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org 32FB0606A334 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key, unprotected) header.d=arm.com header.i=@arm.com header.a=rsa-sha256 header.s=foss header.b=ihkfHa+L Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 6E0E91691; Mon, 2 Nov 2026 06:14:20 -0800 (PST) Received: from e122027.arm.com (unknown [10.57.58.9]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id C848E3F59E; Mon, 2 Nov 2026 06:14:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1793628863; bh=vDEqOjWV7ICBwPmWvU+CuAGa9z+MEe1Eh70c6qnULq4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ihkfHa+Lf5iT8gcKObEx1DQ/iVmmotF8Tms2upU7MAkdUAQGTjRCYGgXU0JfO+JiF rt0o702pi4TC78wIFrTYRjLO+Bmm/RatfYYrEytc2szdp7pVQnwvp+UZ70oSKwhNer 8a0UQtJJEX13PV39etg/0aGd0hkrFR6W61rLM9Uw= From: Steven Price To: kvm@vger.kernel.org, kvmarm@lists.linux.dev Cc: Suzuki K Poulose , Catalin Marinas , Marc Zyngier , Will Deacon , James Morse , Oliver Upton , Zenghui Yu , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Joey Gouly , Alexandru Elisei , Christoffer Dall , Fuad Tabba , linux-coco@lists.linux.dev, Ganapatrao Kulkarni , Gavin Shan , Shanker Donthineni , Alper Gun , "Aneesh Kumar K . V" , Emi Kisanuki , Vishal Annapurve , WeiLin.Chang@arm.com, Lorenzo Pieralisi , Steven Price Subject: [PATCH 11/11] KVM: arm64: CCA: Add Realm stage-2 MMU operations Date: Mon, 2 Nov 2026 14:13:02 +0000 Message-ID: <20261102141304.126883-12-steven.price@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20261102141304.126883-1-steven.price@arm.com> References: <20261102141304.126883-1-steven.price@arm.com> X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Suzuki K Poulose Register the Realm stage-2 MMU operations now that the RMM mapping and unmapping helpers are available. Route unmapping through the RMM, and use the existing fault handler for Realm memory faults. The RMM handles TLB invalidation when stage-2 mappings change, so the host has no separate TLB flush to perform. Realm stage-2 does not support access flags, including for shared IPAs. Signed-off-by: Suzuki K Poulose Signed-off-by: Steven Price --- arch/arm64/kvm/mmu.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 20aedbe6ec07..bb33c07569e3 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -191,6 +191,12 @@ static int kvm_vm_flush_remote_tlbs(struct kvm *kvm) return 0; } +static int realm_flush_remote_tlbs(struct kvm *kvm) +{ + /* Nothing to do here, RMM does the job */ + return 0; +} + /** * kvm_arch_flush_remote_tlbs() - flush all VM TLB entries for v7/8 * @kvm: pointer to kvm structure. @@ -218,6 +224,13 @@ static int kvm_vm_flush_remote_tlbs_range(struct kvm *kvm, return 0; } +static int realm_flush_remote_tlbs_range(struct kvm *kvm, + gfn_t gfn, u64 nr_pages) +{ + /* Nothing to do here, RMM does the job */ + return 0; +} + int kvm_arch_flush_remote_tlbs_range(struct kvm *kvm, gfn_t gfn, u64 nr_pages) { @@ -353,6 +366,15 @@ static void no_stage2_unmap_range(struct kvm_s2_mmu *mmu, { } +static void realm_stage2_unmap_range(struct kvm_s2_mmu *mmu, + phys_addr_t start, u64 size, bool may_block, + enum kvm_gfn_range_filter filter) +{ + struct kvm *kvm = kvm_s2_mmu_to_kvm(mmu); + + kvm_realm_unmap_range_filter(kvm, start, size, may_block, filter); +} + /* * Unmapping vs dcache management: * @@ -3291,6 +3313,15 @@ static const struct kvm_vm_s2_ops kvm_default_vm_s2_ops = { .vm_mem_abort = kvm_vm_mem_abort, }; +static const struct kvm_vm_s2_ops realm_vm_s2_ops = { + .vm_flush_remote_tlbs = realm_flush_remote_tlbs, + .vm_flush_remote_tlbs_range = realm_flush_remote_tlbs_range, + .vm_age_gfn = no_age_gfn, + .vm_test_age_gfn = no_age_gfn, + .vm_stage2_unmap_range = realm_stage2_unmap_range, + .vm_mem_abort = kvm_vm_mem_abort, +}; + #define KVM_VM_S2_OPS(flavor, ops) \ [flavor] = &(ops) @@ -3299,7 +3330,7 @@ static const struct kvm_vm_s2_ops *arm64_vm_s2_ops[] = { KVM_VM_S2_OPS(VM_NVHE, kvm_default_vm_s2_ops), KVM_VM_S2_OPS(VM_PKVM, pkvm_vm_s2_ops), KVM_VM_S2_OPS(VM_PROTECTED_PKVM, protected_pkvm_vm_s2_ops), - [VM_REALM] = NULL, + KVM_VM_S2_OPS(VM_REALM, realm_vm_s2_ops), }; static int kvm_vm_init_vm_s2_ops(struct kvm *kvm) -- 2.43.0