From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f74.google.com (mail-wm1-f74.google.com [209.85.128.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E6E253D6CB9 for ; Fri, 12 Jun 2026 06:59:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.74 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781247579; cv=none; b=QfOjeNqR9nmNFMd60KWhgj37YoV/rpshGE/9qvDuDwjLY4+92uJEwLtQttiRkW+j0t14x5oP2rZAT/QBHQ6Y49i4PsA9wSU4YKnLlvXa27WTnaJnOX1wqFiyUs7/J9zj3SSVJShEYYubetZyl0bxaEO0hJOxgobNiYDOntiugc0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781247579; c=relaxed/simple; bh=sRfTcsxroH2oLEruvCbf0VDMRBouZkr/XhuvaRHwJN8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=Zt2PChOp7L3yQnIASNfdTtn66MvI25Nq/5CW/j5NX5D00AXHTQpoGeAsP/TbHIlOrkn1SiY17XSDFbG9mO2t6wXoRj/d65oB3ZYVorvTxnQZko+LN5oGa7euqrO6vZtoeUZeRns0RRLozYYBJfNR7bcWqlQWYYXTMOugF20RVrw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=AtY7tmna; arc=none smtp.client-ip=209.85.128.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--tabba.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="AtY7tmna" Received: by mail-wm1-f74.google.com with SMTP id 5b1f17b1804b1-490b79e6b94so4625375e9.2 for ; Thu, 11 Jun 2026 23:59:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1781247575; x=1781852375; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=5fZWED7+strAr60xfenjKYZKpvQ8pXiqF/YOTUO0ZIw=; b=AtY7tmna91eH0PfF4AZ+aQJ3J/QR9Pb3sDO3UHQ9Q91yGTXN4DqoyThesG61QP7gpr TlX5LpPDUMmMA2ZonQASeri5eAQFmqPZv8G2o8ix1LENXz3gPf8x2i3wqtikzHAJaoU0 1XmFQPShcbgIXCP6id7iGr7zw0/KJQF/ORRvP0hV93l8OjLgBtWWuSxa7xaT1HVz55cF AmxZid6jyXGxWmxuEt3+KIP1+/y1oePTBQYkqP4cWenbnpjxaSgrK4i9Qqfy9iF7J3AB dbzob/E0QfDj+jRxVQmG0cnLjyjrNkETTZLt3hNF+KwXk7ABUaEsp6k09Lp6FPgyHZ+N mO2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781247575; x=1781852375; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=5fZWED7+strAr60xfenjKYZKpvQ8pXiqF/YOTUO0ZIw=; b=EnxWuxoZHa+8kvRtxY6Y2ZL8c+On1+6zv0AWATj1r8V9LVbWdX+NeGUWVDj9jgBBPM M9NB2EJGvtdKEP7XzUxR4THHgauvdng4b8hLyJ/pyz2H2z0WBQQeoZ1cJf4brH4vQuIM KsvnQScSyelbnAysyWotppmUjPwuu29lUlfWbnPDQ1mAEwVSwZNvA/ZsCXy9lqTqZbqa NEBlZVToLsFUsrgnMdwhdvv1Vy2UhpcqJCggKlhmFkjXHBqSWGqYoElKobY9jtuiqV8L tKdAvlleLYG80icXl/MKYgA1TxH33alOAj+4fw5BSgcpIMjMpfrttqGJ8Pqq0F6ieWKF l3CQ== X-Forwarded-Encrypted: i=1; AFNElJ/O6F/32HnW5FAgIsdroIzKTRj5mRr9CwPnQBrBcX1vA38PwJDYF4LZwu3MA7u4Y0WkwvfSOUqNw1JhRB0=@vger.kernel.org X-Gm-Message-State: AOJu0YzHDe+DUBy4Ju/R3ug1dr8BFX1a5bqMI8KNQx7Pc8skUKp9RjJM CZ6FIQOHBDQFEaFBo8TvCjDDAiezoQvjs5S/FyqBEeF+6blvKz5rGiyGH/5Ejifd3+a1k80yZl1 Niw== X-Received: from wmti3.prod.google.com ([2002:a05:600c:8b83:b0:490:ab10:cd32]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:5942:b0:490:47e3:929a with SMTP id 5b1f17b1804b1-490ec4cd289mr10397555e9.6.1781247575054; Thu, 11 Jun 2026 23:59:35 -0700 (PDT) Date: Fri, 12 Jun 2026 07:59:22 +0100 In-Reply-To: <20260612065925.755562-1-tabba@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260612065925.755562-1-tabba@google.com> X-Mailer: git-send-email 2.54.0.1136.gdb2ca164c4-goog Message-ID: <20260612065925.755562-9-tabba@google.com> Subject: [PATCH v1 08/11] KVM: arm64: Add host and hypervisor vCPU lookup primitives From: tabba@google.com To: Marc Zyngier , Oliver Upton Cc: Fuad Tabba , Will Deacon , Catalin Marinas , Quentin Perret , Vincent Donnefort , Sebastian Ene , Per Larsen , Suzuki K Poulose , Zenghui Yu , Joey Gouly , Steffen Eiden , Mark Rutland , Jonathan Cameron , Hyunwoo Kim , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="UTF-8" From: Marc Zyngier The nVHE hypervisor repeatedly resolves a host vCPU into the EL2 address space and validates that the loaded hyp vCPU matches it, with that logic open-coded in each handler. Add __get_host_hyp_vcpus() and the get_host_hyp_vcpus() macro, which translate the host vCPU into the hypervisor's address space and, when pKVM is enabled, also return the loaded hyp vCPU if it matches. If pKVM is enabled but the loaded hyp vCPU does not correspond to the requested host vCPU, both the host and hyp vCPU are returned as NULL. Convert handle___kvm_vcpu_run() to use it. No functional change intended. Signed-off-by: Marc Zyngier Co-developed-by: Fuad Tabba Signed-off-by: Fuad Tabba --- arch/arm64/kvm/hyp/nvhe/hyp-main.c | 52 ++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/arch/arm64/kvm/hyp/nvhe/hyp-main.c b/arch/arm64/kvm/hyp/nvhe/hyp-main.c index 06db299c37a8..420fb19a6476 100644 --- a/arch/arm64/kvm/hyp/nvhe/hyp-main.c +++ b/arch/arm64/kvm/hyp/nvhe/hyp-main.c @@ -195,14 +195,45 @@ static void handle___pkvm_vcpu_put(struct kvm_cpu_context *host_ctxt) pkvm_put_hyp_vcpu(hyp_vcpu); } -static void handle___kvm_vcpu_run(struct kvm_cpu_context *host_ctxt) +static struct kvm_vcpu *__get_host_hyp_vcpus(struct kvm_vcpu *arg, + struct pkvm_hyp_vcpu **hyp_vcpup) { - DECLARE_REG(struct kvm_vcpu *, host_vcpu, host_ctxt, 1); - int ret; + struct kvm_vcpu *host_vcpu = kern_hyp_va(arg); + struct pkvm_hyp_vcpu *hyp_vcpu = NULL; if (unlikely(is_protected_kvm_enabled())) { - struct pkvm_hyp_vcpu *hyp_vcpu = pkvm_get_loaded_hyp_vcpu(); + hyp_vcpu = pkvm_get_loaded_hyp_vcpu(); + if (!hyp_vcpu || hyp_vcpu->host_vcpu != host_vcpu) { + hyp_vcpu = NULL; + host_vcpu = NULL; + } + } + + *hyp_vcpup = hyp_vcpu; + return host_vcpu; +} + +#define get_host_hyp_vcpus(ctxt, regnr, hyp_vcpup) \ + ({ \ + DECLARE_REG(struct kvm_vcpu *, __vcpu, ctxt, regnr); \ + __get_host_hyp_vcpus(__vcpu, hyp_vcpup); \ + }) + +static void handle___kvm_vcpu_run(struct kvm_cpu_context *host_ctxt) +{ + struct pkvm_hyp_vcpu *hyp_vcpu; + struct kvm_vcpu *host_vcpu; + int ret; + + host_vcpu = get_host_hyp_vcpus(host_ctxt, 1, &hyp_vcpu); + + if (!host_vcpu) { + ret = -EINVAL; + goto out; + } + + if (unlikely(hyp_vcpu)) { /* * KVM (and pKVM) doesn't support SME guests for now, and * ensures that SME features aren't enabled in pstate when @@ -214,23 +245,16 @@ static void handle___kvm_vcpu_run(struct kvm_cpu_context *host_ctxt) goto out; } - if (!hyp_vcpu) { - ret = -EINVAL; - goto out; - } - flush_hyp_vcpu(hyp_vcpu); ret = __kvm_vcpu_run(&hyp_vcpu->vcpu); sync_hyp_vcpu(hyp_vcpu); } else { - struct kvm_vcpu *vcpu = kern_hyp_va(host_vcpu); - /* The host is fully trusted, run its vCPU directly. */ - fpsimd_lazy_switch_to_guest(vcpu); - ret = __kvm_vcpu_run(vcpu); - fpsimd_lazy_switch_to_host(vcpu); + fpsimd_lazy_switch_to_guest(host_vcpu); + ret = __kvm_vcpu_run(host_vcpu); + fpsimd_lazy_switch_to_host(host_vcpu); } out: cpu_reg(host_ctxt, 1) = ret; -- 2.54.0.1136.gdb2ca164c4-goog