Re: [PATCH v16 11/45] KVM: arm64: CCA: Check for RMI support at KVM init
Fuad Tabba <[email protected]> Tue, 4 Aug 2026 15:55:00 +0100
| Newsgroups | dev.linux.lists.kvmarm,dev.linux.lists.linux-coco,org.infradead.lists.linux-arm-kernel,org.kernel.vger.kvm,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <CA+EHjTwoKj+c-ZS7W4fCAMYWSgrc+15QWBxu_sE-PMECr+8zpA@mail.gmail.com> |
Hi Steven, On Mon, 3 Aug 2026 at 14:45, Steven Price <[email protected]> wrote: ... > diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h > index bae2c4f92ef5..1a5e15040111 100644 > --- a/arch/arm64/include/asm/kvm_host.h > +++ b/arch/arm64/include/asm/kvm_host.h > @@ -27,6 +27,7 @@ > #include <asm/fpsimd.h> > #include <asm/kvm.h> > #include <asm/kvm_asm.h> > +#include <asm/kvm_rmi.h> > #include <asm/vncr_mapping.h> > > #define __KVM_HAVE_ARCH_INTC_INITIALIZED > @@ -424,6 +425,9 @@ struct kvm_arch { > /* Nested virtualization info */ > struct dentry *debugfs_nv_dentry; > #endif > + > + bool is_realm; > + struct realm realm; > }; Marc suggested at v10 making the pKVM and CCA state here a union, given the two are exclusive, and I believe you acked it [1]. Was there an issue with it, or did it just get lost across the respins? Cheers, /fuad [1] https://lore.kernel.org/all/[email protected]/ > > struct kvm_vcpu_fault_info { > diff --git a/arch/arm64/include/asm/kvm_rmi.h b/arch/arm64/include/asm/kvm_rmi.h > new file mode 100644 > index 000000000000..57d24b244c95 > --- /dev/null > +++ b/arch/arm64/include/asm/kvm_rmi.h > @@ -0,0 +1,17 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) 2023-2026 ARM Ltd. > + */ > + > +#ifndef __ASM_KVM_RMI_H > +#define __ASM_KVM_RMI_H > + > +/** > + * struct realm - Additional per VM data for a Realm > + */ > +struct realm { > +}; > + > +void kvm_init_rmi(void); > + > +#endif /* __ASM_KVM_RMI_H */ > diff --git a/arch/arm64/include/asm/virt.h b/arch/arm64/include/asm/virt.h > index b546703c3ab9..92cec42952f4 100644 > --- a/arch/arm64/include/asm/virt.h > +++ b/arch/arm64/include/asm/virt.h > @@ -87,6 +87,7 @@ void __hyp_reset_vectors(void); > bool is_kvm_arm_initialised(void); > > DECLARE_STATIC_KEY_FALSE(kvm_protected_mode_initialized); > +DECLARE_STATIC_KEY_FALSE(kvm_rmi_is_available); > > static inline bool is_pkvm_initialized(void) > { > diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig > index 449154f9a485..189e8ad78b22 100644 > --- a/arch/arm64/kvm/Kconfig > +++ b/arch/arm64/kvm/Kconfig > @@ -37,6 +37,7 @@ menuconfig KVM > select SCHED_INFO > select GUEST_PERF_EVENTS if PERF_EVENTS > select KVM_GUEST_MEMFD > + select ARM_RMM > help > Support hosting virtualized guest machines. > > diff --git a/arch/arm64/kvm/Makefile b/arch/arm64/kvm/Makefile > index 59612d2f277c..ed3cf30eb06e 100644 > --- a/arch/arm64/kvm/Makefile > +++ b/arch/arm64/kvm/Makefile > @@ -16,7 +16,7 @@ CFLAGS_handle_exit.o += -Wno-override-init > kvm-y += arm.o mmu.o mmio.o psci.o hypercalls.o pvtime.o \ > inject_fault.o va_layout.o handle_exit.o config.o \ > guest.o debug.o reset.o sys_regs.o stacktrace.o \ > - vgic-sys-reg-v3.o fpsimd.o pkvm.o \ > + vgic-sys-reg-v3.o fpsimd.o pkvm.o rmi.o \ > arch_timer.o trng.o vmid.o emulate-nested.o nested.o at.o \ > vgic/vgic.o vgic/vgic-init.o \ > vgic/vgic-irqfd.o vgic/vgic-v2.o \ > diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c > index 50adfff75be8..b961c22fce3d 100644 > --- a/arch/arm64/kvm/arm.c > +++ b/arch/arm64/kvm/arm.c > @@ -42,6 +42,7 @@ > #include <asm/kvm_nested.h> > #include <asm/kvm_pkvm.h> > #include <asm/kvm_ptrauth.h> > +#include <asm/kvm_rmi.h> > #include <asm/sections.h> > #include <asm/stacktrace/nvhe.h> > > @@ -111,6 +112,8 @@ long kvm_get_cap_for_kvm_ioctl(unsigned int ioctl, long *ext) > return -EINVAL; > } > > +DEFINE_STATIC_KEY_FALSE(kvm_rmi_is_available); > + > DECLARE_KVM_HYP_PER_CPU(unsigned long, kvm_hyp_vector); > > DEFINE_PER_CPU(unsigned long, kvm_arm_hyp_stack_base); > @@ -3019,6 +3022,8 @@ static __init int kvm_arm_init(void) > > in_hyp_mode = is_kernel_in_hyp_mode(); > > + kvm_init_rmi(); > + > if (cpus_have_final_cap(ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE) || > cpus_have_final_cap(ARM64_WORKAROUND_1508412)) > kvm_info("Guests without required CPU erratum workarounds can deadlock system!\n" \ > diff --git a/arch/arm64/kvm/rmi.c b/arch/arm64/kvm/rmi.c > new file mode 100644 > index 000000000000..384991d69f78 > --- /dev/null > +++ b/arch/arm64/kvm/rmi.c > @@ -0,0 +1,24 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (C) 2023-2026 ARM Ltd. > + */ > + > +#include <linux/kvm_host.h> > + > +#include <asm/rmi_cmds.h> > +#include <asm/virt.h> > + > +void kvm_init_rmi(void) > +{ > + /* > + * TODO: Support Realm guests in nVHE mode, this will require adding > + * EL2 stub(s) for REC entry and possibly other things. > + */ > + if (!is_kernel_in_hyp_mode()) > + return; > + > + if (!is_rmi_available()) > + return; > + > + /* Future patch will enable static branch kvm_rmi_is_available */ > +} > -- > 2.43.0 >