From mboxrd@z Thu Jan 1 00:00:00 1970 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 A685ED65528 for ; Wed, 17 Dec 2025 10:12:53 +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-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=KIvmUZaPGjPj/Iu07B/aCxCaoa83S2kNVuAK+xsctvw=; b=s+Bcpr+ODYEPyCvf/xPta+aC1H 5WP6Natc2xJ3HKDjaGGNjuzwEnj4t1P/AKoj6MdGrHdlw6BNUwICbWAmqp3aKZtDxt1rADYVX1rJX /23B30/HeqVhFMpHY1bFGEzkMaq5PbGllbPIywLghPgG73Nv1OtZGn4eijZXqhKiJJwEXLM8LRP6X 5XmMAQ3mtesKowQgS+biFBP4w3eoxPhUNve477uZXSk6F4nmm0BOz7JCMSHGKvU3bBSKyol9nvi8N 2AXALa36m90ZUKSwrsZuHLEHDw9n1ub0TYN8YO9pbw2kIzq5KTOXNBMmvfoXqTTvAUatrUlOXmPsY ZL/akawg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1vVoWW-00000006WXg-3rxE; Wed, 17 Dec 2025 10:12:48 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1vVoWP-00000006WQC-1Bfb for linux-arm-kernel@lists.infradead.org; Wed, 17 Dec 2025 10:12:47 +0000 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 9FB771517; Wed, 17 Dec 2025 02:12:32 -0800 (PST) Received: from e122027.arm.com (unknown [10.57.45.201]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id ADCDE3F73B; Wed, 17 Dec 2025 02:12:35 -0800 (PST) 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 v12 11/46] arm64: RMI: Activate realm on first VCPU run Date: Wed, 17 Dec 2025 10:10:48 +0000 Message-ID: <20251217101125.91098-12-steven.price@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251217101125.91098-1-steven.price@arm.com> References: <20251217101125.91098-1-steven.price@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20251217_021241_455625_C0EF4502 X-CRM114-Status: GOOD ( 13.09 ) 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 When a VCPU migrates to another physical CPU check if this is the first time the guest has run, and if so 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 --- New patch for v12 --- arch/arm64/include/asm/kvm_rmi.h | 1 + arch/arm64/kvm/arm.c | 6 +++++ arch/arm64/kvm/rmi.c | 42 ++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/arch/arm64/include/asm/kvm_rmi.h b/arch/arm64/include/asm/kvm_rmi.h index cb7350f8a01a..e4534af06d96 100644 --- a/arch/arm64/include/asm/kvm_rmi.h +++ b/arch/arm64/include/asm/kvm_rmi.h @@ -69,6 +69,7 @@ void kvm_init_rmi(void); u32 kvm_realm_ipa_limit(void); 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); diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index 941d1bec8e77..542df37b9e82 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -951,6 +951,12 @@ int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu) return ret; } + if (kvm_is_realm(vcpu->kvm)) { + ret = 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 e57e8b7eafa9..98929382c365 100644 --- a/arch/arm64/kvm/rmi.c +++ b/arch/arm64/kvm/rmi.c @@ -223,6 +223,48 @@ void kvm_realm_destroy_rtts(struct kvm *kvm) WARN_ON(realm_tear_down_rtt_range(realm, 0, (1UL << ia_bits))); } +static int realm_ensure_created(struct kvm *kvm) +{ + /* Provided in later patch */ + return -ENXIO; +} + +int kvm_activate_realm(struct kvm *kvm) +{ + struct realm *realm = &kvm->arch.realm; + int ret; + + if (!kvm_is_realm(kvm)) + return -ENXIO; + + if (kvm_realm_state(kvm) == REALM_STATE_ACTIVE) + return 0; + + guard(mutex)(&kvm->arch.config_lock); + /* Check again with the lock held */ + if (kvm_realm_state(kvm) == REALM_STATE_ACTIVE) + return 0; + + ret = realm_ensure_created(kvm); + if (ret) + return ret; + + /* Mark state as dead in case we fail */ + WRITE_ONCE(realm->state, REALM_STATE_DEAD); + + if (!irqchip_in_kernel(kvm)) { + /* Userspace irqchip not yet supported with realms */ + return -EOPNOTSUPP; + } + + ret = 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 = &kvm->arch.realm; -- 2.43.0