[PATCH v19 14/20] KVM: arm64: CCA: Add bare minimal S2 operations for Realm

From: Suzuki K Poulose

Date: Sun Sep 20 2026 - 17:39:13 EST


Add bare minimal MMU operation hooks for Realms. The mem_abort handling
is chosen as the default KVM variant. However this cannot be reached for
Realms yet and we would need real RMI command support to make it fully
functional.

RMM takes care of the TLB flushing as required, when the Stage2 is
modified. So host doesn't need to do anything explicitly. RMM doesn't
support access flags for the stage2, even for the shared IPA.

Signed-off-by: Suzuki K Poulose <suzuki.poulose@xxxxxxx>
---
arch/arm64/kvm/mmu.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)

diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c
index 413c4b114d75d..a38459f6b456e 100644
--- a/arch/arm64/kvm/mmu.c
+++ b/arch/arm64/kvm/mmu.c
@@ -180,6 +180,12 @@ static int kvm_vm_flush_remote_tlbs(struct kvm *kvm)
return 0;
}

+static int realm_vm_flush_remote_tlbs(struct kvm *kvm)
+{
+ /* Nothing to do here, RMM takes care of this */
+ return 0;
+}
+
/**
* kvm_arch_flush_remote_tlbs() - flush all VM TLB entries for v7/8
* @kvm: pointer to kvm structure.
@@ -209,6 +215,13 @@ static int kvm_vm_flush_remote_tlbs_range(struct kvm *kvm,
return 0;
}

+static int realm_vm_flush_remote_tlbs_range(struct kvm *kvm,
+ gfn_t gfn, u64 nr_pages)
+{
+ /* Nothing to do here, RMM takes care of this */
+ return 0;
+}
+
int kvm_arch_flush_remote_tlbs_range(struct kvm *kvm,
gfn_t gfn, u64 nr_pages)
{
@@ -2881,6 +2894,17 @@ 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_vm_flush_remote_tlbs,
+ .vm_flush_remote_tlbs_range = realm_vm_flush_remote_tlbs_range,
+ .vm_mem_abort = kvm_vm_mem_abort,
+ /*
+ * Not supported for Realms
+ * .vm_age_gfn = realm_vm_age_gfn,
+ * .vm_test_age_gfn = realm_vm_test_age_gfn,
+ */
+};
+
#define KVM_VM_S2_OPS(flavor, ops) \
[flavor] = ops
static const struct kvm_vm_s2_ops *arm64_vm_s2_ops[] = {
--
2.43.0