From nobody Mon Apr 6 18:24:01 2026 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A7A7C3FB7D2; Wed, 18 Mar 2026 15:55:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773849329; cv=none; b=BzMGJ+DxERiav5NrARVJ7/hAuMR/ZPup1fM3pypx9ZFEsKhQgmpj8nA+ev8Ek8V84b/e2/4oLZOts7ZICds4oE9p9ksA96OJGkXRd5ydqsqIL1q5SixsIcQjdtarrjMqF+KpTEd9LVl+TdgfVB1FLyog0U3Wc8HdHyM+sIRlS5M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773849329; c=relaxed/simple; bh=ldU7LZi7pgNzzfjTUJVNN4CGF6QFW88qyqkWNWF2lMg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HmUaAeEHHbBEscjTCh761CuRgkAeBDuEUQ9CBSjgcIpV8G/HASxPJjw6LUU0umtpoY4hNBBo64bD0A0iLdztmyLfAVmQPU3FWR7Z5OGOLkHAwEnxSwmrC3xKMVEgDG+iEcAoNQ7c9fE1FKLWmTtmVtGlgSCfUfVYiMC+KvDC60A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 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 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 C7DFB1C2B; Wed, 18 Mar 2026 08:55:18 -0700 (PDT) Received: from e122027.arm.com (unknown [10.57.61.122]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 85DF23F73B; Wed, 18 Mar 2026 08:55:21 -0700 (PDT) From: Steven Price To: kvm@vger.kernel.org, kvmarm@lists.linux.dev Cc: Steven Price , Catalin Marinas , Marc Zyngier , Will Deacon , James Morse , Oliver Upton , Suzuki K Poulose , 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 Subject: [PATCH v13 16/48] arm64: RMI: Activate realm on first VCPU run Date: Wed, 18 Mar 2026 15:53:40 +0000 Message-ID: <20260318155413.793430-17-steven.price@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260318155413.793430-1-steven.price@arm.com> References: <20260318155413.793430-1-steven.price@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use kvm_arch_vcpu_run_pid_change() to check if this is the first time the realm guest has run. If this is the first run then activate the realm. Before the realm can be activated it must first be created, this is a stub in this patch and will be filled in by a later patch. Signed-off-by: Steven Price --- Changes since v12: * Fix commit message * Change realm_state checks to be >=3D REALM_STATE_ACTIVE to avoid a dead guest being revived by kvm_activate_realm(). --- arch/arm64/include/asm/kvm_rmi.h | 1 + arch/arm64/kvm/arm.c | 6 +++++ arch/arm64/kvm/rmi.c | 39 ++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/arch/arm64/include/asm/kvm_rmi.h b/arch/arm64/include/asm/kvm_= rmi.h index 16a297f3091a..6c13847480f7 100644 --- a/arch/arm64/include/asm/kvm_rmi.h +++ b/arch/arm64/include/asm/kvm_rmi.h @@ -67,6 +67,7 @@ void kvm_init_rmi(void); u32 kvm_realm_ipa_limit(void); =20 int kvm_init_realm_vm(struct kvm *kvm); +int kvm_activate_realm(struct kvm *kvm); void kvm_destroy_realm(struct kvm *kvm); void kvm_realm_destroy_rtts(struct kvm *kvm); =20 diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index b79b58802b33..c8e51ed009c0 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -998,6 +998,12 @@ int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu) return ret; } =20 + if (kvm_is_realm(vcpu->kvm)) { + ret =3D kvm_activate_realm(kvm); + if (ret) + return ret; + } + mutex_lock(&kvm->arch.config_lock); set_bit(KVM_ARCH_FLAG_HAS_RAN_ONCE, &kvm->arch.flags); mutex_unlock(&kvm->arch.config_lock); diff --git a/arch/arm64/kvm/rmi.c b/arch/arm64/kvm/rmi.c index 1fd2c18f7381..937fababf960 100644 --- a/arch/arm64/kvm/rmi.c +++ b/arch/arm64/kvm/rmi.c @@ -366,6 +366,45 @@ void kvm_realm_destroy_rtts(struct kvm *kvm) WARN_ON(realm_tear_down_rtt_range(realm, 0, (1UL << ia_bits))); } =20 +static int realm_ensure_created(struct kvm *kvm) +{ + /* Provided in later patch */ + return -ENXIO; +} + +int kvm_activate_realm(struct kvm *kvm) +{ + struct realm *realm =3D &kvm->arch.realm; + int ret; + + if (kvm_realm_state(kvm) >=3D REALM_STATE_ACTIVE) + return 0; + + if (!irqchip_in_kernel(kvm)) { + /* Userspace irqchip not yet supported with realms */ + return -EOPNOTSUPP; + } + + guard(mutex)(&kvm->arch.config_lock); + /* Check again with the lock held */ + if (kvm_realm_state(kvm) >=3D REALM_STATE_ACTIVE) + return 0; + + ret =3D realm_ensure_created(kvm); + if (ret) + return ret; + + /* Mark state as dead in case we fail */ + WRITE_ONCE(realm->state, REALM_STATE_DEAD); + + ret =3D rmi_realm_activate(virt_to_phys(realm->rd)); + if (ret) + return -ENXIO; + + WRITE_ONCE(realm->state, REALM_STATE_ACTIVE); + return 0; +} + void kvm_destroy_realm(struct kvm *kvm) { struct realm *realm =3D &kvm->arch.realm; --=20 2.43.0