From nobody Fri Sep 25 00:01:58 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 34CFD4F7CDA; Fri, 18 Sep 2026 13:31:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738306; cv=none; b=K/7LdA+xuN/5VHBvWQx1YTy5Zdb7YEFT2fphCbKUrUvjujx6YBidrgsYaqKP1iGXO5Mh4R4Df0+VOzClsmoL2XGvUVd9Of8O73CgLVDEPFm2xWbfmzudSgSfUVKv24Ilz9Iyw5py1LKj2/4YEdJDUPuVHFDDC/ia8FkrQkYYYr0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738306; c=relaxed/simple; bh=tRqgKRNWjjU3bOalRnKsPbDRdGHP6HAuir8mhQ3nFFA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lWmt65MDUft2fJkoxhtKgx9wPRwdwyCAsF6yBAsROK7DVAKb8buzvt8C34WxAYCKAOP7+u1tnXg+F4m/tBz2ldBt14LWnjmeFxMquAJ8xbKS0IAlzgYYTSMBbELKNLIyzpcPv7r0PHruyErIS7dtGRfZ6lXVfdz/oWSqbdBrfXo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=N7QYleKl; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="N7QYleKl" Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA1VrU3979055; Fri, 18 Sep 2026 13:31:17 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=pw9h0MXlYzlny3S/e Nw2NjZKbOhNMhfLYpS69vfV5gU=; b=N7QYleKl6nnA9WPwNAQ+6O3Snbkd5VJSg eTEeeqG1NXSEt2y4ZlEpRdN+vqUZZTPwgFK858piOZ6d6MsBgae88kmJQCGF2QaT 2xMaPuj2OtmunFK9MrHSOFqkRv3uS7KYcYLmWwqipi7+dZJno+xae9VT2OwiBREI cOCLurWf1YozFaECccWgW70q/zkjjwibLBfjzDoBWdKv8biBLCS4Wep2t78LvRXT hq9tsDkUpD7gQgnJuFdQRXGjd2X6YKv9Ho7L1yDwLRcolJMK80haHA6IGcGmkPqh bUfYj7dvAgUoNB+7M6hMqP6lslP0ZmfU4OO3B2v2ZmoCXktrewe1Q== Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmw5eftrx-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:16 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDNrEj722688; Fri, 18 Sep 2026 13:31:15 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gr5fjqgvc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:15 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDV89m51642826 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:08 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 892C720040; Fri, 18 Sep 2026 13:31:08 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 370462004B; Fri, 18 Sep 2026 13:31:08 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:08 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 01/29] KVM: Introduce file_to_kvm_() infrastructure Date: Fri, 18 Sep 2026 15:30:38 +0200 Message-ID: <20260918133107.1042730-2-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfXxFrQ/P1J0+KD d1DQTGdnhKBvbJH8EyeYqCJ8I9C+dK8IfZHlL5jqf5m7FqO/8GbtCpNPXMj/TgJBGvHX6yrzE8p h1mEYVcI9surmWD4/aRvFILq+OIIefSRAQtcwncvqO3SZsNl/uuttToawsIrsdank7qswBpt9ek RBwJsl1mRcw0fDPtk6Q+E8yIpkOrbzjrwDQ6VitTORm9uURHhFTI3C21TNBBxoF3BWWIGZ7ERy3 0OhIXx1Vx8fj7C36eBV/klQjKQ+j6TFPY2esrF3RGyWNS5Kd+RDI8xn1iFwc1sEj2eBfrTJ4OzU z/wVGW7C+UDT3OGsRaD2zQGxvKbtH/1qNxvgsoxSejukemSTDBImIUhEivCEYVJksJPLK2I7xWf 4Af7DY0ZjGIpGG72+Da4ayFhN8+5q9mwpeeVP4ybrtDyEsw2uWTk+La56/Qs/Tzx5Dbj1moOe+j PnIR1rCctZ/tuSJbADA== X-Authority-Analysis: v=2.4 cv=E/NYNqdl c=1 sm=1 tr=0 ts=6aad3d24 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=1XWaLZrsAAAA:8 a=VnNF1IyMAAAA:8 a=VUxmUKdmKFa5Qofq_fQA:9 X-Proofpoint-ORIG-GUID: MtkYc9tkSr0_zK7BDKYMje2mjFKuAmt1 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX8uY4apRe4BFR vCmeQzGUXMW7Zrh3Tr27U+3Z0xzqUNFvxEakl5IlH8mdJRmU5C2kczA8YzgtgOdfiDwf5It1c48 ZxUggaBX6jSmBqs39EJ71blXmCVkveQ= X-Proofpoint-GUID: m-apAQu_9Y6FW9cdyS6K5S_BtNzmm8UA X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 priorityscore=1501 spamscore=0 adultscore=0 clxscore=1015 bulkscore=0 malwarescore=0 suspectscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" Add a macro mechanism that generates an opt-in and arch-namespaced file_to_kvm_() to convert a file reference to a kvm object if the file handle represents a kvm handle. Activate for x86 and for s390 (native KVM only). Suggested-by: Sean Christopherson Signed-off-by: Steffen Eiden --- arch/s390/include/asm/kvm_host_s390.h | 2 ++ arch/x86/include/asm/kvm_host.h | 2 ++ arch/x86/kvm/Makefile | 1 + include/linux/kvm_host.h | 12 ++++++++++++ virt/kvm/kvm_main.c | 11 +++++++++++ 5 files changed, 28 insertions(+) diff --git a/arch/s390/include/asm/kvm_host_s390.h b/arch/s390/include/asm/= kvm_host_s390.h index cd692f8fb764..8a7eed5847e1 100644 --- a/arch/s390/include/asm/kvm_host_s390.h +++ b/arch/s390/include/asm/kvm_host_s390.h @@ -27,6 +27,8 @@ #include #include =20 +#define kvm_file_to_kvm_arch s390 + #define KVM_HAVE_MMU_RWLOCK #define KVM_MAX_VCPUS 255 =20 diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index 683bb8bf43a9..e460073ff176 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -44,6 +44,8 @@ =20 #include =20 +#define kvm_file_to_kvm_arch x86 + #define __KVM_HAVE_ARCH_VCPU_DEBUGFS =20 /* diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile index 0474604ab8a1..e6d395ede9e2 100644 --- a/arch/x86/kvm/Makefile +++ b/arch/x86/kvm/Makefile @@ -61,6 +61,7 @@ exports_grep_trailer :=3D --include=3D'*.[ch]' -nrw $(src= tree)/virt/kvm $(srctree)/a -e kvm_page_track_unregister_notifier \ -e kvm_write_track_add_gfn \ -e kvm_write_track_remove_gfn \ + -e kvm_file_to_kvm_fn \ -e kvm_get_kvm \ -e kvm_get_kvm_safe \ -e kvm_put_kvm diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 03bfc92864b6..a1bf6d4a8f46 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -1082,6 +1082,18 @@ void kvm_get_kvm(struct kvm *kvm); bool kvm_get_kvm_safe(struct kvm *kvm); void kvm_put_kvm(struct kvm *kvm); bool file_is_kvm(struct file *file); + +/* + * Architectures define kvm_file_to_kvm_arch to + * to get a typed, arch-namespaced helper: + * + * static inline struct kvm *file_to_kvm_(struct file *file) + */ +#ifdef kvm_file_to_kvm_arch +#define kvm_file_to_kvm_fn CONCATENATE(file_to_kvm_, kvm_file_to_kvm_arch) +struct kvm *kvm_file_to_kvm_fn(struct file *file); +#endif /* kvm_file_to_kvm_arch */ + void kvm_put_kvm_no_destroy(struct kvm *kvm); =20 static inline struct kvm_memslots *__kvm_memslots(struct kvm *kvm, int as_= id) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 65eb26a0520d..0172ca94f82e 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -5496,6 +5496,17 @@ bool file_is_kvm(struct file *file) } EXPORT_SYMBOL_FOR_KVM_INTERNAL(file_is_kvm); =20 +#ifdef kvm_file_to_kvm_arch +struct kvm *kvm_file_to_kvm_fn(struct file *file) +{ + if (!file || file->f_op !=3D &kvm_vm_fops) + return NULL; + + return file->private_data; +} +EXPORT_SYMBOL_GPL(kvm_file_to_kvm_fn); +#endif + static int kvm_dev_ioctl_create_vm(unsigned long type) { char fdname[ITOA_MAX_LEN + 1]; --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 053CF4FB9C0; Fri, 18 Sep 2026 13:32:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738337; cv=none; b=D/lZ22OWNLe6vmk8h5N3aQQQ2bMn1Gmj0imS6RZJjI1gzopEGtUAgaipgfZ27V8fBzjKkzaGGwpgjj0rMrfsDV4aXayIfZJllyaIzLEgsRzs6Kt+SHSwSjWbKVKmB/hayTLQCTNgeagKlb/dbXxpQbkFKl1Rp067JEEl3xrojXM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738337; c=relaxed/simple; bh=QfQ8k6bv2crdYgt2de4mPlgLdFS3kW2o5ooo31+T+k4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MvfhTf0m4Y8UIWvjlq387RIbA09TFYmiDRH6QiqD+ll1mHcdN+TRI1/LB8LcNbdjpISvLR/is/5qdlgJd8GqTSfVCbWpSAC56vvMg3ireban+S9ve/TKKdTBuc5h5Yd++lX9CrMJQGo9DESfaggYnC9K1oWg/yCE3mAELtN5E8g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=TxuRd6GE; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="TxuRd6GE" Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA1fgq803525; Fri, 18 Sep 2026 13:31:21 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=RH7/ACgaLAD7xiHpi 23Sm9CXa397B2KbF2Zs4gvs6bI=; b=TxuRd6GEvIDaUeTuWYkqIuTGCWsIJbI0f PAYs+vRgRT6tMsjwfK2YGOxQw9zFaMriFhZfvdyuSBDjYyEXlk3YTalTNonK9FUY h+lsaHq+qEdrQaGMCFiN9KWMfnsWcnmm+UHKDZfAZv38Y+GV0uACDWKiGiigWYIt GlrpGuT0GvkfCL3i0kY1lEYCU7mhMZjwpKlfMN2HM6XluFH5UxDMvD58NWmCJbsx nZbXkTNTZDTbtf5lnXfrN/CXd2nGtEfWAu+7ow7uJbXPNEi7RNssfRp4V5PbRcx+ FJzWMJDeeAYZE0/nBBPPv9XEoWRzH4tBJDYLJNtRVE9hq72S+Yw2A== Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmv5j8145-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:20 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDOCl1695830; Fri, 18 Sep 2026 13:31:20 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gra3fek79-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:19 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDV8ao51642828 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:09 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id DCBE220040; Fri, 18 Sep 2026 13:31:08 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8E59020049; Fri, 18 Sep 2026 13:31:08 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:08 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 02/29] KVM: Add file back-pointer to struct kvm Date: Fri, 18 Sep 2026 15:30:39 +0200 Message-ID: <20260918133107.1042730-3-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX9xIhu1g9ugrX rH4DjmJFGl8+lyQPTbtptshAtETCkgumxcoebAzSqdVptl4BKNfxgmwR5CWWeHNj7t4X+XFS8H8 OoJ6tytuZd6znqTlmLnzkuow6Wvvvt7QOF3rDLpsGX9J9g+3p4Xomo8WC3nb8PUWtTi/mTaIYWJ h/LiiGRKzWIL/Z/rthHqr+/ZaXTt4zwM5qjoFvMS86ULz/cj7OZ7+tWCC+WY0V99GxVa9a+9KeH AWeh38cbWwX/lJj3E1pBPLHTuDZvVuwmZ80jHiEmW3zcOfp8VpIwkmOWAaCUjhtcVZV7IFU5I0l Of8O38piHZDqih2GmuoXZt1zG78Xl+UlH46BuLtjTDr6xLsRUc/RjbGTfmolG4xa0Y2Z55hqCvr 00WibjrLsXQ/zdx3KxpQlpxxJyYxEw6L3GLKzhQisz7pKVLlLNikNfYme9U2e1hIIMppWnVYD6V FwyDd/RYi2DSNNZgTPg== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX6I+kRjZoQGyD vpYKSCuMscvu/Vxtyd30LkMGo8FBLEAp5tGdrIUeTJhqCCdShCZc9ERtbIZc2O96UMP7Bak0sR6 /JYJ/q3d4yvfGTiBlulpDZ8UMOewdvI= X-Authority-Analysis: v=2.4 cv=Zsx4uN7G c=1 sm=1 tr=0 ts=6aad3d29 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=1XWaLZrsAAAA:8 a=VnNF1IyMAAAA:8 a=q3OYOvv_GcRzabu4IdsA:9 X-Proofpoint-ORIG-GUID: hhakXsoQk_t-0CLSijhO_PAbfQM46rA6 X-Proofpoint-GUID: tNskIW43qKDl8CnCnNcc1c165n-p9K5N X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 impostorscore=0 clxscore=1015 priorityscore=1501 lowpriorityscore=0 bulkscore=0 adultscore=0 phishscore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" Add kvm->file as a no-reference back-pointer to the VM file in struct kvm. The pointer is set at VM creation time and cleared under WRITE_ONCE() in kvm_vm_release() before the file is freed. Callers storing the file must take their own reference. Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson Signed-off-by: Steffen Eiden --- include/linux/kvm_host.h | 6 ++++++ virt/kvm/kvm_main.c | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index a1bf6d4a8f46..2b56fb4e8555 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -784,6 +784,12 @@ struct kvm { * kvm_swap_active_memslots(). */ struct mutex slots_arch_lock; + /* + * Back-reference to the VM file for subsystems (e.g., VFIO). Holds no + * reference to avoid pinning the VM. Callers storing the file must + * take their own reference. + */ + struct file *file; struct mm_struct *mm; /* userspace tied to this vm */ unsigned long nr_memslot_pages; /* The two memslot sets - active and inactive (per address space) */ diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 0172ca94f82e..bab71d398236 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1352,6 +1352,8 @@ static int kvm_vm_release(struct inode *inode, struct= file *filp) =20 kvm_irqfd_release(kvm); =20 + WRITE_ONCE(kvm->file, NULL); + kvm_put_kvm(kvm); return 0; } @@ -5532,6 +5534,8 @@ static int kvm_dev_ioctl_create_vm(unsigned long type) goto put_kvm; } =20 + kvm->file =3D file; + /* * Don't call kvm_put_kvm anymore at this point; file->f_op is * already set, with ->release() being kvm_vm_release(). In error --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E0DE14FD29E; Fri, 18 Sep 2026 13:32:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738375; cv=none; b=SCQMw6KchZbBskyHLb/maI8fde1GnGCyY82kCzpasMrjbuQa3rHO4Fu9maivFjeAgdgFDDrGH9h/QQJtQj1FZ7BSPfUj7yYWBJGuCzCMRiwJt1ysPt4PLeTmQmxi5gxsDRAQJvMiJ+vMxEQhF293UXoXdCIdYJ9aPssvZAVTIDk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738375; c=relaxed/simple; bh=f2lWFrVUaldFPOGGRSQjtndrudqn+1CbFAiZyaHKlXM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rLWdLK1M8xHPja4M1/7sItIFz+Nkw1ISGl7H1a3Lg6S/2NJTmFx7eyhEivrMfdAuy4va3qb9iS2cipP5BN+7A4c7UEN5bEqj/FqXFUp2waOXksfSLuX23K4p5ssanQsClwMYdmFTYICbFD4kEG/7x7LN2W5n+iWZH3GdwsyDv90= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=kP5caMYG; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="kP5caMYG" Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA1VA7946109; Fri, 18 Sep 2026 13:31:16 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=dGxaGv9ue7Ewuq1eH s7QObjbv274+o/jH3uV6I04G0M=; b=kP5caMYGjWiK5Zg2yVeZnKRrXStfjjtMN e/nksQVa3dP8EalptcgmlGUF+v3Ahmg2yc0p4zB/DU8GnrEY4nYECNrkvd9sVl26 nbeJeYM/6c7PKV5zAYs/7uFhyiHuKYU71EK4i39njZSHmgqon8ugiKVQ6I+FUPBT UJYEAYEqhciujOOozkNoMHE4lBDC8twyRQQN7k9p+nsWHNt43qC7wubksU2Yzkra 8T7KYhqUKPu2+G0UAtGlo9Aq8FOjrEYqdi+2nyeiAqW0YdEHB6FVmvDAIXfl8kSV 78Z5/U1pzbRlSyGUUDwOwnxb6SfI7qfFpGFYhsBn98PgNk5rIjn+g== Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmx848a5f-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:16 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDO2Jf777731; Fri, 18 Sep 2026 13:31:15 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gra3yxkbh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:15 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDV9JJ40042858 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:09 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3C34A20040; Fri, 18 Sep 2026 13:31:09 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E2CB62004B; Fri, 18 Sep 2026 13:31:08 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:08 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 03/29] KVM: x86: Use file_to_kvm_x86() in SEV Date: Fri, 18 Sep 2026 15:30:40 +0200 Message-ID: <20260918133107.1042730-4-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX5upRvvzS/GHQ 9nzo7qmWVjtnz5WCcRPJtMyGiKna5NBxlk52F16Fu7SE1ZgImvaJG3+AnTRMLE5rziu38wu3CNv e6v77EWhmvcX9ZJxQCnoFNVmxfARWU2rEONrXkuFLFxIDPJeLovOAl/n3GDG39h0C/YsmpGgEuF l7ywT9z8OnhSffJXBHwNhtGFf2nsHS1QLlUPUschoawP034y7xT/W010DIbZRl5PAijEaclg4aR KcX0brqYW+pnCoJ3jR916UGmhL7cjRSd1nYiFxZqwCTn77I0FcR3go/9s4wC9ZzNV8ddHs5lDLF kuMcIYgLCWSBUHk7HK8iVFpvTh4dNhsDQg1p5oYdsNEohNylYE0Fj5Y8LTDu3caeSPuPS9ZtWHb 31c7/ybfWsltitju73Ed+1ubKgLx39eXdmFI6wzBS6jMNV1scoueo2kvFVygBRI2lva6WOG4gKl gnPwlbBenMtKmbaj87Q== X-Proofpoint-ORIG-GUID: kZZrtHqZQ3qIZ0PGz-KG7j3HrJTxHGUp X-Proofpoint-GUID: LktavOI8BR_X_3gU2-eZCG7Zm5MjsSFG X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX7KFZJvIoroxU WgpTbxWHlqJPPemq926nr1d+8zrUDr9bVB1iP81J6PUQWzmLq14agA2NJBDdfp/sjZhuteq3dgP 4NPOzBPElk6Xk0hws92vYwS+pghTpvA= X-Authority-Analysis: v=2.4 cv=cY9HPXDM c=1 sm=1 tr=0 ts=6aad3d24 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=1XWaLZrsAAAA:8 a=VnNF1IyMAAAA:8 a=JZHfIBTrcVpj99XhhAcA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 spamscore=0 bulkscore=0 clxscore=1015 suspectscore=0 impostorscore=0 malwarescore=0 phishscore=0 adultscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" Use the new arch-namespaced helper instead of open-coding the file check and private_data cast separately. Suggested-by: Sean Christopherson Signed-off-by: Steffen Eiden --- arch/x86/kvm/svm/sev.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c index 5705723f1f41..6b0eacde4f06 100644 --- a/arch/x86/kvm/svm/sev.c +++ b/arch/x86/kvm/svm/sev.c @@ -2145,10 +2145,10 @@ int sev_vm_move_enc_context_from(struct kvm *kvm, u= nsigned int source_fd) if (fd_empty(f)) return -EBADF; =20 - if (!file_is_kvm(fd_file(f))) + source_kvm =3D file_to_kvm_x86(fd_file(f)); + if (!source_kvm) return -EBADF; =20 - source_kvm =3D fd_file(f)->private_data; ret =3D sev_lock_two_vms(kvm, source_kvm); if (ret) return ret; @@ -2866,10 +2866,10 @@ int sev_vm_copy_enc_context_from(struct kvm *kvm, u= nsigned int source_fd) if (fd_empty(f)) return -EBADF; =20 - if (!file_is_kvm(fd_file(f))) + source_kvm =3D file_to_kvm_x86(fd_file(f)); + if (!source_kvm) return -EBADF; =20 - source_kvm =3D fd_file(f)->private_data; ret =3D sev_lock_two_vms(kvm, source_kvm); if (ret) return ret; --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 63AD5502574; Fri, 18 Sep 2026 13:36:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738601; cv=none; b=C0TR9Zir2+MsXkYSaHZGVYiRZ7jY7zHeYFSiMx+upPUzSip1iln1eqYvStec/MKNdGdjjJY/DGi5+g9WSq4eltT/CS06kdFLPsN66FB9LL3arvUzGh/uKsiB4d5gafqlskA6GgfQY/WzMmg4SjZBg8ow2QNMWvR3t7FWnSAL0E8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738601; c=relaxed/simple; bh=XsnM/0XsktS2sF+YlIfsDsw/JgGZ+aGtjJctmbBOLeA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=inLyB2QdGvyGuC/9Ug0yudz0dKwuHAn6yu6AJacUhh6Fp6EFbnSxAs7IXNOv24EW7X2fts9F+KfKwpTmugDH5zthuYMHShV9/MFC9ynOsNJ7azAQuXi/mI0eh8dJKzSem6tEOLFPTnE6kq6gu63y0f+5/cU2ADh+ZIJc8Rv2sU8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=AAbG5ARW; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="AAbG5ARW" Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA2nhS991057; Fri, 18 Sep 2026 13:31:18 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=TPCKSNeFnfNK3/ftY 279YVqWwTRGevmLg/hUf5O+cjQ=; b=AAbG5ARWeUnJQS8eDx2g1IjvyBvkHF7vP gT7Ly+I8HJJajOQ5nZZ8gY21bId2UAn00E6Ap6ps4I8hIoGhaiiXrFxbZQJZf/Fz S90erFgAjUAO53zNuCGNK7Qzi9vbWInK3A1FBFfKAA1nie8qqeIP7+10eXTHxHss Igrfmiuu9Ug0/NAhVCQZjrsdukvzkShef87E7dLfMpwVhDhYYqNO8eWp6sNO2+aq 6As3f7uZCK+YR9MVuOhsGXzxHMm0NkOMYfZAYK0lEUGMcclO2nIDFVZyldLNg3Mc XfDhGuJXJcaOyFdLqNPcI1Q2iY7Bzq3JqEtmLnd9ikVITKuV1ZsAA== Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmxcvfnp2-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:17 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDNqHT739423; Fri, 18 Sep 2026 13:31:16 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gs56q88u0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:16 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDV9Hq40042860 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:09 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A207120040; Fri, 18 Sep 2026 13:31:09 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 426EF20049; Fri, 18 Sep 2026 13:31:09 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:09 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 04/29] KVM/vfio: Use file-based reference counting for KVM Date: Fri, 18 Sep 2026 15:30:41 +0200 Message-ID: <20260918133107.1042730-5-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfXzEzjvNjNDHOp T1BE1I+RCJv5Wr/r9Zvs23W64BI64dhlCN1+P39tzZ0gFj1WtIep3llmHLZc+KiA3qCktm7l9mk PnqsBpmLB4VLDjtEcDTEAEIPz+u+WBM= X-Proofpoint-ORIG-GUID: OcRhjop6AO359DjUigtUwK_Zw5h2LoL0 X-Proofpoint-GUID: 6U6c6oZmo-28uCesnMvaCAOLAgclfmBv X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX8EaFOiKey/1d t4tH8VOfMR9F3qtnPuYx/oCrcEMl+6UrPlzziGq3QJm5LplCA2GP7pd++VoYc0dKFDyzndIOJen Gj+yoBQozhlEd9Td2hPVWn2sl4kius9SqcZZjz82CRG4WuyqoeGuWxZE5+EnJdDQlWMcddXZUGH e+xfKYw1osATtREdH1Hu9sywWWyo9vUFAYqgBmDT46R0W6f+qGnN2tbSbxM5U8KxwJsUFCPaEpb LlOWeI0ntnRfqA9lhWfrLZI7ZlFa88TzF6cF7z+HigfTpHbiVbYfLC8/ycOy43tLMtSlTW32A2c SXxIIFYkDboEGzLFZNJYkTXU1XTZmHmlNqn+NXT8+8/eQ1pYE4gkvUxqIfu3n2wEZJ/HZyWkbKS sOyvvzJBlGMh2YJtGfP1tng/d+0L2ouVx9C1AgkDQ24RskFfuU7FK48BEvk24mkk7N9pysCy5mY I0/gLll8YHxSIj371HQ== X-Authority-Analysis: v=2.4 cv=F+7C5ahN c=1 sm=1 tr=0 ts=6aad3d26 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=Ikd4Dj_1AAAA:8 a=1XWaLZrsAAAA:8 a=VnNF1IyMAAAA:8 a=NcvOO2zV9weGGrCt3WIA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 phishscore=0 clxscore=1015 malwarescore=0 lowpriorityscore=0 bulkscore=0 spamscore=0 impostorscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" Replace manual module reference counting with file-based reference counting for KVM integration. Previously, VFIO used symbol_get() to obtain function pointers for kvm_get_kvm_safe() and kvm_put_kvm(), then manually tracked module references through these symbols. This approach required storing the put_kvm function pointer in each device and carefully managing symbol references. Pass struct file pointers instead of struct kvm pointers throughout the VFIO-KVM interface, leveraging the kernel's existing file reference counting via get_file()/get_file_active() and fput(). Convert the x86 page-track API likewise, and update vfio_ap and vfio_pci_zdev to use file_to_kvm_s390(). This simplifies the code and removes all remaining externally exported symbols for KVM which would appear twice for when a second concurrent KVM module is introduced. Suggested-by: Jason Gunthorpe Co-developed-by: Sean Christopherson Signed-off-by: Sean Christopherson Reviewed-by: Jason J. Herne Signed-off-by: Steffen Eiden --- arch/x86/include/asm/kvm_page_track.h | 8 ++-- arch/x86/kvm/mmu/page_track.c | 22 +++++++---- drivers/s390/crypto/vfio_ap_ops.c | 20 +++++++--- drivers/vfio/group.c | 11 +++++- drivers/vfio/pci/vfio_pci_zdev.c | 8 +++- drivers/vfio/vfio.h | 12 +++--- drivers/vfio/vfio_main.c | 57 +++++++++------------------ include/linux/vfio.h | 5 +-- virt/kvm/vfio.c | 13 ++++-- 9 files changed, 84 insertions(+), 72 deletions(-) diff --git a/arch/x86/include/asm/kvm_page_track.h b/arch/x86/include/asm/k= vm_page_track.h index 3d040741044b..046a25c8fe4f 100644 --- a/arch/x86/include/asm/kvm_page_track.h +++ b/arch/x86/include/asm/kvm_page_track.h @@ -44,13 +44,13 @@ struct kvm_page_track_notifier_node { struct kvm_page_track_notifier_node *node); }; =20 -int kvm_page_track_register_notifier(struct kvm *kvm, +int kvm_page_track_register_notifier(struct file *file, struct kvm_page_track_notifier_node *n); -void kvm_page_track_unregister_notifier(struct kvm *kvm, +void kvm_page_track_unregister_notifier(struct file *file, struct kvm_page_track_notifier_node *n); =20 -int kvm_write_track_add_gfn(struct kvm *kvm, gfn_t gfn); -int kvm_write_track_remove_gfn(struct kvm *kvm, gfn_t gfn); +int kvm_write_track_add_gfn(struct file *file, gfn_t gfn); +int kvm_write_track_remove_gfn(struct file *file, gfn_t gfn); #else /* * Allow defining a node in a structure even if page tracking is disabled,= e.g. diff --git a/arch/x86/kvm/mmu/page_track.c b/arch/x86/kvm/mmu/page_track.c index 7e8195a311bb..f12558dfcd81 100644 --- a/arch/x86/kvm/mmu/page_track.c +++ b/arch/x86/kvm/mmu/page_track.c @@ -16,6 +16,8 @@ #include #include =20 +#include + #include "mmu.h" #include "mmu_internal.h" #include "page_track.h" @@ -237,10 +239,11 @@ static int kvm_enable_external_write_tracking(struct = kvm *kvm) * register the notifier so that event interception for the tracked guest * pages can be received. */ -int kvm_page_track_register_notifier(struct kvm *kvm, +int kvm_page_track_register_notifier(struct file *file, struct kvm_page_track_notifier_node *n) { struct kvm_page_track_notifier_head *head; + struct kvm *kvm =3D file_to_kvm_x86(file); int r; =20 if (!kvm || kvm->mm !=3D current->mm) @@ -252,7 +255,7 @@ int kvm_page_track_register_notifier(struct kvm *kvm, return r; } =20 - kvm_get_kvm(kvm); + get_file(file); =20 head =3D &kvm->arch.track_notifier_head; =20 @@ -267,10 +270,11 @@ EXPORT_SYMBOL_GPL(kvm_page_track_register_notifier); * stop receiving the event interception. It is the opposed operation of * kvm_page_track_register_notifier(). */ -void kvm_page_track_unregister_notifier(struct kvm *kvm, +void kvm_page_track_unregister_notifier(struct file *file, struct kvm_page_track_notifier_node *n) { struct kvm_page_track_notifier_head *head; + struct kvm *kvm =3D file_to_kvm_x86(file); =20 head =3D &kvm->arch.track_notifier_head; =20 @@ -279,7 +283,7 @@ void kvm_page_track_unregister_notifier(struct kvm *kvm, write_unlock(&kvm->mmu_lock); synchronize_srcu(&head->track_srcu); =20 - kvm_put_kvm(kvm); + fput(file); } EXPORT_SYMBOL_GPL(kvm_page_track_unregister_notifier); =20 @@ -336,11 +340,12 @@ void kvm_page_track_delete_slot(struct kvm *kvm, stru= ct kvm_memory_slot *slot) * add guest page to the tracking pool so that corresponding access on that * page will be intercepted. * - * @kvm: the guest instance we are interested in. + * @file: the VM file of the guest instance we are interested in. * @gfn: the guest page. */ -int kvm_write_track_add_gfn(struct kvm *kvm, gfn_t gfn) +int kvm_write_track_add_gfn(struct file *file, gfn_t gfn) { + struct kvm *kvm =3D file_to_kvm_x86(file); struct kvm_memory_slot *slot; int idx; =20 @@ -366,11 +371,12 @@ EXPORT_SYMBOL_GPL(kvm_write_track_add_gfn); * remove the guest page from the tracking pool which stops the intercepti= on * of corresponding access on that page. * - * @kvm: the guest instance we are interested in. + * @file: the VM file of the guest instance we are interested in. * @gfn: the guest page. */ -int kvm_write_track_remove_gfn(struct kvm *kvm, gfn_t gfn) +int kvm_write_track_remove_gfn(struct file *file, gfn_t gfn) { + struct kvm *kvm =3D file_to_kvm_x86(file); struct kvm_memory_slot *slot; int idx; =20 diff --git a/drivers/s390/crypto/vfio_ap_ops.c b/drivers/s390/crypto/vfio_a= p_ops.c index 940c0ff668be..556e643244f2 100644 --- a/drivers/s390/crypto/vfio_ap_ops.c +++ b/drivers/s390/crypto/vfio_ap_ops.c @@ -1822,17 +1822,27 @@ static const struct attribute_group *vfio_ap_mdev_a= ttr_groups[] =3D { =20 /** * vfio_ap_mdev_set_kvm - sets all data for @matrix_mdev that are needed - * to manage AP resources for the guest whose state is represented by @kvm + * to manage AP resources for the guest whose state is represented by + * @kvm_file * * @matrix_mdev: a mediated matrix device - * @kvm: reference to KVM instance + * @kvm_file: the KVM VM file this vfio device is associated with * - * Return: 0 if no other mediated matrix device has a reference to @kvm; + * Return: 0 if no other mediated matrix device has a reference to the VM; * otherwise, returns an -EPERM. */ static int vfio_ap_mdev_set_kvm(struct ap_matrix_mdev *matrix_mdev, - struct kvm *kvm) + struct file *kvm_file) { + struct kvm *kvm; + + if (!kvm_file) + return -ENOENT; + + kvm =3D file_to_kvm_s390(kvm_file); + if (!kvm) + return -ENOENT; + if (kvm->arch.crypto.crycbd) { get_update_locks_for_kvm(kvm); if (kvm->arch.crypto.pqap_hook) { @@ -1841,7 +1851,6 @@ static int vfio_ap_mdev_set_kvm(struct ap_matrix_mdev= *matrix_mdev, } kvm->arch.crypto.pqap_hook =3D &matrix_mdev->pqap_hook; =20 - kvm_get_kvm(kvm); matrix_mdev->kvm =3D kvm; vfio_ap_mdev_update_guest_apcb(matrix_mdev); release_update_locks_for_kvm(kvm); @@ -1894,7 +1903,6 @@ static void vfio_ap_mdev_unset_kvm(struct ap_matrix_m= dev *matrix_mdev) matrix_mdev->kvm =3D NULL; =20 release_update_locks_for_kvm(kvm); - kvm_put_kvm(kvm); } } =20 diff --git a/drivers/vfio/group.c b/drivers/vfio/group.c index b2299e5bc6df..5bf8cbdff377 100644 --- a/drivers/vfio/group.c +++ b/drivers/vfio/group.c @@ -860,11 +860,20 @@ bool vfio_group_enforced_coherent(struct vfio_group *= group) return ret; } =20 -void vfio_group_set_kvm(struct vfio_group *group, struct kvm *kvm) +void vfio_group_set_kvm(struct vfio_group *group, struct file *kvm) { + struct file *old; + + if (kvm) + get_file(kvm); + spin_lock(&group->kvm_ref_lock); + old =3D group->kvm; group->kvm =3D kvm; spin_unlock(&group->kvm_ref_lock); + + if (old) + fput(old); } =20 /** diff --git a/drivers/vfio/pci/vfio_pci_zdev.c b/drivers/vfio/pci/vfio_pci_z= dev.c index f47f36314a1c..332bc66db55b 100644 --- a/drivers/vfio/pci/vfio_pci_zdev.c +++ b/drivers/vfio/pci/vfio_pci_zdev.c @@ -184,6 +184,7 @@ int vfio_pci_zdev_feature_err(struct vfio_device *devic= e, u32 flags, int vfio_pci_zdev_open_device(struct vfio_pci_core_device *vdev) { struct zpci_dev *zdev =3D to_zpci(vdev->pdev); + struct kvm *kvm; int ret; =20 if (!zdev) @@ -195,9 +196,14 @@ int vfio_pci_zdev_open_device(struct vfio_pci_core_dev= ice *vdev) return 0; =20 ret =3D -ENOENT; + kvm =3D file_to_kvm_s390(vdev->vdev.kvm); + if (!kvm) + goto recovery; + if (zpci_kvm_hook.kvm_register) - ret =3D zpci_kvm_hook.kvm_register(zdev, vdev->vdev.kvm); + ret =3D zpci_kvm_hook.kvm_register(zdev, kvm); =20 +recovery: if (ret) zpci_stop_mediated_recovery(zdev); =20 diff --git a/drivers/vfio/vfio.h b/drivers/vfio/vfio.h index 7728bc99b63d..9b619951a5d0 100644 --- a/drivers/vfio/vfio.h +++ b/drivers/vfio/vfio.h @@ -23,7 +23,7 @@ struct vfio_device_file { u8 access_granted; u32 devid; /* only valid when iommufd is valid */ spinlock_t kvm_ref_lock; /* protect kvm field */ - struct kvm *kvm; + struct file *kvm; struct iommufd_ctx *iommufd; /* protected by struct vfio_device_set::lock= */ }; =20 @@ -88,7 +88,7 @@ struct vfio_group { #endif enum vfio_group_type type; struct mutex group_lock; - struct kvm *kvm; + struct file *kvm; struct file *opened_file; struct iommufd_ctx *iommufd; spinlock_t kvm_ref_lock; @@ -107,7 +107,7 @@ void vfio_device_group_unuse_iommu(struct vfio_device *= device); void vfio_df_group_close(struct vfio_device_file *df); struct vfio_group *vfio_group_from_file(struct file *file); bool vfio_group_enforced_coherent(struct vfio_group *group); -void vfio_group_set_kvm(struct vfio_group *group, struct kvm *kvm); +void vfio_group_set_kvm(struct vfio_group *group, struct file *kvm); bool vfio_device_has_container(struct vfio_device *device); int __init vfio_group_init(void); void vfio_group_cleanup(void); @@ -165,7 +165,7 @@ static inline bool vfio_group_enforced_coherent(struct = vfio_group *group) return true; } =20 -static inline void vfio_group_set_kvm(struct vfio_group *group, struct kvm= *kvm) +static inline void vfio_group_set_kvm(struct vfio_group *group, struct fil= e *kvm) { } =20 @@ -429,11 +429,11 @@ static inline void vfio_virqfd_exit(void) #endif =20 #if IS_ENABLED(CONFIG_KVM) -void vfio_device_get_kvm_safe(struct vfio_device *device, struct kvm *kvm); +void vfio_device_get_kvm_safe(struct vfio_device *device, struct file *kvm= ); void vfio_device_put_kvm(struct vfio_device *device); #else static inline void vfio_device_get_kvm_safe(struct vfio_device *device, - struct kvm *kvm) + struct file *kvm) { } =20 diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c index 423ead48aafe..ed96acfa8635 100644 --- a/drivers/vfio/vfio_main.c +++ b/drivers/vfio/vfio_main.c @@ -472,36 +472,14 @@ void vfio_unregister_group_dev(struct vfio_device *de= vice) EXPORT_SYMBOL_GPL(vfio_unregister_group_dev); =20 #if IS_ENABLED(CONFIG_KVM) -void vfio_device_get_kvm_safe(struct vfio_device *device, struct kvm *kvm) +void vfio_device_get_kvm_safe(struct vfio_device *device, struct file *kvm) { - void (*pfn)(struct kvm *kvm); - bool (*fn)(struct kvm *kvm); - bool ret; - lockdep_assert_held(&device->dev_set->lock); =20 if (!kvm) return; =20 - pfn =3D symbol_get(kvm_put_kvm); - if (WARN_ON(!pfn)) - return; - - fn =3D symbol_get(kvm_get_kvm_safe); - if (WARN_ON(!fn)) { - symbol_put(kvm_put_kvm); - return; - } - - ret =3D fn(kvm); - symbol_put(kvm_get_kvm_safe); - if (!ret) { - symbol_put(kvm_put_kvm); - return; - } - - device->put_kvm =3D pfn; - device->kvm =3D kvm; + device->kvm =3D get_file(kvm); } =20 void vfio_device_put_kvm(struct vfio_device *device) @@ -511,14 +489,7 @@ void vfio_device_put_kvm(struct vfio_device *device) if (!device->kvm) return; =20 - if (WARN_ON(!device->put_kvm)) - goto clear; - - device->put_kvm(device->kvm); - device->put_kvm =3D NULL; - symbol_put(kvm_put_kvm); - -clear: + fput(device->kvm); device->kvm =3D NULL; } #endif @@ -1544,9 +1515,13 @@ bool vfio_file_enforced_coherent(struct file *file) } EXPORT_SYMBOL_GPL(vfio_file_enforced_coherent); =20 -static void vfio_device_file_set_kvm(struct file *file, struct kvm *kvm) +static void vfio_device_file_set_kvm(struct file *file, struct file *kvm) { struct vfio_device_file *df =3D file->private_data; + struct file *old; + + if (kvm) + get_file(kvm); =20 /* * The kvm is first recorded in the vfio_device_file, and will @@ -1554,28 +1529,32 @@ static void vfio_device_file_set_kvm(struct file *f= ile, struct kvm *kvm) * iommufd successfully in the vfio device cdev path. */ spin_lock(&df->kvm_ref_lock); + old =3D df->kvm; df->kvm =3D kvm; spin_unlock(&df->kvm_ref_lock); + + if (old) + fput(old); } =20 /** * vfio_file_set_kvm - Link a kvm with VFIO drivers - * @file: VFIO group file or VFIO device file - * @kvm: KVM to link + * @vfio_file: VFIO group file or VFIO device file + * @kvm: KVM file to link * * When a VFIO device is first opened the KVM will be available in * device->kvm if one was associated with the file. */ -void vfio_file_set_kvm(struct file *file, struct kvm *kvm) +void vfio_file_set_kvm(struct file *vfio_file, struct file *kvm) { struct vfio_group *group; =20 - group =3D vfio_group_from_file(file); + group =3D vfio_group_from_file(vfio_file); if (group) vfio_group_set_kvm(group, kvm); =20 - if (vfio_device_from_file(file)) - vfio_device_file_set_kvm(file, kvm); + if (vfio_device_from_file(vfio_file)) + vfio_device_file_set_kvm(vfio_file, kvm); } EXPORT_SYMBOL_GPL(vfio_file_set_kvm); =20 diff --git a/include/linux/vfio.h b/include/linux/vfio.h index 45f08986359e..0cc91c6f96d2 100644 --- a/include/linux/vfio.h +++ b/include/linux/vfio.h @@ -54,7 +54,7 @@ struct vfio_device { struct list_head dev_set_list; unsigned int migration_flags; u8 precopy_info_v2; - struct kvm *kvm; + struct file *kvm; =20 /* Members below here are private, not for driver use */ unsigned int index; @@ -66,7 +66,6 @@ struct vfio_device { unsigned int open_count; struct completion comp; struct iommufd_access *iommufd_access; - void (*put_kvm)(struct kvm *kvm); struct inode *inode; #if IS_ENABLED(CONFIG_IOMMUFD) struct iommufd_device *iommufd_device; @@ -378,7 +377,7 @@ static inline bool vfio_file_has_dev(struct file *file,= struct vfio_device *devi #endif bool vfio_file_is_valid(struct file *file); bool vfio_file_enforced_coherent(struct file *file); -void vfio_file_set_kvm(struct file *file, struct kvm *kvm); +void vfio_file_set_kvm(struct file *vfio_file, struct file *kvm); =20 #define VFIO_PIN_PAGES_MAX_ENTRIES (PAGE_SIZE/sizeof(unsigned long)) =20 diff --git a/virt/kvm/vfio.c b/virt/kvm/vfio.c index 6cdc4e9a333a..19548a430942 100644 --- a/virt/kvm/vfio.c +++ b/virt/kvm/vfio.c @@ -35,15 +35,15 @@ struct kvm_vfio { bool noncoherent; }; =20 -static void kvm_vfio_file_set_kvm(struct file *file, struct kvm *kvm) +static void kvm_vfio_file_set_kvm(struct file *vfio_file, struct file *kvm) { - void (*fn)(struct file *file, struct kvm *kvm); + void (*fn)(struct file *vfio_file, struct file *kvm); =20 fn =3D symbol_get(vfio_file_set_kvm); if (!fn) return; =20 - fn(file, kvm); + fn(vfio_file, kvm); =20 symbol_put(vfio_file_set_kvm); } @@ -144,6 +144,7 @@ static int kvm_vfio_file_add(struct kvm_device *dev, un= signed int fd) { struct kvm_vfio *kv =3D dev->private; struct kvm_vfio_file *kvf; + struct file *kvm_file __free(fput) =3D NULL; struct file *filp __free(fput) =3D NULL; =20 filp =3D fget(fd); @@ -154,6 +155,10 @@ static int kvm_vfio_file_add(struct kvm_device *dev, u= nsigned int fd) if (!kvm_vfio_file_is_valid(filp)) return -EINVAL; =20 + kvm_file =3D get_file_active(&dev->kvm->file); + if (!kvm_file) + return -ENOENT; + guard(mutex)(&kv->lock); =20 list_for_each_entry(kvf, &kv->file_list, node) { @@ -168,7 +173,7 @@ static int kvm_vfio_file_add(struct kvm_device *dev, un= signed int fd) kvf->file =3D get_file(filp); list_add_tail(&kvf->node, &kv->file_list); =20 - kvm_vfio_file_set_kvm(kvf->file, dev->kvm); + kvm_vfio_file_set_kvm(kvf->file, kvm_file); kvm_vfio_update_coherency(dev); =20 return 0; --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 321D1515972; Fri, 18 Sep 2026 13:32:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738368; cv=none; b=gBbEopNPwklJugn9J7veq8qNQ0UeXfcezxHXXAo78yDpCnTZVLEpvQP8iIz0pm7WY6pmP/aZxnMhLzKSg1llDvYS8s2S7yNbh9ZufYvjo4T1fgC4iHdShgssQrGtn+inrL+GAETbRzzxkyxBUI9Ku3pXD+UeYalpFY+FLSu4M5M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738368; c=relaxed/simple; bh=F2ax8f7E7S119mESAGQy4tAkYSakdMymgCGBt6gUQUU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QankC5SToDvEyqaz/E6WjaO6n2IAp91q09BNQdmOvMc1QXFF1gSluPRVqJlMaOXwACiuVboXUpQf0YZ6cioiqIlnlMlX+BXqJlFGuLGkxXPEwOGZT2jeBIiG9L4QW/EY0kX+I9VMcLPvJzxT6vzWPE3haqHfHtae8w1EdYi/3Lo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=oHqNUUK7; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="oHqNUUK7" Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA1PqA960700; Fri, 18 Sep 2026 13:31:19 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=3mqGfRoVdfq7E+mHT QJBKISisjVhVOSDyzLzlLFbT8s=; b=oHqNUUK7QtMJohudWNUbZxVKDHJRlu5fw 288+rIASaeOtn28sQrhlMqsqmNQYs5k5syQ5UYCuFlRk2+oI8RUMaUPJYf2CF1HT KrThW66f53oDnLzybVQOv6iDyCfqdLV3bjfdPT1QYvM3ZGzTX29rgBEIDC7JY8bs y1iC5ub7G0YO16LwDO2lCw5pOOIooE1fO8M/SG8zZ4kNgJ7IUMhAC2pjCfK/dT1x O8LX7W1+BSf2pQIFDCwi0ZPz1bRfsgn4MOzt11i1VRWkfkjvAE1CoWl0TWP9Hg4L uIphVLhKUOQN4SVChheEYd5FWmvq0wYiztJnPLHcBpu4QRGnMR5Xg== Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmxf5gb6k-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:18 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDOLxU1684689; Fri, 18 Sep 2026 13:31:17 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gs4tv8bh5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:17 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVAtJ51642848 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:10 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0412C20040; Fri, 18 Sep 2026 13:31:10 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A8A832004B; Fri, 18 Sep 2026 13:31:09 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:09 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 05/29] KVM: Restrict kvm_get_kvm/kvm_put_kvm export to internal KVM modules Date: Fri, 18 Sep 2026 15:30:42 +0200 Message-ID: <20260918133107.1042730-6-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-GUID: IzGp1T9JHTVQGhSGOM8MW0mgylfcyXqI X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX/Ce7xezjbWGc qVkDsiLCaMfAhjqgZ+cHJvVobHmEsQKxt0wSKboXRDAgAmKMhvXeyug1/kVmlJWftHXcll0D7Ft P9Z4ziUSWtPBeTADmfH6Z1hzUc3egOk= X-Authority-Analysis: v=2.4 cv=cvgOAF4i c=1 sm=1 tr=0 ts=6aad3d27 cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=1XWaLZrsAAAA:8 a=VnNF1IyMAAAA:8 a=cWV-k8hB2h86IYwIXi4A:9 X-Proofpoint-ORIG-GUID: 2cK9Jgsw_kboKG4yhhAg5SVvhmho0g-i X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX9/m04V2tjKkt u0p1Ywr4vzs+xtCXCwLsTXBrSimc9Y1jKn/WJjwZB/2bKRp3mkp2plHyZQ1W3tY3s5ub7D9Go9H ozdg0N7BltEBDJaLyUuMoPJaugHRV71DJXj0S/ylryqgi+B0ajOIFIy/6RzyXNEtn8pOP8ukGPx GbZU1kYkjpD3E9gHMzxUpjI7OioFRiiolwAdirWiT2zdHN7IuY2iLOh4fdR+RxAOOOy98PsreTq rTkEXXC7WSGsCYMC4RUq8sCtshZSG0jodu6T+VOsPaNMjjXTl2TdW7eZmGFVB8kyWS7Lv/Iw083 PV+cJDNdbvjv0aveIZbnoP4Z0tp62Bm77PwCbloSB60lRQffrOdTaqnTD12NV8/TX+VmMNf61uR YRXJxYsPCNpQVYUyEJIR1PJTPozDoK5DJpZfSTTOEVLwQPfj+/XfGemwxabGyjOmNdVq87KyhhJ ugNvtwvzD4kJBYryP0Q== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 lowpriorityscore=0 clxscore=1015 priorityscore=1501 suspectscore=0 bulkscore=0 impostorscore=0 phishscore=0 spamscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" Switch kvm_get_kvm, kvm_get_kvm_safe, and kvm_put_kvm from EXPORT_SYMBOL_GPL to EXPORT_SYMBOL_FOR_KVM_INTERNAL. These symbols are now only used within KVM itself. No external module needs them now that VFIO uses file-based reference counting. Remove the corresponding exemptions from the x86 KVM Makefile exports check. Suggested-by: Sean Christopherson Signed-off-by: Steffen Eiden --- arch/x86/kvm/Makefile | 5 +---- virt/kvm/kvm_main.c | 6 +++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile index e6d395ede9e2..c6bf463f5032 100644 --- a/arch/x86/kvm/Makefile +++ b/arch/x86/kvm/Makefile @@ -61,10 +61,7 @@ exports_grep_trailer :=3D --include=3D'*.[ch]' -nrw $(sr= ctree)/virt/kvm $(srctree)/a -e kvm_page_track_unregister_notifier \ -e kvm_write_track_add_gfn \ -e kvm_write_track_remove_gfn \ - -e kvm_file_to_kvm_fn \ - -e kvm_get_kvm \ - -e kvm_get_kvm_safe \ - -e kvm_put_kvm + -e kvm_file_to_kvm_fn =20 # Force grep to emit a goofy group separator that can in turn be replaced = with # the above newline macro (newlines in Make are a nightmare). Note, grep = only diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index bab71d398236..891a67cb365a 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1314,7 +1314,7 @@ void kvm_get_kvm(struct kvm *kvm) { refcount_inc(&kvm->users_count); } -EXPORT_SYMBOL_GPL(kvm_get_kvm); +EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_get_kvm); =20 /* * Make sure the vm is not during destruction, which is a safe version of @@ -1324,14 +1324,14 @@ bool kvm_get_kvm_safe(struct kvm *kvm) { return refcount_inc_not_zero(&kvm->users_count); } -EXPORT_SYMBOL_GPL(kvm_get_kvm_safe); +EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_get_kvm_safe); =20 void kvm_put_kvm(struct kvm *kvm) { if (refcount_dec_and_test(&kvm->users_count)) kvm_destroy_vm(kvm); } -EXPORT_SYMBOL_GPL(kvm_put_kvm); +EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_put_kvm); =20 /* * Used to put a reference that was taken on behalf of an object associated --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D455A4FC33B; Fri, 18 Sep 2026 13:33:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738386; cv=none; b=NC0DUqv3GxPvhne73881XXi2LTrxjBjwLlTc5AkX2nwmw7vDtGXC99vqSt0fCXeXvyvLIubVJcGIhClgCxCNiysTNX+YX6zLIKlhDCwFVoO4InAB1YTo7mi+2kP0R364Li8lU3acVrKDZNtLYtJhK1F1QIjSo92HfzVFRCgPITo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738386; c=relaxed/simple; bh=RyxxTMht2B5B102zC167boZIZ7l/cT+ihBRApFMGiCA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Oji6Ek7Apyc8ko3F5sjmrIsZl+dXKxAn2xluuVjN/RIlQs1C5SmZJBOYlCdUiyfDhINT3qSqZUm8hrviEVMamRtE2WaCtXjfhyTCu+i9NP5beNn4VZkDXE8treGhkj9aujo86pifEVB772PqdA46c41gYsmskpK8Idnr5K07JmU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=VGA5hyml; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="VGA5hyml" Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA1aql803423; Fri, 18 Sep 2026 13:31:19 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=ultWEJhp6ZIJJNlF9 2dkS5UfNARIdvGV4toPmQvSUaE=; b=VGA5hymlz2YlxdTIlYmAndnysWU1Y1bKi uzUB1HyJxNDeCQ1tFv5VmwK26WtQrb7EH1JNAue6LKj/iTpSaGWDYlSPkOhW5x9q qXvEu0FsY8/E0YJPqUef80iwRXfVtd9YD+LWna2kY/tn9p60V7WLOWz1JBedRZOl 7MO8h/5XgoXUDAsYMZ3fDVYPlh1IkXZRGTt2iLKyp8h2/GhALdIc8PtaV0mjxjWf ynRrE1d0cjb7TOYKZKEl1jPYAdSjOvfJcQ46gT99UOtjQobvXtEEDOo6dicvKFki vlR0EKIU71VLK8aMtCfR1CT2pc2KjQHgMJ+W84E4FlIp2LZPSfJ9w== Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmv5j813p-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:18 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDNqsf722670; Fri, 18 Sep 2026 13:31:17 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gr5fjqgvm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:17 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVAgS51642852 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:10 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 588D920040; Fri, 18 Sep 2026 13:31:10 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0A3B02004D; Fri, 18 Sep 2026 13:31:10 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:09 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 06/29] KVM: Move export symbol check macros to Makefile.kvm Date: Fri, 18 Sep 2026 15:30:43 +0200 Message-ID: <20260918133107.1042730-7-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX4ECV8w/7ItR+ 5Qv/vl2FdwTOaswJMK+Jy5EOVXfioy81ZhsW5RJTIEgkLCX3zoKk31bMjLJ7kVj7/ecyYuU4q71 iwhi3Xxsv+bTPXsKImSofiJGwY7cfNpYPVMm2hblWB9xdo4wSM6TdQAZa6lakMoug1EA2AvdDTQ z+ofNsphWTo+pWGQbgtQY8waxW0wTeiD//sVOvYJuVjivIqKPS/QfWnTv08jcTnEbLj4vSyr5nI pk0VmyhYV2DZVYsaoRP9aztNZMdyERSSMelaAaeH2AauSYnobNxlnU9FxqB8jG3vJ8QUF7JI68O v99MCR7IZp1F3tngJgUX1wAWHXdoptY2Newv4QBwUnC18jLxpIcQdGS9dusTGGCIKiwV1RE/T0q 0a7ZHA5YF7eD2wO2lyqaHWI/LDqcn8srCQdGcSaIs7oPA6Vm6/p2vS6lriM9ITMccmTpUgc0mVC PiHc1TOSfj+QWaNvTgw== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX5W2Vxqiy8jJs 0BZFP2ztqyaKCBQxsuJ1S2BbC0tYFV32WmoPUbzBtsTcta2n8Al/LJDCOq2++HQo1a2z0ZzOa2N R7jtVJEMmXG7EOcHnkbTf4rOTbkQk9w= X-Authority-Analysis: v=2.4 cv=Zsx4uN7G c=1 sm=1 tr=0 ts=6aad3d26 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VnNF1IyMAAAA:8 a=xeFIZLMA4NwSUji8HBwA:9 X-Proofpoint-ORIG-GUID: JiX0ns0nG5pKmZYWp0e1gsi3vLiY40wB X-Proofpoint-GUID: L9ZS1jqqmo0O9XiSGMaRkjSrgjZgmqyC X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 impostorscore=0 clxscore=1015 priorityscore=1501 lowpriorityscore=0 bulkscore=0 adultscore=0 phishscore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" The EXPORT_SYMBOL_GPL/EXPORT_SYMBOL enforcement logic in arch/x86/kvm/Makefile is useful for any KVM architecture wanting to restrict the exported symbols. Move the check macros to virt/kvm/Makefile.kvm so they can be shared. Arch Makefiles only need to set kvm_exports_allowed to a space-separated list of symbols that are permitted and then call kvm_check_exports for each symbol type they want to enforce. No functional change. Signed-off-by: Steffen Eiden --- arch/x86/kvm/Makefile | 49 +++++++++---------------------------------- virt/kvm/Makefile.kvm | 33 +++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 39 deletions(-) diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile index c6bf463f5032..1bfd630c0767 100644 --- a/arch/x86/kvm/Makefile +++ b/arch/x86/kvm/Makefile @@ -54,43 +54,14 @@ clean-files +=3D kvm-asm-offsets.h # Only a handful of exports intended for other modules (VFIO, KVMGT) should # use EXPORT_SYMBOL_GPL, and EXPORT_SYMBOL should never be used. ifdef CONFIG_KVM_X86 -# Search recursively for whole words and print line numbers. Filter out t= he -# allowed set of exports, i.e. those that are intended for external usage. -exports_grep_trailer :=3D --include=3D'*.[ch]' -nrw $(srctree)/virt/kvm $(= srctree)/arch/x86/kvm | \ - grep -v -e kvm_page_track_register_notifier \ - -e kvm_page_track_unregister_notifier \ - -e kvm_write_track_add_gfn \ - -e kvm_write_track_remove_gfn \ - -e kvm_file_to_kvm_fn - -# Force grep to emit a goofy group separator that can in turn be replaced = with -# the above newline macro (newlines in Make are a nightmare). Note, grep = only -# prints the group separator when N lines of context are requested via -C, -# a.k.a. --NUM. Simply request zero lines. Print the separator only after -# filtering out expected exports to avoid extra newlines in the error mess= age. -define get_kvm_exports -$(shell grep "$(1)" -C0 $(exports_grep_trailer) | grep "$(1)" -C0 --group-= separator=3D"!SEP!") -endef - -define check_kvm_exports -nr_kvm_exports :=3D $(shell grep "$(1)" $(exports_grep_trailer) | wc -l) - -ifneq (0,$$(nr_kvm_exports)) -$$(error ERROR ***\ -$$(newline)found $$(nr_kvm_exports) unwanted occurrences of $(1):\ -$$(newline) $(subst !SEP!,$$(newline) ,$(call get_kvm_exports,$(1)))\ -$$(newline)in directories:\ -$$(newline) $(srctree)/arch/x86/kvm\ -$$(newline) $(srctree)/virt/kvm\ -$$(newline)Use EXPORT_SYMBOL_FOR_KVM_INTERNAL, not $(1)) -endif # nr_kvm_exports !=3D 0 -undefine nr_kvm_exports -endef # check_kvm_exports - -$(eval $(call check_kvm_exports,EXPORT_SYMBOL_GPL)) -$(eval $(call check_kvm_exports,EXPORT_SYMBOL)) - -undefine check_kvm_exports -undefine get_kvm_exports -undefine exports_grep_trailer +kvm_exports_allowed :=3D kvm_page_track_register_notifier \ + kvm_page_track_unregister_notifier \ + kvm_write_track_add_gfn \ + kvm_write_track_remove_gfn \ + kvm_file_to_kvm_fn + +$(eval $(call kvm_check_exports,EXPORT_SYMBOL_GPL)) +$(eval $(call kvm_check_exports,EXPORT_SYMBOL)) + +undefine kvm_exports_allowed endif # CONFIG_KVM_X86 diff --git a/virt/kvm/Makefile.kvm b/virt/kvm/Makefile.kvm index d047d4cf58c9..dd40544b8ecb 100644 --- a/virt/kvm/Makefile.kvm +++ b/virt/kvm/Makefile.kvm @@ -13,3 +13,36 @@ kvm-$(CONFIG_HAVE_KVM_IRQ_ROUTING) +=3D $(KVM)/irqchip.o kvm-$(CONFIG_HAVE_KVM_DIRTY_RING) +=3D $(KVM)/dirty_ring.o kvm-$(CONFIG_HAVE_KVM_PFNCACHE) +=3D $(KVM)/pfncache.o kvm-$(CONFIG_KVM_GUEST_MEMFD) +=3D $(KVM)/guest_memfd.o + +# Force grep to emit a goofy group separator that can in turn be replaced = with +# the above newline macro (newlines in Make are a nightmare). Note, grep = only +# prints the group separator when N lines of context are requested via -C, +# a.k.a. --NUM. Simply request zero lines. Print the separator only after +# filtering out expected exports to avoid extra newlines in the error mess= age. +define __kvm_get_exports +$(shell grep "$(1)" -C0 --include=3D'*.[ch]' -nrw \ + $(srctree)/virt/kvm $(srctree)/arch/$(SRCARCH)/kvm \ + $(addprefix | grep -v -e ,$(kvm_exports_allowed)) \ + | grep "$(1)" -C0 --group-separator=3D"!SEP!") +endef + + +KVM_CHECK_EXPORT_DIRS ?=3D $(srctree)/virt/kvm $(srctree)/arch/$(ARCH)/kvm + +# Fail the build if any unwanted $(1) usage is found outside kvm_exports_a= llowed. +define kvm_check_exports +kvm_nr_exports :=3D $(shell grep "$(1)" --include=3D'*.[ch]' -nrw \ + $(KVM_CHECK_EXPORT_DIRS) \ + $(addprefix | grep -v -e ,$(kvm_exports_allowed)) | wc -l) + +ifneq (0,$$(kvm_nr_exports)) +$$(error ERROR ***\ +$$(newline)found $$(kvm_nr_exports) unwanted occurrences of $(1):\ +$$(newline) $(subst !SEP!,$$(newline) ,$(call __kvm_get_exports,$(1)))\ +$$(newline)in directories:\ +$$(newline) $(KVM_CHECK_EXPORT_DIRS)\ +$$(newline)If this is a valid exception add it to kvm_exports_allowed or\ +$$(newline)use EXPORT_SYMBOL_FOR_KVM_INTERNAL, not $(1)) +endif # kvm_nr_exports !=3D 0 +undefine kvm_nr_exports +endef # kvm_check_exports --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0883D50B43A; Fri, 18 Sep 2026 13:32:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738339; cv=none; b=um9Jq2YcXL1rn8Qxj9u3/KOI8QASNzLoJFw+vYa++jvRmHOAyncQbr6EjlcdwTOa95oZIih/gJ2jpl6OvpTcliX2RPfhegI9vnIFsxDLIrJv1qMBffJk00uLWn/m0F9Dch9I6l8eS/nDeP7y1Fdb34OxqAYVQWcCxmchPdglgyI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738339; c=relaxed/simple; bh=dYxjLos6G/KI+tj567RHX7o++67S2fvKAruv7U/jBhI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YCSem4whw/hXL87PFFHHKlM+X6UtDS7IbDreqLpNs8IyjwSGBuD0tFoz6q+CSShiaeL/QZP91J1eCleWQNpAK1Uueki00T/+cpmoty9lAX8lamSzI61wCP+myG4rLGzlnUkrFTEwrLB4TthBeAVXTne6P9VoRL64O+yUzTZBWeE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=D6+8wN4v; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="D6+8wN4v" Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA1Utn3274380; Fri, 18 Sep 2026 13:31:20 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=66NICZkpa47NvpHYn IVSUpRZllbnikkprLG0oLOMVPo=; b=D6+8wN4vxi9HrM/bWhCTlMz5VVZElLPoM O4XvzCrIz9QQmpHS+tqcrdi6LDJVAX7h2CysiZJ+9yzvJ2upi2BU7lSq/QYCxq3I jyHdoaSlPPoFSK39iR3q7eCjDo/vsOnnZMO3s5w3v339IFXKWWVs4sbrmgyyRERb Fyz0C/Rbs8Cb554/SxIGQe6vlqlJn1FxmsQCq6gpAhdzBqpzgUJ/ovbs4SnTIdJU MYNzCNTxzoR+AoGQAjlIZ1hEDGCsa0t60an2TTCbJ+nUQNi3fwD7L/SU0XnNbjja gvZ/yorNKNg85AWfHM5CabhkYuyrG4zusmPxa4Evqan8bA5YxlgfA== Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmxdqra2d-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:19 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDO1fV722844; Fri, 18 Sep 2026 13:31:18 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gr5fjqgvk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:17 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVAXt51642854 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:10 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AD4CE20040; Fri, 18 Sep 2026 13:31:10 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5ECF320049; Fri, 18 Sep 2026 13:31:10 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:10 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 07/29] KVM: Make device name configurable Date: Fri, 18 Sep 2026 15:30:44 +0200 Message-ID: <20260918133107.1042730-8-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE5MiBTYWx0ZWRfX6PFHKHixtLOW x5tY9MowY7VnfJT3WZrK6fAPYr5okJiVO0YYQSEaqW+BLXDkfGkDvmC9H0N93v5CNQwQC5wWho8 mbvwLeMeUUTg5fzEYrd/vZRPHuRIiX84vidrWeT95x0CYGqmU9xDN7sSqZWREiwhgQoUaIRqMrJ 8nvksHH9CrPJotrP5fgYX6QSE6JW8l4NmewW4Xj8DW2hLid4cxTvf77m/IZN6A1ayumQGSle1D7 mLiyUwesEwzGA52LoMXsNRlQkLt5DLbUwHl61WtwJbDtofTuDlo6nSFAFnLYNbpiqj9kv90CKZ1 eEHqHz5IzeeR8ZY1m+NzMRsHxuYSgokUMsCcYvwqsweXlXYLhP8mfmVVdyWkqTujalpsqSH34C0 bzMLS+ROP50iVVpWMtMfLh3S/zmnAxN1kV1rkFmTsbOSTx4mLgo5JCXKeqA6KoYrVM90qal5uXM Wnyyu7J/OtRfpNaS9Sg== X-Proofpoint-GUID: RgsPdhZ0RH5nmL3PNSwi9xljPgTIobIF X-Authority-Analysis: v=2.4 cv=DobDa2/+ c=1 sm=1 tr=0 ts=6aad3d27 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=1XWaLZrsAAAA:8 a=VnNF1IyMAAAA:8 a=0LJ3BSutFHZo8nszAoUA:9 X-Proofpoint-ORIG-GUID: DM1GbzmWFPq4hzPjCb4MgZ9lsqohNb1_ X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE5MiBTYWx0ZWRfX9MCrXhz5L7VZ zyrTHGHU4YuwLnBR6YO+zB7TDsX+fcAWgmA7HNIYUZFFwntw4iRz0EmBDjnDpOW8puRnFj9g3KZ 5a6OkGmRKkZvXoG7n0FGUMD/iaAe0TY= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 malwarescore=0 priorityscore=1501 suspectscore=0 impostorscore=0 spamscore=0 clxscore=1015 adultscore=0 bulkscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180192 Content-Type: text/plain; charset="utf-8" Allow KVM implementations to choose alternative device names. This is especially useful for architectures providing multiple KVM implementations simultaneously. Architectures providing multiple KVM implementations must compile the KVM common code once per implementation and mange symbols. Suggested-by: Sean Christopherson Signed-off-by: Steffen Eiden --- arch/s390/kvm/gmap/trace_gmap.h | 4 +++- arch/s390/kvm/s390/Makefile | 2 +- include/linux/kvm_host.h | 3 +++ include/trace/events/kvm.h | 8 +++++++- virt/kvm/Makefile.kvm | 5 +++++ virt/kvm/kvm_main.c | 10 +++++----- 6 files changed, 24 insertions(+), 8 deletions(-) diff --git a/arch/s390/kvm/gmap/trace_gmap.h b/arch/s390/kvm/gmap/trace_gma= p.h index 15ec88bdce55..78d26dae59f9 100644 --- a/arch/s390/kvm/gmap/trace_gmap.h +++ b/arch/s390/kvm/gmap/trace_gmap.h @@ -4,8 +4,10 @@ =20 #include =20 +#undef UNPACK_KVM +#define UNPACK_KVM(name) name #undef TRACE_SYSTEM -#define TRACE_SYSTEM kvm +#define TRACE_SYSTEM UNPACK_KVM(KVM_DEV_NAME) #undef TRACE_INCLUDE_PATH #define TRACE_INCLUDE_PATH ../gmap #undef TRACE_INCLUDE_FILE diff --git a/arch/s390/kvm/s390/Makefile b/arch/s390/kvm/s390/Makefile index 762a63826423..b91334db90a2 100644 --- a/arch/s390/kvm/s390/Makefile +++ b/arch/s390/kvm/s390/Makefile @@ -4,7 +4,7 @@ KVM :=3D ../../../../virt/kvm include $(srctree)/virt/kvm/Makefile.kvm include $(srctree)/arch/s390/kvm/gmap/Makefile =20 -ccflags-y :=3D -I$(src) -I$(srctree)/arch/s390/kvm/gmap +ccflags-y +=3D -I$(src) -I$(srctree)/arch/s390/kvm/gmap =20 kvm-y +=3D s390.o intercept.o interrupt.o priv.o sigp.o kvm-y +=3D diag.o gaccess.o guestdbg.o vsie.o pv.o diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 2b56fb4e8555..5926478563e8 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -45,6 +45,9 @@ #include #include =20 +#define __KVM_DEV_STRING(name, x) __stringify(name ## _ ## x) +#define KVM_DEV_STRING(x) __KVM_DEV_STRING(KVM_DEV_NAME, x) + #ifndef KVM_MAX_VCPU_IDS #define KVM_MAX_VCPU_IDS KVM_MAX_VCPUS #endif diff --git a/include/trace/events/kvm.h b/include/trace/events/kvm.h index b282e3a86769..f37582730ffc 100644 --- a/include/trace/events/kvm.h +++ b/include/trace/events/kvm.h @@ -4,8 +4,14 @@ =20 #include =20 +#undef UNPACK_KVM +#define UNPACK_KVM(name) name #undef TRACE_SYSTEM -#define TRACE_SYSTEM kvm +#define TRACE_SYSTEM UNPACK_KVM(KVM_DEV_NAME) +#undef TRACE_SYSTEM_VAR +#define TRACE_SYSTEM_VAR kvm +#undef TRACE_INCLUDE_FILE +#define TRACE_INCLUDE_FILE kvm =20 #define ERSN(x) { KVM_EXIT_##x, "KVM_EXIT_" #x } =20 diff --git a/virt/kvm/Makefile.kvm b/virt/kvm/Makefile.kvm index dd40544b8ecb..ee66d460c494 100644 --- a/virt/kvm/Makefile.kvm +++ b/virt/kvm/Makefile.kvm @@ -5,6 +5,11 @@ =20 KVM ?=3D ../../../virt/kvm =20 +KVM_DEV_NAME ?=3D kvm +KVM_DEV_MINOR ?=3D KVM_MINOR + +ccflags-y +=3D-DKVM_DEV_NAME=3D$(KVM_DEV_NAME) -DKVM_DEV_MINOR=3D$(KVM_DEV= _MINOR) + kvm-y :=3D $(KVM)/kvm_main.o $(KVM)/eventfd.o $(KVM)/binary_stats.o kvm-$(CONFIG_KVM_VFIO) +=3D $(KVM)/vfio.o kvm-$(CONFIG_KVM_MMIO) +=3D $(KVM)/coalesced_mmio.o diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 891a67cb365a..4f25e170b542 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -5596,8 +5596,8 @@ static struct file_operations kvm_chardev_ops =3D { }; =20 static struct miscdevice kvm_dev =3D { - KVM_MINOR, - "kvm", + KVM_DEV_MINOR, + __stringify(KVM_DEV_NAME), &kvm_chardev_ops, }; =20 @@ -6376,7 +6376,7 @@ static void kvm_init_debug(void) const struct kvm_stats_desc *pdesc; int i; =20 - kvm_debugfs_dir =3D debugfs_create_dir("kvm", NULL); + kvm_debugfs_dir =3D debugfs_create_dir(__stringify(KVM_DEV_NAME), NULL); =20 for (i =3D 0; i < kvm_vm_stats_header.num_desc; ++i) { pdesc =3D &kvm_vm_stats_desc[i]; @@ -6521,7 +6521,7 @@ int kvm_init(unsigned vcpu_size, unsigned vcpu_align,= struct module *module) if (!vcpu_align) vcpu_align =3D __alignof__(struct kvm_vcpu); kvm_vcpu_cache =3D - kmem_cache_create_usercopy("kvm_vcpu", vcpu_size, vcpu_align, + kmem_cache_create_usercopy(KVM_DEV_STRING(vcpu), vcpu_size, vcpu_align, SLAB_ACCOUNT, offsetof(struct kvm_vcpu, arch), offsetofend(struct kvm_vcpu, stats_id) @@ -6574,7 +6574,7 @@ int kvm_init(unsigned vcpu_size, unsigned vcpu_align,= struct module *module) */ r =3D misc_register(&kvm_dev); if (r) { - pr_err("kvm: misc device register failed\n"); + pr_err(__stringify(KVM_DEV_NAME) ": misc device register failed\n"); goto err_register; } =20 --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AAF734F93C3; Fri, 18 Sep 2026 13:32:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738359; cv=none; b=qIiJrFjWvssV4s8njrrFZO2Z1cjVbQMRzIT4r0VLcgBhQ/28MHD9/oq3eXfCp/BATPwjlNdTMDhINlPwvCbpOoib2z7CZI1lYfyUDOme6ho3Qijq5j7msmRsY/7E48MjtvcZPqeKbg2wZ/CSO0SGpFMLu7tJxxD8+UbX32+WFYE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738359; c=relaxed/simple; bh=6EgD8i3CE3AtETIenE0D3zpVwvhqFf6EDMOChlJQZc8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MgwR/PtH3O7+ZdohEd2wEyy5tnfdOOnzN+eUtJaXp/rRvbO2VE9xPp9M2hZLu2DzXKVqjQ6PLMe20av6sl6+/gJ2PCwoGJmuekCd6ID8B3KBrmsZZ392n6kb32eiQDVzMjHmauWFpTjW14YJjJR0h/xbfYZP0po1YoxZUyiDxxw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=pTtu5a+E; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="pTtu5a+E" Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA1WPA3979066; Fri, 18 Sep 2026 13:31:22 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=pbtqYrAN3W2LzyED5 w10DT4NqSRcgG+1DLfffCPvG38=; b=pTtu5a+EuRUpHunQ0MQiOpzM4O9igk22g GD8ZcBvXI0ks5VuFa0jjaAqYRDuzbhhnq40KMTQuBZmLfeXtQlUZClD1EE9q31V2 +VKWFjzgqsJvQnfC69bdbeiDqS7rMs14BOcHLxys4B31JkrQmFX+9NsQFHUpT1BX oUZRusofjSpnv+F6/VhALZdlT3DtDHKu64o6ngXw0Qi/adcIcmWpVC4mx79bqUdJ faYhbIOpQffpfFz5ApSjx1oVtEhn7htuOUw/vlIzPFYffGwT63/G7uXd/nMcoepa 9A6rFRZnAJWNwH1qKC5qjz1bxgrguxbRXpoOhPb1z1fNTG2SBfBLw== Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmw5eftsh-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:21 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDO9In771962; Fri, 18 Sep 2026 13:31:20 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gr5fffhcb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:20 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay07.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVBG746072142 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:11 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 15EC020040; Fri, 18 Sep 2026 13:31:11 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B3AE92004B; Fri, 18 Sep 2026 13:31:10 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:10 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 08/29] KVM: Move architecture capability Kconfigs to header defines Date: Fri, 18 Sep 2026 15:30:45 +0200 Message-ID: <20260918133107.1042730-9-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX+L0b5IMlrCHL g51jzBPnMW/yQz5uHgeO1+bxpBneAhZ22CkbDl7QL2HBo4n6BVOhjXksaJ6yB3RddRrRoJMbDA3 QnzeWFGqx0AuFMq4Y7KT9AzDz0SyZ3nTRfOrmzX/aAeYIKJ2k9yYED98dFvKoS6kLZc6SQuc7Og +14AvvEXMEcwNy8hxdmWJ+VVWKmLE4JC05mocjyw4wQfTewxHd5HXPyUdiBKYqJHd2gwIG6WWEO r9Xb/BrHpyryeRI51+Cyp5R4240doqt7F+L2f0ob53YDzNW8hZsl56XrGZbnFBuvWRUSJnhiVV6 SoNEAp6+rSAV/9hW/OgY3W1n+o64ofETlPQF7La/0hSZQ0MZf44fDoCNpZy9aql1lircOtkE1Qi dHBRlKEpfM/ztL8R32GRugRgsMbrW6l2tT3SegQrx5efTXVTb2PIKi0oY3aS1tK2xCe2qaNYp/K V/2BnwAIiNCkh2ORQXg== X-Authority-Analysis: v=2.4 cv=E/NYNqdl c=1 sm=1 tr=0 ts=6aad3d2a cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VnNF1IyMAAAA:8 a=Zed0xjmiq0EMZ3KVzcgA:9 a=4VlVeAog_cEay8Ou:21 X-Proofpoint-ORIG-GUID: 6xrBa-2ANJ8qif2L6cstpVccskYDFVO6 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX4suYAxM5NcwU uTxx1zkNizqWCqthQqjTA+VDvGIFbJk5FjC1rzqbVLlWjtxwSxnBdQ94+Ns6w7HtDIkc7EsceUe VIyU5ZZCO5mSZwY6jlgRQhXErsEom/M= X-Proofpoint-GUID: HQOMIqY6q82Dfi2VG72T0w3t9R0HebQM X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 priorityscore=1501 spamscore=0 adultscore=0 clxscore=1015 bulkscore=0 malwarescore=0 suspectscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" Historically, KVM feature opt-ins and callbacks (e.g. read-only memory, MSI routing, generic pre-fault memory, lockless aging, halt-polling controls, and vcpu run PID changes) were configured globally via Kconfig symbols (CONFIG_HAVE_KVM_* and CONFIG_KVM_*). With s390 hosting multiple independent KVM implementations within the same kernel build (native s390 KVM and arm64 on s390), global Kconfig selections force both implementations to inherit options that only apply to one of them. For instance, selecting KVM_GENERIC_PRE_FAULT_MEMORY for native s390 would force arm64 on s390 to provide unused dummy stubs. Replace these global Kconfig options with architecture-specific opt-in defines in and standardize their naming by dropping the HAVE_ prefix: - KVM_GENERIC_PRE_FAULT_MEMORY - KVM_INVALID_WAKEUPS - KVM_MSI (formerly HAVE_KVM_MSI) - KVM_NO_POLL (formerly HAVE_KVM_NO_POLL) - KVM_READONLY_MEM (formerly HAVE_KVM_READONLY_MEM) - KVM_VCPU_RUN_PID_CHANGE (formerly HAVE_KVM_VCPU_RUN_PID_CHANGE) This allows each architecture and guest implementation to configure its supported capabilities independently in its kvm_host header and eliminates unnecessary fallback stubs across different KVM targets. Signed-off-by: Steffen Eiden --- arch/arm64/include/asm/kvm_host.h | 3 +++ arch/arm64/kvm/Kconfig | 3 --- arch/loongarch/include/asm/kvm_host.h | 2 ++ arch/loongarch/kvm/Kconfig | 2 -- arch/mips/include/asm/kvm_host.h | 1 + arch/mips/kvm/Kconfig | 1 - arch/powerpc/include/asm/kvm_host.h | 3 +++ arch/powerpc/kvm/Kconfig | 1 - arch/riscv/include/asm/kvm_host.h | 2 ++ arch/riscv/kvm/Kconfig | 2 -- arch/s390/include/asm/kvm_host_s390.h | 4 ++++ arch/s390/kvm/Kconfig | 3 --- arch/x86/include/asm/kvm_host.h | 4 ++++ arch/x86/kvm/Kconfig | 4 ---- include/linux/kvm_host.h | 20 ++++++++++++-------- virt/kvm/Kconfig | 20 +------------------- virt/kvm/kvm_main.c | 8 ++++---- 17 files changed, 36 insertions(+), 47 deletions(-) diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm= _host.h index 27fe0cd5b2d7..9c314d0568b1 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -30,6 +30,9 @@ #include =20 #define __KVM_HAVE_ARCH_INTC_INITIALIZED +#define KVM_MSI +#define KVM_READONLY_MEM +#define KVM_VCPU_RUN_PID_CHANGE =20 #define KVM_HALT_POLL_NS_DEFAULT 500000 =20 diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig index 449154f9a485..7329124deb2f 100644 --- a/arch/arm64/kvm/Kconfig +++ b/arch/arm64/kvm/Kconfig @@ -28,12 +28,9 @@ menuconfig KVM select KVM_VFIO select HAVE_KVM_DIRTY_RING_ACQ_REL select NEED_KVM_DIRTY_RING_WITH_BITMAP - select HAVE_KVM_MSI select HAVE_KVM_IRQCHIP select HAVE_KVM_IRQ_ROUTING select HAVE_KVM_IRQ_BYPASS - select HAVE_KVM_READONLY_MEM - select HAVE_KVM_VCPU_RUN_PID_CHANGE select SCHED_INFO select GUEST_PERF_EVENTS if PERF_EVENTS select KVM_GUEST_MEMFD diff --git a/arch/loongarch/include/asm/kvm_host.h b/arch/loongarch/include= /asm/kvm_host.h index 65d91c3ce313..4cb370a8d09b 100644 --- a/arch/loongarch/include/asm/kvm_host.h +++ b/arch/loongarch/include/asm/kvm_host.h @@ -26,6 +26,8 @@ #include =20 #define __KVM_HAVE_ARCH_INTC_INITIALIZED +#define KVM_MSI +#define KVM_READONLY_MEM =20 /* Loongarch KVM register ids */ #define KVM_GET_IOC_CSR_IDX(id) ((id & KVM_CSR_IDX_MASK) >> LOONGARCH_REG= _SHIFT) diff --git a/arch/loongarch/kvm/Kconfig b/arch/loongarch/kvm/Kconfig index 15da2d88c0c1..a427429a2b05 100644 --- a/arch/loongarch/kvm/Kconfig +++ b/arch/loongarch/kvm/Kconfig @@ -23,8 +23,6 @@ config KVM select HAVE_KVM_DIRTY_RING_ACQ_REL select HAVE_KVM_IRQ_ROUTING select HAVE_KVM_IRQCHIP - select HAVE_KVM_MSI - select HAVE_KVM_READONLY_MEM select KVM_COMMON select KVM_GENERIC_DIRTYLOG_READ_PROTECT select KVM_GENERIC_HARDWARE_ENABLING diff --git a/arch/mips/include/asm/kvm_host.h b/arch/mips/include/asm/kvm_h= ost.h index c14b10821817..8e484bb482ba 100644 --- a/arch/mips/include/asm/kvm_host.h +++ b/arch/mips/include/asm/kvm_host.h @@ -893,5 +893,6 @@ static inline void kvm_arch_vcpu_blocking(struct kvm_vc= pu *vcpu) {} static inline void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu) {} =20 #define __KVM_HAVE_ARCH_FLUSH_REMOTE_TLBS +#define KVM_READONLY_MEM =20 #endif /* __MIPS_KVM_HOST_H__ */ diff --git a/arch/mips/kvm/Kconfig b/arch/mips/kvm/Kconfig index b1b9a1d67758..c24b872afbcb 100644 --- a/arch/mips/kvm/Kconfig +++ b/arch/mips/kvm/Kconfig @@ -24,7 +24,6 @@ config KVM select KVM_GENERIC_DIRTYLOG_READ_PROTECT select KVM_MMIO select KVM_GENERIC_HARDWARE_ENABLING - select HAVE_KVM_READONLY_MEM help Support for hosting Guest kernels. =20 diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm= /kvm_host.h index 2d139c807577..ad7c34e9b227 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h @@ -49,6 +49,9 @@ #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */ =20 #define __KVM_HAVE_ARCH_INTC_INITIALIZED +#ifdef CONFIG_KVM_MPIC +#define KVM_MSI +#endif =20 #define KVM_HALT_POLL_NS_DEFAULT 10000 /* 10 us */ =20 diff --git a/arch/powerpc/kvm/Kconfig b/arch/powerpc/kvm/Kconfig index b6bc2fc86dca..1fae2de8fa68 100644 --- a/arch/powerpc/kvm/Kconfig +++ b/arch/powerpc/kvm/Kconfig @@ -232,7 +232,6 @@ config KVM_MPIC depends on KVM && PPC_E500 select HAVE_KVM_IRQCHIP select HAVE_KVM_IRQ_ROUTING - select HAVE_KVM_MSI help Enable support for emulating MPIC devices inside the host kernel, rather than relying on userspace to emulate. diff --git a/arch/riscv/include/asm/kvm_host.h b/arch/riscv/include/asm/kvm= _host.h index a30600579231..23b5560e97ba 100644 --- a/arch/riscv/include/asm/kvm_host.h +++ b/arch/riscv/include/asm/kvm_host.h @@ -47,6 +47,8 @@ #define KVM_REQ_STEAL_UPDATE KVM_ARCH_REQ(6) =20 #define __KVM_HAVE_ARCH_FLUSH_REMOTE_TLBS_RANGE +#define KVM_MSI +#define KVM_READONLY_MEM =20 #define KVM_HAVE_MMU_RWLOCK =20 diff --git a/arch/riscv/kvm/Kconfig b/arch/riscv/kvm/Kconfig index ec2cee0a39e0..3cb4f8037300 100644 --- a/arch/riscv/kvm/Kconfig +++ b/arch/riscv/kvm/Kconfig @@ -22,8 +22,6 @@ config KVM depends on RISCV_SBI && MMU select HAVE_KVM_IRQCHIP select HAVE_KVM_IRQ_ROUTING - select HAVE_KVM_MSI - select HAVE_KVM_READONLY_MEM select HAVE_KVM_DIRTY_RING_ACQ_REL select KVM_COMMON select KVM_GENERIC_DIRTYLOG_READ_PROTECT diff --git a/arch/s390/include/asm/kvm_host_s390.h b/arch/s390/include/asm/= kvm_host_s390.h index 8a7eed5847e1..5fd7f49d7c0d 100644 --- a/arch/s390/include/asm/kvm_host_s390.h +++ b/arch/s390/include/asm/kvm_host_s390.h @@ -34,6 +34,10 @@ =20 #define KVM_INTERNAL_MEM_SLOTS 1 =20 +#define KVM_GENERIC_PRE_FAULT_MEMORY +#define KVM_INVALID_WAKEUPS +#define KVM_NO_POLL + #define KVM_S390_MANAGES_S390_GUEST 1 =20 /* diff --git a/arch/s390/kvm/Kconfig b/arch/s390/kvm/Kconfig index 8d3ee17a1bcb..a6ff2e5aa19b 100644 --- a/arch/s390/kvm/Kconfig +++ b/arch/s390/kvm/Kconfig @@ -25,12 +25,9 @@ config KVM select KVM_COMMON select HAVE_KVM_IRQCHIP select HAVE_KVM_IRQ_ROUTING - select HAVE_KVM_INVALID_WAKEUPS - select HAVE_KVM_NO_POLL select KVM_VFIO select VIRT_XFER_TO_GUEST_WORK select KVM_MMU_LOCKLESS_AGING - select KVM_GENERIC_PRE_FAULT_MEMORY help Support hosting paravirtualized guest machines using the SIE virtualization capability on the mainframe. This should work diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index e460073ff176..cfe22832a4df 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -47,6 +47,10 @@ #define kvm_file_to_kvm_arch x86 =20 #define __KVM_HAVE_ARCH_VCPU_DEBUGFS +#define KVM_GENERIC_PRE_FAULT_MEMORY +#define KVM_MSI +#define KVM_NO_POLL +#define KVM_READONLY_MEM =20 /* * CONFIG_KVM_MAX_NR_VCPUS is defined iff CONFIG_KVM!=3Dn, provide a dummy= max if diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index 538ed1e80332..fa20f64d6a2f 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -28,7 +28,6 @@ config KVM_X86 select HAVE_KVM_DIRTY_RING_ACQ_REL select HAVE_KVM_IRQ_BYPASS select HAVE_KVM_IRQ_ROUTING - select HAVE_KVM_READONLY_MEM select VHOST_TASK select KVM_ASYNC_PF select USER_RETURN_NOTIFIER @@ -37,15 +36,12 @@ config KVM_X86 select PERF_EVENTS select GUEST_PERF_EVENTS select PERF_GUEST_MEDIATED_PMU - select HAVE_KVM_MSI select HAVE_KVM_CPU_RELAX_INTERCEPT - select HAVE_KVM_NO_POLL select VIRT_XFER_TO_GUEST_WORK select KVM_GENERIC_DIRTYLOG_READ_PROTECT select KVM_VFIO select HAVE_KVM_PM_NOTIFIER if PM select KVM_GENERIC_HARDWARE_ENABLING - select KVM_GENERIC_PRE_FAULT_MEMORY select KVM_WERROR if WERROR select KVM_GUEST_MEMFD if X86_64 =20 diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 5926478563e8..b7bd20fc9e34 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -749,7 +749,11 @@ static inline u64 kvm_gmem_get_supported_flags(struct = kvm *kvm) #ifndef kvm_arch_has_readonly_mem static inline bool kvm_arch_has_readonly_mem(struct kvm *kvm) { - return IS_ENABLED(CONFIG_HAVE_KVM_READONLY_MEM); +#ifdef KVM_READONLY_MEM + return true; +#else + return false; +#endif } #endif =20 @@ -2481,7 +2485,7 @@ void kvm_arch_update_irqfd_routing(struct kvm_kernel_= irqfd *irqfd, struct kvm_kernel_irq_routing_entry *new); #endif /* CONFIG_HAVE_KVM_IRQ_BYPASS */ =20 -#ifdef CONFIG_HAVE_KVM_INVALID_WAKEUPS +#ifdef KVM_INVALID_WAKEUPS /* If we wakeup during the poll time, was it a sucessful poll? */ static inline bool vcpu_valid_wakeup(struct kvm_vcpu *vcpu) { @@ -2493,9 +2497,9 @@ static inline bool vcpu_valid_wakeup(struct kvm_vcpu = *vcpu) { return true; } -#endif /* CONFIG_HAVE_KVM_INVALID_WAKEUPS */ +#endif /* KVM_INVALID_WAKEUPS */ =20 -#ifdef CONFIG_HAVE_KVM_NO_POLL +#ifdef KVM_NO_POLL /* Callback that tells if we must not poll */ bool kvm_arch_no_poll(struct kvm_vcpu *vcpu); #else @@ -2503,18 +2507,18 @@ static inline bool kvm_arch_no_poll(struct kvm_vcpu= *vcpu) { return false; } -#endif /* CONFIG_HAVE_KVM_NO_POLL */ +#endif /* KVM_NO_POLL */ =20 void kvm_arch_guest_memory_reclaimed(struct kvm *kvm); =20 -#ifdef CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE +#ifdef KVM_VCPU_RUN_PID_CHANGE int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu); #else static inline int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu) { return 0; } -#endif /* CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE */ +#endif /* KVM_VCPU_RUN_PID_CHANGE */ =20 #ifdef CONFIG_VIRT_XFER_TO_GUEST_WORK static inline void kvm_handle_signal_exit(struct kvm_vcpu *vcpu) @@ -2663,7 +2667,7 @@ void kvm_arch_gmem_reclaim(kvm_pfn_t pfn, kvm_pfn_t n= r_pages); void kvm_arch_gmem_invalidate_range(struct kvm *kvm, struct kvm_gfn_range = *range); #endif =20 -#ifdef CONFIG_KVM_GENERIC_PRE_FAULT_MEMORY +#ifdef KVM_GENERIC_PRE_FAULT_MEMORY long kvm_arch_vcpu_pre_fault_memory(struct kvm_vcpu *vcpu, struct kvm_pre_fault_memory *range); #endif diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index c3c0ee253fc7..008b110ebdb7 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -9,7 +9,7 @@ config KVM_COMMON select PREEMPT_NOTIFIERS =20 config HAVE_KVM_PFNCACHE - bool + booCONFIG_ltt =20 config HAVE_KVM_IRQCHIP bool @@ -50,27 +50,15 @@ config KVM_ASYNC_PF config KVM_ASYNC_PF_SYNC bool =20 -config HAVE_KVM_MSI - bool - -config HAVE_KVM_READONLY_MEM - bool - config HAVE_KVM_CPU_RELAX_INTERCEPT bool =20 config KVM_VFIO bool =20 -config HAVE_KVM_INVALID_WAKEUPS - bool - config KVM_GENERIC_DIRTYLOG_READ_PROTECT bool =20 -config KVM_GENERIC_PRE_FAULT_MEMORY - bool - config KVM_COMPAT def_bool y depends on KVM && COMPAT && !(S390 || ARM64 || RISCV) @@ -79,12 +67,6 @@ config HAVE_KVM_IRQ_BYPASS tristate select IRQ_BYPASS_MANAGER =20 -config HAVE_KVM_VCPU_RUN_PID_CHANGE - bool - -config HAVE_KVM_NO_POLL - bool - config VIRT_XFER_TO_GUEST_WORK bool =20 diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 4f25e170b542..a7ce1f22b3de 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -4351,7 +4351,7 @@ static int kvm_vcpu_ioctl_get_stats_fd(struct kvm_vcp= u *vcpu) return fd; } =20 -#ifdef CONFIG_KVM_GENERIC_PRE_FAULT_MEMORY +#ifdef KVM_GENERIC_PRE_FAULT_MEMORY static int kvm_vcpu_pre_fault_memory(struct kvm_vcpu *vcpu, struct kvm_pre_fault_memory *range) { @@ -4650,7 +4650,7 @@ static long kvm_vcpu_ioctl(struct file *filp, r =3D kvm_vcpu_ioctl_get_stats_fd(vcpu); break; } -#ifdef CONFIG_KVM_GENERIC_PRE_FAULT_MEMORY +#ifdef KVM_GENERIC_PRE_FAULT_MEMORY case KVM_PRE_FAULT_MEMORY: { struct kvm_pre_fault_memory range; =20 @@ -4891,7 +4891,7 @@ static int kvm_vm_ioctl_check_extension_generic(struc= t kvm *kvm, long arg) case KVM_CAP_DESTROY_MEMORY_REGION_WORKS: case KVM_CAP_JOIN_MEMORY_REGIONS_WORKS: case KVM_CAP_INTERNAL_ERROR_DATA: -#ifdef CONFIG_HAVE_KVM_MSI +#ifdef KVM_MSI case KVM_CAP_SIGNAL_MSI: #endif #ifdef CONFIG_HAVE_KVM_IRQCHIP @@ -5281,7 +5281,7 @@ static long kvm_vm_ioctl(struct file *filp, r =3D kvm_ioeventfd(kvm, &data); break; } -#ifdef CONFIG_HAVE_KVM_MSI +#ifdef KVM_MSI case KVM_SIGNAL_MSI: { struct kvm_msi msi; =20 --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DD42C51477D; Fri, 18 Sep 2026 13:32:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738366; cv=none; b=qoLWyH+IFvO1foUXWRJ/7Nj4tX4UbsnlSwIZMv1BWc2bbQFL5hNm+vzhPJEORJ1O1Mx6EQKd4xAXKaCjJYqtcbdXCiZ7hdlqI33oDYwCKyKRUQb21hLJHelPoFKzKV3vrDmtq3WWgr4Cpy3MppIEcZGj5ubwHcYQ67wJcTuQ94Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738366; c=relaxed/simple; bh=HR5edIySJTkJlH8V/TugMFZTnVEJDG5OrL6WugG3PVI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BGat6kEEzRHLriTZLA11k5ick711BjDUab7DMvnAMDLztDvJpoMTTX/KvoeCPOeqj1Q/0nbByyCA87qAmCvsQnvHUo/VzP5QA/gXYnXH8KpX7+JFlpdPAsUGe/yD7ze8AqmavfnpVQGaqCfvHtPzpY5WrA24rpvsjzXxZfvupRw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=capNOPzO; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="capNOPzO" Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA1aJ2803415; Fri, 18 Sep 2026 13:31:20 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=PJerFyzkPWj2kC6tD p4sQaXJPJbZR893tvs3BZgfH2o=; b=capNOPzOD1E02x62atzFqiR3/2KEAwZ4z 4J0OEtBf2Sx0U/ybBG7MMUrtfxerwhQxaKgcpb5/3WyWyaBJzYwCkQjhY0FmOdXC fuIcUybcKzaa0Hmr1vDNEXz4361a4yzVnCN8WvdZLG1njSwrVc/QUHi5vmuU0Sg9 0tzLaI4pmrqPQaP5igbLhy4Z1WFqAuEBOHoEtkFqUoNPORH7yuYNmbBd79dfu/HB 0x0Hg4Vz30jOEPm1450FWodqYI6EXQtVAmePY4VzTU19E1zhCfZbQvqBvw9tcRn8 E8JorFMhQS+CQXbG78kljqdSlQvYiNEdbUxzWT3OpeAeit95DIIVA== Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmv5j813s-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:19 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDNtoF695598; Fri, 18 Sep 2026 13:31:18 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gra3fek77-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:18 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay07.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVBB146072144 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:11 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 72E8320040; Fri, 18 Sep 2026 13:31:11 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1C13C20049; Fri, 18 Sep 2026 13:31:11 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:11 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 09/29] KVM: Replace CONFIG_KVM_MMIO with KVM_NO_MMIO Date: Fri, 18 Sep 2026 15:30:46 +0200 Message-ID: <20260918133107.1042730-10-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX5W8eSHV56JqQ zxat/vZ8FLwoy1goBNurPRN9EJ59PsyrOOkWUumHTYDzkfZR+XAoS8Y823MGgNA4S2jAmffWnHt iwnbgXhiJ3NdGxM55EyMZDmhsHd29HxUpqR0ApeGhKmNUCIloMWAAwUjCgqNFvgn6r2huURbYxF cJHDAri4Uy8Abu7+2v7i1qG2LDBo9si10764Cr/f4NpE+snRN/NB68RHDlkvV5kcGIzkU84yrg/ H0OYKsLt564IJX107rvHNzwHHfEXiHS/v4PunYXwTASbgKUwkQ/Vep6nRaAUF5KaQen52fJwKRf B6wXBqBCqcmBZI7MOBiPSlLVxIJWlHuPxzmk+g9gMZgJvPVuGnCm4VLi/jE/BlOBlc3iblJ9k94 WbXjOEmnW5bP5cMVPINitbihnuSHZOkP3UE0TJEJ6Bav/WBGSgWoilTTMEwaYHuDcvuRE+ZS+ML B34JwO6+OO2TcHYwbPQ== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX+wTm/+QPjKgk rlnuE55E97Rq1z9h1NEp8QWVqC6kWaXT4F1VkbJAVSIvy1HC3NEQIaSdRRadmT1/8n/ybj7hrBb 7I+D1j+VtAZQk0P+XvBMCz0bFy2nN+k= X-Authority-Analysis: v=2.4 cv=Zsx4uN7G c=1 sm=1 tr=0 ts=6aad3d28 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=b18d5-NrEheKXPzz568A:9 a=ysjONUepx5X5FVbz:21 X-Proofpoint-ORIG-GUID: ivCGvatQpcaSTNAG3aLlm7accMHLCFra X-Proofpoint-GUID: NFuGtSrDvcWlTIxdbTmNh1uMz78N_e67 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 impostorscore=0 clxscore=1015 priorityscore=1501 lowpriorityscore=0 bulkscore=0 adultscore=0 phishscore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" Defining KVM_MMIO is not flexible enough for multi-KVM systems where one KVM implements MMIO but others do not. Therefore, remove KVM_MMIO from the config space and use the macro KVM_NO_MMIO instead. Define KVM_NO_MMIO for KVM/s390 and for selected KVM/powerpc configurations. coalesced_mmio.c is now always compiled&linked. However, for architectures/configurations defining KVM_NO_MMIO this effectively collapses to an empty object with no mmio code. No functional changes. Suggested-by: Marc Zyngier Signed-off-by: Steffen Eiden --- arch/arm64/kvm/Kconfig | 1 - arch/loongarch/kvm/Kconfig | 1 - arch/mips/kvm/Kconfig | 1 - arch/powerpc/include/asm/kvm_host.h | 7 +++++++ arch/powerpc/kvm/Kconfig | 4 ---- arch/riscv/kvm/Kconfig | 1 - arch/s390/include/asm/kvm_host_s390.h | 2 ++ arch/x86/kvm/Kconfig | 1 - include/linux/kvm_host.h | 2 +- virt/kvm/Kconfig | 3 --- virt/kvm/Makefile.kvm | 4 ++-- virt/kvm/coalesced_mmio.c | 4 ++++ virt/kvm/coalesced_mmio.h | 2 +- virt/kvm/kvm_main.c | 8 ++++---- 14 files changed, 21 insertions(+), 20 deletions(-) diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig index 7329124deb2f..8475f32ad9e6 100644 --- a/arch/arm64/kvm/Kconfig +++ b/arch/arm64/kvm/Kconfig @@ -22,7 +22,6 @@ menuconfig KVM select KVM_COMMON select KVM_GENERIC_HARDWARE_ENABLING select HAVE_KVM_CPU_RELAX_INTERCEPT - select KVM_MMIO select KVM_GENERIC_DIRTYLOG_READ_PROTECT select VIRT_XFER_TO_GUEST_WORK select KVM_VFIO diff --git a/arch/loongarch/kvm/Kconfig b/arch/loongarch/kvm/Kconfig index a427429a2b05..fd387326d2f2 100644 --- a/arch/loongarch/kvm/Kconfig +++ b/arch/loongarch/kvm/Kconfig @@ -26,7 +26,6 @@ config KVM select KVM_COMMON select KVM_GENERIC_DIRTYLOG_READ_PROTECT select KVM_GENERIC_HARDWARE_ENABLING - select KVM_MMIO select VIRT_XFER_TO_GUEST_WORK select SCHED_INFO select GUEST_PERF_EVENTS if PERF_EVENTS diff --git a/arch/mips/kvm/Kconfig b/arch/mips/kvm/Kconfig index c24b872afbcb..849ce7c7c4df 100644 --- a/arch/mips/kvm/Kconfig +++ b/arch/mips/kvm/Kconfig @@ -22,7 +22,6 @@ config KVM select EXPORT_UASM select KVM_COMMON select KVM_GENERIC_DIRTYLOG_READ_PROTECT - select KVM_MMIO select KVM_GENERIC_HARDWARE_ENABLING help Support for hosting Guest kernels. diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm= /kvm_host.h index ad7c34e9b227..620f163d65a9 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h @@ -29,6 +29,13 @@ =20 #define __KVM_HAVE_ARCH_VCPU_DEBUGFS =20 +#if !defined(CONFIG_KVM_BOOK3S_32_HANDLER) && \ + !defined(CONFIG_KVM_BOOK3S_PR_POSSIBLE) && \ + !defined(CONFIG_KVM_E500V2) && \ + !defined(CONFIG_KVM_E500MC) +#define KVM_NO_MMIO +#endif + #define KVM_MAX_VCPUS NR_CPUS #define KVM_MAX_VCORES NR_CPUS =20 diff --git a/arch/powerpc/kvm/Kconfig b/arch/powerpc/kvm/Kconfig index 1fae2de8fa68..cacc22e34afd 100644 --- a/arch/powerpc/kvm/Kconfig +++ b/arch/powerpc/kvm/Kconfig @@ -30,7 +30,6 @@ config KVM_BOOK3S_HANDLER config KVM_BOOK3S_32_HANDLER bool select KVM_BOOK3S_HANDLER - select KVM_MMIO =20 config KVM_BOOK3S_64_HANDLER bool @@ -38,7 +37,6 @@ config KVM_BOOK3S_64_HANDLER =20 config KVM_BOOK3S_PR_POSSIBLE bool - select KVM_MMIO =20 config KVM_BOOK3S_HV_POSSIBLE bool @@ -201,7 +199,6 @@ config KVM_E500V2 depends on PPC_E500 && !PPC_E500MC depends on !CONTEXT_TRACKING_USER select KVM - select KVM_MMIO help Support running unmodified E500 guest kernels in virtual machines on E500v2 host processors. @@ -216,7 +213,6 @@ config KVM_E500MC depends on PPC_E500MC depends on !CONTEXT_TRACKING_USER select KVM - select KVM_MMIO select KVM_BOOKE_HV help Support running unmodified E500MC/E5500/E6500 guest kernels in diff --git a/arch/riscv/kvm/Kconfig b/arch/riscv/kvm/Kconfig index 3cb4f8037300..2e3c4e6c1cd7 100644 --- a/arch/riscv/kvm/Kconfig +++ b/arch/riscv/kvm/Kconfig @@ -26,7 +26,6 @@ config KVM select KVM_COMMON select KVM_GENERIC_DIRTYLOG_READ_PROTECT select KVM_GENERIC_HARDWARE_ENABLING - select KVM_MMIO select VIRT_XFER_TO_GUEST_WORK select SCHED_INFO select GUEST_PERF_EVENTS if PERF_EVENTS diff --git a/arch/s390/include/asm/kvm_host_s390.h b/arch/s390/include/asm/= kvm_host_s390.h index 5fd7f49d7c0d..451346f32008 100644 --- a/arch/s390/include/asm/kvm_host_s390.h +++ b/arch/s390/include/asm/kvm_host_s390.h @@ -40,6 +40,8 @@ =20 #define KVM_S390_MANAGES_S390_GUEST 1 =20 +#define KVM_NO_MMIO + /* * These seem to be used for allocating ->chip in the routing table, which= we * don't use. 1 is as small as we can get to reduce the needed memory. If = we diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig index fa20f64d6a2f..82b6c91e763b 100644 --- a/arch/x86/kvm/Kconfig +++ b/arch/x86/kvm/Kconfig @@ -31,7 +31,6 @@ config KVM_X86 select VHOST_TASK select KVM_ASYNC_PF select USER_RETURN_NOTIFIER - select KVM_MMIO select SCHED_INFO select PERF_EVENTS select GUEST_PERF_EVENTS diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index b7bd20fc9e34..7ebc9aaaec2d 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -846,7 +846,7 @@ struct kvm { struct kvm_vm_stat stat; struct kvm_arch arch; refcount_t users_count; -#ifdef CONFIG_KVM_MMIO +#ifndef KVM_NO_MMIO struct kvm_coalesced_mmio_ring *coalesced_mmio_ring; spinlock_t ring_lock; struct list_head coalesced_zones; diff --git a/virt/kvm/Kconfig b/virt/kvm/Kconfig index 008b110ebdb7..69b47cb6526c 100644 --- a/virt/kvm/Kconfig +++ b/virt/kvm/Kconfig @@ -40,9 +40,6 @@ config NEED_KVM_DIRTY_RING_WITH_BITMAP bool depends on HAVE_KVM_DIRTY_RING =20 -config KVM_MMIO - bool - config KVM_ASYNC_PF bool =20 diff --git a/virt/kvm/Makefile.kvm b/virt/kvm/Makefile.kvm index ee66d460c494..9a3b05a01c62 100644 --- a/virt/kvm/Makefile.kvm +++ b/virt/kvm/Makefile.kvm @@ -10,9 +10,9 @@ KVM_DEV_MINOR ?=3D KVM_MINOR =20 ccflags-y +=3D-DKVM_DEV_NAME=3D$(KVM_DEV_NAME) -DKVM_DEV_MINOR=3D$(KVM_DEV= _MINOR) =20 -kvm-y :=3D $(KVM)/kvm_main.o $(KVM)/eventfd.o $(KVM)/binary_stats.o +kvm-y :=3D $(KVM)/kvm_main.o $(KVM)/eventfd.o $(KVM)/binary_stats.o \ + $(KVM)/coalesced_mmio.o kvm-$(CONFIG_KVM_VFIO) +=3D $(KVM)/vfio.o -kvm-$(CONFIG_KVM_MMIO) +=3D $(KVM)/coalesced_mmio.o kvm-$(CONFIG_KVM_ASYNC_PF) +=3D $(KVM)/async_pf.o kvm-$(CONFIG_HAVE_KVM_IRQ_ROUTING) +=3D $(KVM)/irqchip.o kvm-$(CONFIG_HAVE_KVM_DIRTY_RING) +=3D $(KVM)/dirty_ring.o diff --git a/virt/kvm/coalesced_mmio.c b/virt/kvm/coalesced_mmio.c index 6b1d90161099..d6cae6855237 100644 --- a/virt/kvm/coalesced_mmio.c +++ b/virt/kvm/coalesced_mmio.c @@ -15,6 +15,8 @@ #include #include =20 +#ifndef KVM_NO_MMIO + #include "coalesced_mmio.h" =20 static inline struct kvm_coalesced_mmio_dev *to_mmio(struct kvm_io_device = *dev) @@ -188,3 +190,5 @@ int kvm_vm_ioctl_unregister_coalesced_mmio(struct kvm *= kvm, */ return 0; } + +#endif /* !KVM_NO_MMIO */ diff --git a/virt/kvm/coalesced_mmio.h b/virt/kvm/coalesced_mmio.h index 36f84264ed25..bcaa34fce1e8 100644 --- a/virt/kvm/coalesced_mmio.h +++ b/virt/kvm/coalesced_mmio.h @@ -11,7 +11,7 @@ * */ =20 -#ifdef CONFIG_KVM_MMIO +#ifndef KVM_NO_MMIO =20 #include =20 diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index a7ce1f22b3de..32b8aad8fa2b 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -4061,7 +4061,7 @@ static vm_fault_t kvm_vcpu_fault(struct vm_fault *vmf) else if (vmf->pgoff =3D=3D KVM_PIO_PAGE_OFFSET) page =3D virt_to_page(vcpu->arch.pio_data); #endif -#ifdef CONFIG_KVM_MMIO +#ifndef KVM_NO_MMIO else if (vmf->pgoff =3D=3D KVM_COALESCED_MMIO_PAGE_OFFSET) page =3D virt_to_page(vcpu->kvm->coalesced_mmio_ring); #endif @@ -4902,7 +4902,7 @@ static int kvm_vm_ioctl_check_extension_generic(struc= t kvm *kvm, long arg) case KVM_CAP_ENABLE_CAP_VM: case KVM_CAP_HALT_POLL: return 1; -#ifdef CONFIG_KVM_MMIO +#ifndef KVM_NO_MMIO case KVM_CAP_COALESCED_MMIO: return KVM_COALESCED_MMIO_PAGE_OFFSET; case KVM_CAP_COALESCED_PIO: @@ -5243,7 +5243,7 @@ static long kvm_vm_ioctl(struct file *filp, break; } #endif -#ifdef CONFIG_KVM_MMIO +#ifndef KVM_NO_MMIO case KVM_REGISTER_COALESCED_MMIO: { struct kvm_coalesced_mmio_zone zone; =20 @@ -5578,7 +5578,7 @@ static long kvm_dev_ioctl(struct file *filp, #ifdef CONFIG_X86 r +=3D PAGE_SIZE; /* pio data page */ #endif -#ifdef CONFIG_KVM_MMIO +#ifndef KVM_NO_MMIO r +=3D PAGE_SIZE; /* coalesced mmio ring page */ #endif break; --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8C153517BCA; Fri, 18 Sep 2026 13:32:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738379; cv=none; b=qOK9JcVZUU1Q8K6/uAqqu495rdk03AWb/tLXyTonvA5ll19b9MRgCUjnNYXUv6u/ey6frK/pNH/8hVH7MB458m4QfMSynCVip4YNYOvl9FGmrBMfmXa/5MLJrn92No9NmQmp2f+7XDMAS6/aWN5leLcMQYoaC/fTbTRnt0XHNM8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738379; c=relaxed/simple; bh=y4kyAuseVXdZvFmiHOyd9Ag8SRcIgA5Vfg3SW8qRIWU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XXAZP3K81YPAvH5AFIrvnWyAAn4/AoPf3tDjCOkzrLF2h9IkOuXEPmDkEKPlj3gN4q/3uLWUx7sGhKeVXEgi/YdvSM0q1rf5ppflmZ21pRDX/+STUwwcZy0P7FTSxY7KDJy9mcRZwM+crJeMglaCFcbGwoM2/29UjgKDuNrabyI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=LBfoH3JM; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="LBfoH3JM" Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA2mgS991016; Fri, 18 Sep 2026 13:31:20 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=8U/24HvfSe9SvVW3M i1QdqXQeajeDAh9/ITv81UXOTk=; b=LBfoH3JMrGGVmy0r3AaqRvm4qlmht+JxQ kOLgmzi9XDiSuIkFtWh26MCzLLUK/kSS74fvmd8fXqg+FEXXMOGVOEarlxWLqoYq DdcNTWKQqAePJS8LqNKt6Ttn9yrRQGpUoKj8ZLAGxR0Le9QRgawPSI8dFPTK8j60 2DzX8ztycCIywuCYS6YDAXDXaHcwaBbLPzzGRCuCFWSJss1IZvOb1fg3O+xR6r0Q rZYFzGwRznlB5U399cW9iLp1jFxL7uETLrnzyVT+UzapuJ/KmLPteuELqa+8B88D ptXWv5ycrQcPtzDziTVuxzqKJBTgoFYOSX5ZlwckgkWKXNx/rOdFQ== Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmxcvfnp9-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:19 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDO1fW722844; Fri, 18 Sep 2026 13:31:18 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gr5fjqgvp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:18 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay07.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVB9A46072148 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:12 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C6EEF20040; Fri, 18 Sep 2026 13:31:11 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 789002004B; Fri, 18 Sep 2026 13:31:11 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:11 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 10/29] arm64: Use proper include variant Date: Fri, 18 Sep 2026 15:30:47 +0200 Message-ID: <20260918133107.1042730-11-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX6vrwIJuZpZxh 7PojR6uLAHAlLT5lTNFjlUkKdSG0lWxd2lux5N5O5hNJRfFsE+xeQ9XvJ2/qKKI/G05nTgvkJeS libMvpDPQQl7pGE++fKFe5lv8RCOnxU= X-Proofpoint-ORIG-GUID: ZaNPU2glogTC9A_K7lCZGOYPKv1rZWq7 X-Proofpoint-GUID: wH4n4pnvjsZKZAaXtIDZtNpZPcCCqQDW X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX2nchNqyg2Xh/ u6DwQ8wLnKk5fvFEOFhkpNpV4agn2xmKD7A00OmoJA9/Ol5s3DrEDQRraMTeXJIYSfM28UD9HfK B4OxKfYIcqhM1HHZHGYTqfulRQm3jEMXI1MSvgoXJqzIsPXJGARzcD0QTJ9BZq4EqHsb5z9q260 TlWIs+IgC8ovQW8JHIoHwzBgPW/DEAwzKIYCMheHrExHIHbf+gAs1wHNlobnU93mnKnFCkD3rx4 5pqevvLP7R0tQWcjIlW8TSn9fgYMM7wrmuu42nvul13zrKN48paQ1+RxOPIMS4ltTEjwY/sD7eD jqeKBGjt6K8I0g+3d4P5OFCIxdyXrF3igvtiWT5xSDhYQvm9F2Maj+d5TR2N/f4cxNncDo3q5yd he0AEmI2nZegiI0XeV2LI0Ffoc4Ch2wz4JBYEoiB7nO3nGwh+f9+w0Ld6KSIddrxGL0wNIJS+Ot /rUqoWGQO400c/Fod+w== X-Authority-Analysis: v=2.4 cv=F+7C5ahN c=1 sm=1 tr=0 ts=6aad3d28 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=d3WjOe2bLlXSZPWdUOEA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 phishscore=0 clxscore=1015 malwarescore=0 lowpriorityscore=0 bulkscore=0 spamscore=0 impostorscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" Use <> for including the sysreg header as it is not discoverable from the current directory. Fixes: c07d8017bceb ("arm64/sysreg: Enable automatic generation of system r= egister definitions") Acked-by: Marc Zyngier Signed-off-by: Steffen Eiden --- arch/arm64/include/asm/sysreg.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysre= g.h index 7aa08d59d494..4bfdac9401bd 100644 --- a/arch/arm64/include/asm/sysreg.h +++ b/arch/arm64/include/asm/sysreg.h @@ -173,7 +173,7 @@ * come from here. The header relies on the definition of sys_reg() * earlier in this file. */ -#include "asm/sysreg-defs.h" +#include =20 /* * System registers, organised loosely by encoding but grouped together --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 23E4F502D7D; Fri, 18 Sep 2026 13:32:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738330; cv=none; b=sgyB4MAlO2L2DEcTIeS07mhzHKuL1MevQ87qQ6UaGTXQ0jRoz6B7WEZq6qGul26NzJDF5Yxfxq8zDzlTenqxT0aE5brYpMgYbdkjryllSNdlT2inKadxECMI3E6uJzsxEG1XtrVBXKx6qh/MXa9yX+nGfTv+HOHsSrDjy0gv/ls= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738330; c=relaxed/simple; bh=FKAS5JM0YtlqsygrtUhVlasxecpfNmansRMVSSV7FM0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=r4a2j/BZkBxokBoc7mdFTwqyvEvE+mME24Fr93r5BfxnvnMYwunhuBiYdmbIKLk1vjADZSbhox8QiqNMAtzzKZZTDoQ/T5AgXuhCIxWc+36Wna02/0qUM5KRL4TPMcu+yz4lEpmw7OaX3V/YtwRpGvajLEkcsq3Wmeq9wc4RoYY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=dDeFysFv; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="dDeFysFv" Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDVPwo1378486; Fri, 18 Sep 2026 13:31:25 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=6kkUuBtQh7OlhH3TH IaN3BECiqBALGTcSbqHwQf9XXw=; b=dDeFysFvwhN6ZeT7hO77ICIqsIxHCgLuG cZYIL3mceklZ+ydaG1C1l3MR44Lj79XbwwS09ftoKsPmO7VGhIyCmhaMmFnMiOiv UOBfX+CZCYO2jZ/8Ure/vi5xlijJq1EIXkGXw+BpG1KtbH06jiWdrwB4uAqirMK5 KFK03/+KmNfmNA0c9Gvvq7Ge0VtZ1oGCZG/AT4oU1qF5h76U2c3pO0x74OoRBbIF QUURVQ8s2DfT8c1D5QaBRiu+zUFBoVJVEOzFgUC/q2lKPEg+QSS5ZbCggxVhY5dq pxCtnGOhn/2Z+v9+ASDDF8IFH+vPstD+o3U00M5GrQZ/2I2K22V4w== Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmx848a66-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:24 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDO1fX722844; Fri, 18 Sep 2026 13:31:21 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gr5fjqgvt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:20 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay02.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVC6849152392 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:12 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 277DD20040; Fri, 18 Sep 2026 13:31:12 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CCDBD20049; Fri, 18 Sep 2026 13:31:11 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:11 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 11/29] arm64: ptrace: Use constants for compat register numbers Date: Fri, 18 Sep 2026 15:30:48 +0200 Message-ID: <20260918133107.1042730-12-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE5MiBTYWx0ZWRfX3oHdTM0RcM9M lJA/QRIcr2gycnElpo/MDeE2zEa/GHQIylJu8moeaG9G0rL5XqCLPB3TcdMk75TJfOPH7wd5uA2 12T+ArQ0VYltavLHTvLNJwriHMxpLe52i3M9sZ7oVCrkD+ahn/8vhbtKBQfD9xXxCDGMu3mMSoD CIG21Za8Lv9fwHNDXpBiK99JdvVFE74DCjcSnbGlHopkZOfAl8VvyEcWAiWOLZUGYrfRcx64HVm 3Sy1NhBOAg4XrfyFqDYErSYKLBCbiJBsfXz84J7u2O8H8py6vY+XsOUP6/QJ1NSoPD/hrBzWc8n vSu7u9U/gIS3dzZwvgTkKK7WXj4Kmhgx1cq/JNxR7MzjABiPnbzAjcv9i+024blZV6I7cqAsBfu T4Eh/mFQEGhmTbfmLOULX6OFejk0Kg0yGyWC8MbwO2WKaVP3qdehPEtD+oRl3k270uMSq6/PeBC R1DurimcSDSxTOzw6Rg== X-Proofpoint-ORIG-GUID: 8p8JeldyMPn5HZt2Ye27SKz3ElNncAyV X-Proofpoint-GUID: _WjLFTjcQpS3C97htwFQBPucWAYwRzl5 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE5MiBTYWx0ZWRfX1JVlF1JJiUpF MpkoXI2Yb2IHIE1je1OHNCRP/sORPGCJ4XY2+VOzfbf/9ozdZDXut91oYhiEI5AkpB1WMrxurKE Iu3MCS/OmPCs+V1FGjTP+wv3wSt3nEo= X-Authority-Analysis: v=2.4 cv=cY9HPXDM c=1 sm=1 tr=0 ts=6aad3d2c cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=8sKaXpLx0aSSeG29UzUA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_04,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 spamscore=0 bulkscore=0 clxscore=1015 suspectscore=0 impostorscore=0 malwarescore=0 phishscore=0 adultscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180192 Content-Type: text/plain; charset="utf-8" Define an enum to determine the register number for the mapping from AArch32 and AArch64 registers. This allows for a more flexible use of the register mappings. Reviewed-by: Marc Zyngier Signed-off-by: Steffen Eiden --- arch/arm64/include/asm/ptrace.h | 60 ++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 19 deletions(-) diff --git a/arch/arm64/include/asm/ptrace.h b/arch/arm64/include/asm/ptrac= e.h index f7dc5fb9427d..49a83a0636b9 100644 --- a/arch/arm64/include/asm/ptrace.h +++ b/arch/arm64/include/asm/ptrace.h @@ -102,26 +102,48 @@ #define COMPAT_USER_SZ 296 =20 /* Architecturally defined mapping between AArch32 and AArch64 registers */ +enum { + __compat_fp =3D 11, + __compat_sp =3D 13, + __compat_lr =3D 14, + __compat_sp_hyp =3D 15, + __compat_lr_irq =3D 16, + __compat_sp_irq =3D 17, + __compat_lr_svc =3D 18, + __compat_sp_svc =3D 19, + __compat_lr_abt =3D 20, + __compat_sp_abt =3D 21, + __compat_lr_und =3D 22, + __compat_sp_und =3D 23, + __compat_r8_fiq =3D 24, + __compat_r9_fiq =3D 25, + __compat_r10_fiq =3D 26, + __compat_r11_fiq =3D 27, + __compat_r12_fiq =3D 28, + __compat_sp_fiq =3D 29, + __compat_lr_fiq =3D 30, +}; + #define compat_usr(x) regs[(x)] -#define compat_fp regs[11] -#define compat_sp regs[13] -#define compat_lr regs[14] -#define compat_sp_hyp regs[15] -#define compat_lr_irq regs[16] -#define compat_sp_irq regs[17] -#define compat_lr_svc regs[18] -#define compat_sp_svc regs[19] -#define compat_lr_abt regs[20] -#define compat_sp_abt regs[21] -#define compat_lr_und regs[22] -#define compat_sp_und regs[23] -#define compat_r8_fiq regs[24] -#define compat_r9_fiq regs[25] -#define compat_r10_fiq regs[26] -#define compat_r11_fiq regs[27] -#define compat_r12_fiq regs[28] -#define compat_sp_fiq regs[29] -#define compat_lr_fiq regs[30] +#define compat_fp regs[__compat_fp] +#define compat_sp regs[__compat_sp] +#define compat_lr regs[__compat_lr] +#define compat_sp_hyp regs[__compat_sp_hyp] +#define compat_lr_irq regs[__compat_lr_irq] +#define compat_sp_irq regs[__compat_sp_irq] +#define compat_lr_svc regs[__compat_lr_svc] +#define compat_sp_svc regs[__compat_sp_svc] +#define compat_lr_abt regs[__compat_lr_abt] +#define compat_sp_abt regs[__compat_sp_abt] +#define compat_lr_und regs[__compat_lr_und] +#define compat_sp_und regs[__compat_sp_und] +#define compat_r8_fiq regs[__compat_r8_fiq] +#define compat_r9_fiq regs[__compat_r9_fiq] +#define compat_r10_fiq regs[__compat_r10_fiq] +#define compat_r11_fiq regs[__compat_r11_fiq] +#define compat_r12_fiq regs[__compat_r12_fiq] +#define compat_sp_fiq regs[__compat_sp_fiq] +#define compat_lr_fiq regs[__compat_lr_fiq] =20 static inline unsigned long compat_psr_to_pstate(const unsigned long psr) { --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ED9014F5E17; Fri, 18 Sep 2026 13:31:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738312; cv=none; b=pzWnyojvXRkYbAbrpON602J2PpbtK4ThiPHXM1Id5LhZPH/FMWupHNEd1K550U2PxgZDe4XCacb23prod0JJfwc4nsAVPH7/Vc4aBFT8XwjLKU+SKSbEssGQBjJt3adGeftXQOXB4eXYEU8ufu4w7USZeTrmU1zgQnhlF9sTdxc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738312; c=relaxed/simple; bh=xgyFBZkX1lfguFXAovdRbxiILkOiqxiVY2yq3ZyfKUY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CG3/c7Saleb2wC6spbL2gSmkh2BZuy7ymhvCM2+WhjuLg3aGTXIO4TvTszl//5BIQVTQlLW2NBAzJLfpUtIETmnU4k/PC3X4dS3DC2RWo/zmNQkMSSS8cjTlXfw4NDNTkUd58wK8Naawpfn85b3sVs6kjIXYrEva3b7uJXUIUGk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=a4ViReZa; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="a4ViReZa" Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA1hDv3979521; Fri, 18 Sep 2026 13:31:22 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=6ujg5jeqG2oaiYOFz tA2vnfZWM7LZJyeIoTsnRjkAX8=; b=a4ViReZa5ZcXRJ0nVKwGfniPy4RRrDwFl 7zZl5x7AIO8CINzb2SPs/B2xhthzSxjPy2UxT1P6YZAW6dZbFQU6uQ5OjspAmHZS 8N/LLh1S917gjpUNLsmkH/j3TAFLXe6EjMOYx+MLqoATUif5tHB3gA7bG95ENzKS xuOqHR2x2rSWF+Ac7RCSS5P6KZRX5HH6KK4QO1l6UaaCfdLR9qb/+OR+V02dozWF l11HZID2JsSf7u5pO7ZtTgwEkQIAVWJb33w5sTu6eFJnmK3CqWc5HFnBF/96LjKZ KCsRNwqtrKy75qvZ1TKAnCn5freAzNXAqwKy0/FIMa7USp+bpUxxg== Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmw5eftsj-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:21 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDNs2H739440; Fri, 18 Sep 2026 13:31:20 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gs56q88u3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:20 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay02.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVCQF53215498 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:12 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7C7DC20049; Fri, 18 Sep 2026 13:31:12 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2DE082004B; Fri, 18 Sep 2026 13:31:12 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:12 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 12/29] arm64: sysreg: Convert SPSR_ELx to automatic register generation Date: Fri, 18 Sep 2026 15:30:49 +0200 Message-ID: <20260918133107.1042730-13-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX9SeeaGmrAO6i eSs60ivzBVn0Ia8MEbS3fNkVfiaSu7oXTD4opt8F4NIygUYrBCjxkF4JMltZ0eGXa2OhN+IaKEq nLGirM+xCgjfOU82M6r6gwy66u5z7MPM3r4GPQDEYot+jL44P3ypDx26NfIuybOcHVmdmKqxg02 3uQ+O29K32ZbaisbAP7HAJ82M+5ucJbuSSmXchD64uSnMksURhISnZ8RJfQRXdz/RA2zm2LOnYx cHzuHA6MjVxS47LtfDxc5TZazqm/HiNe8t+6euZTlnGn4yU05YeGrvrtKl26YcK2uuSroDNphaS FsPFLwSmCKSujo72H3OpHncFFbGaSKq3ZZuUBDtXly90oFc4uerRqxkrcPLu2VwgOc0Gdp5eALQ pjWNBuzOuaV8fnCCCTf8mexkDUExa4PcvGvRRE5LC7aDZuSV1uGzkNFnjj1Jp4rBBVPcAnvxWYN sVDZhXJOR9io8FgHcDg== X-Authority-Analysis: v=2.4 cv=E/NYNqdl c=1 sm=1 tr=0 ts=6aad3d29 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VnNF1IyMAAAA:8 a=qAnUzrOnmDNqMeXR4cMA:9 X-Proofpoint-ORIG-GUID: oSxcbNzd3Cv9LjDtWOtb6m-y7R9u6NOs X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX1tW5FVWgaOiZ l1gJhiJepboIh873XtOWXf81KyrhD967GRegWRYWu6KDg7bOfI9XdGpla19GFtsmFPNdrX4rqkf WowuEGGZujLyCg3UZX+BnDt99jqT0z0= X-Proofpoint-GUID: WvcPuc0D3J2eK4oREXHIxHlFwLPERoiI X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 priorityscore=1501 spamscore=0 adultscore=0 clxscore=1015 bulkscore=0 malwarescore=0 suspectscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" Convert SPSR_EL{1, 2, 12} to automatic register generation as per DDIO616 2026-06. No functional change. Signed-off-by: Steffen Eiden --- arch/arm64/include/asm/sysreg.h | 3 -- arch/arm64/tools/sysreg | 51 +++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysre= g.h index 4bfdac9401bd..1aa601c95188 100644 --- a/arch/arm64/include/asm/sysreg.h +++ b/arch/arm64/include/asm/sysreg.h @@ -295,7 +295,6 @@ #define SYS_APGAKEYLO_EL1 sys_reg(3, 0, 2, 3, 0) #define SYS_APGAKEYHI_EL1 sys_reg(3, 0, 2, 3, 1) =20 -#define SYS_SPSR_EL1 sys_reg(3, 0, 4, 0, 0) #define SYS_ELR_EL1 sys_reg(3, 0, 4, 0, 1) =20 #define SYS_ICC_PMR_EL1 sys_reg(3, 0, 4, 6, 0) @@ -518,7 +517,6 @@ #define SYS_VTTBR_EL2 sys_reg(3, 4, 2, 1, 0) =20 #define SYS_HAFGRTR_EL2 sys_reg(3, 4, 3, 1, 6) -#define SYS_SPSR_EL2 sys_reg(3, 4, 4, 0, 0) #define SYS_ELR_EL2 sys_reg(3, 4, 4, 0, 1) #define SYS_SP_EL1 sys_reg(3, 4, 4, 1, 0) #define SYS_SPSR_irq sys_reg(3, 4, 4, 3, 0) @@ -604,7 +602,6 @@ #define SYS_BRBCR_EL12 sys_reg(2, 5, 9, 0, 0) #define SYS_TTBR0_EL12 sys_reg(3, 5, 2, 0, 0) #define SYS_TTBR1_EL12 sys_reg(3, 5, 2, 0, 1) -#define SYS_SPSR_EL12 sys_reg(3, 5, 4, 0, 0) #define SYS_ELR_EL12 sys_reg(3, 5, 4, 0, 1) #define SYS_AFSR0_EL12 sys_reg(3, 5, 5, 1, 0) #define SYS_AFSR1_EL12 sys_reg(3, 5, 5, 1, 1) diff --git a/arch/arm64/tools/sysreg b/arch/arm64/tools/sysreg index e2d37ee221b8..893b5f9df575 100644 --- a/arch/arm64/tools/sysreg +++ b/arch/arm64/tools/sysreg @@ -401,6 +401,57 @@ Res0 3:1 Field 0 SO EndSysreg =20 +SysregFields SPSR_ELx +Res0 63:37 +Field 36 UINJ +Field 35 PACM +Field 34 EXLOCK +Res0 33 +Field 32 PM +Field 31 N +Field 30 Z +Field 29 C +Field 28 V +Res0 27:26 +Field 25 TCO +Field 24 DIT +Field 23 UAO +Field 22 PAN +Field 21 SS +Field 20 IL +Res0 19:14 +Field 13 ALLINT +Field 12 SSBS +Field 11:10 BTYPE +Field 9 D +Field 8 A +Field 7 I +Field 6 F +Res0 5 +Field 4 M4 +Enum 3:0 M + 0b0000 EL0 + 0b0100 EL1t + 0b0101 EL1h + 0b1000 EL2t + 0b1001 EL2h + 0b1100 EL3t + 0b1101 EL3h +EndEnum +EndSysregFields + +Sysreg SPSR_EL1 3 0 4 0 0 +Fields SPSR_ELx +EndSysreg + +Sysreg SPSR_EL2 3 4 4 0 0 +Fields SPSR_ELx +EndSysreg + +Sysreg SPSR_EL12 3 5 4 0 0 +Mapping SPSR_EL1 +EndSysreg + Sysreg ID_PFR0_EL1 3 0 0 1 0 Res0 63:32 UnsignedEnum 31:28 RAS --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AB6DD502778; Fri, 18 Sep 2026 13:36:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738615; cv=none; b=Xamj1iHNld+c7hnHLiWSn4krcW+S51cAjPDTv7vbOIkRQpzsL/wSt6GTvT6Eef9Pw/a+yvG/L9XN3u+X2XJ+p8jAEGjtl7ZlSHZBQ9LZUAzF5jOBOcx/yWvbn3g4ZSA3RTUXTgIfslGYrPPKmDm3CghkWlsv9oj8A1ukyVnlqas= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738615; c=relaxed/simple; bh=PwhFqFMAeYeK+MC4/KZZfQxyMfFiJimRkPCte/6WvZU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NiyK1nd44UbbCHYTkrJzOElQ5M31zy4TeJN0oQCz27Ray8WnLsCZ7Uet10cfW1i3HTYkyvCNL3RgrzPon0tZKTa+uSM3kDgU7wbpW67pIl6EJsFRpizTwsUEwkFOwRVp8arZkzWIJ4KCPODRWNWwB3aF9qtqERQiG8V1GXzfjMc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=gYpzmgqQ; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="gYpzmgqQ" Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA1jfO803606; Fri, 18 Sep 2026 13:31:24 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=JE4/GZMkKMUK8RFbS +RuHFWgO7/CyR4r6pUgWEewwFQ=; b=gYpzmgqQ7f/biLtZJTivXq8A/tEjngxAi Em1fnVXuyHD/XfZUnFeb/NvguyrvYWakpkPXQ7FIkFPA0O3NCHByGVh6JU7FwNRr 0+pRpypDfjLFKt+4EEIQAo/bTr0eSQ+qF0LwU7uwbrP49jC9hD6zt0D5Cy2PtWFu KLELwVCI/ltV8T6TJgWXufDNRGY4lLDz+qRike3p4MnI7DRGnBMaoRNuF9QPwukC b8rSIf4MXxpEhAlBf3F3Spll2ZHU+w/wPp60i1lMmkwTCpOIsAkpXYW+Q/+HjHYw oW0a2npFu0csU8jbhlmTD57r9zoMk2G1NZpdX+2wCP4EnRIf9Arxg== Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmv5j814k-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:24 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDNxAf695613; Fri, 18 Sep 2026 13:31:23 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gra3fek7h-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:23 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay02.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVCeh48103896 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:13 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id DB1D120040; Fri, 18 Sep 2026 13:31:12 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 827682004D; Fri, 18 Sep 2026 13:31:12 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:12 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 13/29] KVM: arm64: Access elements of vcpu_gp_regs individually Date: Fri, 18 Sep 2026 15:30:50 +0200 Message-ID: <20260918133107.1042730-14-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfXy6IdVay5VOV+ e3MmoMNok4Gw42Q3Mz7wgwbH4AUC/LCcV7E+W/wi/jlfVc5XCU/IchaapkVrT5t6QabUBRHUqnz IsIl8qdS2HMuqyKF9FHnsvlhHeXxwbPhXdfU1s2BDii9nHac1CpDeg8f32BYb0i59w2WVn9xOIj M6h4VTOfZ4z0bU26zJ+T2zTQ91qTy/emJi5SP4dikf+7wurppLES1NjneC7AEes7Sevy9VFrI/R vdrSbWjbJOHP7s8R99VDLIyjLDME7hSGYZW9Nq04smVUidLs/G6FqODlRZejl+vrqHFd20+ft2D 6dYxz637Mv097ZA6Y7CV1UVPu63YcoRaZaISTXJihiJzWlj5iG3wV3M7LBjD6BgvaritUlsqiKA roYp0+5GmWykJRW4ba+bDwnqZBv6bbrWp9Vj+s4rlLSavA1m5Gvmtxk88drseEz7f/XQN1MEZ+o yPxBoV/Dxf03rO1l1yQ== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX8vdrwBBt9wLD K8IQU+qUe5Dj8mpJwhzKVUV+P3hYF+pedTzrspKrGICvl1pyT0tLISonhbnOaEF/BsYw5QzW+Sd GIyqYGhb3mmyEOE0SL0Pg+Pwgv2FLSo= X-Authority-Analysis: v=2.4 cv=Zsx4uN7G c=1 sm=1 tr=0 ts=6aad3d2c cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VnNF1IyMAAAA:8 a=2bnsYzwZQeDic6pRC-MA:9 X-Proofpoint-ORIG-GUID: s9eu1dlonEWwz8qODihA8Tu4nnYtV55f X-Proofpoint-GUID: CyBk7QD1nSKWXwM7b1MZHoOFoswpNzm7 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 impostorscore=0 clxscore=1015 priorityscore=1501 lowpriorityscore=0 bulkscore=0 adultscore=0 phishscore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" While for arm64 the members of vcpu_gp_regs are allocated continuous this is not necessarily true for other architectures implementing ARM. Let vcpu_gp_regs() no longer return the address of the user_pt_regs in the vcpu context but the address of the gp-register array field in the user_pt_reg struct. Note, this change semantically excludes pc from the GPRs. No functional change. Co-developed-by: Nina Schoetterl-Glausch Signed-off-by: Nina Schoetterl-Glausch Signed-off-by: Steffen Eiden --- arch/arm64/include/asm/kvm_emulate.h | 14 ++++++++------ arch/arm64/include/asm/kvm_host.h | 2 +- arch/arm64/kvm/guest.c | 2 +- arch/arm64/kvm/hyp/exception.c | 4 ++-- arch/arm64/kvm/hyp/include/hyp/adjust_pc.h | 4 ++-- arch/arm64/kvm/hyp/include/hyp/switch.h | 4 ++-- 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/arch/arm64/include/asm/kvm_emulate.h b/arch/arm64/include/asm/= kvm_emulate.h index a3c1928bdf74..8603766c1b4d 100644 --- a/arch/arm64/include/asm/kvm_emulate.h +++ b/arch/arm64/include/asm/kvm_emulate.h @@ -133,12 +133,12 @@ static inline void vcpu_set_vsesr(struct kvm_vcpu *vc= pu, u64 vsesr) =20 static __always_inline unsigned long *vcpu_pc(const struct kvm_vcpu *vcpu) { - return (unsigned long *)&vcpu_gp_regs(vcpu)->pc; + return (unsigned long *)&vcpu->arch.ctxt.regs.pc; } =20 static __always_inline unsigned long *vcpu_cpsr(const struct kvm_vcpu *vcp= u) { - return (unsigned long *)&vcpu_gp_regs(vcpu)->pstate; + return (unsigned long *)&vcpu->arch.ctxt.regs.pstate; } =20 static __always_inline bool vcpu_mode_is_32bit(const struct kvm_vcpu *vcpu) @@ -167,14 +167,14 @@ static inline void vcpu_set_thumb(struct kvm_vcpu *vc= pu) static __always_inline unsigned long vcpu_get_reg(const struct kvm_vcpu *v= cpu, u8 reg_num) { - return (reg_num =3D=3D 31) ? 0 : vcpu_gp_regs(vcpu)->regs[reg_num]; + return (reg_num =3D=3D 31) ? 0 : vcpu_gp_regs(vcpu)[reg_num]; } =20 static __always_inline void vcpu_set_reg(struct kvm_vcpu *vcpu, u8 reg_num, unsigned long val) { if (reg_num !=3D 31) - vcpu_gp_regs(vcpu)->regs[reg_num] =3D val; + vcpu_gp_regs(vcpu)[reg_num] =3D val; } =20 static inline bool vcpu_is_el2_ctxt(const struct kvm_cpu_context *ctxt) @@ -750,13 +750,15 @@ static inline void kvm_reset_vcpu_core(struct kvm_vcp= u *vcpu) pstate =3D VCPU_RESET_PSTATE_EL1; =20 /* Reset core registers */ - memset(vcpu_gp_regs(vcpu), 0, sizeof(*vcpu_gp_regs(vcpu))); + memset(vcpu_gp_regs(vcpu), 0, sizeof(vcpu_gp_regs(vcpu))); + *vcpu_pc(vcpu) =3D 0; + vcpu->arch.ctxt.regs.sp =3D 0; memset(&vcpu->arch.ctxt.fp_regs, 0, sizeof(vcpu->arch.ctxt.fp_regs)); vcpu->arch.ctxt.spsr_abt =3D 0; vcpu->arch.ctxt.spsr_und =3D 0; vcpu->arch.ctxt.spsr_irq =3D 0; vcpu->arch.ctxt.spsr_fiq =3D 0; - vcpu_gp_regs(vcpu)->pstate =3D pstate; + *vcpu_cpsr(vcpu) =3D pstate; } =20 /* PSCI reset handling for a vcpu. */ diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm= _host.h index 9c314d0568b1..fc0037efa0b4 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -1161,7 +1161,7 @@ struct kvm_vcpu_arch { #define vcpu_clear_on_unsupported_cpu(vcpu) \ vcpu_clear_flag(vcpu, ON_UNSUPPORTED_CPU) =20 -#define vcpu_gp_regs(v) (&(v)->arch.ctxt.regs) +#define vcpu_gp_regs(v) ((v)->arch.ctxt.regs.regs) =20 /* * Only use __vcpu_sys_reg/ctxt_sys_reg if you know you want the diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c index b01d6622b872..81d850d5a328 100644 --- a/arch/arm64/kvm/guest.c +++ b/arch/arm64/kvm/guest.c @@ -134,7 +134,7 @@ static void *core_reg_addr(struct kvm_vcpu *vcpu, const= struct kvm_one_reg *reg) KVM_REG_ARM_CORE_REG(regs.regs[30]): off -=3D KVM_REG_ARM_CORE_REG(regs.regs[0]); off /=3D 2; - return &vcpu->arch.ctxt.regs.regs[off]; + return &vcpu_gp_regs(vcpu)[off]; =20 case KVM_REG_ARM_CORE_REG(regs.sp): return &vcpu->arch.ctxt.regs.sp; diff --git a/arch/arm64/kvm/hyp/exception.c b/arch/arm64/kvm/hyp/exception.c index 754e2dc1df54..0640c9ccaa3c 100644 --- a/arch/arm64/kvm/hyp/exception.c +++ b/arch/arm64/kvm/hyp/exception.c @@ -276,12 +276,12 @@ static void enter_exception32(struct kvm_vcpu *vcpu, = u32 mode, u32 vect_offset) switch(mode) { case PSR_AA32_MODE_ABT: __vcpu_write_spsr_abt(vcpu, host_spsr_to_spsr32(spsr)); - vcpu_gp_regs(vcpu)->compat_lr_abt =3D return_address; + vcpu_gp_regs(vcpu)[__compat_lr_abt] =3D return_address; break; =20 case PSR_AA32_MODE_UND: __vcpu_write_spsr_und(vcpu, host_spsr_to_spsr32(spsr)); - vcpu_gp_regs(vcpu)->compat_lr_und =3D return_address; + vcpu_gp_regs(vcpu)[__compat_lr_und] =3D return_address; break; } =20 diff --git a/arch/arm64/kvm/hyp/include/hyp/adjust_pc.h b/arch/arm64/kvm/hy= p/include/hyp/adjust_pc.h index 4fdfeabefeb4..a049983bd5c3 100644 --- a/arch/arm64/kvm/hyp/include/hyp/adjust_pc.h +++ b/arch/arm64/kvm/hyp/include/hyp/adjust_pc.h @@ -33,11 +33,11 @@ static inline void kvm_skip_instr(struct kvm_vcpu *vcpu) static inline void __kvm_skip_instr(struct kvm_vcpu *vcpu) { *vcpu_pc(vcpu) =3D read_sysreg_el2(SYS_ELR); - vcpu_gp_regs(vcpu)->pstate =3D read_sysreg_el2(SYS_SPSR); + *vcpu_cpsr(vcpu) =3D read_sysreg_el2(SYS_SPSR); =20 kvm_skip_instr(vcpu); =20 - write_sysreg_el2(vcpu_gp_regs(vcpu)->pstate, SYS_SPSR); + write_sysreg_el2(*vcpu_cpsr(vcpu), SYS_SPSR); write_sysreg_el2(*vcpu_pc(vcpu), SYS_ELR); } =20 diff --git a/arch/arm64/kvm/hyp/include/hyp/switch.h b/arch/arm64/kvm/hyp/i= nclude/hyp/switch.h index 1ce7130e2549..a2a054fec2e2 100644 --- a/arch/arm64/kvm/hyp/include/hyp/switch.h +++ b/arch/arm64/kvm/hyp/include/hyp/switch.h @@ -470,7 +470,7 @@ static inline bool kvm_hyp_handle_mops(struct kvm_vcpu = *vcpu, u64 *exit_code) u64 spsr; =20 *vcpu_pc(vcpu) =3D read_sysreg_el2(SYS_ELR); - arm64_mops_reset_regs(vcpu_gp_regs(vcpu), vcpu->arch.fault.esr_el2); + arm64_mops_reset_regs(&vcpu->arch.ctxt.regs, vcpu->arch.fault.esr_el2); write_sysreg_el2(*vcpu_pc(vcpu), SYS_ELR); =20 /* @@ -902,7 +902,7 @@ static inline void synchronize_vcpu_pstate(struct kvm_v= cpu *vcpu) /* * Check for the conditions of Cortex-A510's #2077057. When these occur * SPSR_EL2 can't be trusted, but isn't needed either as it is - * unchanged from the value in vcpu_gp_regs(vcpu)->pstate. + * unchanged from the value in vcpu_cpsr(vcpu). * Are we single-stepping the guest, and took a PAC exception from the * active-not-pending state? */ --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7A7624F93D8; Fri, 18 Sep 2026 13:32:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738327; cv=none; b=citoiTar9jJe5vlElBR4n4936ksWv80e8uO5tAMkQZnZ+NkubhkvAVuqc7XtElZ5cuwnrs6u3ivnc8/f6RJIlaZ7bQ1P8pqR6enr5F1zOEEizUo12+k71EvCIZdfdfM1onSbhG1sH0n9JMntaxZwbiP6FGmtu9F9amVjw9UF2qg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738327; c=relaxed/simple; bh=7Cd/fFREaMB8379rYlVP3WMtKJL+r2XoUjKHJBkVZ1A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=slvb/BHSmtOrs/Fnoagfo7ygAJ4v+GHnJTOXipxbxm5JLOkN/A9zvblE0TBci5Vb9Fj8jJPWm4VKK3nHFI7ywdTSlXj1/2HK8xtdnYdHnYZiBBeRoVxsevCjJi4kh2cbAz9YxOlA+e8ivpw6WgpDcPhDgIz8zxPueiBUUxqh988= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=pdQXN12d; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="pdQXN12d" Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA1eGB3979474; Fri, 18 Sep 2026 13:31:22 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=7Kq4FY8QEDk1BLA1w cKf1js43+qFWt5S2y+8get5iaY=; b=pdQXN12dx8LQJWGWwVofN+K+fRKSW7a/R Jjox1sUdvFoug4dhe9k1Ow8p2RYjr368VfDxRyEbBI1mMqpdPtXGHM+/W6s+uUj3 91hWkukaQPLIxzTNS9LIqQH+pBN6nU0HW0PRk3Wx1JWyDrXxIHkDxpoVvaUxSWyI 8c5h7YEXe852aa/HiCAjSHZ+DTVSdWMhJVnbgahO5hX3Ao+bbRfvto2nJOxK4YsV OOEiyC1gpV5ftA4LM7d3rCDHFjlZkdAE7dLdQ/ONpQSWLKTtiD0+hUB44HbkjV/Q BiStOr/11ZaG5CVfepb+TfKJcMnc/5F32fY1Rp+7sOrjsU+x6vJEA== Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmw5eftsr-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:21 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDNxAe695613; Fri, 18 Sep 2026 13:31:21 GMT Received: from smtprelay03.fra02v.mail.ibm.com ([9.218.2.224]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gra3fek7d-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:21 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay03.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVDO543123018 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:13 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 39C7E20040; Fri, 18 Sep 2026 13:31:13 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E0BFE2004B; Fri, 18 Sep 2026 13:31:12 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:12 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 14/29] KVM: arm64: Use accessor functions for core regs Date: Fri, 18 Sep 2026 15:30:51 +0200 Message-ID: <20260918133107.1042730-15-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfXxnSVzOquEoRT Ge43JShlD0pjtnWWebUghNqP9gI3ITcEhuekJvArIv5S1ZwuRgbTnctrJLA2olnTVViNt6aGVaW 32tSWtdnChEvMi4sXJh+cbHrs2XfhWEYyx/J+2gs2jYE71dtbvrE5QFCpa/+gS+kgkzjXcQ10a0 Mi64ROvd+RR/XnpMkmu15Iu+bl8aZRoJBZxARvyEjhznjZMC8RLmfNFwgx2hqjFTLsNFS26I0kF kcRwreLQ3pdUKmfFeBf6Kt2pxm9/MG0e08iYn988Unqp0AgCNGCtmLAJn+6VCHrpC5VtGLu5kNu E6i470YV3qAPueFAfHbpIwb7aFETtqdkWA/WH37LLAgVfrGsoBKaay8rvGjCQTXqvLSq6rCe5wT FzoVhXl3kPxl4PmMnqC+GHdrDx7nahAdqORBcKj3OP+JEADf6jPZrZcXJ8N9KdF0sEZLM1C2c/i pmdT6lt0S0dyEIZ4Dgw== X-Authority-Analysis: v=2.4 cv=E/NYNqdl c=1 sm=1 tr=0 ts=6aad3d2a cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VnNF1IyMAAAA:8 a=5d8JqmD_1xC0DvqtPZgA:9 X-Proofpoint-ORIG-GUID: qcCBgPh0KK7EETcpVsndmPWRjc1yAd5c X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX5Vtcu3rwuL/T 56miinYwUq6J9X1g/b7W7JPeFyVgJmrBwdRvjeK9uPvC6B7FBsj2zPqNyvcijZepL9SlUuVBx9U /Jee2B1JI1rV8yhGbOtaNSNApC8DFfs= X-Proofpoint-GUID: 1seeCj-Vufx83P-PhTYJVU21v1hkxc78 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 priorityscore=1501 spamscore=0 adultscore=0 clxscore=1015 bulkscore=0 malwarescore=0 suspectscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" Instead of accessing the value directly use assessor function that abstract the actual location of the register values. Add a helper function to reset fpsimd registers. Enables other KVM implementations to reuse this code. No functional changes. Signed-off-by: Steffen Eiden --- arch/arm64/include/asm/kvm_emulate.h | 34 ++++++++++++++++++++++++++-- arch/arm64/kvm/guest.c | 14 ++++++------ 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/arch/arm64/include/asm/kvm_emulate.h b/arch/arm64/include/asm/= kvm_emulate.h index 8603766c1b4d..b31d50bdf59e 100644 --- a/arch/arm64/include/asm/kvm_emulate.h +++ b/arch/arm64/include/asm/kvm_emulate.h @@ -141,6 +141,31 @@ static __always_inline unsigned long *vcpu_cpsr(const = struct kvm_vcpu *vcpu) return (unsigned long *)&vcpu->arch.ctxt.regs.pstate; } =20 +static __always_inline unsigned long *vcpu_sp_el0(struct kvm_vcpu *vcpu) +{ + return (unsigned long *)&vcpu->arch.ctxt.regs.sp; +} + +static __always_inline u64 *vcpu_sp_el1(struct kvm_vcpu *vcpu) +{ + return __ctxt_sys_reg(&vcpu->arch.ctxt, SP_EL1); +} + +static __always_inline __u128 *vcpu_vreg(struct kvm_vcpu *vcpu, int n) +{ + return &vcpu->arch.ctxt.fp_regs.vregs[n]; +} + +static __always_inline __u32 *vcpu_fpsr(struct kvm_vcpu *vcpu) +{ + return &vcpu->arch.ctxt.fp_regs.fpsr; +} + +static __always_inline __u32 *vcpu_fpcr(struct kvm_vcpu *vcpu) +{ + return &vcpu->arch.ctxt.fp_regs.fpcr; +} + static __always_inline bool vcpu_mode_is_32bit(const struct kvm_vcpu *vcpu) { return !!(*vcpu_cpsr(vcpu) & PSR_MODE32_BIT); @@ -737,6 +762,11 @@ static inline void vcpu_set_hcrx(struct kvm_vcpu *vcpu) } } =20 +static inline void kvm_reset_fpsimd(struct kvm_vcpu *vcpu) +{ + memset(&vcpu->arch.ctxt.fp_regs, 0, sizeof(vcpu->arch.ctxt.fp_regs)); +} + /* Reset a vcpu's core registers. */ static inline void kvm_reset_vcpu_core(struct kvm_vcpu *vcpu) { @@ -752,8 +782,8 @@ static inline void kvm_reset_vcpu_core(struct kvm_vcpu = *vcpu) /* Reset core registers */ memset(vcpu_gp_regs(vcpu), 0, sizeof(vcpu_gp_regs(vcpu))); *vcpu_pc(vcpu) =3D 0; - vcpu->arch.ctxt.regs.sp =3D 0; - memset(&vcpu->arch.ctxt.fp_regs, 0, sizeof(vcpu->arch.ctxt.fp_regs)); + *vcpu_sp_el0(vcpu) =3D 0; + kvm_reset_fpsimd(vcpu); vcpu->arch.ctxt.spsr_abt =3D 0; vcpu->arch.ctxt.spsr_und =3D 0; vcpu->arch.ctxt.spsr_irq =3D 0; diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c index 81d850d5a328..773f6c8e5026 100644 --- a/arch/arm64/kvm/guest.c +++ b/arch/arm64/kvm/guest.c @@ -137,16 +137,16 @@ static void *core_reg_addr(struct kvm_vcpu *vcpu, con= st struct kvm_one_reg *reg) return &vcpu_gp_regs(vcpu)[off]; =20 case KVM_REG_ARM_CORE_REG(regs.sp): - return &vcpu->arch.ctxt.regs.sp; + return vcpu_sp_el0(vcpu); =20 case KVM_REG_ARM_CORE_REG(regs.pc): - return &vcpu->arch.ctxt.regs.pc; + return vcpu_pc(vcpu); =20 case KVM_REG_ARM_CORE_REG(regs.pstate): - return &vcpu->arch.ctxt.regs.pstate; + return vcpu_cpsr(vcpu); =20 case KVM_REG_ARM_CORE_REG(sp_el1): - return __ctxt_sys_reg(&vcpu->arch.ctxt, SP_EL1); + return vcpu_sp_el1(vcpu); =20 case KVM_REG_ARM_CORE_REG(elr_el1): return __ctxt_sys_reg(&vcpu->arch.ctxt, ELR_EL1); @@ -170,13 +170,13 @@ static void *core_reg_addr(struct kvm_vcpu *vcpu, con= st struct kvm_one_reg *reg) KVM_REG_ARM_CORE_REG(fp_regs.vregs[31]): off -=3D KVM_REG_ARM_CORE_REG(fp_regs.vregs[0]); off /=3D 4; - return &vcpu->arch.ctxt.fp_regs.vregs[off]; + return vcpu_vreg(vcpu, off); =20 case KVM_REG_ARM_CORE_REG(fp_regs.fpsr): - return &vcpu->arch.ctxt.fp_regs.fpsr; + return vcpu_fpsr(vcpu); =20 case KVM_REG_ARM_CORE_REG(fp_regs.fpcr): - return &vcpu->arch.ctxt.fp_regs.fpcr; + return vcpu_fpcr(vcpu); =20 default: return NULL; --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 090CA51589B; Fri, 18 Sep 2026 13:32:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738364; cv=none; b=SCPHcqZHnN+zHzmnoe8l4fv8ad0SsqXPg/EO8STORUJNAgSTVAQ46kYcfDniaxkSTJZyDwR+r/CY7iuiV/Ss5Ce+CDNdjAmRzMLmtBKpFa3FNEBfxhLaWL3Jl5XkoGYMp5DsDTl4WgQTUyiNTfWv4eYvvANOwH0+3q6sn430rdM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738364; c=relaxed/simple; bh=c/unfFO0wpLkEETmC6oL5JSbYdJjOzUINj3qv6pISVA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=S4z5c1sepJR9zcYgjt5PFujKwZMmmjjcrS5t+OdyirpCPlofaD8+hv9RiF28XOqVnREWfpn5QUEgE6XlyT8l6DlRq90CqThVCGHw1JhF72s1IcoRkUkSk3jk1w24Lv0Pr6zCjVqqtIp5VvRkKwuRN5gvicaCJ7l0oM2WR+ATTG0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=FyqF6NYL; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="FyqF6NYL" Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA2mJQ990983; Fri, 18 Sep 2026 13:31:22 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=Hu+tOFnh7eUsXs+94 Bur6LcBVUOTmAqViyjecbougC8=; b=FyqF6NYLX5usZF3CkBbC/xRwjQTHYOUZb 813oSo8MMMpdg9r/oJjKDJUnMGWAgpeKTHgT9UTjcJDZEivVZGGh9p/KmZiKTxAi 1lYK6aBsGmap7JyxfaC++EhPyyOzDqTky6u4i1tAj2KU841wlvPNdtvnteEdBiOF hcFJ3UnUzfmfwrVKF4WK+7P/KPK3mvSCinWJ16DElVri5AMeb/p4kTyi0eAfIXRI z8gxMJyRIm7nxYdNsBy5Wcto7R/KlHPHzb5A4SBQ9/BvPF/ilY9jGQCqQMIZiuEb XXRGshZDnT4MooP2wPeeE6xACgMhrHDpTc8+q3wFR1Bl2+2z5ZGZw== Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmxcvfnpj-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:21 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDNrpI777356; Fri, 18 Sep 2026 13:31:20 GMT Received: from smtprelay03.fra02v.mail.ibm.com ([9.218.2.224]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gra3yxkbu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:20 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay03.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVDv543123022 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:13 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 95C0120040; Fri, 18 Sep 2026 13:31:13 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4002B20049; Fri, 18 Sep 2026 13:31:13 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:13 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 15/29] arm64: Prepare sharing arm64 headers with s390 Date: Fri, 18 Sep 2026 15:30:52 +0200 Message-ID: <20260918133107.1042730-16-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX6xQQ+Iq8q/BW 9jawpEut8GzAYhM+YaDcmE3A3i9+Zlidtnl4XUuH+pQuE0ZhY7zJ4DA47GGJ8b6m9SMx+Fkaf3+ 6+/IHZuL+RaEOfwL5i3ccB92V03owc0= X-Proofpoint-ORIG-GUID: vnzME8dN8chmiJtNzEajdacSnFZnEw7T X-Proofpoint-GUID: 0DGdP1w6oakJ2jbw5RTH_vaNrWexvxC2 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX5ka60DZuOBQp 8ATF56QAOBSx8G8xFTvm4Kn+BcxAAX0cphwIodF9NvOEVQI7Q7S90+Nh5VMwkgMJNKoXHqMrEom x8KaBou4j7dslVjW/zkYxaNwolXxTpqAgaezH6Hp/drrA0idii5024JqRGZJz6jWRSO2kJBxPdB wGUZWG7gU7Tz4vJZVMtWwQdjff/SMlT6powk0Z9S8MSmYUxM31Ujq+i8sVL4UnW22i3Ivj0M15y XSIAG72eGWpFCx/g9SUSz2D5UImsMwYrlm+bJZBXRlBfUYfJS4lx6xiVZnPVPVyqH7N17/qwFii Ysi54Kzfjo7qrxpA/pknSR8kYmY2HNDQd+hS4TUPhqo3cG2lG9noP+BrWpJGUbvTx3Xb9+ag6lp x7W1hkhku+SR+mzeJS+fHkKMjNh9XXU6ovG1iMw22rrEg6Q8v1FTOP6CLPf81yxjPUDEBw8ETPs JaKh0qPF7dJfGNfH5IQ== X-Authority-Analysis: v=2.4 cv=F+7C5ahN c=1 sm=1 tr=0 ts=6aad3d29 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VnNF1IyMAAAA:8 a=eg9QoaqSYRrbe55da3AA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 phishscore=0 clxscore=1015 malwarescore=0 lowpriorityscore=0 bulkscore=0 spamscore=0 impostorscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" Prepare the sharing of arm64 headers with s390 by moving definitions inside headers to reduce the number of shared markers. Clean up includes to further streamline the sharing of headers. No functional change. Signed-off-by: Steffen Eiden --- arch/arm64/include/asm/esr.h | 4 +- arch/arm64/include/asm/kvm_arm.h | 5 +- arch/arm64/include/asm/kvm_emulate.h | 5 +- arch/arm64/include/asm/kvm_host.h | 102 ++++++++++++++------------- arch/arm64/include/asm/sysreg.h | 2 +- 5 files changed, 62 insertions(+), 56 deletions(-) diff --git a/arch/arm64/include/asm/esr.h b/arch/arm64/include/asm/esr.h index f816f5d77f1a..da085c83b57e 100644 --- a/arch/arm64/include/asm/esr.h +++ b/arch/arm64/include/asm/esr.h @@ -7,7 +7,7 @@ #ifndef __ASM_ESR_H #define __ASM_ESR_H =20 -#include +#include #include =20 #define ESR_ELx_EC_UNKNOWN UL(0x00) @@ -435,7 +435,7 @@ #define ESR_ELx_IT_GCSPOPX 7 =20 #ifndef __ASSEMBLER__ -#include +#include =20 static inline unsigned long esr_brk_comment(unsigned long esr) { diff --git a/arch/arm64/include/asm/kvm_arm.h b/arch/arm64/include/asm/kvm_= arm.h index 4bfbd827c5aa..57edd8437200 100644 --- a/arch/arm64/include/asm/kvm_arm.h +++ b/arch/arm64/include/asm/kvm_arm.h @@ -7,10 +7,11 @@ #ifndef __ARM64_KVM_ARM_H__ #define __ARM64_KVM_ARM_H__ =20 +#include +#include +#include #include -#include #include -#include =20 /* * Because I'm terribly lazy and that repainting the whole of the KVM diff --git a/arch/arm64/include/asm/kvm_emulate.h b/arch/arm64/include/asm/= kvm_emulate.h index b31d50bdf59e..a34a9417ff4d 100644 --- a/arch/arm64/include/asm/kvm_emulate.h +++ b/arch/arm64/include/asm/kvm_emulate.h @@ -44,11 +44,12 @@ enum exception_type { bool kvm_condition_valid32(const struct kvm_vcpu *vcpu); void kvm_skip_instr32(struct kvm_vcpu *vcpu); =20 +int kvm_inject_dabt_excl_atomic(struct kvm_vcpu *vcpu, u64 addr); +int kvm_inject_serror_esr(struct kvm_vcpu *vcpu, u64 esr); + void kvm_inject_undefined(struct kvm_vcpu *vcpu); void kvm_inject_sync(struct kvm_vcpu *vcpu, u64 esr); -int kvm_inject_serror_esr(struct kvm_vcpu *vcpu, u64 esr); int kvm_inject_sea(struct kvm_vcpu *vcpu, bool iabt, u64 addr); -int kvm_inject_dabt_excl_atomic(struct kvm_vcpu *vcpu, u64 addr); void kvm_inject_size_fault(struct kvm_vcpu *vcpu); =20 static inline int kvm_inject_sea_dabt(struct kvm_vcpu *vcpu, u64 addr) diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm= _host.h index fc0037efa0b4..1e48af601f9d 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -59,6 +59,46 @@ #define KVM_REQ_MAP_L1_VNCR_EL2 KVM_ARCH_REQ(10) #define KVM_REQ_VGIC_PROCESS_UPDATE KVM_ARCH_REQ(11) =20 +/* Bit indices for kvm_arch::flags */ +enum { + /* + * If we encounter a data abort without valid instruction syndrome + * information, report this to user space. User space can (and + * should) opt in to this feature if KVM_CAP_ARM_NISV_TO_USER is + * supported. + */ + KVM_ARCH_FLAG_RETURN_NISV_IO_ABORT_TO_USER, + /* Memory Tagging Extension enabled for the guest */ + KVM_ARCH_FLAG_MTE_ENABLED, + /* At least one vCPU has ran in the VM */ + KVM_ARCH_FLAG_HAS_RAN_ONCE, + /* The vCPU feature set for the VM is configured */ + KVM_ARCH_FLAG_VCPU_FEATURES_CONFIGURED, + /* PSCI SYSTEM_SUSPEND enabled for the guest */ + KVM_ARCH_FLAG_SYSTEM_SUSPEND_ENABLED, + /* VM counter offset */ + KVM_ARCH_FLAG_VM_COUNTER_OFFSET, + /* Timer PPIs made immutable */ + KVM_ARCH_FLAG_TIMER_PPIS_IMMUTABLE, + /* Initial ID reg values loaded */ + KVM_ARCH_FLAG_ID_REGS_INITIALIZED, + /* Fine-Grained UNDEF initialised */ + KVM_ARCH_FLAG_FGU_INITIALIZED, + /* SVE exposed to guest */ + KVM_ARCH_FLAG_GUEST_HAS_SVE, + /* MIDR_EL1, REVIDR_EL1, and AIDR_EL1 are writable from userspace */ + KVM_ARCH_FLAG_WRITABLE_IMP_ID_REGS, + /* Unhandled SEAs are taken to userspace */ + KVM_ARCH_FLAG_EXIT_SEA, +}; + +struct vcpu_reset_state { + unsigned long pc; + unsigned long r0; + bool be; + bool reset; +}; + #define KVM_DIRTY_LOG_MANUAL_CAPS (KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE |= \ KVM_DIRTY_LOG_INITIALLY_SET) =20 @@ -341,35 +381,6 @@ struct kvm_arch { /* Protects VM-scoped configuration data */ struct mutex config_lock; =20 - /* - * If we encounter a data abort without valid instruction syndrome - * information, report this to user space. User space can (and - * should) opt in to this feature if KVM_CAP_ARM_NISV_TO_USER is - * supported. - */ -#define KVM_ARCH_FLAG_RETURN_NISV_IO_ABORT_TO_USER 0 - /* Memory Tagging Extension enabled for the guest */ -#define KVM_ARCH_FLAG_MTE_ENABLED 1 - /* At least one vCPU has ran in the VM */ -#define KVM_ARCH_FLAG_HAS_RAN_ONCE 2 - /* The vCPU feature set for the VM is configured */ -#define KVM_ARCH_FLAG_VCPU_FEATURES_CONFIGURED 3 - /* PSCI SYSTEM_SUSPEND enabled for the guest */ -#define KVM_ARCH_FLAG_SYSTEM_SUSPEND_ENABLED 4 - /* VM counter offset */ -#define KVM_ARCH_FLAG_VM_COUNTER_OFFSET 5 - /* Timer PPIs made immutable */ -#define KVM_ARCH_FLAG_TIMER_PPIS_IMMUTABLE 6 - /* Initial ID reg values loaded */ -#define KVM_ARCH_FLAG_ID_REGS_INITIALIZED 7 - /* Fine-Grained UNDEF initialised */ -#define KVM_ARCH_FLAG_FGU_INITIALIZED 8 - /* SVE exposed to guest */ -#define KVM_ARCH_FLAG_GUEST_HAS_SVE 9 - /* MIDR_EL1, REVIDR_EL1, and AIDR_EL1 are writable from userspace */ -#define KVM_ARCH_FLAG_WRITABLE_IMP_ID_REGS 10 - /* Unhandled SEAs are taken to userspace */ -#define KVM_ARCH_FLAG_EXIT_SEA 11 unsigned long flags; =20 /* VM-wide vCPU feature set */ @@ -838,13 +849,6 @@ extern s64 kvm_nvhe_sym(hyp_physvirt_offset); extern u64 kvm_nvhe_sym(hyp_cpu_logical_map)[NR_CPUS]; #define hyp_cpu_logical_map CHOOSE_NVHE_SYM(hyp_cpu_logical_map) =20 -struct vcpu_reset_state { - unsigned long pc; - unsigned long r0; - bool be; - bool reset; -}; - struct vncr_tlb; =20 struct kvm_vcpu_arch { @@ -1049,6 +1053,11 @@ struct kvm_vcpu_arch { /* pKVM VCPU setup completed */ #define VCPU_PKVM_FINALIZED __vcpu_single_flag(cflags, BIT(2)) =20 +int kvm_arm_vcpu_finalize(struct kvm_vcpu *vcpu, int feature); +bool kvm_arm_vcpu_is_finalized(struct kvm_vcpu *vcpu); + +#define kvm_arm_vcpu_sve_finalized(vcpu) vcpu_get_flag(vcpu, VCPU_SVE_FINA= LIZED) + /* Exception pending */ #define PENDING_EXCEPTION __vcpu_single_flag(iflags, BIT(0)) /* @@ -1242,14 +1251,6 @@ struct kvm_vcpu_stat { u64 exits; }; =20 -unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu); -int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *indices); -int kvm_arm_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg); -int kvm_arm_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg); - -unsigned long kvm_arm_num_sys_reg_descs(struct kvm_vcpu *vcpu); -int kvm_arm_copy_sys_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindic= es); - int __kvm_arm_vcpu_get_events(struct kvm_vcpu *vcpu, struct kvm_vcpu_events *events); =20 @@ -1328,6 +1329,14 @@ int __init populate_nv_trap_config(void); =20 void kvm_calculate_traps(struct kvm_vcpu *vcpu); =20 +unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu); +int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *indices); +int kvm_arm_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg); +int kvm_arm_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg); + +unsigned long kvm_arm_num_sys_reg_descs(struct kvm_vcpu *vcpu); +int kvm_arm_copy_sys_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindic= es); + /* MMIO helpers */ void kvm_mmio_write_buf(void *buf, unsigned int len, unsigned long data); unsigned long kvm_mmio_read_buf(const void *buf, unsigned int len); @@ -1511,11 +1520,6 @@ struct kvm *kvm_arch_alloc_vm(void); =20 #define vcpu_is_protected(vcpu) kvm_vm_is_protected((vcpu)->kvm) =20 -int kvm_arm_vcpu_finalize(struct kvm_vcpu *vcpu, int feature); -bool kvm_arm_vcpu_is_finalized(struct kvm_vcpu *vcpu); - -#define kvm_arm_vcpu_sve_finalized(vcpu) vcpu_get_flag(vcpu, VCPU_SVE_FINA= LIZED) - #define kvm_has_mte(kvm) \ (system_supports_mte() && \ test_bit(KVM_ARCH_FLAG_MTE_ENABLED, &(kvm)->arch.flags)) diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysre= g.h index 1aa601c95188..ab205f9db94a 100644 --- a/arch/arm64/include/asm/sysreg.h +++ b/arch/arm64/include/asm/sysreg.h @@ -1263,6 +1263,6 @@ FIELD_PREP(reg##_##field##_MASK, \ SYS_FIELD_VALUE(reg, field, val)) =20 -#endif +#endif /* __ASSEMBLER__ */ =20 #endif /* __ASM_SYSREG_H */ --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 10A6C4FD780; Fri, 18 Sep 2026 13:32:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738325; cv=none; b=PVHtr8aHrO1GXDHqeV6W3USxv5z08/eswhdUiBjgD3N4uFOw283mnfLQe22fhtCkrfxIgFFFL8EprvFF8BgAGtMuLlZuOjQb0nS8qHoBqSnbNtR87T8di4f1ey5FA3Pb5IvgUSfcv5bdqt8DAfLeIuPr3m0yVnltMasJMzdJfkE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738325; c=relaxed/simple; bh=QJF71c7yQpVbqVyezHbfAI7VA2N1gNHCRZIDk6mPOyQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rtaGsZ8i/PAGzzh9BjynR/+QzzJigGR9bnCTySxQSlT4CygJOGLP1SoUldBHAwQTqZXXarTOg9YmgYP1NJ279t7e6fJEBia7rxGKUx7ACDAm5jukfxcehW2p99tN77BUaeISrLLXy8ag9zDH8yzcFHiVQb/5u4iDut9gmnhjqKg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=qdj8ZQsl; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="qdj8ZQsl" Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDVPO41378493; Fri, 18 Sep 2026 13:31:25 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=yiMS/CFP+QrddSFq3 J7o3VNlhfAMYOMVoHKDiHTe7T0=; b=qdj8ZQsli8/iHb397tnJF5+swRdMw/EOk e1HghUyTx0dmFR7tW0pNZSgkkKd68UfbC0D4IBawPMddMK5Nw5PVODhD2+AB3P+d vHAs4BeVNdvDIOt7MJzRuiOKaXquHVglGk23kilvv8BasRSP2f+f9LDU/1v2OiKB 1p1IGvR2bDKaL1+ucXhqUk/Ok8Vh6LeweM900pnPswp9DI2dloNVm8C/VmgyqqwC MmSvzqbeGAX7cwvp+oF03x36xQoIzBtuIZHzrkJOPDiuCB7Asfb3x1VIBw3ekcff AEwHV8LL+rkV9tEaRM8YrT3HDjkCHXCYbW7c91wpAFLKj0vsJZL0w== Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmx848a67-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:24 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDNxX0739495; Fri, 18 Sep 2026 13:31:21 GMT Received: from smtprelay04.fra02v.mail.ibm.com ([9.218.2.228]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gs56q88u7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:21 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay04.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVE9J14156124 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:14 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id F265720040; Fri, 18 Sep 2026 13:31:13 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9BF532004B; Fri, 18 Sep 2026 13:31:13 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:13 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 16/29] arm64: Share arm64 headers with s390 Date: Fri, 18 Sep 2026 15:30:53 +0200 Message-ID: <20260918133107.1042730-17-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE5MiBTYWx0ZWRfXwTbv/KhTkuyu ofWFJixMNxX/mheRoc6JE+fzrJQlQl+tPE445hd3dEscQud/vfIJB4K74/aHrcW0M8n0jggZBHN mvt6FrCM+A5E+HLn6VgHh701wrIqnWRUh+ZK+pyUeVsLqlwAmpvOzy2P6C8awb5tFOMDhw4z/FP D7YLTpPcCTJ17/pjc/32B1sJfEEG6Q6b9qeFp9e2YxTtppS4uSFG/43Sxhr16HQ32TRXRloKzwb r4kiT72Lf602lyLXkbucQYJy7i4t4jcHY2h7kvo4lcRRLWx+53t/BsI8crLjMvbLLPF3qhtBiCp yHAfx0iJHL1k0d5wl28ghKqQ8M7vzvqXcq700W1DXfYYFHc3uBSOKxzr0R7QakWR/46/ay6tFT2 pzgO1i6RcQpS8s4K9rDO1pBoW2yW+sh9CuPs4quYPBEs2wPOrS2sBF4pgEMXxAnTpDMxHXuHss3 cBi98V8hCUatnVe9wWQ== X-Proofpoint-ORIG-GUID: AB11M0Bb3ssuw6mDYWhNRO9ZvrZvyAc1 X-Proofpoint-GUID: r1fVA1PU3psLgyq-RPFxtYYzecYBpUZz X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE5MiBTYWx0ZWRfX41YO5ZgjFThr sn3fJAatuKqk2mA5V8eKhgYzK4V0Otuu1AsmwEF48TG5867mCYrGO5RGIvkLZyESbxaN3issiBO Cx1AOaMbUZqtRQFHifTyQIpvtJG74oA= X-Authority-Analysis: v=2.4 cv=cY9HPXDM c=1 sm=1 tr=0 ts=6aad3d2d cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VnNF1IyMAAAA:8 a=7CQSdrXTAAAA:8 a=EmdgIBuBJ6aLKJQMbmsA:9 a=a-qgeE7W1pNrGK8U0ZQC:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_04,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 spamscore=0 bulkscore=0 clxscore=1015 suspectscore=0 impostorscore=0 malwarescore=0 phishscore=0 adultscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180192 Content-Type: text/plain; charset="utf-8" Allow sharing of arm64 headers with s390 by marking the shared regions or add a comment that the whole file is shared. The shared regions are marked with: #ifdef ARM64_S390_COMMON /* insert shared definitions here */ #endif /* ARM64_S390_COMMON */ The preprocessor symbol ARM64_S390_COMMON is always defined for arm64. s390 later will generate its own view of arm64 headers based on the content inside the ifdef/endif block. No functional change. Signed-off-by: Steffen Eiden --- arch/arm64/Makefile | 5 +++++ arch/arm64/include/asm/brk-imm.h | 1 + arch/arm64/include/asm/esr.h | 1 + arch/arm64/include/asm/kvm_arm.h | 1 + arch/arm64/include/asm/kvm_emulate.h | 18 ++++++++++++++++++ arch/arm64/include/asm/kvm_host.h | 13 +++++++++++++ arch/arm64/include/asm/ptrace.h | 4 ++++ arch/arm64/include/asm/sysreg.h | 15 +++++++++++++++ 8 files changed, 58 insertions(+) diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile index 6b005c8fef70..12cbad460258 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile @@ -45,6 +45,11 @@ KBUILD_CFLAGS +=3D $(CC_FLAGS_NO_FPU) \ KBUILD_CFLAGS +=3D $(call cc-disable-warning, psabi) KBUILD_AFLAGS +=3D $(compat_vdso) =20 +# Enable all code shared to s390 +KBUILD_CFLAGS +=3D -DARM64_S390_COMMON +KBUILD_AFLAGS +=3D -DARM64_S390_COMMON +KBUILD_CPPFLAGS +=3D -DARM64_S390_COMMON + ifeq ($(call rustc-min-version, 108500),y) KBUILD_RUSTFLAGS +=3D --target=3Daarch64-unknown-none-softfloat else diff --git a/arch/arm64/include/asm/brk-imm.h b/arch/arm64/include/asm/brk-= imm.h index beb42c62b6ac..dd2d153dc0d8 100644 --- a/arch/arm64/include/asm/brk-imm.h +++ b/arch/arm64/include/asm/brk-imm.h @@ -2,6 +2,7 @@ /* * Copyright (C) 2012 ARM Ltd. */ +/* Whole file is shared with s390 */ =20 #ifndef __ASM_BRK_IMM_H #define __ASM_BRK_IMM_H diff --git a/arch/arm64/include/asm/esr.h b/arch/arm64/include/asm/esr.h index da085c83b57e..2cb73bde7346 100644 --- a/arch/arm64/include/asm/esr.h +++ b/arch/arm64/include/asm/esr.h @@ -3,6 +3,7 @@ * Copyright (C) 2013 - ARM Ltd * Author: Marc Zyngier */ +/* Whole file is shared with s390 */ =20 #ifndef __ASM_ESR_H #define __ASM_ESR_H diff --git a/arch/arm64/include/asm/kvm_arm.h b/arch/arm64/include/asm/kvm_= arm.h index 57edd8437200..678f0daed445 100644 --- a/arch/arm64/include/asm/kvm_arm.h +++ b/arch/arm64/include/asm/kvm_arm.h @@ -3,6 +3,7 @@ * Copyright (C) 2012,2013 - ARM Ltd * Author: Marc Zyngier */ +/* Whole file is shared with s390 */ =20 #ifndef __ARM64_KVM_ARM_H__ #define __ARM64_KVM_ARM_H__ diff --git a/arch/arm64/include/asm/kvm_emulate.h b/arch/arm64/include/asm/= kvm_emulate.h index a34a9417ff4d..09f04a5686a1 100644 --- a/arch/arm64/include/asm/kvm_emulate.h +++ b/arch/arm64/include/asm/kvm_emulate.h @@ -47,6 +47,7 @@ void kvm_skip_instr32(struct kvm_vcpu *vcpu); int kvm_inject_dabt_excl_atomic(struct kvm_vcpu *vcpu, u64 addr); int kvm_inject_serror_esr(struct kvm_vcpu *vcpu, u64 esr); =20 +#ifdef ARM64_S390_COMMON void kvm_inject_undefined(struct kvm_vcpu *vcpu); void kvm_inject_sync(struct kvm_vcpu *vcpu, u64 esr); int kvm_inject_sea(struct kvm_vcpu *vcpu, bool iabt, u64 addr); @@ -62,6 +63,8 @@ static inline int kvm_inject_sea_iabt(struct kvm_vcpu *vc= pu, u64 addr) return kvm_inject_sea(vcpu, true, addr); } =20 +#endif /* ARM64_S390_COMMON */ + static inline int kvm_inject_serror(struct kvm_vcpu *vcpu) { /* @@ -185,6 +188,7 @@ static inline void vcpu_set_thumb(struct kvm_vcpu *vcpu) *vcpu_cpsr(vcpu) |=3D PSR_AA32_T_BIT; } =20 +#ifdef ARM64_S390_COMMON /* * vcpu_get_reg and vcpu_set_reg should always be passed a register number * coming from a read of ESR_EL2. Otherwise, it may give the wrong result = on @@ -203,6 +207,8 @@ static __always_inline void vcpu_set_reg(struct kvm_vcp= u *vcpu, u8 reg_num, vcpu_gp_regs(vcpu)[reg_num] =3D val; } =20 +#endif /* ARM64_S390_COMMON */ + static inline bool vcpu_is_el2_ctxt(const struct kvm_cpu_context *ctxt) { switch (ctxt->regs.pstate & (PSR_MODE32_BIT | PSR_MODE_MASK)) { @@ -405,6 +411,7 @@ static inline u64 kvm_vcpu_get_disr(const struct kvm_vc= pu *vcpu) return vcpu->arch.fault.disr_el1; } =20 +#ifdef ARM64_S390_COMMON static inline u32 kvm_vcpu_hvc_get_imm(const struct kvm_vcpu *vcpu) { return kvm_vcpu_get_esr(vcpu) & ESR_ELx_xVC_IMM_MASK; @@ -482,6 +489,8 @@ static __always_inline u8 kvm_vcpu_trap_get_fault(const= struct kvm_vcpu *vcpu) return kvm_vcpu_get_esr(vcpu) & ESR_ELx_FSC; } =20 +#endif /* ARM64_S390_COMMON */ + static inline bool kvm_vcpu_trap_is_permission_fault(const struct kvm_vcpu *vcpu) { @@ -522,6 +531,7 @@ static __always_inline int kvm_vcpu_sys_get_rt(struct k= vm_vcpu *vcpu) return ESR_ELx_SYS64_ISS_RT(esr); } =20 +#ifdef ARM64_S390_COMMON static inline bool kvm_is_write_fault(struct kvm_vcpu *vcpu) { if (kvm_vcpu_abt_iss1tw(vcpu)) { @@ -546,6 +556,8 @@ static inline bool kvm_is_write_fault(struct kvm_vcpu *= vcpu) return kvm_vcpu_dabt_iswrite(vcpu); } =20 +#endif /* ARM64_S390_COMMON */ + static inline unsigned long kvm_vcpu_get_mpidr_aff(struct kvm_vcpu *vcpu) { return __vcpu_sys_reg(vcpu, MPIDR_EL1) & MPIDR_HWID_BITMASK; @@ -587,6 +599,7 @@ static inline bool kvm_vcpu_is_be(struct kvm_vcpu *vcpu) return vcpu_read_sys_reg(vcpu, r) & bit; } =20 +#ifdef ARM64_S390_COMMON static inline unsigned long vcpu_data_guest_to_host(struct kvm_vcpu *vcpu, unsigned long data, unsigned int len) @@ -662,6 +675,8 @@ static __always_inline void kvm_incr_pc(struct kvm_vcpu= *vcpu) vcpu_set_flag((v), e); \ } while (0) =20 +#endif /* ARM64_S390_COMMON */ + /* * Returns a 'sanitised' view of CPTR_EL2, translating from nVHE to the VHE * format if E2H isn't set. @@ -768,6 +783,7 @@ static inline void kvm_reset_fpsimd(struct kvm_vcpu *vc= pu) memset(&vcpu->arch.ctxt.fp_regs, 0, sizeof(vcpu->arch.ctxt.fp_regs)); } =20 +#ifdef ARM64_S390_COMMON /* Reset a vcpu's core registers. */ static inline void kvm_reset_vcpu_core(struct kvm_vcpu *vcpu) { @@ -792,6 +808,8 @@ static inline void kvm_reset_vcpu_core(struct kvm_vcpu = *vcpu) *vcpu_cpsr(vcpu) =3D pstate; } =20 +#endif /* ARM64_S390_COMMON */ + /* PSCI reset handling for a vcpu. */ static inline void kvm_reset_vcpu_psci(struct kvm_vcpu *vcpu, struct vcpu_reset_state *reset_state) diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm= _host.h index 1e48af601f9d..cfb74a472e9b 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -42,6 +42,7 @@ =20 #define KVM_MAX_VCPUS VGIC_V3_MAX_CPUS =20 +#ifdef ARM64_S390_COMMON #define KVM_VCPU_MAX_FEATURES 10 #define KVM_VCPU_VALID_FEATURES (BIT(KVM_VCPU_MAX_FEATURES) - 1) =20 @@ -99,6 +100,8 @@ struct vcpu_reset_state { bool reset; }; =20 +#endif /* ARM64_S390_COMMON */ + #define KVM_DIRTY_LOG_MANUAL_CAPS (KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE |= \ KVM_DIRTY_LOG_INITIALLY_SET) =20 @@ -958,6 +961,7 @@ struct kvm_vcpu_arch { pid_t pid; }; =20 +#ifdef ARM64_S390_COMMON /* * Each 'flag' is composed of a comma-separated triplet: * @@ -1116,6 +1120,8 @@ bool kvm_arm_vcpu_is_finalized(struct kvm_vcpu *vcpu); /* KVM is currently emulating an L2 to L1 exception */ #define IN_NESTED_EXCEPTION __vcpu_single_flag(sflags, BIT(9)) =20 +#endif /* ARM64_S390_COMMON */ + #define vcpu_sve_max_vq(vcpu) sve_vq_from_vl((vcpu)->arch.sve_max_vl) =20 #define vcpu_sve_zcr_elx(vcpu) \ @@ -1329,6 +1335,7 @@ int __init populate_nv_trap_config(void); =20 void kvm_calculate_traps(struct kvm_vcpu *vcpu); =20 +#ifdef ARM64_S390_COMMON unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu); int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *indices); int kvm_arm_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg); @@ -1344,6 +1351,8 @@ unsigned long kvm_mmio_read_buf(const void *buf, unsi= gned int len); int kvm_handle_mmio_return(struct kvm_vcpu *vcpu); int io_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa); =20 +#endif /* ARM64_S390_COMMON */ + /* * Returns true if a Performance Monitoring Interrupt (PMI), a.k.a. perf e= vent, * arrived in guest context. For arm64, any event that arrives while a vC= PU is @@ -1536,11 +1545,15 @@ static inline bool __vcpu_has_feature(const struct = kvm_arch *ka, int feature) return test_bit(feature, ka->vcpu_features); } =20 +#ifdef ARM64_S390_COMMON + #define kvm_vcpu_has_feature(k, f) __vcpu_has_feature(&(k)->arch, (f)) #define vcpu_has_feature(v, f) __vcpu_has_feature(&(v)->kvm->arch, (f)) =20 #define kvm_vcpu_initialized(v) vcpu_get_flag(v, VCPU_INITIALIZED) =20 +#endif /* ARM64_S390_COMMON */ + int kvm_trng_call(struct kvm_vcpu *vcpu); #ifdef CONFIG_KVM extern phys_addr_t hyp_mem_base; diff --git a/arch/arm64/include/asm/ptrace.h b/arch/arm64/include/asm/ptrac= e.h index 49a83a0636b9..05c1307fa62f 100644 --- a/arch/arm64/include/asm/ptrace.h +++ b/arch/arm64/include/asm/ptrace.h @@ -26,6 +26,8 @@ =20 #define GIC_PRIO_PSR_I_SET GICV3_PRIO_PSR_I_SET =20 +#ifdef ARM64_S390_COMMON + /* Additional SPSR bits not exposed in the UABI */ #define PSR_MODE_THREAD_BIT (1 << 0) #define PSR_IL_BIT (1 << 20) @@ -66,6 +68,8 @@ #define PSR_AA32_IT_MASK 0x0600fc00 /* If-Then execution state mask */ #define PSR_AA32_GE_MASK 0x000f0000 =20 +#endif /* ARM64_S390_COMMON */ + #ifdef CONFIG_CPU_BIG_ENDIAN #define PSR_AA32_ENDSTATE PSR_AA32_E_BIT #else diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysre= g.h index ab205f9db94a..1c5c4df260be 100644 --- a/arch/arm64/include/asm/sysreg.h +++ b/arch/arm64/include/asm/sysreg.h @@ -16,6 +16,8 @@ =20 #include =20 +#ifdef ARM64_S390_COMMON + /* * ARMv8 ARM reserves the following encoding for system registers: * (Ref: ARMv8 ARM, Section: "System instruction class encoding overview", @@ -50,6 +52,8 @@ #define sys_reg_CRm(id) (((id) >> CRm_shift) & CRm_mask) #define sys_reg_Op2(id) (((id) >> Op2_shift) & Op2_mask) =20 +#endif /* ARM64_S390_COMMON */ + #ifndef CONFIG_BROKEN_GAS_INST =20 #ifdef __ASSEMBLER__ @@ -123,6 +127,8 @@ #define GSB_SYS_BARRIER_INSN __SYS_BARRIER_INSN(1, 0, 12, 0, 0, 31) #define GSB_ACK_BARRIER_INSN __SYS_BARRIER_INSN(1, 0, 12, 0, 1, 31) =20 +#ifdef ARM64_S390_COMMON + /* Data cache zero operations */ #define SYS_DC_ISW sys_insn(1, 0, 7, 6, 2) #define SYS_DC_IGSW sys_insn(1, 0, 7, 6, 4) @@ -832,6 +838,8 @@ #define SCTLR_ELx_A (BIT(1)) #define SCTLR_ELx_M (BIT(0)) =20 +#endif /* ARM64_S390_COMMON */ + #ifdef CONFIG_CPU_BIG_ENDIAN #define ENDIAN_SET_EL2 SCTLR_ELx_EE #else @@ -866,6 +874,7 @@ SCTLR_EL1_LSMAOE | SCTLR_EL1_nTLSMD | SCTLR_EL1_EIS | \ SCTLR_EL1_TSCXT | SCTLR_EL1_EOS) =20 +#ifdef ARM64_S390_COMMON /* MAIR_ELx memory attributes (used by Linux) */ #define MAIR_ATTR_DEVICE_nGnRnE UL(0x00) #define MAIR_ATTR_DEVICE_nGnRE UL(0x04) @@ -1102,6 +1111,8 @@ #define GICV5_GICR_CDNMIA_TYPE_MASK GENMASK_ULL(31, 29) #define GICV5_GICR_CDNMIA_ID_MASK GENMASK_ULL(23, 0) =20 +#endif /* ARM64_S390_COMMON */ + #define gicr_insn(insn) read_sysreg_s(GICV5_OP_GICR_##insn) #define gic_insn(v, insn) write_sysreg_s(v, GICV5_OP_GIC_##insn) =20 @@ -1251,6 +1262,8 @@ par; \ }) =20 +#ifdef ARM64_S390_COMMON + #define SYS_FIELD_VALUE(reg, field, val) reg##_##field##_##val =20 #define SYS_FIELD_GET(reg, field, val) \ @@ -1263,6 +1276,8 @@ FIELD_PREP(reg##_##field##_MASK, \ SYS_FIELD_VALUE(reg, field, val)) =20 +#endif /* ARM64_S390_COMMON */ + #endif /* __ASSEMBLER__ */ =20 #endif /* __ASM_SYSREG_H */ --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8725650B8AA; Fri, 18 Sep 2026 13:32:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738338; cv=none; b=OYmVdz4rWgBPjlnBHJblGOTV9vpkqJKpRUfUV0T0cmSYp56/cGhTX4jI710s4IfiFA922SvV+qar6UDtj+JZ8HgJvyZ9Oh4fdV6LTjQxjCbI6xudNc/ls01ykFtaopkiNHXafvQ4EvQrQhm8a9gzxxqnVKcvBs4NNkQtimsjxZo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738338; c=relaxed/simple; bh=osxPNSHcQUO0nk+XKlToV/RimPTNmaFDOasczQeqmPg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TubNRruvKwxm6J517y66calCM6EbdSU6a4HPmvZ9ltx4DFeKG3e5gYW524pm2e3MM+lz9fBD6GdeHLiI8ryIGti0UZ411WvVlWIB43mkmI5O0UVxoRlFTgUV0ct0O/xzbzH7XR7tLfQt/IYETy59Kdu9OaiTPqxhR06x2LXg6wg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=Ko8fDgQ4; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="Ko8fDgQ4" Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA1VXo960914; Fri, 18 Sep 2026 13:31:24 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=C5SCNP8saHi3O3B1k Nvg87I+cyuIzf7H9GcjrjizG3o=; b=Ko8fDgQ4pLot/CcAAYQGooiN4YjvVU1QK jB6gjcmUricbP39QTj2QoRkRZs0xJ150QY3lUVzkQGbU/U4yAgl5E3AbFMo98dlp 4Qnra5FwZ0DawM3dfQh9k0sM+5R77SS1lU8YsH3h8Auz5R8DSe2JgSrdH9Vno7xb kJd+HWe9BPZkYeeLCaimYiiiJ1mSkNviSR7smoOQiXPE+3DUOWRh0ca+cihA1Sbw z/pBn0+E5xP8c4iGvsRqfYwg+2ZEC7jJfTeZyg9PdPP530O4yZTMCiZe0QpTBJfa N497h2gUSwBKIhggJjJBp3GJxPS32rR7uSw1hf9IqChvm5uIQEDFg== Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmxf5gb75-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:23 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDNufH771797; Fri, 18 Sep 2026 13:31:22 GMT Received: from smtprelay04.fra02v.mail.ibm.com ([9.218.2.228]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gr5fffhcg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:22 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay04.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVEWv20841000 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:14 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 536782004B; Fri, 18 Sep 2026 13:31:14 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 045D520049; Fri, 18 Sep 2026 13:31:14 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:13 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 17/29] KVM: arm64: Share arm64 code with s390 Date: Fri, 18 Sep 2026 15:30:54 +0200 Message-ID: <20260918133107.1042730-18-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-GUID: Gd5dYhDmS8id6aAs38q-IeAloOoIi_tv X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX384FMWKEv2aj QvUqUYOdWfojFvSd4aUPC8ThKjbYvjuwNodZTRunetGk4xZqQcDpd6sOyG8Pg3jly9KFfhozTJT 9GLSI7QMqFC84u3CyZg7sXU2Ap84ZHs= X-Authority-Analysis: v=2.4 cv=cvgOAF4i c=1 sm=1 tr=0 ts=6aad3d2b cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VnNF1IyMAAAA:8 a=3a0hE5hcTyqzKRjSqTQA:9 X-Proofpoint-ORIG-GUID: RxgjPLRIDeiqnHJfQ4CCB1Yd2NanKony X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX5B0YoHVfggDR ycvbVN32uWWkZYYDaGkzET0g11OuYLetTBpKvfBVtCBMUbLUCcRcVZyc49ajtFNWyJ8IIfl+eAo Ho7pmjjWwVOaylJX0YMHLjl3G2FksTx1W14U/knkWnKaCi3i1v8SFaqka7LVC4DSIs+mveJQzLI CF89nSz6tjn1PFax+8ojBwHYun1c1GJWkTNB5JzFBTQPiq41G/cuQmniirBLK2fN1BH4Z3dTW1v oJ6rJPYzwwpz9wg3Sr8LXi+f1Xyfbp2Y4Vpit4VjIB90mwNN/0BF52JpvfzgUtEa+08yS9VOrKP nwIVlBqc1y3tS8bq/+merr94S6NR+VHi+wsr6SRh2QMsxyOHy88pw6Cxhx0oU7hnMxwvWU5dqTt oe1rITDoZ6vKUsT/Ta8LHLSqDKfMyQEuvnTGn+PFMzE1QZE0QTKdz11QW7BwjrLiEjhkjpRA42P RkzhCkcgeLTwHL7DMjw== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 lowpriorityscore=0 clxscore=1015 priorityscore=1501 suspectscore=0 bulkscore=0 impostorscore=0 phishscore=0 spamscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" Mark functions that s390 can use to implement arm on s390 as shared functions. No functional change. Signed-off-by: Steffen Eiden --- arch/arm64/kvm/arm.c | 3 +++ arch/arm64/kvm/guest.c | 6 ++++++ arch/arm64/kvm/mmio.c | 2 ++ 3 files changed, 11 insertions(+) diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index 8b080804bc90..6b92a3c1d490 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -1603,6 +1603,7 @@ static unsigned long system_supported_vcpu_features(v= oid) return features; } =20 +#ifdef ARM64_S390_COMMON static int kvm_vcpu_init_check_features(struct kvm_vcpu *vcpu, const struct kvm_vcpu_init *init) { @@ -1656,6 +1657,8 @@ static bool kvm_vcpu_init_changed(struct kvm_vcpu *vc= pu, KVM_VCPU_MAX_FEATURES); } =20 +#endif /* ARM64_S390_COMMON */ + static int kvm_setup_vcpu(struct kvm_vcpu *vcpu) { struct kvm *kvm =3D vcpu->kvm; diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c index 773f6c8e5026..6ca5a9f357cd 100644 --- a/arch/arm64/kvm/guest.c +++ b/arch/arm64/kvm/guest.c @@ -62,6 +62,7 @@ const struct kvm_stats_header kvm_vcpu_stats_header =3D { sizeof(kvm_vcpu_stats_desc), }; =20 +#ifdef ARM64_S390_COMMON static bool core_reg_offset_is_vreg(u64 off) { return off >=3D KVM_REG_ARM_CORE_REG(fp_regs.vregs) && @@ -306,6 +307,8 @@ static int set_core_reg(struct kvm_vcpu *vcpu, const st= ruct kvm_one_reg *reg) return err; } =20 +#endif /* ARM64_S390_COMMON */ + #define vq_word(vq) (((vq) - SVE_VQ_MIN) / 64) #define vq_mask(vq) ((u64)1 << ((vq) - SVE_VQ_MIN) % 64) #define vq_present(vqs, vq) (!!((vqs)[vq_word(vq)] & vq_mask(vq))) @@ -543,6 +546,7 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu,= struct kvm_regs *regs) return -EINVAL; } =20 +#ifdef ARM64_S390_COMMON static int copy_core_reg_indices(const struct kvm_vcpu *vcpu, u64 __user *uindices) { @@ -591,6 +595,8 @@ static unsigned long num_core_regs(const struct kvm_vcp= u *vcpu) return copy_core_reg_indices(vcpu, NULL); } =20 +#endif /* ARM64_S390_COMMON */ + static unsigned long num_sve_regs(const struct kvm_vcpu *vcpu) { const unsigned int slices =3D vcpu_sve_slices(vcpu); diff --git a/arch/arm64/kvm/mmio.c b/arch/arm64/kvm/mmio.c index d1c3a352d5a2..5161102da507 100644 --- a/arch/arm64/kvm/mmio.c +++ b/arch/arm64/kvm/mmio.c @@ -10,6 +10,7 @@ =20 #include "trace.h" =20 +#ifdef ARM64_S390_COMMON void kvm_mmio_write_buf(void *buf, unsigned int len, unsigned long data) { void *datap =3D NULL; @@ -258,3 +259,4 @@ int io_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fau= lt_ipa) run->exit_reason =3D KVM_EXIT_MMIO; return 0; } +#endif /* ARM64_S390_COMMON */ --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7780C4F93B3; Fri, 18 Sep 2026 13:32:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738359; cv=none; b=QYpPnaOraxIhTfNlHCcKrANZ54jLROHwLxBAQnH8UaJB/tqBGNNEKT+Rxfft08ZEqF/8KQ/xPlxUI6AhKKPiNTUAm6aqlNI7LVhNWbDBzhR4k9Gi0SXHuDx0qjNwTkyL5GMLLfz1ZpHWS1prcv42CXS78tQ49ZFib/P5VTFfpIs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738359; c=relaxed/simple; bh=K0pH/kIzdjn7XhRQ01Q7s1FQZEgJAfF9fnAxKZl9i7c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=URhzW7y3MBegDiL18uSgCk1krVGgd90Mc2agAM1hAi9cU+vLQ8sBeBynNmRnK+dCKv9vIn01j9fFERmkFdQTmJqzPJFYhVJyejcs2OO2IvWEnEAuRACH/XiSiMg+vMC1U/0PqiE8PA+l0D7fG+DkmsPCycAWPtiUkn+RGseg08w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=TXEUsyp7; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="TXEUsyp7" Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA1UxN960828; Fri, 18 Sep 2026 13:31:28 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=z8sLHo8BqRMdgseyc gHYqYz+145DnazUIQfzCQ3O+EU=; b=TXEUsyp7tpftExjG3PvhHzCrmmOX/hy7j XZav0EJGnBznAiVp97CzFdXE/SricpHQ/ZUoBoVKH3FZ9Ete7nFUFMpmNzHU3vpx v7eRjEOyNi1/iVnF7Elf0Gsn3P0zbORgE8d90qac7l4iy9V+z+ihh6s7J4LnC0Kx 89GEwotPJvfOdlmeiQRljNEmvWvdSJYcopzqKWsddGVJ1Puu0cQMvRbe2R1cJRAc vAjSW3cghVIm0p99ivvq3CgjsYLDPjtAGeNJ0VifkC/xqz8EXz7k5qnLn8OU72ry P+cxqPii13dpDQWl5oub7WW7bkoo9j6rFQN3nJtKHOSudUa2o38bg== Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmxf5gb7x-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:27 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDOFiA739719; Fri, 18 Sep 2026 13:31:26 GMT Received: from smtprelay04.fra02v.mail.ibm.com ([9.218.2.228]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gs56q88uk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:26 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay04.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVEfx20841002 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:14 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AFEFE20049; Fri, 18 Sep 2026 13:31:14 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 599DA2004D; Fri, 18 Sep 2026 13:31:14 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:14 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 18/29] s390/tools: Use arm64 headers Date: Fri, 18 Sep 2026 15:30:55 +0200 Message-ID: <20260918133107.1042730-19-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-GUID: PM5P4ONwvp8aq_-ervFBOC6wbtARJ8S4 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX8duBsZH4K1lb zZQsIPsiVBfO4eNjU29XFEvwZCWT++xJ4FMFGD7W6ivzBzCMq+lB0pjdC7z1wkyrvrEMZCbq6YP zNRMMuuvICwcWUNVYJwLWJnBquPwNPM= X-Authority-Analysis: v=2.4 cv=cvgOAF4i c=1 sm=1 tr=0 ts=6aad3d30 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VnNF1IyMAAAA:8 a=ZhoKsAT7EqIUtuKD8d0A:9 X-Proofpoint-ORIG-GUID: zY9TUmbVGn5R_HPEJBGWQp6E46Zl6Q9I X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX3b/I2acUpJIV 1IZfE4XuANgIUARNvopskPG/TDdYI7mecaUAAGnChUzNPcI01wYOi4QGeWqREGU0+Z1snLsa1n4 F569J7ELjx2QhPYlwMQwgO3MaAl+aMnPMPTKzuj2AkIVHoHcT5j08QniIDv9rhfv5XIGuTwN6RL j43j9R1F/+YEBeXCxjfBGbVoVQMwQFY+4JJS+gkKqa8cVnXe+mkzMor9FEneA2UxhEvW6UYp3pO BYVPyaOo0gIHd7FrtH5JfBzsBdWDw/6jo+HEVYQDaY78XG7Q8vXBXp/wFOlq0IWCH/srUuAFVPP JmVOZQKPALw96y88OSA5zvZ/B+4YyUsHROzG8pDuDuaidLKEst6Trrw8k6LQDaXUwgAiRnOGDMr tMZCl41R4iEeytwVqxnjz8zaow/kKrl9AuS4WtgDboRchC0SUB4/C+wb/k5nss8GXuvGg/VaqkX YsuklSfm4jBi55FkUsQ== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 lowpriorityscore=0 clxscore=1015 priorityscore=1501 suspectscore=0 bulkscore=0 impostorscore=0 phishscore=0 spamscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" Introduce a flexible system for sharing ARM64 headers with s390 KVM. Selected arm64 headers or snippet of headers will be reachable by s390 code through asm/header.h. Add copy-arm64h.awk that detects ARM64_S390_COMMON markers and extracts marked section into a generated header consumable by s390. Falls back to full file copy when no markers are found. Transform copied includes by replacing '#include ' with '#include ' and similar for uapi headers to ensure correct path resolution on s390 and allow for a clear separation of s390 asm headers and arm64 asm headers. Integrate this extraction into the s390/kapi target, conditional on CONFIG_KVM. Signed-off-by: Steffen Eiden --- arch/s390/tools/Makefile | 9 +++- arch/s390/tools/Makefile.arm64h | 56 ++++++++++++++++++++++ arch/s390/tools/copy-arm64h-full.awk | 47 ++++++++++++++++++ arch/s390/tools/copy-arm64h.awk | 71 ++++++++++++++++++++++++++++ 4 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 arch/s390/tools/Makefile.arm64h create mode 100644 arch/s390/tools/copy-arm64h-full.awk create mode 100644 arch/s390/tools/copy-arm64h.awk diff --git a/arch/s390/tools/Makefile b/arch/s390/tools/Makefile index f2862364fb42..6a97beff03a2 100644 --- a/arch/s390/tools/Makefile +++ b/arch/s390/tools/Makefile @@ -3,12 +3,19 @@ # Makefile for s390 specific build tools # =20 +include $(srctree)/arch/s390/tools/Makefile.arm64h + kapi :=3D arch/$(ARCH)/include/generated/asm kapi-hdrs-y :=3D $(kapi)/facility-defs.h $(kapi)/dis-defs.h =20 +targets +=3D $(addprefix ../../../,$(kapi-hdrs-y)) +targets +=3D $(patsubst $(objtree)/%,../../../%,$(ARM64_TARGETS)) + +kapi-hdrs-$(CONFIG_KVM) +=3D $(ARM64_TARGETS) + PHONY +=3D kapi =20 -kapi: $(kapi-hdrs-y) +kapi: $(kapi-hdrs-y) $(kapi-hdrs-m) =20 hostprogs +=3D gen_facilities hostprogs +=3D gen_opcode_table diff --git a/arch/s390/tools/Makefile.arm64h b/arch/s390/tools/Makefile.arm= 64h new file mode 100644 index 000000000000..069473ea335d --- /dev/null +++ b/arch/s390/tools/Makefile.arm64h @@ -0,0 +1,56 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Share ARM64 headers with s390 KVM +# + +arm64api :=3D $(objtree)/arch/$(ARCH)/include/generated/arm64 +arm64uapi :=3D $(objtree)/arch/$(ARCH)/include/generated/uapi/arm64 + +# List of ARM64 headers to share with s390 KVM +# Format: [uapi:]header.h or header-gen.h +# +# * header.h - from arch/arm64/include/asm/ to arm64/ +# * uapi:header.h - from arch/arm64/include/uapi/asm/ to uapi/arm64/ +# * header-gen.h - generated as header-gen.h from ARM64 header header.h +# If a header contains partial markers (#ifdef ARM64_S390_COMMON) only thi= s part will be copied. +# If the file does not contain any markers the whole file will be copied. +ARM64_SHARED_HEADERS :=3D \ + brk-imm.h \ + esr.h \ + kvm_arm.h \ + kvm_emulate-gen.h \ + kvm_host.h \ + ptrace-gen.h \ + sysreg-gen.h \ + uapi:hwcap.h \ + uapi:kvm.h \ + uapi:ptrace.h \ + uapi:sve_context.h \ + +quiet_cmd_gen_arm_hdr =3D GEN $@ + cmd_gen_arm_hdr =3D mkdir -p $(dir $@); \ + $(AWK) -f $(src)/copy-arm64h.awk $< > $@ || \ + $(AWK) -f $(src)/copy-arm64h-full.awk -v srcfile=3D"= $(subst $(srctree)/,,$(subst $(srctree)/../,,$<))" $< > $@ || \ + { echo "Error: Unbalanced ARM64_S390_COMMON markers in $<" >&2; rm= -f $@; exit 1; } + +arm64-type =3D $(firstword $(subst :, ,$(1))) +arm64-base =3D $(or $(word 2,$(subst :, ,$(1))),$(1)) +arm64-src-base =3D $(patsubst %-gen.h,%.h,$(call arm64-base,$(1))) + +arm64-src =3D $(srctree)/arch/arm64/include/$(if $(filter uapi,$(call arm6= 4-type,$(1))),uapi/)asm/$(call arm64-src-base,$(1)) +arm64-dst =3D $(if $(filter uapi,$(call arm64-type,$(1))),$(arm64uapi),$(a= rm64api))/$(call arm64-base,$(1)) + +$(foreach hdr,$(ARM64_SHARED_HEADERS),\ + $(eval $(call arm64-dst,$(hdr)): $(call arm64-src,$(hdr)) $(src)/copy-arm= 64h.awk $(src)/copy-arm64h-full.awk FORCE)) + +ARM64_TARGETS :=3D $(sort $(foreach hdr,$(ARM64_SHARED_HEADERS),$(call arm= 64-dst,$(hdr)))) +$(ARM64_TARGETS): + $(call if_changed,gen_arm_hdr) + +quiet_cmd_gen_sysreg_arm64 =3D GEN $@ + cmd_gen_sysreg_arm64 =3D mkdir -p $(dir $@); $(AWK) -f $(srctree)/ar= ch/arm64/tools/gen-sysreg.awk $(srctree)/arch/arm64/tools/sysreg > $@ + +$(arm64api)/sysreg-defs.h: $(srctree)/arch/arm64/tools/gen-sysreg.awk $(sr= ctree)/arch/arm64/tools/sysreg FORCE + $(call if_changed,gen_sysreg_arm64) + +ARM64_TARGETS +=3D $(arm64api)/sysreg-defs.h diff --git a/arch/s390/tools/copy-arm64h-full.awk b/arch/s390/tools/copy-ar= m64h-full.awk new file mode 100644 index 000000000000..a6aaf9cc3332 --- /dev/null +++ b/arch/s390/tools/copy-arm64h-full.awk @@ -0,0 +1,47 @@ +#!/usr/bin/awk -f +# SPDX-License-Identifier: GPL-2.0 +# +# Process entire ARM64 headers for sharing with s390 KVM +# +# Usage: copy-arm64h-full.awk -v srcfile=3D +# +# This processes the entire file (unlike copy-arm64h.awk which only extrac= ts marked sections) + +BEGIN { + max_guard_line =3D 25 + guard_found =3D 0 + header_added =3D 0 +} + +# Find and process the include guard in the first few lines +NR <=3D max_guard_line && !guard_found && /^#ifndef [A-Z_0-9]+$/ { + guard_name =3D $2 + guard_found =3D 1 + print "/* This header was copied from " srcfile " */" + print "" + print + header_added =3D 1 + next +} + +# Transform include directives +/^#include +# +# Extracts all sections between start/end markers. If no markers found, si= gnals for fallback. +BEGIN { + # Constants + start_pattern =3D "^#ifdef ARM64_S390_COMMON$" + end_pattern =3D "^#endif \\/\\* ARM64_S390_COMMON \\*\\/$" + max_guard_line =3D 25 + + # State variables + copying =3D found_marker =3D 0 + guard_name =3D "" + file_header_done =3D 0 +} + +NR <=3D max_guard_line && !guard_name && /^#ifndef [A-Za-z0-9_]+$/ { + guard_name =3D $2 + filename =3D FILENAME + sub(/^.*arch\/arm64\//, "arch/arm64/", filename) + print "/*" + print " * This header was automatically generated from " filename + print " * Do not modify this file directly." + print " */" + print "#ifndef " guard_name + print "#define " guard_name + print "" + next +} + +NR > max_guard_line && !guard_name && !file_header_done { + print "error: no include guard found in first " max_guard_line " lines" >= "/dev/stderr" + file_header_done =3D 1 + exit 1 +} + +!guard_name { + print + next +} + +$0 ~ start_pattern { + if (copying) { exit 1 } + copying =3D found_marker =3D 1 + next +} + +guard_name && !found_marker { + next +} + +$0 ~ end_pattern { copying =3D 0; next } + +copying { + gsub(/#include To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 19/29] KVM: s390: Use arm64 code Date: Fri, 18 Sep 2026 15:30:56 +0200 Message-ID: <20260918133107.1042730-20-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX2bZyimmMZATy 2PEuNpRzDigwMA511pmlsni9ojm+mZNKWojX34zEOM8c7YbhXFne0IN0bfxIbf7Td0cSVTcjHak XKJ+Y0XHGEruSYzhvMuEL1JQq3DaPqc+POo7Uhic59aoiIiiAH59f17tF0VIf0HUHEHHA6wUZxw KESAG00KnUX6IguFhEZzlUQDNi5HCiPQw5I3mQzqpTCuKlzDpffwuxQk1vzDWv20PExPNCkkZwK nlqdweaazH6hflg1aHvjgiPWtNtjzvonokNzqL8t5eYoRX5FSuYwUYPrfqoJQk+L0HY7qo8uNJ7 0M7zMeUGzM7gi8oJpFc3FE4Wnt7txn9YtCXFvAfx1GWpnkHcj+6kTRAmWUT0a91FAHxqijqJk40 09pWR59oTLHWxH3ZOgj9dhQmHuzj+j8MhTgI4TK1k1dhYKQk0QJA2r8nBnfsCIrbBw7LkMk5L3N cXucVIJhbjqtun7/MUw== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX1zSEh6TCujeA IHWziz4fXnD4xOl5llKDuyjr8Dh7aurFPqzLVZtCsWkIY7uSgUy3uJbFJhUG+wflL04T05Fj8ls 1NOFRsnM2hR2sImdLS8R17X++8m9gEI= X-Authority-Analysis: v=2.4 cv=Zsx4uN7G c=1 sm=1 tr=0 ts=6aad3d2a cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VnNF1IyMAAAA:8 a=x1b9RNJZmR4nZInT6RoA:9 X-Proofpoint-ORIG-GUID: V5YxHi439nzC48TG7SzpuiCKoqWu1GHl X-Proofpoint-GUID: Yod9GHa8_eKmqnjMdNZtQd42f_TNEzLX X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 impostorscore=0 clxscore=1015 priorityscore=1501 lowpriorityscore=0 bulkscore=0 adultscore=0 phishscore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" Add the infrastructure to extract KVM/arm64 code into s390 at built time similar to the arm64 header sharing. Add copy-arm64c.awk hat detects ARM64_S390_COMMON markers and extracts marked section into an .inc file that can be consumed by arm on s390 host code. If no marker is found make will fail. To ensure that no code is consumed twice by accident a guard is added during file generation. A s390 C file wanting to consume such an inc file must first define __INCL_GEN_ARM_FILE otherwise the inc file will emit a compile error. Example: #define __INCL_GEN_ARM_FILE #include #undef __INCL_GEN_ARM_FILE Signed-off-by: Steffen Eiden --- arch/s390/kvm/arm64/.gitignore | 2 + arch/s390/kvm/arm64/Makefile.gen | 26 +++++++++++ arch/s390/kvm/arm64/copy-arm64c.awk | 72 +++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 arch/s390/kvm/arm64/.gitignore create mode 100644 arch/s390/kvm/arm64/Makefile.gen create mode 100644 arch/s390/kvm/arm64/copy-arm64c.awk diff --git a/arch/s390/kvm/arm64/.gitignore b/arch/s390/kvm/arm64/.gitignore new file mode 100644 index 000000000000..bd9d90694676 --- /dev/null +++ b/arch/s390/kvm/arm64/.gitignore @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +generated/* diff --git a/arch/s390/kvm/arm64/Makefile.gen b/arch/s390/kvm/arm64/Makefil= e.gen new file mode 100644 index 000000000000..e12714203bde --- /dev/null +++ b/arch/s390/kvm/arm64/Makefile.gen @@ -0,0 +1,26 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Extracts ARM64 marked sections to .inc files that are included by main s= ource +# files + +# List of ARM64 C files to extract +ARM64_CFILES :=3D \ + arm.c \ + guest.c \ + mmio.c \ + +quiet_cmd_extract_inc =3D GEN $@ + cmd_extract_inc =3D mkdir -p $(dir $@); \ + $(AWK) -f $(src)/copy-arm64c.awk $< > $@ || \ + { echo "Error: No or unbalanced ARM64_S390_COMMON = markers in $<" >&2; rm -f $@; exit 1; } + +$(obj)/generated/%.inc: $(srctree)/arch/arm64/kvm/%.c $(src)/copy-arm64c.a= wk FORCE + $(call if_changed,extract_inc) + +ARM64_INC_FILES :=3D $(foreach cfile,$(ARM64_CFILES),generated/$(basename = $(cfile)).inc) + +targets +=3D $(ARM64_INC_FILES) +clean-files +=3D generated/*.inc + +$(foreach cfile,$(basename $(ARM64_CFILES)),\ + $(eval $(obj)/$(cfile).o: $(obj)/generated/$(cfile).inc)) diff --git a/arch/s390/kvm/arm64/copy-arm64c.awk b/arch/s390/kvm/arm64/copy= -arm64c.awk new file mode 100644 index 000000000000..5561619aa70c --- /dev/null +++ b/arch/s390/kvm/arm64/copy-arm64c.awk @@ -0,0 +1,72 @@ +#!/usr/bin/awk -f +# SPDX-License-Identifier: GPL-2.0 +# +# Extract marked sections from ARM64 C files for sharing with s390 KVM +# +# Usage: copy-arm64c.awk +# +# Extracts all sections between start/end markers. If no markers found, si= gnals failure. + +BEGIN { + # Constants + start_pattern =3D "^#ifdef ARM64_S390_COMMON$" + end_pattern =3D "^#endif /\\* ARM64_S390_COMMON \\*/$" + + # State variables + copying =3D found_marker =3D 0 + file_header_done =3D 0 +} + +!file_header_done { + if (/^\/\*/ || /^\/\/ SPDX-License-Identifier:/) { + print + next + } + if (/[[:space:]]\*([[:space:]]|$)/) { + print + next + } + if (/\*\//) { + print " *" + } else { + print "/*" + } + + filename =3D FILENAME + sub(/^.*arch\/arm64\//, "arch/arm64/", filename) + print " * This file was automatically generated from " filename + print " * Do not modify this file directly." + print " */" + print "" + print "#ifndef __INCL_GEN_ARM_FILE" + print "#error included .inc file w/o proper guard definition" + print "#else" + print "#undef __INCL_GEN_ARM_FILE" + print "#endif /* __INCL_GEN_ARM_FILE */" + print "" + + file_header_done =3D 1 +} + +$0 ~ start_pattern { + if (copying) { error =3D 1; exit 1 } + copying =3D found_marker =3D 1 + next +} + +$0 ~ end_pattern { + if (!copying) { error =3D 1; exit } + copying =3D 0 + next +} + +copying { + gsub(/#include To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 20/29] s390: Introduce Start Arm Execution instruction Date: Fri, 18 Sep 2026 15:30:57 +0200 Message-ID: <20260918133107.1042730-21-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-GUID: IEVhVmBpA1jc5d-_GK7vOGB9NrfqqidR X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX/f89X5ytzz26 iztav76V3YIXrypgTRieWtU/tYjRJEihCLfysYkLVPJFPWtK2jPk+qF+scPHtTXacCenhBAVPxy mtzqRcneAEFutIhvfTX20nueNL+A7c0= X-Authority-Analysis: v=2.4 cv=cvgOAF4i c=1 sm=1 tr=0 ts=6aad3d2c cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VnNF1IyMAAAA:8 a=D7HF9d94yUUfLUezzdoA:9 X-Proofpoint-ORIG-GUID: vQEt_WSTqkSk_mvxOUD2nPTSI9fJFCWw X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX5VTFoRBA5hIF btvRL5wdFR3wTzH2Uc+oYxw+nUVYzknJfQ1bqvCDlduAPXz+tVZjEVRIui6KtFe7NM4XqKCUEJu +AMSJmRpVYq0GsZiucz5Vha2nxjnCAxsdAmG4uO/nwF1ZEPCF3Tu2d3BrjiNjsiDmqWDavUXeq2 to/apKYsZWpMkQn2V/TAvKRCckIsADFivHsPVL003hGMRb3JGIcWcKuwDil6N9/I8clyqzraVHj g5U17lPWY5Ba2IwyKKDNWU/Y8ql3IRqzidXp2hMJqRJdjfzT5D7DRt6R9wxgbR6mRPSa53EhgBd WEvtEwSe3tibCwYkKgJZPph3sEgFRfjpxwCEmE6pyJ1KYvwqGgM+QiybPtXIXMHovlD67rowQCA xdWZL3CDNcKHg17hWu422Z//XSAv3R+I8VTIX/Y9/uzZPmAUy8aiUYsITUY4T17ajnsO9LxIstO xaQnKYi3+CJogGtv68Q== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 lowpriorityscore=0 clxscore=1015 priorityscore=1501 suspectscore=0 bulkscore=0 impostorscore=0 phishscore=0 spamscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" The Start Arm Execution (SAE) instruction is the centerpiece for executing arm64 (KVM) guests on s390. Its purpose is, similar to SIE, to enable accelerated execution of arm64 virtual machines. SAE expects the physical address of a control block as the only argument. The host is responsible to save & restore - GPRs 0-13 - access register 0-15 - breaking event register (BEAR) - vector/floating point registers between SAE executions to guarantee host consistency. GPRs and BEAR are save and restores in the asm functions. The other register are handled in within C code. Access registers are handled in a later patch and SVEs will be handled when they are introduced in a future series. Most arm64 registers are handled by a satellite block called save_area. Some registers, frequently used by hypervisors, are placed into the SAE control block itself. Enlighten asm/kvm_host_types.h for the new header variant. The new header is chosen instead of asm/kvm_host_s390_types.h if KVM_S390_ARM64 is defined. Co-developed-by: Andreas Grapentin Signed-off-by: Andreas Grapentin Co-developed-by: Nina Schoetterl-Glausch Signed-off-by: Nina Schoetterl-Glausch Signed-off-by: Steffen Eiden --- arch/s390/include/asm/asm-prototypes.h | 1 + arch/s390/include/asm/kvm_host_arm64_types.h | 124 +++++++++++++++++++ arch/s390/include/asm/kvm_host_types.h | 4 + arch/s390/include/asm/sae.h | 58 +++++++++ arch/s390/include/asm/stacktrace.h | 5 + arch/s390/kernel/asm-offsets.c | 1 + arch/s390/kernel/entry.S | 22 ++++ arch/s390/tools/opcodes.txt | 3 + 8 files changed, 218 insertions(+) create mode 100644 arch/s390/include/asm/kvm_host_arm64_types.h create mode 100644 arch/s390/include/asm/sae.h diff --git a/arch/s390/include/asm/asm-prototypes.h b/arch/s390/include/asm= /asm-prototypes.h index d4da4436d02b..faa2afb259a1 100644 --- a/arch/s390/include/asm/asm-prototypes.h +++ b/arch/s390/include/asm/asm-prototypes.h @@ -6,6 +6,7 @@ #include #include #include +#include #include =20 #endif /* _ASM_S390_PROTOTYPES_H */ diff --git a/arch/s390/include/asm/kvm_host_arm64_types.h b/arch/s390/inclu= de/asm/kvm_host_arm64_types.h new file mode 100644 index 000000000000..8783a66d3029 --- /dev/null +++ b/arch/s390/include/asm/kvm_host_arm64_types.h @@ -0,0 +1,124 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef ASM_KVM_HOST_ARM64_TYPES_H +#define ASM_KVM_HOST_ARM64_TYPES_H + +#include +#include +#include +#include +#include + +struct kvm_sae_block { + u64 _0000[16]; /* 0x0000 */ +#define SAE_ICPTR_SPURIOUS 0x00 +#define SAE_ICPTR_VALIDITY 0x01 +#define SAE_ICPTR_HOST_ACCESS_EXCEPTION 0x02 +#define SAE_ICPTR_SYNCHRONOUS_EXCEPTION 0x03 +#define SAE_ICPTR_TIMER 0x04 +#define SAE_ICPTR_PE_INTERCOMM 0x05 +#define SAE_ICPTR_GUEST_ADDRESS_SIZE 0x06 +#define SAE_ICPTR_STOP 0x07 +#define SAE_ICPTR_MIO_ADDRESS 0x08 +#define SAE_ICPTR_PMU 0x09 +#define SAE_ICPTR_MAINTENANCE 0x0a + u8 icptr; /* 0x0080 */ + u8 _0081[7]; /* 0x0081 */ + u64 scad; /* 0x0088 */ + u64 _0090[16]; /* 0x0090 */ + u32 cntp_ctl; /* 0x0110 */ + u32 cntv_ctl; /* 0x0114 */ + u8 irq_ctl; /* 0x0118 */ + u8 _0119[7]; /* 0x0119 */ + struct { + u64 ich_hcr_el2; /* 0x0120 */ + u64 ich_vmcr_el2; /* 0x0128 */ + u64 ich_ap0r0_el2; /* 0x0130 */ + u64 ich_ap1r0_el2; /* 0x0138 */ + u64 _0140[2]; /* 0x0140 */ + u64 ich_lrn_el2[4]; /* 0x0150 */ + u64 _0170[4]; /* 0x0170 */ + } ic_regs; + u64 _0190[12]; /* 0x0190 */ + u64 contextidr_el1; /* 0x01f0 */ + u32 wip; /* 0x01f8 */ + u32 _01fc; /* 0x01fc */ +#define SAE_SD_FORMAT_0 0x00 + u8 sdf; /* 0x0200 */ + u8 _0201[7]; /* 0x0201 */ + u64 mso; /* 0x0208 */ + u64 msl; /* 0x0210 */ + u64 hbasce; /* 0x0218 */ + u64 _0220; /* 0x0220 */ + u64 gpto; /* 0x0228 */ + u64 ic; /* 0x0230 */ + u64 ec; /* 0x0238 */ + u64 save_area; /* 0x0240 */ + u64 _0248[7]; /* 0x0248 */ + u8 _0280[6]; /* 0x0280 */ + u16 lrcpua; /* 0x0286 */ + u64 pstate; /* 0x0288 */ + u64 pc; /* 0x0290 */ + u64 sp_el0; /* 0x0298 */ + u64 sp_el1; /* 0x02a0 */ + u64 _02a8; /* 0x02a8 */ + struct { /* 0x02b0 */ + u32 _fpcr_res0; + u32 fpcr; + }; + struct { /* 0x02b8 */ + u32 _fpsr_res0; + u32 fpsr; + }; + u16 sve_pregs[16]; /* 0x02c0 */ + u16 sve_ffr; /* 0x02e0 */ + u8 _02e2[6]; /* 0x02e2 */ + u64 _02e8[3]; /* 0x02e8 */ + + u64 gpr[31]; /* 0x0300 */ + u64 _03f8; /* 0x03f8 */ + + union { + u64 icptd[8]; /* 0x0400 */ + /* validity-interception reason; icptr 0x01 */ + u16 vir; /* 0x0400 */ + /* host access interception details; icptr 0x02 */ + struct { + u64 esr_el2; /* 0x0400 */ + u8 _0408[6]; /* 0x0408 */ + u16 pic; /* 0x040e */ + union teid teid; /* 0x0410 */ + gva_t far_el2; /* 0x0418 */ + gva_t vaddr; /* 0x0420 */ + u64 suppl; /* 0x0428 */ + u8 gltl; /* 0x0430 */ + u8 _0431[7]; /* 0x0431 */ + u64 _0438; /* 0x0438 */ + } hai; + /* exception-interception details; icptr 0x03 */ + struct { + u64 esr_el2; /* 0x0400 */ + u64 _0408[2]; /* 0x0408 */ + gva_t far_el2; /* 0x0418 */ + } trap; + /* timer-interception reason; icptr 0x04 */ +#define SAE_IR_TIMER_ID_VIRT BIT(6) +#define SAE_IR_TIMER_ID_PHYS BIT(7) + u8 tir; /* 0x0400 */ + }; + u64 _0440[376]; /* 0x0440 */ +} __packed __aligned(PAGE_SIZE); +static_assert(sizeof(struct kvm_sae_block) =3D=3D PAGE_SIZE); + +struct kvm_sae_save_area { +#define SAE_SAVE_AREA_FORMAT_0 0x00 + u8 saf; /* 0x0000 */ + u8 _0001[5]; /* 0x0001 */ +#define SAE_SAS_VALID BIT(0) + u16 sas; /* 0x0006 */ + u64 sdo; /* 0x0008 */ + u64 _0010[2]; /* 0x0010 */ + u64 regs[508]; /* 0x0020 */ +} __packed __aligned(PAGE_SIZE); +static_assert(sizeof(struct kvm_sae_save_area) =3D=3D PAGE_SIZE); + +#endif /* ASM_KVM_HOST_ARM64_TYPES_H */ diff --git a/arch/s390/include/asm/kvm_host_types.h b/arch/s390/include/asm= /kvm_host_types.h index e5bdba07cab0..d308739ebcf5 100644 --- a/arch/s390/include/asm/kvm_host_types.h +++ b/arch/s390/include/asm/kvm_host_types.h @@ -3,6 +3,10 @@ #ifndef ASM_KVM_HOST_TYPES_H #define ASM_KVM_HOST_TYPES_H =20 +#ifdef KVM_S390_ARM64 +#include +#else #include +#endif /* KVM_S390_ARM64 */ =20 #endif /* ASM_KVM_HOST_TYPES_H */ diff --git a/arch/s390/include/asm/sae.h b/arch/s390/include/asm/sae.h new file mode 100644 index 000000000000..b644e65c4e37 --- /dev/null +++ b/arch/s390/include/asm/sae.h @@ -0,0 +1,58 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __ASM_S390_SAE_H +#define __ASM_S390_SAE_H + +#include +#include + +#ifndef __ASSEMBLER__ + +/* defined in arch/s390/kernel/entry.S */ +asmlinkage void __sae64a(phys_addr_t sae_block_phys); + +#include +#include + +/** + * sae64a() - Start Arm Execution + * @sae_block: pointer to the SAE control block + */ +static inline void sae64a(struct kvm_sae_block *sae_block) +{ + __sae64a(virt_to_phys(sae_block)); +} + +/** + * stiasrm() - STore and Invalidate Arm System Register Multiple + * @save_area: Pointer to SAE save area + * + * Store the guest system registers to the save area. + * The values in the guest are no longer valid. + */ +static __always_inline void stiasrm(struct kvm_sae_save_area *save_area) +{ + asm volatile( + " .insn rre,0xb9a70000,%[r1],0\n" + : "+m"(*save_area) + : [r1] "a"(save_area) + ); +} + +/** + * lasrm() - Load Arm System Register Multiple + * + * @save_area: Pointer to SAE save area + * + * Load the system registers from save_area into the guest. + */ +static __always_inline void lasrm(struct kvm_sae_save_area *save_area) +{ + asm volatile( + " .insn rre,0xb9a60000,%[r1],0\n" + : + : "m"(*save_area), [r1] "a"(save_area) + ); +} + +#endif /* !__ASSEMBLER__ */ +#endif /* __ASM_S390_SAE_H */ diff --git a/arch/s390/include/asm/stacktrace.h b/arch/s390/include/asm/sta= cktrace.h index ac3606c3babe..2d332d7c8145 100644 --- a/arch/s390/include/asm/stacktrace.h +++ b/arch/s390/include/asm/stacktrace.h @@ -59,6 +59,7 @@ static inline bool on_stack(struct stack_info *info, struct stack_frame { union { unsigned long empty[9]; + /* SIE stack frame */ struct { unsigned long sie_control_block; unsigned long sie_savearea; @@ -68,6 +69,10 @@ struct stack_frame { unsigned long sie_guest_asce; unsigned long sie_irq; }; + /* SAE stack frame */ + struct { + unsigned long sae_bear; + }; }; unsigned long gprs[10]; unsigned long back_chain; diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c index f6dd2b67dcee..f9f9c2246074 100644 --- a/arch/s390/kernel/asm-offsets.c +++ b/arch/s390/kernel/asm-offsets.c @@ -70,6 +70,7 @@ int main(void) OFFSET(__SF_SIE_CONTROL_PHYS, stack_frame, sie_control_block_phys); OFFSET(__SF_SIE_GUEST_ASCE, stack_frame, sie_guest_asce); OFFSET(__SF_SIE_IRQ, stack_frame, sie_irq); + OFFSET(__SF_SAE_BEAR, stack_frame, sae_bear); DEFINE(STACK_FRAME_OVERHEAD, sizeof(struct stack_frame)); BLANK(); OFFSET(__SFUSER_BACKCHAIN, stack_frame_user, back_chain); diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index 10dd9bbdf985..af515f2b6c11 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S @@ -245,6 +245,28 @@ EXPORT_SYMBOL(__sie64a) EXPORT_SYMBOL(sie_exit) #endif =20 +#if IS_ENABLED(CONFIG_KVM) +/* + * __sae64a calling convention: + * %r2 pointer to sae control block physical address + */ +SYM_FUNC_START(__sae64a) + stmg %r6,%r14,__SF_GPRS(%r15) # store kernel registers + STBEAR __SF_SAE_BEAR(%r15) # save breaking event address register + .insn rre,0xb9a50000,%r2,0 # Start Arm Execution + LBEAR __SF_SAE_BEAR(%r15) # restore breaking event address register + lmg %r6,%r14,__SF_GPRS(%r15) # restore kernel registers + xgr %r0,%r0 # clear guest registers to + xgr %r1,%r1 # prevent speculative use + xgr %r2,%r2 + xgr %r3,%r3 + xgr %r4,%r4 + xgr %r5,%r5 + BR_EX %r14 +SYM_FUNC_END(__sae64a) +EXPORT_SYMBOL(__sae64a) +#endif + /* * SVC interrupt handler routine. System calls are synchronous events and * are entered with interrupts disabled. diff --git a/arch/s390/tools/opcodes.txt b/arch/s390/tools/opcodes.txt index def2659f6602..0e4773c94af0 100644 --- a/arch/s390/tools/opcodes.txt +++ b/arch/s390/tools/opcodes.txt @@ -594,6 +594,9 @@ b9a0 clp RRF_U0RR b9a1 tpei RRE_RR b9a2 ptf RRE_R0 b9a4 uvc RRF_URR +b9a5 sae RRE_R0 +b9a6 lasrm RRE_R0 +b9a7 stiasrm RRE_R0 b9aa lptea RRF_RURR2 b9ab essa RRF_U0RR b9ac irbm RRE_RR --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 109314F93CE; Fri, 18 Sep 2026 13:32:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738326; cv=none; b=heTXJpScMRw5+KCwxUksSWCuMuXz7uWyX4xV+lUTR+QGVBilKxK2Y98WIsS+2kIqv/uwLQD6PxFkF8N2i4LSmmiaOYfdAwoGJLADqZCWQdbvG2EQkefv+X/Uboiushg9bOOMNx8zsZF3zC0DbHtL9gEoc+hVa/Rwz35kyxr5qpY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738326; c=relaxed/simple; bh=t1jeXn9iWc9cZUhznIX2JIDgkagJrvhqYk8LrNxNg8o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CZ8rfuEKwRManiFtyJJJ7pM/IoZMtiFhOECuDtxy8g65pOFd72d0xABuzdmdMbn5Vj7hG6yRgmPePuwG2laHo+RlC54tmqrEvXiEb17B0QYWfxK0kCGC+tzH2DsUv0QW3WCZ7ehjD35m42KUPNiNvJovHlwbWsdGdBz0AAmycm4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=X0XvJyTt; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="X0XvJyTt" Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDVOpO3708389; Fri, 18 Sep 2026 13:31:26 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=ivmcceeRGorrfwpwV re86o39eFpixfIESvS4Tqwwa98=; b=X0XvJyTt8uTeqpiG8AIRb527cWY7o0adZ EPecq8nfjAqE75VMnf0COClU8v2gSw9/vbm1f/O/NS0AxISREH9a2w9VWQpUziMB HTftruhe6jI/7x/KnZTlhjyjLv1JFU3orSvZhAXwc3yVUDWDpufAMBP8DZrH5zJw x+yvNWOcgv1of1KlXRlhp1qixGUGmiKsYGggSI5tnfkMMwEpuDDAKAK7+ELEsP8g WVrp5qzW3HJJivNV/4q2wPGC2f075bKOdaIV3U19CEhD1u1JRp9eszDB8hEOIVZb yI0ZNd0k7JlPSro64EtKPlf4+cObjZaWRfs0fgdqCHxlRlDluIGSg== Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmxdqra33-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:25 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDNwJQ722825; Fri, 18 Sep 2026 13:31:24 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gr5fjqgw4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:24 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVF5X45351220 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:16 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C992C20040; Fri, 18 Sep 2026 13:31:15 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7346F2004B; Fri, 18 Sep 2026 13:31:15 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:15 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 21/29] KVM: s390: arm64: Introduce host definitions Date: Fri, 18 Sep 2026 15:30:58 +0200 Message-ID: <20260918133107.1042730-22-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE5MiBTYWx0ZWRfXw/RngsBCgYC0 U5UOx7fme+hxEGn+fCSqxe2N/Dw++fXE8xwPU0EuX7VcofqtcvmT+jx8r79Eoek2MMHuMnAJI2Y k8NF+F6NocG+KDkpnowuC3dWCYq3wvbjEtvH5KDq2c9SEqhBfGqkkOnVhpLWeC7hZEqYoP7ODVp YS+EAwtKY2e6MJm+DGZDRNzv8a/r4SI0TNEzLjuQHlq+XtEPLHTEyVTzXu+5xyNVCDh7mkH78AX 4iUu9xMtK7kmNbZl6PqpUgAKMyjbYuYmseMdYk8JdfXYNyLX1h6yihYLJvNcJHSun/bQTyUIm9V EePVeRmrNVmH0QZuoGcYkY/bLm5dg6s0qFd1TRFbl7SN5IG6hDigOvRECVnU0P6D0ofMD8+k2wv iBNZ6BYzOZiQYeGRBaPK5MaM/2WrfunbukyoYRvB8bZeyp63Z+QFFcUw5jqNAUWAjp9jm4ZWONm d/cm2x7vAXR4/+rFlYA== X-Proofpoint-GUID: RQDaemn8p4tOZc5VsxLjs0LCk3XSHfEB X-Authority-Analysis: v=2.4 cv=DobDa2/+ c=1 sm=1 tr=0 ts=6aad3d2e cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VnNF1IyMAAAA:8 a=NkYWUXnGwG2_pH3cPtwA:9 X-Proofpoint-ORIG-GUID: s5X10l3rB8uvsmzW7r96g7DtId0z0Lws X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE5MiBTYWx0ZWRfX18l+J3ujZym5 HzG7BeG2MdpJ4GHKlxFm4e7fTT5E2GFiOcYHdi4I2VVZP7BGypB22wFly8K+uqp7nRH5hCcapei 8Iti2LcujhWBhwTR46N7SkYehhDRKds= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_04,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 malwarescore=0 priorityscore=1501 suspectscore=0 impostorscore=0 spamscore=0 clxscore=1015 adultscore=0 bulkscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180192 Content-Type: text/plain; charset="utf-8" Add all basic definitions the arm on s390 KVM host requires. Including, but not limited to, struct kvm*arch definitions, various functions (to be implemented in the following patches), and various defines required to run arm64 guests. Enlighten asm/kvm_host.h for the new header variant. The new header is chosen instead of asm/kvm_host_s390.h if KVM_S390_ARM64 is defined. Co-developed-by: Andreas Grapentin Signed-off-by: Andreas Grapentin Co-developed-by: Nina Schoetterl-Glausch Signed-off-by: Nina Schoetterl-Glausch Signed-off-by: Steffen Eiden --- arch/s390/include/asm/kvm.h | 6 + arch/s390/include/asm/kvm_host.h | 9 ++ arch/s390/include/asm/kvm_host_arm64.h | 212 +++++++++++++++++++++++++ 3 files changed, 227 insertions(+) create mode 100644 arch/s390/include/asm/kvm.h create mode 100644 arch/s390/include/asm/kvm_host_arm64.h diff --git a/arch/s390/include/asm/kvm.h b/arch/s390/include/asm/kvm.h new file mode 100644 index 000000000000..aeb11dc631d5 --- /dev/null +++ b/arch/s390/include/asm/kvm.h @@ -0,0 +1,6 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifdef KVM_S390_ARM64 +#include +#else +#include +#endif diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_h= ost.h index 147325978225..cd6d572883ab 100644 --- a/arch/s390/include/asm/kvm_host.h +++ b/arch/s390/include/asm/kvm_host.h @@ -3,7 +3,16 @@ #ifndef ASM_KVM_HOST_H #define ASM_KVM_HOST_H =20 +#ifdef KVM_S390_ARM64 +#include +#else #include +#endif + +static inline bool kvm_arch_pmi_in_guest(struct kvm_vcpu *vcpu) +{ + return false; +} =20 #define PGM_OPERATION 0x01 #define PGM_PRIVILEGED_OP 0x02 diff --git a/arch/s390/include/asm/kvm_host_arm64.h b/arch/s390/include/asm= /kvm_host_arm64.h new file mode 100644 index 000000000000..3d036361b63b --- /dev/null +++ b/arch/s390/include/asm/kvm_host_arm64.h @@ -0,0 +1,212 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef ASM_KVM_HOST_ARM64_H +#define ASM_KVM_HOST_ARM64_H + +#include + +#include +#include + +#define vcpu_gp_regs(v) ((v)->arch.sae_block.gpr) + +#include +#include + +#include + +#define KVM_HAVE_MMU_RWLOCK +#define KVM_MAX_VCPUS 1 +#define KVM_READONLY_MEM +#define KVM_VCPU_RUN_PID_CHANGE + +#define KVM_S390_ARM64_IMPL_FEATURES 0 +#define KVM_HALT_POLL_NS_DEFAULT 50000 + +#define KVM_S390_MANAGES_S390_GUEST 0 + +/* Minimal (=3Dno) vgic definitions */ +#define KVM_IRQCHIP_NUM_PINS 1 +#define irqchip_in_kernel(_k) false + +#define __ctxt_sys_reg(ctx, reg) NULL +struct kvm_cpu_context { + /* + * These are just for 32 bit, which we don't have, making them RES0. + * They are exposed to user space. + */ + u64 spsr_abt; + u64 spsr_und; + u64 spsr_irq; + u64 spsr_fiq; + + __vector128 __aligned(16) vregs[32]; +}; + +struct kvm_vcpu_arch { + struct kvm_sae_block sae_block; + struct kvm_sae_save_area save_area; + struct kvm_cpu_context ctxt; + + u32 host_acrs[NUM_ACRS]; + + /* Hypervisor Configuration Register */ + u64 hcr_el2; + + /* Configuration flags, set once and for all before the vcpu can run */ + u8 cflags; + + /* Input flags to the hypervisor code, potentially cleared after use */ + u8 iflags; + + /* State flags for kernel bookkeeping, unused by the hypervisor code */ + u8 sflags; + + /* + * Don't run the guest (internal implementation need). + * + * Contrary to the flags above, this is set/cleared outside of + * a vcpu context, and thus cannot be mixed with the flags + * themselves (or the flag accesses need to be made atomic). + */ + bool pause; + + /* vcpu power state */ + struct kvm_mp_state mp_state; + /* lock for mp_state & reset_state.reset */ + spinlock_t mp_state_lock; + + /* vcpu reset state */ + struct vcpu_reset_state reset_state; + + /* GMAP */ + struct gmap *gmap; + struct kvm_s390_mmu_cache *mc; + + void *debugfs_state_data; +}; + +struct kvm_vcpu_stat { + struct kvm_vcpu_stat_generic generic; + /* ARM64 stats */ + u64 hvc_exit_stat; + u64 wfe_exit_stat; + u64 wfi_exit_stat; + u64 mmio_exit_user; + u64 mmio_exit_kernel; + u64 signal_exits; + u64 exits; + /* GMAP stats */ + u64 pfault_sync; +}; + +#define kvm_has_mte(_kvm) false +#define vcpu_has_sve(_vcpu) false +#define vcpu_has_ptrauth(_vcpu) false + +struct kvm_arch_memory_slot { +}; + +struct kvm_arch { + struct gmap *gmap; + u64 guest_phys_size; + + /* VM-wide vCPU feature set */ + unsigned long flags; + + /* Protects VM-scoped configuration data */ + struct mutex config_lock; + + debug_info_t *dbf; + + DECLARE_BITMAP(vcpu_features, KVM_VCPU_MAX_FEATURES); + + unsigned long mem_limit; +}; + +static inline bool __vcpu_has_feature(const struct kvm_arch *ka, int featu= re) +{ + return test_bit(feature, ka->vcpu_features); +} + +struct kvm_vm_stat { + struct kvm_vm_stat_generic generic; +}; + +static inline bool system_has_full_ptr_auth(void) +{ + return true; +} + +#define kvm_vm_is_protected(_kvm) false +#define vcpu_is_protected(_vcpu) false + +#define vcpu_is_loaded(_vcpu) ((_vcpu)->cpu !=3D -1) + +#define KVM_HVA_ERR_BAD -1UL +#define KVM_HVA_ERR_RO_BAD -2UL + +static inline bool kvm_is_error_hva(unsigned long addr) +{ + return IS_ERR_VALUE(addr); +} + +u32 get_kvm_ipa_limit(void); + +/* unused, but required functions */ +static inline void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memor= y_slot *slot) {} +static inline void kvm_arch_memslots_updated(struct kvm *kvm, u64 gen) {} +static inline void kvm_arch_flush_shadow_all(struct kvm *kvm) {} +static inline void kvm_arch_flush_shadow_memslot(struct kvm *kvm, struct k= vm_memory_slot *slot) {} +static inline void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu) {} +static inline void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu) {} +static inline void kvm_arch_sync_events(struct kvm *kvm) {} +static inline void kvm_arch_sched_in(struct kvm_vcpu *vcpu, int cpu) {} +static inline void kvm_arch_mmu_enable_log_dirty_pt_masked(struct kvm *kvm, + struct kvm_memory_slot *slot, + gfn_t gfn_offset, + unsigned long mask) {} + +int kvm_handle_guest_abort(struct kvm_vcpu *vcpu); +void kvm_reset_vcpu(struct kvm_vcpu *vcpu); + +/* arm64 guests do not use async-pf. Defined because Kbuild requires it as= s390 kvm turns it on. */ +#define ASYNC_PF_PER_VCPU 0 +struct kvm_arch_async_pf { + unsigned long pfault_token; +}; + +#define __unsupp_async_call(fn) WARN_ONCE(true, "async not supported on kv= m-arm64 %s", fn) + +static inline bool kvm_arch_can_dequeue_async_page_present(struct kvm_vcpu= *vcpu) +{ + __unsupp_async_call(__func__); + return false; +}; + +static inline void kvm_arch_async_page_ready(struct kvm_vcpu *vcpu, + struct kvm_async_pf *work) +{ + __unsupp_async_call(__func__); +}; + +static inline bool kvm_arch_async_page_not_present(struct kvm_vcpu *vcpu, + struct kvm_async_pf *work) +{ + __unsupp_async_call(__func__); + return false; +}; + +static inline void kvm_arch_async_page_present(struct kvm_vcpu *vcpu, + struct kvm_async_pf *work) +{ + __unsupp_async_call(__func__); +}; + +static inline void kvm_arch_async_page_present_queued(struct kvm_vcpu *vcp= u) +{ + __unsupp_async_call(__func__); +}; + +#define kvm_supports_32bit_el0() false + +#endif /* ASM_KVM_HOST_ARM64_H */ --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 732CE4EFFB1; Fri, 18 Sep 2026 13:32:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738328; cv=none; b=eMzr99kc8hBoVDXvwlRLfO8omAemY2ptfvVm9G+1JBBIABf9Gx1h2xBcDXz/9qbmRkXmHMRugc38cG43JV+6PWO2vcIlLAzCxc+EXWo2QQNIOaevIgaD2pw3b/f81mCeI7dBZL9dCEaT+eQiTLMWJhBZQlp9RVUqwjPzEWiQK5E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738328; c=relaxed/simple; bh=tmItWwCbeld3hacr1W/IAEWGRv9LaAVfUr4NMchFF/M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ebZ/OIg22qQDHX38LFL/Md1jhPP7OkYuTD8y2QhDirGOIEIngwtVXrJYJ/J3RJ5h6op0XsCuZqc7PewoPStHK1ZrGUXsKZQPzyVdicVZu7n2BIFLjOQf784VO4oiZaTRCVCT/uSuw0OiJv4ys7oNtxI+BHqJOxcSiiO+z+xY02g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=AQdOW0JR; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="AQdOW0JR" Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA1fVM961319; Fri, 18 Sep 2026 13:31:25 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=ywId08J7Tbx4MqC2r zjHWK754WaVxW5lbY11LpqyFpM=; b=AQdOW0JRXYwCVLE7TH4s6HDr8DiMiipWO Swxn0YVoIMogm8OFstEoLD8FqC9JZoE6KYv9HlIxGiV8J7x023zrTqn6bxlg2Za2 VWH+8plqhHhiEJnmdSw50COLXBrFj9dHLtktdjiPy2sEByy31Rn1eneUyIUH4ZTj G8+jRS2raUrgU2DnZYfFkuo7/WeUl07ltK3BVI5Tgr1PTvdgbEJQgEewdlAdr4SZ blvi0837EwfTSj/dBpTpLN0coF4icE94z5N4u5rMhGfUD0f1brUshQM+342M0vD4 wxKX4cRfZ1zBgnZgMVtA5N5bwOpZ2U3N3N+/tiuPHaqsiDWfFt/Ng== Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmxf5gb7c-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:24 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDNrbu777353; Fri, 18 Sep 2026 13:31:23 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gra3yxkc4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:23 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVGQL40305056 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:16 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 292E420040; Fri, 18 Sep 2026 13:31:16 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CFF1D20049; Fri, 18 Sep 2026 13:31:15 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:15 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 22/29] s390/hwcaps: Report SAE support as hwcap Date: Fri, 18 Sep 2026 15:30:59 +0200 Message-ID: <20260918133107.1042730-23-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-GUID: RBbHeuJ4BlONtx86I7st4wH3IyU26ljd X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX/7QU28G0Whtj H/ipDTuXf9PobnVR2NDWEY6Oq7Ehfjuc9smjQlXwTJ0N1OK4HjHqR3KjfQS3hAYWtoxu7IjwWov Z4PW/2SCkL7iqb7xC2uD/OQiPljtx8Y= X-Authority-Analysis: v=2.4 cv=cvgOAF4i c=1 sm=1 tr=0 ts=6aad3d2d cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VnNF1IyMAAAA:8 a=MMtvGDNtdIwsdepEW5QA:9 X-Proofpoint-ORIG-GUID: 1_C3DVvU2r7GPSRcTm91NIMiA8jsmHX8 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX0C6vWRMc35Hq B1H2aaaZNNT8nGNtqHHyKTlLqn02OXd3nG9CPGmwqvbAA+H9Oi5Due5/vXvWZi8WnGUwxO3BwR+ 6Wh4GeET02H7qCqc/L2P3II+bVcjq/z5takVbAZysZMhj7y4bPKzpAQkmtqBZ12HloFqPvdeptt 0Z/AvYNDq5wVqGV7bGon0RFqTlplakD+lYBZqDe4d3YjeLSrwOGq5Lup6XYxHlidbH2d1kXGgQW tn53MnDFcJyjo5+jy/9WiZQFTMcN3ZKoWLr3b0HLxGCS0zwubbuzemavtwC+qrrnQzbxDxjmnV6 oMG4TuoGihNF7HTMQe40EqOAuKxTgWw2FfC6FMizS9ntUTPX1oG5HHJw1A4vwVY47CmilbXYyhD FYquULmdjAdwNm2EMEesVRihWOAlquIk5JwV8loCjRituVQyxFRyWqfIbl5iuUk0xiGv1xqLQtS WY/gEAhb9lVriwrB8OA== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 lowpriorityscore=0 clxscore=1015 priorityscore=1501 suspectscore=0 bulkscore=0 impostorscore=0 phishscore=0 spamscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" From: Hendrik Brueckner Report SAE support as hwcap (and /proc/cpuinfo) Signed-off-by: Hendrik Brueckner Reviewed-by: Steffen Eiden Signed-off-by: Steffen Eiden Reviewed-by: Janosch Frank --- arch/s390/include/asm/elf.h | 2 ++ arch/s390/include/asm/sclp.h | 5 ++++- arch/s390/kernel/processor.c | 3 +++ drivers/s390/char/sclp_early.c | 1 + 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/arch/s390/include/asm/elf.h b/arch/s390/include/asm/elf.h index bb63fa4d20bb..ad3108ecfb07 100644 --- a/arch/s390/include/asm/elf.h +++ b/arch/s390/include/asm/elf.h @@ -123,6 +123,7 @@ enum { HWCAP_NR_NNPA =3D 20, HWCAP_NR_PCI_MIO =3D 21, HWCAP_NR_SIE =3D 22, + HWCAP_NR_SAE =3D 23, HWCAP_NR_MAX }; =20 @@ -150,6 +151,7 @@ enum { #define HWCAP_NNPA BIT(HWCAP_NR_NNPA) #define HWCAP_PCI_MIO BIT(HWCAP_NR_PCI_MIO) #define HWCAP_SIE BIT(HWCAP_NR_SIE) +#define HWCAP_SAE BIT(HWCAP_NR_SAE) =20 /* * These are used to set parameters in the core dumps. diff --git a/arch/s390/include/asm/sclp.h b/arch/s390/include/asm/sclp.h index 44066550b9b1..68f61b71a2d5 100644 --- a/arch/s390/include/asm/sclp.h +++ b/arch/s390/include/asm/sclp.h @@ -56,7 +56,9 @@ struct sclp_core_entry { u8 siif : 1; u8 sigpif : 1; u8 : 3; - u8 reserved2[3]; + u8 aef: 1; + u8 : 7; + u8 reserved2[2]; u8 : 2; u8 ib : 1; u8 cei : 1; @@ -109,6 +111,7 @@ struct sclp_info { unsigned char has_aeni : 1; unsigned char has_aisi : 1; unsigned char has_astfleie2 : 1; + unsigned char has_aef : 1; unsigned int ibc; unsigned int mtid; unsigned int mtid_cp; diff --git a/arch/s390/kernel/processor.c b/arch/s390/kernel/processor.c index e33a3eccda56..6da55a158027 100644 --- a/arch/s390/kernel/processor.c +++ b/arch/s390/kernel/processor.c @@ -150,6 +150,7 @@ static void show_cpu_summary(struct seq_file *m, void *= v) [HWCAP_NR_NNPA] =3D "nnpa", [HWCAP_NR_PCI_MIO] =3D "pcimio", [HWCAP_NR_SIE] =3D "sie", + [HWCAP_NR_SAE] =3D "sae", }; int i, cpu; =20 @@ -254,6 +255,8 @@ static int __init setup_hwcaps(void) /* virtualization support */ if (sclp.has_sief2) elf_hwcap |=3D HWCAP_SIE; + if (sclp.has_aef) + elf_hwcap |=3D HWCAP_SAE; =20 return 0; } diff --git a/drivers/s390/char/sclp_early.c b/drivers/s390/char/sclp_early.c index 22dd797e6229..e58d24b95bd1 100644 --- a/drivers/s390/char/sclp_early.c +++ b/drivers/s390/char/sclp_early.c @@ -96,6 +96,7 @@ static void __init sclp_early_facilities_detect(void) sclp.has_ib =3D cpue->ib; sclp.has_cei =3D cpue->cei; sclp.has_skey =3D cpue->skey; + sclp.has_aef =3D cpue->aef; break; } =20 --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 900DD50B8AB; Fri, 18 Sep 2026 13:32:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738340; cv=none; b=kYPi6nbena/Bcr5Ay8LXr3axPVBdDbFyGc1pr3Rdv/lujp0cyOxYGfOS1PZWSxSeR7lPZ56fC4acR4BMhN66RHIl52taq+E5CMmzgCQ6HQtbAVjhNy3tbbe9BcpdHlBdASshOiOwTSDXxy3FkYyIq1YWLAfwxZz1x5yFUEsFqE8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738340; c=relaxed/simple; bh=KlUzCh+5mBk5mgiUhbZnHGv1HtA2mcrxVwFDw7e+b+k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GsyjYpODZ9bW1IxW9oXwrju2fOIxA/GIX1IEHgNGy/e3bWjMInci8dOaM+Uvm6Yq4tjfQkGpFq2D8EDp2wsuwdumSrzfBUNFn4F/ZnW2aHEgmMJ9miGeMStQrfqk84ioVQyZFrG4BSqPw5+K1tym9M0DIJHn2+VsIkvMwZJQ3g8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=WinBD692; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="WinBD692" Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA1Z0w3979089; Fri, 18 Sep 2026 13:31:25 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=5u3gurQPJnVB3ezqa JY0vbk7DHBvRJ1v+yDXH7noGsk=; b=WinBD692L6MONarn37IJzeHa/J16q/ds4 FjUmIH0FHfpb98eR8igrpkVTkjo04g+t2OQrDxtHTTlzpA2fbuxUHz8aOcbxC357 4HvPJVg46TDG+U8Y72XUFKbhs8n9d+5/rR33o5zPoWxywn3krmVIQTmTJ2JL9d3h UHqj9djKwSpSyiyDrjWSbKz3ozgGkbb6E/m25hN2854kRplPJ0QuEkI9V3lVzf3z lnYXZ0sU52wGmd089rXmgmrgqJpmzGBnBGgGwTAQfMoAuWdAh1VsPtj9/PQVsTTZ rugXKPgSDBaQfWMwhJHMugla2DLtU1gyUBS201z7nM4s9O4CfqXQA== Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmw5eftt3-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:24 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDNrhi1684363; Fri, 18 Sep 2026 13:31:23 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gs4tv8bhp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:23 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVGHI40042868 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:16 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 872B120040; Fri, 18 Sep 2026 13:31:16 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2F9A72004B; Fri, 18 Sep 2026 13:31:16 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:16 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 23/29] KVM: s390: Add basic arm64 kvm module Date: Fri, 18 Sep 2026 15:31:00 +0200 Message-ID: <20260918133107.1042730-24-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX4nlFjU6REHZ0 QXLROdzSvukMpSYaKeYKtXSTxMONCvjc0IGurrHfp0B5dTu+8je+qy0OoQ+I8OyFZAFgQw0r4jC oziE5RJZnW6M1IhlnVpewXI31dQSivOvFMRZqr5p+CdXtiyDE6U3M5+eLftxsAaKslOcLXhbuyV WHyoQ/CTARmcgi61DcinHera/AZozy8aLf9lL1sVjjddWk9q0XbJG+ur1ZOeRvNeuKnRcrSgzUE D8XAhlX7TQ55sNeSgTanZY47Osq4agKZ5TOMm7ypiM/SH6NF6DOEXK5boiPABwMv/OHhTYoLw0s 0XLYlz8imNLSQkLotoDlR5aISF3AjUVTN3Qxg/+17l6vmiASRUhUTW2PJq6UrubA63ErtqRfCyV axjy43Hj3bEYBu9YN3uKb3ZCP1LWoXmkQVVk/dmLlscHYgQLKXJYvBTYPOdZOdSqycf1GNpPs0o IYKgfOCY6nwLJ4f40ag== X-Authority-Analysis: v=2.4 cv=E/NYNqdl c=1 sm=1 tr=0 ts=6aad3d2d cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VnNF1IyMAAAA:8 a=eH1OejZgTT6WBNCqD1QA:9 X-Proofpoint-ORIG-GUID: bVjiixvRfX8on-bqRom4aYFfkTcztkCU X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX8RHWvRNcFegY 5xeL1X+xYoMOHF6h+p85+Bv8TxjJNbNJe31l7twVkJBP/muUD9dnzjZfjSUiFzIDWk3XK6225R3 Ewi7KjE8xpyGOdEXCMro1ZhvE7s+DwI= X-Proofpoint-GUID: GD60kTMhlDLXMSKdia1D2MKCMb3e19Bz X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 priorityscore=1501 spamscore=0 adultscore=0 clxscore=1015 bulkscore=0 malwarescore=0 suspectscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" Add basic code for the new arm64 on s390 KVM implementation. Add kernel module boilerplate code and trivial functions. Add tracing scaffolding. Signed-off-by: Steffen Eiden --- arch/s390/kvm/arm64/arm.c | 147 ++++++++++++++++++++++++++++++++++++ arch/s390/kvm/arm64/arm.h | 44 +++++++++++ arch/s390/kvm/arm64/guest.c | 92 ++++++++++++++++++++++ arch/s390/kvm/arm64/trace.h | 18 +++++ 4 files changed, 301 insertions(+) create mode 100644 arch/s390/kvm/arm64/arm.c create mode 100644 arch/s390/kvm/arm64/arm.h create mode 100644 arch/s390/kvm/arm64/guest.c create mode 100644 arch/s390/kvm/arm64/trace.h diff --git a/arch/s390/kvm/arm64/arm.c b/arch/s390/kvm/arm64/arm.c new file mode 100644 index 000000000000..8b056fc836d7 --- /dev/null +++ b/arch/s390/kvm/arm64/arm.c @@ -0,0 +1,147 @@ +// SPDX-License-Identifier: GPL-2.0 + +#define KMSG_COMPONENT "kvm-s390-arm64" +#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt + +#include +#include +#include +#include + +#include "arm.h" + +#define CREATE_TRACE_POINTS +#include "trace.h" + +static unsigned long system_supported_vcpu_features(void); + +#define __INCL_GEN_ARM_FILE +#include "generated/arm.inc" +#undef __INCL_GEN_ARM_FILE + +int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) +{ + int ret; + + switch (ext) { + case KVM_CAP_NR_VCPUS: + case KVM_CAP_MAX_VCPUS: + case KVM_CAP_MAX_VCPU_ID: + ret =3D KVM_MAX_VCPUS; + break; + case KVM_CAP_ARM_VM_IPA_SIZE: + ret =3D get_kvm_ipa_limit(); + break; + case KVM_CAP_IOEVENTFD: + ret =3D 1; + break; + default: + ret =3D 0; + } + + return ret; +} + +static u64 kvm_max_guest_address(void) +{ + u64 max_addr; + + max_addr =3D min_t(u64, TASK_SIZE_MAX, sclp.hamax); + max_addr =3D max_t(u64, max_addr, SZ_1G - 1); + return ALIGN_DOWN(max_addr + 1, SZ_1G) - 1; +} + +vm_fault_t kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf) +{ + return VM_FAULT_SIGBUS; +} + +long kvm_arch_dev_ioctl(struct file *filp, + unsigned int ioctl, unsigned long arg) +{ + return -EINVAL; +} + +u32 get_kvm_ipa_limit(void) +{ + return fls64(kvm_max_guest_address() + 1) - 1; +} + +int kvm_arch_vcpu_precreate(struct kvm *kvm, unsigned int id) +{ + return 0; +} + +void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu) +{ +} + +int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, + struct kvm_mp_state *mp_state) +{ + *mp_state =3D READ_ONCE(vcpu->arch.mp_state); + return 0; +} + +int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, + struct kvm_mp_state *mp_state) +{ + return -EINVAL; +} + +int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) +{ + return 0; +} + +static unsigned long system_supported_vcpu_features(void) +{ + unsigned long features =3D KVM_S390_ARM64_IMPL_FEATURES; + + return features; +} + +bool kvm_arch_irqchip_in_kernel(struct kvm *kvm) +{ + return false; +} + +int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e, struct kvm *kvm, + int irq_source_id, int level, bool line_status) +{ + return -EINVAL; +} + +int kvm_set_routing_entry(struct kvm *kvm, + struct kvm_kernel_irq_routing_entry *e, + const struct kvm_irq_routing_entry *ue) +{ + return -EINVAL; +} + +int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu) +{ + return 0; +} + +long kvm_arch_vcpu_unlocked_ioctl(struct file *filp, unsigned int ioctl, + unsigned long arg) +{ + return -ENOIOCTLCMD; +} + +static int __init kvm_s390_arm64_init(void) +{ + if (!sclp.has_aef) + return -ENXIO; + + return kvm_init(sizeof(struct kvm_vcpu), 0, THIS_MODULE); +} + +static __exit void kvm_s390_arm64_exit(void) +{ + kvm_exit(); +} + +module_init(kvm_s390_arm64_init); +module_exit(kvm_s390_arm64_exit); diff --git a/arch/s390/kvm/arm64/arm.h b/arch/s390/kvm/arm64/arm.h new file mode 100644 index 000000000000..b38eb44c11fe --- /dev/null +++ b/arch/s390/kvm/arm64/arm.h @@ -0,0 +1,44 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef ARCH_S390_KVM_ARM64_H +#define ARCH_S390_KVM_ARM64_H + +static __always_inline int kvm_is_ucontrol(struct kvm *kvm) +{ + return 0; +} + +static __always_inline int __kvm_s390_pv_destroy_page(struct page *page) +{ + return 0; +} + +static __always_inline void kvm_s390_vsie_gmap_notifier(struct gmap *gmap,= gpa_t start, gpa_t end) +{ +} + +static __always_inline int kvm_s390_pv_get_handle(struct kvm *kvm) +{ + return 0; +} + +static __always_inline int kvm_s390_is_migration_mode(struct kvm *kvm) +{ + return false; +} + +static __always_inline bool kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu) +{ + return false; +} + +static __always_inline void kvm_s390_update_cmma_dirty(struct kvm *kvm, st= ruct kvm_memory_slot *old) +{ +} + +/* should never be called */ +static __always_inline int kvm_s390_vm_stop_migration(struct kvm *kvm) +{ + return -EINVAL; +} + +#endif /* ARCH_S390_KVM_ARM64_H */ diff --git a/arch/s390/kvm/arm64/guest.c b/arch/s390/kvm/arm64/guest.c new file mode 100644 index 000000000000..fd6442d9e4f4 --- /dev/null +++ b/arch/s390/kvm/arm64/guest.c @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include + +#include +#include + +#include "guest.h" + +#define __INCL_GEN_ARM_FILE +#include "generated/guest.inc" +#undef __INCL_GEN_ARM_FILE + +const struct kvm_stats_desc kvm_vm_stats_desc[] =3D { + KVM_GENERIC_VM_STATS() +}; + +const struct kvm_stats_header kvm_vm_stats_header =3D { + .name_size =3D KVM_STATS_NAME_SIZE, + .num_desc =3D ARRAY_SIZE(kvm_vm_stats_desc), + .id_offset =3D sizeof(struct kvm_stats_header), + .desc_offset =3D sizeof(struct kvm_stats_header) + KVM_STATS_NAME_SIZE, + .data_offset =3D sizeof(struct kvm_stats_header) + KVM_STATS_NAME_SIZE + + sizeof(kvm_vm_stats_desc), +}; + +const struct kvm_stats_desc kvm_vcpu_stats_desc[] =3D { + KVM_GENERIC_VCPU_STATS(), + /* ARM64 stats */ + STATS_DESC_COUNTER(VCPU, hvc_exit_stat), + STATS_DESC_COUNTER(VCPU, wfe_exit_stat), + STATS_DESC_COUNTER(VCPU, wfi_exit_stat), + STATS_DESC_COUNTER(VCPU, mmio_exit_user), + STATS_DESC_COUNTER(VCPU, mmio_exit_kernel), + STATS_DESC_COUNTER(VCPU, signal_exits), + STATS_DESC_COUNTER(VCPU, exits), + /* GMAP stats */ + STATS_DESC_COUNTER(VCPU, pfault_sync), +}; + +const struct kvm_stats_header kvm_vcpu_stats_header =3D { + .name_size =3D KVM_STATS_NAME_SIZE, + .num_desc =3D ARRAY_SIZE(kvm_vcpu_stats_desc), + .id_offset =3D sizeof(struct kvm_stats_header), + .desc_offset =3D sizeof(struct kvm_stats_header) + KVM_STATS_NAME_SIZE, + .data_offset =3D sizeof(struct kvm_stats_header) + KVM_STATS_NAME_SIZE + + sizeof(kvm_vcpu_stats_desc), +}; + +int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *r= egs) +{ + return -EINVAL; +} + +int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *r= egs) +{ + return -EINVAL; +} + +int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, + struct kvm_sregs *sregs) +{ + return -EINVAL; +} + +int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, + struct kvm_sregs *sregs) +{ + return -EINVAL; +} + +int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) +{ + return -EINVAL; +} + +int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) +{ + return -EINVAL; +} + +int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu, + struct kvm_translation *tr) +{ + return -EINVAL; +} + +int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, + struct kvm_guest_debug *dbg) +{ + return -EINVAL; +} diff --git a/arch/s390/kvm/arm64/trace.h b/arch/s390/kvm/arm64/trace.h new file mode 100644 index 000000000000..3a5dcd039c13 --- /dev/null +++ b/arch/s390/kvm/arm64/trace.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#if !defined(KVM_ARM64_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ) +#define KVM_ARM64_TRACE_KVM_H + +#include + +#undef TRACE_SYSTEM +#define TRACE_SYSTEM kvm + +#endif /* KVM_ARM64_TRACE_KVM_H */ + +#undef TRACE_INCLUDE_PATH +#define TRACE_INCLUDE_PATH . +#undef TRACE_INCLUDE_FILE +#define TRACE_INCLUDE_FILE trace + +/* This part must be outside protection */ +#include --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5A4924A64EE; Fri, 18 Sep 2026 13:36:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738615; cv=none; b=i2cQOIhVOoTbFgsL6/ruEYMSxfUkXLXYODrtIXvMStHJJa3OUY8xvB2EeihyAIkCR1ZMLf7Gl3nRbK0PUDwOGCgbN1USzfszEBl0WjLLen8y63qlptpRpLYSpC8OrjJvdpDDrVVgRHUljqCjZWNu0Pc0Gq0zUEGukmoQvnbdX58= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738615; c=relaxed/simple; bh=3zS3ILOY5u+v+tQSNcrZD4p8aN7fZi8Ujq1/tblUSZM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=A6id811JkPzV1F/if/fU1uyVzzQwBZqgjLXvjyZ50vuK1KqvxVVS+hG5SXVGFQ+gHLpy3nkndhYut4su/tLK+05I3+8QaJcKieL/81uRcj92szJdvFauFBzR+ch0awEUIfCFkCk2cgdy7TXCsNSzTIq5sDAAoE6uZjSTu9dHSRM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=GYu5NOdF; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="GYu5NOdF" Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDVRJP3708434; Fri, 18 Sep 2026 13:31:27 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=I6grQv4vxC77T4JUn 9FYPoPuVQ1P9c6HXUzkuUU42TQ=; b=GYu5NOdFaA2UgOmgnj8TFxYflhTA6iJg8 vXIFnNINzuMOrmHRuXYGaH6M5Ein8HHQ0BcqS5po0Z+mg2sq8pWPj3Zpml6dMSTa /6u42SGbjkGcJ8VPDH8cw0ITW0qLC4xZ0v4YRx2xYEvm/lgJvG+I8zI0nuI18Biy XO8TGkFGeZ0RhHKTECVYpjIbQOetd6RSTKRaJWb7/R7VAMeLu0c+rouBrUPQaMT+ qYPLawrJ5V2YPpBNTFP6Lh9R4r5nmDfJ1TkK9U9ipQmLu78VBcIIfDhlg5PvFOqq J8sKJyFzmmwa+tG4ZPkrYcugv6PqOlBOQA/Qg2YNcWdzP42Gf3HeQ== Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmxdqra38-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:26 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDNqtH722674; Fri, 18 Sep 2026 13:31:25 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gr5fjqgw7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:25 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVHjj46137660 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:17 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E585C2004B; Fri, 18 Sep 2026 13:31:16 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8DA4E2004D; Fri, 18 Sep 2026 13:31:16 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:16 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 24/29] KVM: s390: arm64: Implement required functions Date: Fri, 18 Sep 2026 15:31:01 +0200 Message-ID: <20260918133107.1042730-25-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE5MiBTYWx0ZWRfX2HeyALd528Dm BoiaA8bGsA9Wo85YpEE1v0SSGyOIvESWcI/oC+jen9W37y0XVEVbVmM4qOcNHZnX6QepLxEfmqQ F3IGQFzO2szkmnA+eqFrfBpzuW8YgFOmN/KQP/XGGu13hXxyfJ8AFGj6AJjdnl4rC/A9htNfO0V VVy0qS3dL9UPpS6WjCrqCwnABRwnbE4ILrd6xcurqUHaeGGGiWHaB7n8RS4+bIZdfn23n+4won3 0Rx3QtM1RcTvTSEYQtH4qyEjyJcZURy/cGp+8bNCPetomzCC12IdMef8yLnTnzaPp7B439jWY2o 72LHjyvCPB3tg7Ukr4MjcvtgTEuy4VXYkY5lFAmOqb4ezgQgmDN4U6JeeL3JpfGyvHnkMqDAs6B a4JHiV+fx1zngKungIN6DvE9cZ3ENg7WnmdE5lOniNPgAkCHgWGjhwy6Sljpxf9rmwACTy5k8eV rALViJqUcx6DmiKl4ow== X-Proofpoint-GUID: vJQ5ReAuJTyPDMW78hzAmSjzjX_JVU0Q X-Authority-Analysis: v=2.4 cv=DobDa2/+ c=1 sm=1 tr=0 ts=6aad3d2e cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VnNF1IyMAAAA:8 a=VwQbUJbxAAAA:8 a=aBOitRegfcjIfz6fJ64A:9 X-Proofpoint-ORIG-GUID: cUiHOfDsM8yV9oOpJAZfQPj3i_6UmZ4g X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE5MiBTYWx0ZWRfXx1IyFlR/oPnW 5i63zQs0/sefhprHpPt6OaqHEmbnhqtH/4xipc8Zhg6gmNoFL0QuMox4RB+1bEFJGeP2twyaFjv X3DYuknSAHBfQ0SNj5a3ooEg+1VJX60= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_04,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 malwarescore=0 priorityscore=1501 suspectscore=0 impostorscore=0 spamscore=0 clxscore=1015 adultscore=0 bulkscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180192 Content-Type: text/plain; charset="utf-8" Implement the mostly trivial functions that the shared arm64 (kvm) code & headers oblige s390 to implement. MAINTAINERS: Add arch/s390/include/arm64/* to KVM/s390 Implement a very basic smccc handler that (non-compliantly) is just able to stop a vcpu. Signed-off-by: Steffen Eiden --- MAINTAINERS | 1 + arch/s390/include/arm64/kvm_emulate.h | 130 ++++++++++++++++++++++++++ arch/s390/include/arm64/kvm_nested.h | 11 +++ arch/s390/include/arm64/ptrace.h | 11 +++ arch/s390/include/arm64/sysreg.h | 13 +++ arch/s390/kvm/arm64/handle_exit.c | 128 +++++++++++++++++++++++++ arch/s390/kvm/arm64/inject_fault.c | 21 +++++ 7 files changed, 315 insertions(+) create mode 100644 arch/s390/include/arm64/kvm_emulate.h create mode 100644 arch/s390/include/arm64/kvm_nested.h create mode 100644 arch/s390/include/arm64/ptrace.h create mode 100644 arch/s390/include/arm64/sysreg.h create mode 100644 arch/s390/kvm/arm64/handle_exit.c create mode 100644 arch/s390/kvm/arm64/inject_fault.c diff --git a/MAINTAINERS b/MAINTAINERS index 3b2eb2a7a89a..8c23370b5a3c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -14372,6 +14372,7 @@ L: kvm@vger.kernel.org S: Supported T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git F: Documentation/virt/kvm/s390* +F: arch/s390/include/arm64/* F: arch/s390/include/asm/gmap_helpers.h F: arch/s390/include/asm/kvm* F: arch/s390/include/uapi/asm/kvm* diff --git a/arch/s390/include/arm64/kvm_emulate.h b/arch/s390/include/arm6= 4/kvm_emulate.h new file mode 100644 index 000000000000..416c4f96db05 --- /dev/null +++ b/arch/s390/include/arm64/kvm_emulate.h @@ -0,0 +1,130 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef __S390_ARM64_KVM_EMULATE_H__ +#define __S390_ARM64_KVM_EMULATE_H__ + +#include +#include + +#include +#include +#include +#include + +static __always_inline unsigned long *vcpu_pc(const struct kvm_vcpu *vcpu) +{ + return (unsigned long *)&vcpu->arch.sae_block.pc; +} + +static __always_inline unsigned long *vcpu_cpsr(const struct kvm_vcpu *vcp= u) +{ + return (unsigned long *)&vcpu->arch.sae_block.pstate; +} + +static __always_inline unsigned long *vcpu_sp_el0(const struct kvm_vcpu *v= cpu) +{ + return (unsigned long *)&vcpu->arch.sae_block.sp_el0; +} + +static __always_inline u64 *vcpu_sp_el1(struct kvm_vcpu *vcpu) +{ + return &vcpu->arch.sae_block.sp_el1; +} + +static __always_inline __vector128 *vcpu_vreg(struct kvm_vcpu *vcpu, int o= ff) +{ + return &vcpu->arch.ctxt.vregs[off]; +} + +static __always_inline u32 *vcpu_fpsr(struct kvm_vcpu *vcpu) +{ + return &vcpu->arch.sae_block.fpsr; +} + +static __always_inline u32 *vcpu_fpcr(struct kvm_vcpu *vcpu) +{ + return &vcpu->arch.sae_block.fpcr; +} + +static __always_inline bool vcpu_mode_is_32bit(const struct kvm_vcpu *vcpu) +{ + return false; +} + +static __always_inline u64 kvm_vcpu_get_esr(const struct kvm_vcpu *vcpu) +{ + return vcpu->arch.sae_block.hai.esr_el2; +} + +static inline unsigned long *vcpu_hcr(struct kvm_vcpu *vcpu) +{ + return (unsigned long *)&vcpu->arch.hcr_el2; +} + +static __always_inline unsigned long kvm_vcpu_get_hfar(const struct kvm_vc= pu *vcpu) +{ + return vcpu->arch.sae_block.hai.far_el2; +} + +static __always_inline phys_addr_t kvm_vcpu_get_fault_ipa(const struct kvm= _vcpu *vcpu) +{ + return gfn_to_gpa(vcpu->arch.sae_block.hai.teid.addr); +} + +static inline u16 kvm_vcpu_fault_pic(const struct kvm_vcpu *vcpu) +{ + return vcpu->arch.sae_block.hai.pic & PGM_INT_CODE_MASK; +} + +static __always_inline +bool kvm_vcpu_trap_is_permission_fault(const struct kvm_vcpu *vcpu) +{ + return kvm_vcpu_fault_pic(vcpu) =3D=3D PGM_PROTECTION; +} + +static __always_inline bool kvm_condition_valid(const struct kvm_vcpu *vcp= u) +{ + return true; +} + +static __always_inline bool vcpu_el1_is_32bit(struct kvm_vcpu *vcpu) +{ + return false; +} + +static inline bool kvm_vcpu_is_be(struct kvm_vcpu *vcpu) +{ + return false; +} + +static inline int kvm_vcpu_abt_gltl(struct kvm_vcpu *vcpu) +{ + return vcpu->arch.sae_block.hai.gltl; +} + +static inline bool vcpu_mode_priv(const struct kvm_vcpu *vcpu) +{ + u32 mode =3D *vcpu_cpsr(vcpu) & PSR_MODE_MASK; + + return mode !=3D PSR_MODE_EL0t; +} + +static inline void kvm_skip_instr(struct kvm_vcpu *vcpu) +{ + *vcpu_pc(vcpu) +=3D 4; + *vcpu_cpsr(vcpu) &=3D ~PSR_BTYPE_MASK; + + /* advance the singlestep state machine */ + *vcpu_cpsr(vcpu) &=3D ~SPSR_ELx_SS; +} + +static inline void kvm_reset_fpsimd(struct kvm_vcpu *vcpu) +{ + memset(vcpu->arch.ctxt.vregs, 0, sizeof(vcpu->arch.ctxt.vregs)); + vcpu->arch.sae_block.fpsr =3D 0; + vcpu->arch.sae_block.fpcr =3D 0; +} + +#include + +#endif /* __S390_ARM64_KVM_EMULATE_H__ */ diff --git a/arch/s390/include/arm64/kvm_nested.h b/arch/s390/include/arm64= /kvm_nested.h new file mode 100644 index 000000000000..e950b1a10c41 --- /dev/null +++ b/arch/s390/include/arm64/kvm_nested.h @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef ASM_KVM_NESTED_H +#define ASM_KVM_NESTED_H + +static inline bool vcpu_has_nv(const struct kvm_vcpu *vcpu) +{ + return false; +} + +#endif /* ASM_KVM_NESTED_H */ diff --git a/arch/s390/include/arm64/ptrace.h b/arch/s390/include/arm64/ptr= ace.h new file mode 100644 index 000000000000..449b85582c97 --- /dev/null +++ b/arch/s390/include/arm64/ptrace.h @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef __S390_ARM64_PTRACE_H__ +#define __S390_ARM64_PTRACE_H__ + +#include +#include + +#include + +#endif /* __S390_ARM64_PTRACE_H__ */ diff --git a/arch/s390/include/arm64/sysreg.h b/arch/s390/include/arm64/sys= reg.h new file mode 100644 index 000000000000..ac6b638fef56 --- /dev/null +++ b/arch/s390/include/arm64/sysreg.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef __S390_ARM64_SYSREG_H__ +#define __S390_ARM64_SYSREG_H__ + +#include +#include +#include +#include + +#include + +#endif /* __S390_ARM64_SYSREG_H__ */ diff --git a/arch/s390/kvm/arm64/handle_exit.c b/arch/s390/kvm/arm64/handle= _exit.c new file mode 100644 index 000000000000..046e905ffcb6 --- /dev/null +++ b/arch/s390/kvm/arm64/handle_exit.c @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include + +#include +#include + +typedef int (*exit_handle_fn)(struct kvm_vcpu *); +static exit_handle_fn arm_exit_handlers[ESR_ELx_EC_MAX + 1]; + +#define PSCI_0_2_FN_SYSTEM_OFF 0x84000008 +#define PSCI_RET_NOT_SUPPORTED -1 +#define PSCI_RET_INTERNAL_FAILURE -6 +/* + * Temporary smc/hvc handler. Non-compliant implementation (features missi= ng). + * Implements only system off so that test programs are able to end their = execution. + * Multi-vCPU power state management and KVM_REQ_SLEEP handling are deferr= ed + * to future SMP series. + */ +static int kvm_smccc_call_handler(struct kvm_vcpu *vcpu) +{ + u32 func_id =3D vcpu_get_reg(vcpu, 0); + u64 val =3D PSCI_RET_NOT_SUPPORTED; + int ret =3D 1; + + if (func_id =3D=3D PSCI_0_2_FN_SYSTEM_OFF) { + scoped_guard(spinlock, &vcpu->arch.mp_state_lock) { + WRITE_ONCE(vcpu->arch.mp_state.mp_state, KVM_MP_STATE_STOPPED); + } + memset(&vcpu->run->system_event, 0, + sizeof(vcpu->run->system_event)); + vcpu->run->system_event.type =3D KVM_SYSTEM_EVENT_SHUTDOWN; + vcpu->run->system_event.ndata =3D 1; + vcpu->run->system_event.data[0] =3D 0; + vcpu->run->exit_reason =3D KVM_EXIT_SYSTEM_EVENT; + val =3D PSCI_RET_INTERNAL_FAILURE; + ret =3D 0; + } + vcpu_set_reg(vcpu, 0, val); + + return ret; +} + +static int handle_hvc(struct kvm_vcpu *vcpu) +{ + vcpu->stat.hvc_exit_stat++; + return kvm_smccc_call_handler(vcpu); +} + +static int kvm_handle_unknown_ec(struct kvm_vcpu *vcpu) +{ + u64 esr =3D kvm_vcpu_get_esr(vcpu); + + kvm_pr_unimpl("Unknown exception class: esr: %#016llx -- %s\n", + esr, esr_get_class_string(esr)); + + kvm_inject_undefined(vcpu); + return 1; +} + +static exit_handle_fn arm_exit_handlers[] =3D { + [0 ... ESR_ELx_EC_MAX] =3D kvm_handle_unknown_ec, + [ESR_ELx_EC_HVC64] =3D handle_hvc, +}; + +static exit_handle_fn kvm_get_exit_handler(struct kvm_vcpu *vcpu) +{ + u64 esr =3D kvm_vcpu_get_esr(vcpu); + u8 esr_ec =3D ESR_ELx_EC(esr); + + return arm_exit_handlers[esr_ec]; +} + +/* + * We may be single-stepping an emulated instruction. If the emulation + * has been completed in the kernel, we can return to userspace with a + * KVM_EXIT_DEBUG, otherwise userspace needs to complete its + * emulation first. + */ +static int handle_trap_exceptions(struct kvm_vcpu *vcpu) +{ + exit_handle_fn exit_handler; + + exit_handler =3D kvm_get_exit_handler(vcpu); + return exit_handler(vcpu); +} + +/* manually copied from arch/arm64/kernel/traps.c */ +static const char * const esr_class_str[] =3D { + [0 ... ESR_ELx_EC_MAX] =3D "UNRECOGNIZED EC", + [ESR_ELx_EC_UNKNOWN] =3D "Unknown/Uncategorized", + [ESR_ELx_EC_WFx] =3D "WFI/WFE", + [ESR_ELx_EC_FP_ASIMD] =3D "ASIMD", + [ESR_ELx_EC_PAC] =3D "PAC", + [ESR_ELx_EC_BTI] =3D "BTI", + [ESR_ELx_EC_ILL] =3D "PSTATE.IL", + [ESR_ELx_EC_SVC64] =3D "SVC (AArch64)", + [ESR_ELx_EC_HVC64] =3D "HVC (AArch64)", + [ESR_ELx_EC_SMC64] =3D "SMC (AArch64)", + [ESR_ELx_EC_SYS64] =3D "MSR/MRS (AArch64)", + [ESR_ELx_EC_SVE] =3D "SVE", + [ESR_ELx_EC_ERET] =3D "ERET/ERETAA/ERETAB", + [ESR_ELx_EC_FPAC] =3D "FPAC", + [ESR_ELx_EC_SME] =3D "SME", + [ESR_ELx_EC_IMP_DEF] =3D "EL3 IMP DEF", + [ESR_ELx_EC_IABT_LOW] =3D "IABT (lower EL)", + [ESR_ELx_EC_IABT_CUR] =3D "IABT (current EL)", + [ESR_ELx_EC_PC_ALIGN] =3D "PC Alignment", + [ESR_ELx_EC_DABT_LOW] =3D "DABT (lower EL)", + [ESR_ELx_EC_DABT_CUR] =3D "DABT (current EL)", + [ESR_ELx_EC_SP_ALIGN] =3D "SP Alignment", + [ESR_ELx_EC_MOPS] =3D "MOPS", + [ESR_ELx_EC_FP_EXC64] =3D "FP (AArch64)", + [ESR_ELx_EC_GCS] =3D "Guarded Control Stack", + [ESR_ELx_EC_SERROR] =3D "SError", + [ESR_ELx_EC_BREAKPT_LOW] =3D "Breakpoint (lower EL)", + [ESR_ELx_EC_BREAKPT_CUR] =3D "Breakpoint (current EL)", + [ESR_ELx_EC_SOFTSTP_LOW] =3D "Software Step (lower EL)", + [ESR_ELx_EC_SOFTSTP_CUR] =3D "Software Step (current EL)", + [ESR_ELx_EC_WATCHPT_LOW] =3D "Watchpoint (lower EL)", + [ESR_ELx_EC_WATCHPT_CUR] =3D "Watchpoint (current EL)", + [ESR_ELx_EC_BRK64] =3D "BRK (AArch64)", +}; + +const char *esr_get_class_string(unsigned long esr) +{ + return esr_class_str[ESR_ELx_EC(esr)]; +} diff --git a/arch/s390/kvm/arm64/inject_fault.c b/arch/s390/kvm/arm64/injec= t_fault.c new file mode 100644 index 000000000000..425dbeaa421c --- /dev/null +++ b/arch/s390/kvm/arm64/inject_fault.c @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include + +/** + * kvm_inject_undefined - inject an undefined instruction into the guest + * @vcpu: The vCPU in which to inject the exception + * + * It is assumed that this code is called from the VCPU thread and that the + * VCPU therefore is not currently executing guest code. + */ +void kvm_inject_undefined(struct kvm_vcpu *vcpu) +{ + /* Stub until s390 supports arm64 sysregs TODO sysregs*/ +} + +int kvm_inject_sea(struct kvm_vcpu *vcpu, bool iabt, u64 addr) +{ + /* Stub until s390 supports arm64 sysregs TODO sysregs*/ + return 1; +} --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 130E1502D6E; Fri, 18 Sep 2026 13:32:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738330; cv=none; b=ivyXe+JgM+7s2ZMq3WqVVZL4cIzv6UG1ZkHjpNmNNMkXJa07FtcAhtjpzlFvtf9oXnLHkI4q0AbJknS0ezjkI/5xf4ihMnjk7bNhovdaWo94dDv+5iPNRUoc8Ia6x4EcSSAQXTgJ93rrzVAOmFH4EEmzUSP8uAN6PGHQckN4x7c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738330; c=relaxed/simple; bh=Igtzo4ZAUIMeboL6nvyBrtJqL9yWgkgj4eJjqsdq29U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=db9/ZfPCo7s/VGq20O5FIuhL5+3FW+AgRZ/Niw6f2m9PT9gyJJMvMVT4hlm0JzUgUnPOChI2pMMuJ91HAS2Ct3q3F0NhJjtwf/XiLSlTlyz6M2tmYCO1j3mQLvCJaFobW+s2bcwmfiNM/Fw/a4Z08kmPhqKecrsgJopk9H7Ud5A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=Yvcs7m2m; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="Yvcs7m2m" Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA2l6Q990974; Fri, 18 Sep 2026 13:31:25 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=5bWhfVzPu4VzVsjkF HOH8+kBpuzeVEALF5mZdRzVS3g=; b=Yvcs7m2mPcaL4er6SXqRfrF+OSi60lVpn 4GL8hBoVJat0psJ47d+EnWMt68FnsXro3XEuV0o9HTDDOLjqD88SXPusAagPetBe MCqZdcUpxiE4n8zZLm6C6c9B6lgchymNumGvYrSkrK0A+d2CdIM2cv+Ngfl049RW gx7OWYmchS+0p1wImAY1MjGMYYQvSKTRuwTFuDXE94VT5nDjvFFlYipU1d9Fgqdb 6FG3fQ7GxY73XBvUHS5YSUPmD/hHSMXXRzlMkdnNTqxK9bDoceWqwFOKx34lsnBw d3MexrA/gZPOuAxegyjzHAjB+rkTRMc934PaQoxKm3YZszagcCcsQ== Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmxcvfnpy-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:24 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDNqTH1684357; Fri, 18 Sep 2026 13:31:23 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gs4tv8bhk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:23 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVHFM46137662 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:17 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4F03720040; Fri, 18 Sep 2026 13:31:17 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id EC0ED2004E; Fri, 18 Sep 2026 13:31:16 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:16 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 25/29] KVM: s390: arm64: Implement vm/vcpu create destroy. Date: Fri, 18 Sep 2026 15:31:02 +0200 Message-ID: <20260918133107.1042730-26-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX+K1rinIdeTY9 02Q6k4YrZwdbbngpeJiz0TGmTV6ZXVYuUEjulBbhY58GRm7iXcaoL60OFq3rceayhIRBYPaOYpN RESjeZpU4r08JQo5bmLMmieAFkSWXlM= X-Proofpoint-ORIG-GUID: zoJtj4toVrlQv0NpegjIckOIa5du2B0e X-Proofpoint-GUID: PpcavBm1dfhW-jrFxw7F1hP_znZDr0lZ X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfXwrVppTzFj6ij y3SXfzpekz0t5ZT9v26gG31x5HNFRZE8McG8uAMMRzrHGtNQ/JvN4zjqVjET06SnJJA1BPahEAv cbfrcKz3VysW5tyMNS2K36tevAYRpJwFV39MgVWq4SDWNcZK3Z70HorkP1maSnfUB3Eq4mmERoU XGmt40Ewyqftb1G8xBPImwh5JO79UanYYiCNMPJaUPSYWefje7r7F+z2Pg7obAN6B9MtdFGVLjR vfqqhnNlkb4i24rWwdkO8IEjGolR5Vw55db53Y9BjaZ9okMbDkb1ySwjldkoujdHQhLGNIMqMjQ rkWOG4UkPkYGn0cEY6bpmAcYR4dDZ27o+YzvxdXFLrfn8hgYRWuRzK9u9luc19qboKli2HBvQDd yzUibEufhHcAr9XFNLgZyAGDakAEpGyuumuzCaxjfZUirCPslVKYxZ/KR3MmKiGU3O/ax5HmP8Q 3Askq5/efpA9eVf4I1w== X-Authority-Analysis: v=2.4 cv=F+7C5ahN c=1 sm=1 tr=0 ts=6aad3d2c cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VnNF1IyMAAAA:8 a=5OF_qzzL2_CoOl6HhsoA:9 a=O8hF6Hzn-FEA:10 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 phishscore=0 clxscore=1015 malwarescore=0 lowpriorityscore=0 bulkscore=0 spamscore=0 impostorscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" Implement init and destroy IOCTLS for vcpu and vm. Implement arch vm IOCTL. Use s390 gmap and gmap plumbing. Implement function (stubs) required by gamp. Co-developed-by: Janosch Frank Signed-off-by: Janosch Frank Co-developed-by: Andreas Grapentin Signed-off-by: Andreas Grapentin Co-developed-by: Nina Schoetterl-Glausch Signed-off-by: Nina Schoetterl-Glausch Signed-off-by: Steffen Eiden --- arch/s390/kvm/arm64/arm.c | 189 ++++++++++++++++++++++++++++++++ arch/s390/kvm/arm64/arm.h | 14 +++ arch/s390/kvm/gmap/faultin.c | 5 + arch/s390/kvm/gmap/gmap.c | 4 + arch/s390/kvm/gmap/kvm_mmu.c | 4 + arch/s390/kvm/gmap/trace_gmap.h | 13 +++ 6 files changed, 229 insertions(+) diff --git a/arch/s390/kvm/arm64/arm.c b/arch/s390/kvm/arm64/arm.c index 8b056fc836d7..446070fea29f 100644 --- a/arch/s390/kvm/arm64/arm.c +++ b/arch/s390/kvm/arm64/arm.c @@ -8,6 +8,9 @@ #include #include =20 +#include +#include + #include "arm.h" =20 #define CREATE_TRACE_POINTS @@ -19,6 +22,8 @@ static unsigned long system_supported_vcpu_features(void); #include "generated/arm.inc" #undef __INCL_GEN_ARM_FILE =20 +#define KVM_PHYS_SHIFT (40) + int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) { int ret; @@ -51,6 +56,83 @@ static u64 kvm_max_guest_address(void) return ALIGN_DOWN(max_addr + 1, SZ_1G) - 1; } =20 +static int kvm_gmap_init(struct kvm *kvm) +{ + struct crst_table *table; + + kvm->arch.gmap =3D gmap_new(kvm, gpa_to_gfn(kvm->arch.guest_phys_size)); + + if (!kvm->arch.gmap) + return -ENOMEM; + + /* arm64 (on s390) do not have pfault */ + clear_bit(GMAP_FLAG_PFAULT_ENABLED, &kvm->arch.gmap->flags); + set_bit(GMAP_FLAG_ALLOW_HPAGE_1M, &kvm->arch.gmap->flags); + + table =3D dereference_asce(kvm->arch.gmap->asce); + crst_table_init((void *)table, _CRSTE_HOLE(table->crstes[0].h.tt).val); + + return 0; +} + +static int kvm_vm_type_ipa_size_shift(unsigned long type) +{ + int phys_shift; + + phys_shift =3D KVM_VM_TYPE_ARM_IPA_SIZE(type); + if (phys_shift) { + if (phys_shift > get_kvm_ipa_limit() || + phys_shift < ARM64_MIN_PARANGE_BITS) + return -EINVAL; + } else { + phys_shift =3D KVM_PHYS_SHIFT; + if (phys_shift > get_kvm_ipa_limit()) { + pr_warn_once("%s using unsupported default IPA limit\n", + current->comm); + return -EINVAL; + } + } + + return phys_shift; +} + +int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) +{ + char debug_name[32]; + int ret; + + if (type & ~KVM_VM_TYPE_ARM_IPA_SIZE_MASK) + return -EINVAL; + + ret =3D kvm_vm_type_ipa_size_shift(type); + if (ret < 0) + return ret; + kvm->arch.guest_phys_size =3D 1UL << ret; + + mutex_init(&kvm->arch.config_lock); + bitmap_zero(kvm->arch.vcpu_features, KVM_VCPU_MAX_FEATURES); + + snprintf(debug_name, sizeof(debug_name), "kvm-arm64-%u-%u", + current->pid, get_random_u32()); + kvm->arch.dbf =3D debug_register(debug_name, 32, 1, 7 * sizeof(long)); + if (!kvm->arch.dbf) + return -ENOMEM; + debug_register_view(kvm->arch.dbf, &debug_sprintf_view); + + ret =3D kvm_gmap_init(kvm); + if (ret) + goto out_err; + kvm->arch.mem_limit =3D kvm->arch.guest_phys_size; + + VM_EVENT(kvm, 3, "vm created with type %lu", type); + return 0; + +out_err: + debug_unregister(kvm->arch.dbf); + + return ret; +} + vm_fault_t kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf) { return VM_FAULT_SIGBUS; @@ -62,6 +144,13 @@ long kvm_arch_dev_ioctl(struct file *filp, return -EINVAL; } =20 +void kvm_arch_destroy_vm(struct kvm *kvm) +{ + kvm_destroy_vcpus(kvm); + debug_unregister(kvm->arch.dbf); + kvm->arch.gmap =3D gmap_put(kvm->arch.gmap); +} + u32 get_kvm_ipa_limit(void) { return fls64(kvm_max_guest_address() + 1) - 1; @@ -72,10 +161,43 @@ int kvm_arch_vcpu_precreate(struct kvm *kvm, unsigned = int id) return 0; } =20 +int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu) +{ + struct kvm_sae_block *sae_block =3D &vcpu->arch.sae_block; + struct kvm_sae_save_area *save_area =3D &vcpu->arch.save_area; + + spin_lock_init(&vcpu->arch.mp_state_lock); + + /* Force users to call KVM_ARM_VCPU_INIT */ + vcpu_clear_flag(vcpu, VCPU_INITIALIZED); + + vcpu->arch.mc =3D kvm_s390_new_mmu_cache(); + if (!vcpu->arch.mc) + return -ENOMEM; + + sae_block->hbasce =3D vcpu->kvm->arch.gmap->asce.val; + sae_block->mso =3D 0L; + sae_block->msl =3D vcpu->kvm->arch.mem_limit - 1; + sae_block->save_area =3D virt_to_phys(save_area); + + VM_EVENT(vcpu->kvm, 3, + "create cpu %d at 0x%p, sae block at 0x%p, satellite at 0x%p", + vcpu->vcpu_id, vcpu, &vcpu->arch.sae_block, + &vcpu->arch.save_area); + return 0; +} + void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu) { } =20 +void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) +{ + kvm_s390_free_mmu_cache(vcpu->arch.mc); + + VCPU_EVENT(vcpu, 3, "%s", "free cpu"); +} + int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, struct kvm_mp_state *mp_state) { @@ -101,6 +223,73 @@ static unsigned long system_supported_vcpu_features(vo= id) return features; } =20 +int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, + struct kvm_dirty_log *log) +{ + return s390_kvm_mmu_get_dirty_log(kvm, log); +} + +bool kvm_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range) +{ + scoped_guard(read_lock, &kvm->mmu_lock) + return gmap_age_gfn(kvm->arch.gmap, range->start, range->end); +} + +void kvm_arch_sync_dirty_log(struct kvm *kvm, struct kvm_memory_slot *mems= lot) +{ + gfn_t last_gfn =3D memslot->base_gfn + memslot->npages; + + scoped_guard(read_lock, &kvm->mmu_lock) + gmap_sync_dirty_log(kvm->arch.gmap, memslot->base_gfn, last_gfn); +} + +int kvm_arch_prepare_memory_region(struct kvm *kvm, + const struct kvm_memory_slot *old, + struct kvm_memory_slot *new, + enum kvm_mr_change change) +{ + return s390_kvm_mmu_prepare_memory_region(kvm, old, new, change); +} + +void kvm_arch_commit_memory_region(struct kvm *kvm, struct kvm_memory_slot= *old, + const struct kvm_memory_slot *new, + enum kvm_mr_change change) +{ + s390_kvm_mmu_commit_memory_region(kvm, old, new, change); +} + +bool kvm_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range) +{ + return gmap_unmap_gfn_range(kvm->arch.gmap, range->slot, range->start, ra= nge->end); +} + +bool kvm_test_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range) +{ + scoped_guard(read_lock, &kvm->mmu_lock) + return dat_test_age_gfn(kvm->arch.gmap->asce, range->start, range->end); +} + +int kvm_arch_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long= arg) +{ + void __user *argp =3D (void __user *)arg; + + switch (ioctl) { + case KVM_ARM_PREFERRED_TARGET: { + struct kvm_vcpu_init init =3D { + .target =3D KVM_ARM_TARGET_GENERIC_V8, + }; + + if (copy_to_user(argp, &init, sizeof(init))) + return -EFAULT; + + return 0; + } + + default: + return -EINVAL; + } +} + bool kvm_arch_irqchip_in_kernel(struct kvm *kvm) { return false; diff --git a/arch/s390/kvm/arm64/arm.h b/arch/s390/kvm/arm64/arm.h index b38eb44c11fe..c743595506fa 100644 --- a/arch/s390/kvm/arm64/arm.h +++ b/arch/s390/kvm/arm64/arm.h @@ -2,6 +2,20 @@ #ifndef ARCH_S390_KVM_ARM64_H #define ARCH_S390_KVM_ARM64_H =20 +#include +#include + +#define VM_EVENT(d_kvm, d_loglevel, d_string, d_args...) \ + debug_sprintf_event((d_kvm)->arch.dbf, d_loglevel, \ + __stringify(KVM_DEV_NAME) ": " d_string "\n", \ + d_args) + +#define VCPU_EVENT(d_vcpu, d_loglevel, d_string, d_args...) \ + debug_sprintf_event((d_vcpu)->kvm->arch.dbf, d_loglevel, \ + __stringify(KVM_DEV_NAME) " %02d[%016llx-%016llx]: " d_string "\n", \ + (d_vcpu)->vcpu_id, (d_vcpu)->arch.sae_block.pstate, \ + (d_vcpu)->arch.sae_block.pc, d_args) + static __always_inline int kvm_is_ucontrol(struct kvm *kvm) { return 0; diff --git a/arch/s390/kvm/gmap/faultin.c b/arch/s390/kvm/gmap/faultin.c index 1dc79807012c..2e93bd563d5c 100644 --- a/arch/s390/kvm/gmap/faultin.c +++ b/arch/s390/kvm/gmap/faultin.c @@ -10,6 +10,11 @@ =20 #include "gmap.h" #include "faultin.h" +#ifdef KVM_S390_ARM64 +#include "arm.h" +#else +#include "s390.h" +#endif =20 bool kvm_arch_setup_async_pf(struct kvm_vcpu *vcpu); #define CREATE_TRACE_POINTS diff --git a/arch/s390/kvm/gmap/gmap.c b/arch/s390/kvm/gmap/gmap.c index 4968330e9553..b7071f50f7ad 100644 --- a/arch/s390/kvm/gmap/gmap.c +++ b/arch/s390/kvm/gmap/gmap.c @@ -21,7 +21,11 @@ =20 #include "dat.h" #include "gmap.h" +#ifdef KVM_S390_ARM64 +#include "arm.h" +#else #include "s390.h" +#endif #include "faultin.h" =20 static int gmap_limit_to_type(gfn_t limit) diff --git a/arch/s390/kvm/gmap/kvm_mmu.c b/arch/s390/kvm/gmap/kvm_mmu.c index b08b8229bb6f..a26a16193467 100644 --- a/arch/s390/kvm/gmap/kvm_mmu.c +++ b/arch/s390/kvm/gmap/kvm_mmu.c @@ -3,7 +3,11 @@ #include #include =20 +#ifdef KVM_S390_ARM64 +#include "arm.h" +#else #include "s390.h" +#endif #include "gmap.h" #include "dat.h" #include "kvm_mmu.h" diff --git a/arch/s390/kvm/gmap/trace_gmap.h b/arch/s390/kvm/gmap/trace_gma= p.h index 78d26dae59f9..1dce3ef3b0d9 100644 --- a/arch/s390/kvm/gmap/trace_gmap.h +++ b/arch/s390/kvm/gmap/trace_gmap.h @@ -13,6 +13,18 @@ #undef TRACE_INCLUDE_FILE #define TRACE_INCLUDE_FILE trace_gmap =20 +#ifdef KVM_S390_ARM64 +#define __KVM_FIELDS \ + __field(unsigned long, pstate) \ + __field(unsigned long, pc) +#define __KVM_ASSIGN ({\ + __entry->pstate =3D vcpu->arch.sae_block.pstate; \ + __entry->pc =3D vcpu->arch.sae_block.pc; \ + }) +#define __KVM_PRINT \ + __entry->pstate, \ + __entry->pc +#else #define __KVM_FIELDS \ __field(unsigned long, pswmask) \ __field(unsigned long, pswaddr) @@ -23,6 +35,7 @@ #define __KVM_PRINT \ __entry->pswmask,\ __entry->pswaddr +#endif =20 TRACE_EVENT(kvm_s390_major_guest_pfault, TP_PROTO(struct kvm_vcpu *vcpu), --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AC5A5502D41; Fri, 18 Sep 2026 13:36:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738615; cv=none; b=pUghZZaB342txZaXPFdSi5vDirCsdUV9ab1Ddm9UwG5CCvJGTLwuxSbtHL5cw06Bdlst0etZLKpsaqSDrqKZEccWN7J8UVV2GOaLHkS4W7S0epWzvs3a4x7LMr64032Tklgz8QMQ80blX9P0W7iKv2ycSgbMRud/niCtE2Wqch8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738615; c=relaxed/simple; bh=Fi6rBU/ZhjVDL448HsfklGiVYGtnIBocBVh/SRwluMs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EKi52a5QQ+ZO58o72hU+BEMc/dstzC+x5VQZI2i1Jxw8c1UJHtZ6RBQZlPcqYYsM8jq4odDYWBvTmzH2DyMYeDqItmuP9DT+uGqxGO8KgZbq28tqdolksNHZaTK8yd1ApH+ewiH+CdCLPVfVSSxJxg5KfJZjcSzKmV3pIIFjnAU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=ZSjfmd4A; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="ZSjfmd4A" Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA1UWk960827; Fri, 18 Sep 2026 13:31:26 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=8m8Ks1dXLpWhsrq6y tEyLqqRJi6ca+5mnmsbGX4L1Nk=; b=ZSjfmd4ASxQk3NJXjqEuNpS/Yn4poI4iT aSVegX8boeE6u3L8Q+27sNVYpot3/lRZ+iuWvmXkjZjnFu/ENVG6bxCOTKUNXOG8 QXn3md8axz3zXr8QQ/CszjX8n0hYOr1tEdD71OGSntv6tTwC4DmRsuZ835EoKC0L Bgwytr9GiKXSsoWlAl1C0P3pYINsN4G9S0a5jNUwZ2icju0ectnNCGb++00VfDhE K8bodiGzCPOf3cXKC/eDNmoJRfPWVSS27gPZWn16YsebKKB2SkueHlMarPm9T7h9 ns0IL5J8oG/cXAxZhw7NiAeveWNeTwQUq7BBvfQ7fAbrDYIlRPxag== Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmxf5gb7q-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:25 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDNten1684373; Fri, 18 Sep 2026 13:31:24 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gs4tv8bht-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:24 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVHFn46137664 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:17 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B750820040; Fri, 18 Sep 2026 13:31:17 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 55BCC20049; Fri, 18 Sep 2026 13:31:17 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:17 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 26/29] KVM: s390: arm64: Implement vCPU IOCTLs Date: Fri, 18 Sep 2026 15:31:03 +0200 Message-ID: <20260918133107.1042730-27-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-GUID: 6fSriThL2d0qVkE2GLv4OtqPUdfui4Hc X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX1ecI5TUSJbch KZA6kYEugVJnbGJJg24w9FI+n16E5UNMHMyJrpEciB+dxEmChSxgN32d7sDs3GYebxnHZp6weFd PFZP2UvVh9X3YVxlIQU1IiQOi3KV95c= X-Authority-Analysis: v=2.4 cv=cvgOAF4i c=1 sm=1 tr=0 ts=6aad3d2e cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VnNF1IyMAAAA:8 a=CcLo7HZLJIY3bPHGds4A:9 X-Proofpoint-ORIG-GUID: w3imLKLH-JkgFX2FyRgLRFPyEzqz_TZU X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX/mF4CjcA8XRQ 9QDm7FuVrbNjWE8PYqEfiX66Xx0ZqJK0VfocSmInmr/gRpg9hFMy0FceivVll0mcBMuig0ORnxt dnCKwy7zN+wxs6i24AUZ1r5KIFMxlpLMiej6ZaVkNLhEzXD1J+x0R+nZj57Wqy76Xx/EOTb+mLZ vjJ4+SfHWxvXhJ+yO4OmvUApDEkV8nku+jQnKI4P+dSuHZM2LKU77ak4akgLaQE7j2+Yj5SvPOV uJOuYcJTWseROrgSspqrFet5TIl1pFeGs2GLjTIy02HeRqUzNJbjjTqjJu0XfN5CWIss+yugcjQ yj028mTQJulyjm/BiQrdjot8IOY2Kg5pQoShi6tMKa9hX0gb1y4Q2ftmVcHbZytOe+J+OXqg6ji skSaT9n00eSqAG7v+n8m88E+kTgf00rfMAb+IlFNpGkiJCVNLM22+kmcUdcR7O8itjlTtFCk7S6 wCT3sNSSY040n3c5iGA== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 lowpriorityscore=0 clxscore=1015 priorityscore=1501 suspectscore=0 bulkscore=0 impostorscore=0 phishscore=0 spamscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" Implement all required vCPU (arch) IOCTLs. Co-developed-by: Andreas Grapentin Signed-off-by: Andreas Grapentin Co-developed-by: Nina Schoetterl-Glausch Signed-off-by: Nina Schoetterl-Glausch Signed-off-by: Steffen Eiden --- arch/s390/kvm/arm64/arm.c | 404 ++++++++++++++++++++++++++++++ arch/s390/kvm/arm64/guest.c | 47 +++- arch/s390/kvm/arm64/handle_exit.c | 32 +++ arch/s390/kvm/arm64/handle_exit.h | 9 + arch/s390/kvm/arm64/reset.c | 71 ++++++ arch/s390/kvm/arm64/trace.h | 2 +- 6 files changed, 562 insertions(+), 3 deletions(-) create mode 100644 arch/s390/kvm/arm64/handle_exit.h create mode 100644 arch/s390/kvm/arm64/reset.c diff --git a/arch/s390/kvm/arm64/arm.c b/arch/s390/kvm/arm64/arm.c index 446070fea29f..bb3e7fa8cad5 100644 --- a/arch/s390/kvm/arm64/arm.c +++ b/arch/s390/kvm/arm64/arm.c @@ -7,11 +7,19 @@ #include #include #include +#include +#include + +#include + +#include +#include =20 #include #include =20 #include "arm.h" +#include "handle_exit.h" =20 #define CREATE_TRACE_POINTS #include "trace.h" @@ -198,6 +206,22 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) VCPU_EVENT(vcpu, 3, "%s", "free cpu"); } =20 +void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) +{ + save_access_regs(&vcpu->arch.host_acrs[0]); + vcpu->cpu =3D cpu; + + lasrm(&vcpu->arch.save_area); +} + +void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) +{ + stiasrm(&vcpu->arch.save_area); + + vcpu->cpu =3D -1; + restore_access_regs(&vcpu->arch.host_acrs[0]); +} + int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, struct kvm_mp_state *mp_state) { @@ -223,6 +247,386 @@ static unsigned long system_supported_vcpu_features(v= oid) return features; } =20 +bool kvm_arch_vcpu_in_kernel(struct kvm_vcpu *vcpu) +{ + return vcpu_mode_priv(vcpu); +} + +int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu) +{ + struct kvm *kvm =3D vcpu->kvm; + + if (!kvm_vcpu_initialized(vcpu)) + return -ENOEXEC; + + if (!kvm_arm_vcpu_is_finalized(vcpu)) + return -EPERM; + + if (likely(READ_ONCE(vcpu->pid))) + return 0; + + scoped_guard(mutex, &kvm->arch.config_lock) + set_bit(KVM_ARCH_FLAG_HAS_RAN_ONCE, &kvm->arch.flags); + + return 0; +} + +/** + * check_vcpu_requests - check and handle pending vCPU requests + * @vcpu: the VCPU pointer + * + * Return: 1 if we should enter the guest + * 0 if we should exit to userspace + * < 0 if we should exit to userspace, where the return value indicates + * an error + */ +static int check_vcpu_requests(struct kvm_vcpu *vcpu) +{ + if (kvm_request_pending(vcpu)) { + if (kvm_check_request(KVM_REQ_VCPU_RESET, vcpu)) + kvm_reset_vcpu(vcpu); + /* + * Clear IRQ_PENDING requests that were made to guarantee + * that a VCPU sees new virtual interrupts. + */ + kvm_check_request(KVM_REQ_IRQ_PENDING, vcpu); + kvm_check_request(KVM_REQ_TLB_FLUSH, vcpu); + } + + return 1; +} + +static int kvm_vcpu_initialize(struct kvm_vcpu *vcpu, + const struct kvm_vcpu_init *init) +{ + unsigned long features =3D init->features[0]; + struct kvm *kvm =3D vcpu->kvm; + + guard(mutex)(&kvm->arch.config_lock); + if (test_bit(KVM_ARCH_FLAG_VCPU_FEATURES_CONFIGURED, &kvm->arch.flags) && + kvm_vcpu_init_changed(vcpu, init)) + return -EINVAL; + + bitmap_copy(kvm->arch.vcpu_features, &features, KVM_VCPU_MAX_FEATURES); + + kvm_reset_vcpu(vcpu); + + set_bit(KVM_ARCH_FLAG_VCPU_FEATURES_CONFIGURED, &kvm->arch.flags); + vcpu_set_flag(vcpu, VCPU_INITIALIZED); + + return 0; +} + +static int kvm_vcpu_set_target(struct kvm_vcpu *vcpu, + const struct kvm_vcpu_init *init) +{ + int ret; + + if (init->target !=3D KVM_ARM_TARGET_GENERIC_V8) + return -EINVAL; + + ret =3D kvm_vcpu_init_check_features(vcpu, init); + if (ret) + return ret; + + if (!kvm_vcpu_initialized(vcpu)) + return kvm_vcpu_initialize(vcpu, init); + + if (kvm_vcpu_init_changed(vcpu, init)) + return -EINVAL; + + kvm_reset_vcpu(vcpu); + + return 0; +} + +static int kvm_arch_vcpu_ioctl_vcpu_init(struct kvm_vcpu *vcpu, + struct kvm_vcpu_init *init) +{ + struct kvm_sae_save_area *save_area =3D &vcpu->arch.save_area; + struct kvm_sae_block *sae_block =3D &vcpu->arch.sae_block; + int ret; + + sae_block->save_area =3D virt_to_phys(save_area); + save_area->sdo =3D virt_to_phys(sae_block); + + ret =3D kvm_vcpu_set_target(vcpu, init); + if (ret) + return ret; + + scoped_guard(spinlock, &vcpu->arch.mp_state_lock) { + WRITE_ONCE(vcpu->arch.mp_state.mp_state, KVM_MP_STATE_RUNNABLE); + } + + return 0; +} + +int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_level, + bool line_status) +{ + /* stub for now*/ + return -EINVAL; +} + +static void adjust_pc(struct kvm_vcpu *vcpu) +{ + if (vcpu_get_flag(vcpu, INCREMENT_PC)) { + kvm_skip_instr(vcpu); + vcpu_clear_flag(vcpu, INCREMENT_PC); + } +} + +static void arm_vcpu_run(struct kvm_vcpu *vcpu) +{ + struct kvm_sae_block *sae_block =3D &vcpu->arch.sae_block; + + adjust_pc(vcpu); + + local_irq_disable(); + guest_timing_enter_irqoff(); + guest_state_enter_irqoff(); + local_irq_enable(); + + sae64a(sae_block); + + local_irq_disable(); + guest_state_exit_irqoff(); + guest_timing_exit_irqoff(); + local_irq_enable(); +} + +/** kvm_arch_vcpu_ioctl_run() - run arm64 vCPU + * + * Execute arm64 guest instructions using SAE. + * + * Returns: + * 1 enter the guest (should not be observed by userspace) + * 0 exit to userspace + * < 0 exit to userspace, where the return value indicates n error + * + * + */ +int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu) +{ + DECLARE_KERNEL_FPU_ONSTACK32(fpu_save); + struct kvm_run *kvm_run =3D vcpu->run; + int ret; + + if (kvm_run->exit_reason =3D=3D KVM_EXIT_MMIO) { + ret =3D kvm_handle_mmio_return(vcpu); + if (ret <=3D 0) + return ret; + } + + vcpu_load(vcpu); + + kernel_fpu_begin(&fpu_save, KERNEL_FPC | KERNEL_VXR); + load_vx_regs((vcpu->arch.ctxt.vregs)); + + if (!vcpu->wants_to_run) { + ret =3D -EINTR; + goto out; + } + + kvm_sigset_activate(vcpu); + + might_fault(); + + kvm_vcpu_srcu_read_lock(vcpu); + + ret =3D 1; + while (ret > 0) { + =09 + ret =3D kvm_xfer_to_guest_mode_handle_work(vcpu); + if (!ret) + ret =3D 1; + + if (ret > 0) + ret =3D check_vcpu_requests(vcpu); + + if (ret <=3D 0) + break; + + vcpu->arch.sae_block.icptr =3D 0; + + smp_store_mb(vcpu->mode, IN_GUEST_MODE); + + if (kvm_request_pending(vcpu)) { + vcpu->mode =3D OUTSIDE_GUEST_MODE; + continue; + } + + kvm_vcpu_srcu_read_unlock(vcpu); + + arm_vcpu_run(vcpu); + + vcpu->mode =3D OUTSIDE_GUEST_MODE; + vcpu->stat.exits++; + + kvm_vcpu_srcu_read_lock(vcpu); + + ret =3D handle_exit(vcpu); + } + + kvm_vcpu_srcu_read_unlock(vcpu); + + kvm_sigset_deactivate(vcpu); +out: + if (unlikely(vcpu_get_flag(vcpu, INCREMENT_PC))) + adjust_pc(vcpu); + + save_vx_regs(vcpu->arch.ctxt.vregs); + kernel_fpu_end(&fpu_save, KERNEL_FPC | KERNEL_VXR); + vcpu_put(vcpu); + + return ret; +} + +static int kvm_arm_vcpu_set_attr(struct kvm_vcpu *vcpu, + struct kvm_device_attr *attr) +{ + int ret; + + switch (attr->group) { + default: + ret =3D -ENXIO; + break; + } + + return ret; +} + +static int kvm_arm_vcpu_get_attr(struct kvm_vcpu *vcpu, + struct kvm_device_attr *attr) +{ + int ret; + + switch (attr->group) { + default: + ret =3D -ENXIO; + break; + } + + return ret; +} + +static int kvm_arm_vcpu_has_attr(struct kvm_vcpu *vcpu, + struct kvm_device_attr *attr) +{ + int ret; + + switch (attr->group) { + default: + ret =3D -ENXIO; + break; + } + + return ret; +} + +long kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, unsigned l= ong arg) +{ + struct kvm_vcpu *vcpu =3D filp->private_data; + void __user *argp =3D (void __user *)arg; + struct kvm_device_attr attr; + int ret; + + switch (ioctl) { + case KVM_ARM_VCPU_INIT: { + struct kvm_vcpu_init init; + + ret =3D -EFAULT; + if (copy_from_user(&init, argp, sizeof(init))) + break; + + ret =3D kvm_arch_vcpu_ioctl_vcpu_init(vcpu, &init); + break; + } + case KVM_SET_ONE_REG: + case KVM_GET_ONE_REG: { + struct kvm_one_reg reg; + + ret =3D -ENOEXEC; + if (unlikely(!kvm_vcpu_initialized(vcpu))) + break; + + ret =3D -EFAULT; + if (copy_from_user(®, argp, sizeof(reg))) + break; + + if (kvm_check_request(KVM_REQ_VCPU_RESET, vcpu)) + kvm_reset_vcpu(vcpu); + + if (ioctl =3D=3D KVM_SET_ONE_REG) + ret =3D kvm_arm_set_reg(vcpu, ®); + else + ret =3D kvm_arm_get_reg(vcpu, ®); + break; + } + case KVM_GET_REG_LIST: { + struct kvm_reg_list __user *user_list =3D argp; + struct kvm_reg_list reg_list; + unsigned int n; + + ret =3D -ENOEXEC; + if (unlikely(!kvm_vcpu_initialized(vcpu))) + break; + ret =3D -EPERM; + if (!kvm_arm_vcpu_is_finalized(vcpu)) + break; + ret =3D -EFAULT; + if (copy_from_user(®_list, user_list, sizeof(reg_list))) + break; + n =3D reg_list.n; + reg_list.n =3D kvm_arm_num_regs(vcpu); + if (copy_to_user(user_list, ®_list, sizeof(reg_list))) + break; + ret =3D -E2BIG; + if (n < reg_list.n) + break; + ret =3D kvm_arm_copy_reg_indices(vcpu, user_list->reg); + break; + } + case KVM_ARM_VCPU_FINALIZE: { + int what; + + if (!kvm_vcpu_initialized(vcpu)) + return -ENOEXEC; + + if (get_user(what, (const int __user *)argp)) + return -EFAULT; + + ret =3D kvm_arm_vcpu_finalize(vcpu, what); + break; + } + case KVM_SET_DEVICE_ATTR: { + ret =3D -EFAULT; + if (copy_from_user(&attr, argp, sizeof(attr))) + break; + ret =3D kvm_arm_vcpu_set_attr(vcpu, &attr); + break; + } + case KVM_GET_DEVICE_ATTR: { + ret =3D -EFAULT; + if (copy_from_user(&attr, argp, sizeof(attr))) + break; + ret =3D kvm_arm_vcpu_get_attr(vcpu, &attr); + break; + } + case KVM_HAS_DEVICE_ATTR: { + ret =3D -EFAULT; + if (copy_from_user(&attr, argp, sizeof(attr))) + break; + ret =3D kvm_arm_vcpu_has_attr(vcpu, &attr); + break; + } + default: + ret =3D -EINVAL; + } + + return ret; +} + int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, struct kvm_dirty_log *log) { diff --git a/arch/s390/kvm/arm64/guest.c b/arch/s390/kvm/arm64/guest.c index fd6442d9e4f4..4ea6fe2c270d 100644 --- a/arch/s390/kvm/arm64/guest.c +++ b/arch/s390/kvm/arm64/guest.c @@ -5,8 +5,6 @@ #include #include =20 -#include "guest.h" - #define __INCL_GEN_ARM_FILE #include "generated/guest.inc" #undef __INCL_GEN_ARM_FILE @@ -47,6 +45,51 @@ const struct kvm_stats_header kvm_vcpu_stats_header =3D { sizeof(kvm_vcpu_stats_desc), }; =20 +int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices) +{ + int ret; + + ret =3D copy_core_reg_indices(vcpu, uindices); + if (ret < 0) + return ret; + uindices +=3D ret; + + return 0; +} + +unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu) +{ + return num_core_regs(vcpu); +} + +int kvm_arm_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) +{ + /* We currently use nothing arch-specific in upper 32 bits */ + if ((reg->id & ~KVM_REG_SIZE_MASK) >> 32 !=3D KVM_REG_ARM64 >> 32) + return -EINVAL; + + switch (reg->id & KVM_REG_ARM_COPROC_MASK) { + case KVM_REG_ARM_CORE: + return get_core_reg(vcpu, reg); + default: + return -EINVAL; + } +} + +int kvm_arm_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) +{ + /* We currently use nothing arch-specific in upper 32 bits */ + if ((reg->id & ~KVM_REG_SIZE_MASK) >> 32 !=3D KVM_REG_ARM64 >> 32) + return -EINVAL; + + switch (reg->id & KVM_REG_ARM_COPROC_MASK) { + case KVM_REG_ARM_CORE: + return set_core_reg(vcpu, reg); + default: + return -EINVAL; + } +} + int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *r= egs) { return -EINVAL; diff --git a/arch/s390/kvm/arm64/handle_exit.c b/arch/s390/kvm/arm64/handle= _exit.c index 046e905ffcb6..38a2cc4ee4e1 100644 --- a/arch/s390/kvm/arm64/handle_exit.c +++ b/arch/s390/kvm/arm64/handle_exit.c @@ -5,6 +5,8 @@ #include #include =20 +#include "handle_exit.h" + typedef int (*exit_handle_fn)(struct kvm_vcpu *); static exit_handle_fn arm_exit_handlers[ESR_ELx_EC_MAX + 1]; =20 @@ -85,6 +87,36 @@ static int handle_trap_exceptions(struct kvm_vcpu *vcpu) return exit_handler(vcpu); } =20 +/* + * Return > 0 to return to guest, < 0 on error, 0 (and set exit_reason) on + * proper exit to userspace. + */ +int handle_exit(struct kvm_vcpu *vcpu) +{ + u8 icptr =3D vcpu->arch.sae_block.icptr; + int ret =3D 1; + + switch (icptr) { + case SAE_ICPTR_SPURIOUS: + break; + case SAE_ICPTR_VALIDITY: + WARN_ONCE(true, "SAE: validity intercept. vir: 0x%04x", + vcpu->arch.sae_block.vir); + vcpu->run->exit_reason =3D KVM_EXIT_FAIL_ENTRY; + ret =3D 0; + break; + case SAE_ICPTR_GUEST_ADDRESS_SIZE: + case SAE_ICPTR_HOST_ACCESS_EXCEPTION: + case SAE_ICPTR_SYNCHRONOUS_EXCEPTION: + ret =3D handle_trap_exceptions(vcpu); + break; + default: + vcpu->run->exit_reason =3D KVM_EXIT_FAIL_ENTRY; + ret =3D 0; + } + return ret; +} + /* manually copied from arch/arm64/kernel/traps.c */ static const char * const esr_class_str[] =3D { [0 ... ESR_ELx_EC_MAX] =3D "UNRECOGNIZED EC", diff --git a/arch/s390/kvm/arm64/handle_exit.h b/arch/s390/kvm/arm64/handle= _exit.h new file mode 100644 index 000000000000..65ae58721537 --- /dev/null +++ b/arch/s390/kvm/arm64/handle_exit.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef KVM_ARM64_HANDLE_EXIT_H +#define KVM_ARM64_HANDLE_EXIT_H + +#include + +int handle_exit(struct kvm_vcpu *vcpu); + +#endif /* KVM_ARM64_HANDLE_EXIT_H */ diff --git a/arch/s390/kvm/arm64/reset.c b/arch/s390/kvm/arm64/reset.c new file mode 100644 index 000000000000..e4cdce1dbf9d --- /dev/null +++ b/arch/s390/kvm/arm64/reset.c @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include + +#include +#include + +bool kvm_arm_vcpu_is_finalized(struct kvm_vcpu *vcpu) +{ + return true; +} + +static inline void vcpu_reset_hcr(struct kvm_vcpu *vcpu) +{ + vcpu->arch.hcr_el2 =3D HCR_EL2_E2H | HCR_EL2_RW | HCR_EL2_AMO | + HCR_EL2_IMO | HCR_EL2_FMO | HCR_EL2_PTW; + /* traps */ + vcpu->arch.hcr_el2 |=3D HCR_EL2_TSC | HCR_EL2_TID1 | HCR_EL2_TID2 | + HCR_EL2_TID3 | HCR_EL2_TID4 | HCR_EL2_TID5 | + HCR_EL2_TIDCP | HCR_EL2_TLOR; +} + +void kvm_reset_vcpu(struct kvm_vcpu *vcpu) +{ + struct vcpu_reset_state reset_state; + bool loaded; + + scoped_guard(spinlock, &vcpu->arch.mp_state_lock) { + reset_state =3D vcpu->arch.reset_state; + vcpu->arch.reset_state.reset =3D false; + } + + /* + * Disable preemption around the vcpu reset as we might otherwise race wi= th + * preempt notifiers which call stiasrm/lasrm from put/load + */ + preempt_disable(); + + /* The reset must run with an unloaded save area */ + loaded =3D vcpu_is_loaded(vcpu); + if (loaded) + vcpu_put(vcpu); + + kvm_reset_vcpu_core(vcpu); + + /* Reset special registers */ + vcpu_reset_hcr(vcpu); + + if (reset_state.reset) { + *vcpu_pc(vcpu) =3D reset_state.pc; + vcpu_clear_flag(vcpu, PENDING_EXCEPTION); + vcpu_clear_flag(vcpu, EXCEPT_MASK); + vcpu_clear_flag(vcpu, INCREMENT_PC); + vcpu_set_reg(vcpu, 0, reset_state.r0); + } + + /* Load new vx-regs into HW if they are currently loaded */ + if (current->thread.kfpu_flags) + load_vx_regs(vcpu->arch.ctxt.vregs); + + if (loaded) + vcpu_load(vcpu); + + preempt_enable(); +} + +int kvm_arm_vcpu_finalize(struct kvm_vcpu *vcpu, int feature) +{ + return -EINVAL; +} diff --git a/arch/s390/kvm/arm64/trace.h b/arch/s390/kvm/arm64/trace.h index 3a5dcd039c13..1e3cb6108196 100644 --- a/arch/s390/kvm/arm64/trace.h +++ b/arch/s390/kvm/arm64/trace.h @@ -5,7 +5,7 @@ #include =20 #undef TRACE_SYSTEM -#define TRACE_SYSTEM kvm +#define TRACE_SYSTEM kvm_arm64 =20 #endif /* KVM_ARM64_TRACE_KVM_H */ =20 --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B52D9515967; Fri, 18 Sep 2026 13:32:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738367; cv=none; b=jnYDZ2DB9vu8P8HofvdXoQsgM0ATF0DkW8jYyIqySbm0PX6rpojstpIhbROA1fTkZIXzOYGqWrtT2NifsXQrvBWQYKsrGxHOTkcfFZS5VGLBuyLWGyutp50MQACxpjoWYzAH+1PmzYPMI572wrm1oeKeAr5WS2o7NphwEY782l4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738367; c=relaxed/simple; bh=VAEskr0fandOTHPpo2TOWy37FCk8H7xWMShABkfig8g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Xs2QQDIaQOQeVZCaOvfZydqwJWzHatyq9gFHkcpSHTGXafs0KY4sEO7ri6bY2W9DtkXba2ceyTza4v5IYp7MjSqSGzdAdxpz90+wAMQUYsIkxo9mxsHWAGkfdcMIOpl+Dgxwvr6b+Or2bOk+Zr6F8ZNysNXTz4gE3DfE5f0DGjw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=kSqRHQza; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="kSqRHQza" Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IA2ml4991015; Fri, 18 Sep 2026 13:31:26 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=AkJFWOxKiHwzi2obc Ct2bffQsfYPBH6Q9tVce2ZXA1k=; b=kSqRHQzaFvUVGgOSdaYAYrPtFnGtBUPyW u0KRB4WqzOiFNzYeQtf7lhsqx+EKTWf1Kke0rihJfUlBd3+3wZu520VTybzV5KGZ sRSdz8V/IFucH2SnVIDtFFLBbqi7cpGuOBhPf2J/ct7LZOWdnwwxb3pDZ0b2qPIe 9JLQui0B/spE+8P//ad5Dy1GcJqzI8IM2Eb1czcDigCG+k9dusBoZf7oYnb9budM oOdjQFLlobWnA8WvBqo0Rjj12HQWWM6vp4AAUxWi7ilT0X7WxPuEo1MHZfC809+1 49ZDkUWPGMiQ2zShwodhdlysuY7zVszikwH48Md3rf92STrXjuwog== Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmxcvfnq4-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:25 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDNnu11684343; Fri, 18 Sep 2026 13:31:24 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gs4tv8bhs-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:24 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay07.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVIV244499304 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:18 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 209EE20040; Fri, 18 Sep 2026 13:31:18 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id BDB9D2004B; Fri, 18 Sep 2026 13:31:17 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:17 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 27/29] KVM: s390: arm64: Implement basic page fault handler Date: Fri, 18 Sep 2026 15:31:04 +0200 Message-ID: <20260918133107.1042730-28-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX7cfGF5Nc1u6p 0o83fFcP6UrDveNe69wNMlejGSoatzUthW03atlu/TFDL92UxglRsqpK5wLYEA1BxWbKMo1gqZz 6YYrBwJG6xNNUWpe7OLdJOC9SqGNBDs= X-Proofpoint-ORIG-GUID: X7AfbF9w0c-DsHk4zTLwp1wrzeTopbVF X-Proofpoint-GUID: Q60U53MBrmas2qUo-E6BlHgs3RAK1q5U X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE4NCBTYWx0ZWRfX2CTF0e9i7i8F Ix7kV1vMDCcwDt4eErVcFMten8x10xX+hFIb/6vvi7a4OgVZfFDBxNUhSTgfoVQdMY2M8MAsvbE AQMKqDfcMSovjx7M8RB9GQTTz7F7mNVaZxomXIenP6QOYM8H/G1q9P0rokQoC1ZFSzcSse5vM4G I8Oq5xzefyD+xYNlQjS2la6yZSSIcXYx//al+gyAjHhNf8FHmwU+v19dC6+ktlyn7EUvrYjaeC/ JjhICTfd1MKvnZKr++Ac9AvROHsL/m65srpm7eTXP72EQGyBWeAN3rntN9JeI0KOEyv+WRtEc1c x/m5Q8p4KdAIdM/OZBZZ8be6FjYqyaNzl99t9EQL94yUWYy4WLutQHoWuCr9YOtWPYrjgJTTcJn 3dhHCT9l8c6iYYzWgskKG/sBL3erwt4cj4RG/ibMY0hTBvNchnI43zQDWnNhIQkoK8qChdv896F 6dwbfB/CHLqAdzmFDew== X-Authority-Analysis: v=2.4 cv=F+7C5ahN c=1 sm=1 tr=0 ts=6aad3d2d cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VnNF1IyMAAAA:8 a=TgzuJATVMAAvp17vzBAA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 phishscore=0 clxscore=1015 malwarescore=0 lowpriorityscore=0 bulkscore=0 spamscore=0 impostorscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180184 Content-Type: text/plain; charset="utf-8" Add host functionality to page in guest memory. If the guest does something unexpected or illegal exit to userspace abort guest execution. This behaviour will be changed to guest error injects once all sysregs are accessible for the host. Co-developed-by: Nina Schoetterl-Glausch Signed-off-by: Nina Schoetterl-Glausch Signed-off-by: Steffen Eiden --- arch/s390/kvm/arm64/handle_exit.c | 2 + arch/s390/kvm/arm64/mmio.c | 15 +++ arch/s390/kvm/arm64/mmu.c | 180 ++++++++++++++++++++++++++++++ arch/s390/kvm/arm64/trace.h | 50 +++++++++ 4 files changed, 247 insertions(+) create mode 100644 arch/s390/kvm/arm64/mmio.c create mode 100644 arch/s390/kvm/arm64/mmu.c diff --git a/arch/s390/kvm/arm64/handle_exit.c b/arch/s390/kvm/arm64/handle= _exit.c index 38a2cc4ee4e1..804ecc1d79ee 100644 --- a/arch/s390/kvm/arm64/handle_exit.c +++ b/arch/s390/kvm/arm64/handle_exit.c @@ -63,6 +63,8 @@ static int kvm_handle_unknown_ec(struct kvm_vcpu *vcpu) static exit_handle_fn arm_exit_handlers[] =3D { [0 ... ESR_ELx_EC_MAX] =3D kvm_handle_unknown_ec, [ESR_ELx_EC_HVC64] =3D handle_hvc, + [ESR_ELx_EC_IABT_LOW] =3D kvm_handle_guest_abort, + [ESR_ELx_EC_DABT_LOW] =3D kvm_handle_guest_abort, }; =20 static exit_handle_fn kvm_get_exit_handler(struct kvm_vcpu *vcpu) diff --git a/arch/s390/kvm/arm64/mmio.c b/arch/s390/kvm/arm64/mmio.c new file mode 100644 index 000000000000..908a6b43ddf7 --- /dev/null +++ b/arch/s390/kvm/arm64/mmio.c @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include + +#include + +#include +#include + +#include "trace.h" + +#define __INCL_GEN_ARM_FILE +#include "generated/mmio.inc" +#undef __INCL_GEN_ARM_FILE diff --git a/arch/s390/kvm/arm64/mmu.c b/arch/s390/kvm/arm64/mmu.c new file mode 100644 index 000000000000..e561fee9ca97 --- /dev/null +++ b/arch/s390/kvm/arm64/mmu.c @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: GPL-2.0 +#include + +#include + +#include + +#include "trace.h" + +static inline bool kvm_s390_cur_gmap_fault_is_write(struct kvm_vcpu *vcpu) +{ + return (vcpu->arch.sae_block.hai.pic & PGM_INT_CODE_MASK) =3D=3D PGM_PROT= ECTION || + vcpu->arch.sae_block.hai.teid.fsi =3D=3D TEID_FSI_STORE; +} + +/* + * user_mem_abort() - handle a dat fault for the gmap of a vcpu + * + * Return: 0 on success, < 0 in case of error. + * Context: The mm lock must not be held before calling. May sleep. + */ +static int user_mem_abort(struct kvm_vcpu *vcpu, gpa_t fault_ipa, + struct kvm_memory_slot *slot, hva_t hva) +{ + struct guest_fault f =3D { }; + int ret; + + if (kvm_s390_cur_gmap_fault_is_write(vcpu)) + f.write_attempt =3D FOLL_WRITE; + f.gfn =3D gpa_to_gfn(fault_ipa); + + ret =3D kvm_s390_faultin_gfn(vcpu, NULL, &f); + if (ret <=3D 0) + return ret; + if (ret =3D=3D PGM_ADDRESSING) + /* + * Without the relevant sysregs we cannot do anything for now. + * Go back to userspace with an error. TODO sysreg handling + */ + return -ENOEXEC; + KVM_BUG_ON(ret, vcpu->kvm); + return -EINVAL; +} + +static int kvm_handle_pic(struct kvm_vcpu *vcpu, bool *translation) +{ + switch (kvm_vcpu_fault_pic(vcpu)) { + /* expected cases: */ + case PGM_ASCE_TYPE: + case PGM_REGION_FIRST_TRANS: + case PGM_REGION_SECOND_TRANS: + case PGM_REGION_THIRD_TRANS: + case PGM_SEGMENT_TRANSLATION: + case PGM_PAGE_TRANSLATION: + *translation =3D true; + break; + case PGM_PROTECTION: + break; + /* unexpected cases: */ + case 0: + KVM_BUG(1, vcpu->kvm, "On MMU fault path but no fault occurred"); + return -EFAULT; + default: + KVM_BUG(1, vcpu->kvm, "Unexpected program interrupt 0x%x, TEID 0x%016lx", + vcpu->arch.sae_block.hai.pic, vcpu->arch.sae_block.hai.teid.val); + send_sig(SIGSEGV, current, 0); + return -EFAULT; + } + + return 0; +} + +int kvm_handle_guest_abort(struct kvm_vcpu *vcpu) +{ + struct kvm_memory_slot *memslot; + bool translation =3D false; + phys_addr_t fault_ipa; + unsigned long hva; + bool write_fault; + bool guest_size_err; + bool writable; + bool is_iabt; + int ret; + gfn_t gfn; + int idx; + + fault_ipa =3D kvm_vcpu_get_fault_ipa(vcpu); + is_iabt =3D kvm_vcpu_trap_is_iabt(vcpu); + guest_size_err =3D vcpu->arch.sae_block.icptr =3D=3D SAE_ICPTR_GUEST_ADDR= ESS_SIZE; + + if (guest_size_err) { + translation =3D true; + } else { + ret =3D kvm_handle_pic(vcpu, &translation); + if (ret) + return ret; + } + + if (translation) { + /* + * For both cases: + * Without the relevant sysregs we cannot do anything for now. + * Go back to userspace with an error. TODO sysreg handling + */ + if (fault_ipa >=3D BIT_ULL(get_kvm_ipa_limit())) + return -ENOEXEC; + + if (fault_ipa >=3D vcpu->kvm->arch.guest_phys_size) + return -ENOEXEC; + } + + trace_kvm_guest_fault(*vcpu_pc(vcpu), kvm_vcpu_get_esr(vcpu), + kvm_vcpu_get_hfar(vcpu), fault_ipa); + + idx =3D srcu_read_lock(&vcpu->kvm->srcu); + + gfn =3D fault_ipa >> PAGE_SHIFT; + + memslot =3D gfn_to_memslot(vcpu->kvm, gfn); + hva =3D gfn_to_hva_memslot_prot(memslot, gfn, &writable); + write_fault =3D kvm_is_write_fault(vcpu); + if (kvm_is_error_hva(hva) || (write_fault && !writable)) { + ret =3D -ENOEXEC; + /* + * The guest has put either its instructions or its page-tables + * somewhere it shouldn't have. Userspace won't be able to do + * anything about this (there's no syndrome for a start). + * + * Without the relevant sysregs we cannot do anything for now. + * Go back to userspace with an error. TODO sysreg handling + */ + if (is_iabt) + goto out_unlock; + + if (kvm_vcpu_abt_iss1tw(vcpu)) { + /* + * Without the relevant sysregs we cannot do anything for now. + * Go back to userspace with an error. TODO sysreg handling + */ + goto out_unlock; + } + + /* + * Check for a cache maintenance operation. Assume the guest is + * cautious and skip instruction + */ + if (kvm_is_error_hva(hva) && kvm_vcpu_dabt_is_cm(vcpu)) { + kvm_incr_pc(vcpu); + ret =3D 1; + goto out_unlock; + } + + /* + * The IPA is reported as [MAX:12], so we need to + * complement it with the bottom 12 bits from the + * faulting VA. This is always 12 bits, irrespective + * of the page size. + */ + fault_ipa |=3D kvm_vcpu_get_hfar(vcpu) & ((1 << 12) - 1); + ret =3D io_mem_abort(vcpu, fault_ipa); + goto out_unlock; + } + + /* Userspace should not be able to register out-of-bounds IPAs */ + VM_BUG_ON(fault_ipa >=3D vcpu->kvm->arch.guest_phys_size); + /* + * Proper guest size faults have been injected. + * In theory it's fine to have device memory higher than MSL, + * even if not currently possible, but that would have been handled above. + * So if we get here with a guest size intercept, we have a bug somewhere. + */ + VM_BUG_ON(guest_size_err); + + ret =3D user_mem_abort(vcpu, fault_ipa, memslot, hva); + if (!ret) + ret =3D 1; +out_unlock: + srcu_read_unlock(&vcpu->kvm->srcu, idx); + return ret; +} diff --git a/arch/s390/kvm/arm64/trace.h b/arch/s390/kvm/arm64/trace.h index 1e3cb6108196..6d4f4af9eee6 100644 --- a/arch/s390/kvm/arm64/trace.h +++ b/arch/s390/kvm/arm64/trace.h @@ -7,6 +7,56 @@ #undef TRACE_SYSTEM #define TRACE_SYSTEM kvm_arm64 =20 +TRACE_EVENT(kvm_mmio_nisv, + TP_PROTO(unsigned long vcpu_pc, unsigned long esr, + unsigned long far, unsigned long ipa), + TP_ARGS(vcpu_pc, esr, far, ipa), + + TP_STRUCT__entry( + __field( unsigned long, vcpu_pc ) + __field( unsigned long, esr ) + __field( unsigned long, far ) + __field( unsigned long, ipa ) + ), + + TP_fast_assign( + __entry->vcpu_pc =3D vcpu_pc; + __entry->esr =3D esr; + __entry->far =3D far; + __entry->ipa =3D ipa; + ), + + TP_printk("ipa %#016lx, esr %#016lx, far %#016lx, pc %#016lx", + __entry->ipa, __entry->esr, + __entry->far, __entry->vcpu_pc) +); + +TRACE_EVENT(kvm_guest_fault, + TP_PROTO(unsigned long vcpu_pc, unsigned long hsr, + unsigned long hxfar, + unsigned long long ipa), + TP_ARGS(vcpu_pc, hsr, hxfar, ipa), + + TP_STRUCT__entry( + __field( unsigned long, vcpu_pc ) + __field( unsigned long, hsr ) + __field( unsigned long, hxfar ) + __field( unsigned long long, ipa ) + ), + + TP_fast_assign( + __entry->vcpu_pc =3D vcpu_pc; + __entry->hsr =3D hsr; + __entry->hxfar =3D hxfar; + __entry->ipa =3D ipa; + ), + + TP_printk("ipa %#llx, hsr %#08lx, hxfar %#08lx, pc %#016lx", + __entry->ipa, __entry->hsr, + __entry->hxfar, __entry->vcpu_pc) +); + + #endif /* KVM_ARM64_TRACE_KVM_H */ =20 #undef TRACE_INCLUDE_PATH --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BDC504FDA68; Fri, 18 Sep 2026 13:31:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738321; cv=none; b=d5kgtJdO92QDb6hN/VHZe/Pd2mDBsCN8SSQC/tahI6DSLZjJ+vOne2f4YdneaBYsNmbXXA5XmzmhS+IHSXdseAGsKhmTJdkRTeFGegBoPBIHISwO3OmFYcN6vyUNnofZ4O5WWED3x40C7alpuKoR66O1iVQwXz5rjLge+xP7u+Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738321; c=relaxed/simple; bh=dXpCdwG66pkHTyERbncZkMWhpTnDi2Lf2HJjOjupGCw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tUQO0G2J3RIccEP6xhYmL3QA62bPgsNUMbopMvKm5zy8CwS5V8h3x0wrtxPUVbcQvtW49V4JI+60Mz9vd6tpv6T7ShMIZF5Np992P9C56ekTTLBPqzp69jL0Qi56tHr81VqczHsu3za9ydFv/YxfFTfJj6uLYIqPGvbgtCCmGQY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=XgI9G39q; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="XgI9G39q" Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDVPo73708413; Fri, 18 Sep 2026 13:31:25 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=FcmdycdQXp41OBusk c+AzFrFAnw0ExIOHhNLryI9ozA=; b=XgI9G39qTDV1E4ZsjU+bZ/5EZhG3xm0oI tgsHulmgwBMjt2YINU0S8cExzZRvkf89Z0bd/gugIuOAC2F/8c42vp/ndkeuEqZb 2C0/oMoTHA0sDCEYZ+x1yPUAKMhYkdC6jEI/OK9QtoqL8kYQPx8jO9NJILJhAQq/ ihFJZWChokxEBpu/PoqAeItn/cbbctlluDdyoK8NPM9fKbYq4rs6howYFNWzEHz0 56jCls+Szdbr5BCpi28V0LYuj9inzdAGoJhBhg13i2ccQu6/YVuPbQOogYjuiS8I 7aIvJ2lRhb3tGJRTwE8ZJCC21j9vsuS3D87vC/H4QXsjNsieLIpNQ== Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmxdqra32-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:25 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDNqig777341; Fri, 18 Sep 2026 13:31:24 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gra3yxkc6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:24 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay07.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVIEO51511724 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:18 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7C47520040; Fri, 18 Sep 2026 13:31:18 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 26CB120049; Fri, 18 Sep 2026 13:31:18 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:18 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 28/29] KVM: s390: arm64: Integrate arm on s390 Date: Fri, 18 Sep 2026 15:31:05 +0200 Message-ID: <20260918133107.1042730-29-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE5MiBTYWx0ZWRfX7q6BDXeYqT3+ CgoRoixI/sExF00hRyln9vGdV5+Vl/hbURdZbyIHIl3IIGfEiuFdWcxk9lsfLtGBV+eqJDzVFkv jTsz9polcAEelgamHS2zY8KJNggoiQNB0Tg4uCkoSVf7UOJDvgMV5IM9AFl9k0QNXJMmd8qrJVY 4ArRlXl8JMrMDK5+RerGI9tPfevGBOveLgpGTQvAIs/tkws6mtgLc3vRN5rEPRZJ3xaXwDcFULU OwH/SJYZVt2oeBzSROq/PODb14gx5KcJ8b8Y8OufA35o81C6ptU3CeV4ldrZbJvx7oL2fasoGk0 x+Wono5kxsBQ9Nq1YlozAUvr/aqxpqQDsBY4h5w9hujZ94dwB7hxA7y2cs0v2cNyJHAfKWKzlOU P7JPohWyyeUPpdSuk5sKMgw3IrruNMWVVK7BK0PVgxYQWheJad8rdSjU9jynBgai2PP+2Q6YPnZ NNdPajPKhIB4kxMFYSg== X-Proofpoint-GUID: TBX9soDy60mSVGXr9vwCVrQzbAInrvi0 X-Authority-Analysis: v=2.4 cv=DobDa2/+ c=1 sm=1 tr=0 ts=6aad3d2d cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VnNF1IyMAAAA:8 a=86Nss3GfdkgdrDYwrAMA:9 X-Proofpoint-ORIG-GUID: 8LmCva1kK--8xXt6EznWyIQYnJ1n4udm X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE5MiBTYWx0ZWRfXxffRJPniMDSS oGUtJssU5YBQEIuSVC+b++kIPITpl5X4TPUWok+ZhvdTkYoO7E9j7SRl2JOmItI+P3zR3jclwOq CRXQO30c8qbyQgWgtK+cTQov2b6cFmg= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_04,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 malwarescore=0 priorityscore=1501 suspectscore=0 impostorscore=0 spamscore=0 clxscore=1015 adultscore=0 bulkscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180192 Content-Type: text/plain; charset="utf-8" Add all Kbuild/Makefile configurations to build a second KVM module on s390 implementing the arm64-KVM API. To prevent symbol conflicts with kvm-s390 all internal symbols in kvm-arm64 are mangled if compiled as built-in. The new module ins named kvm-arm64. As in this case the build does not go through the normal build process the module parameter handling would be messed up. By forcing KBUILD_MODNAME to kvm-arm64 all parameters are at the same location and not at object/basename of the object file where the parameter is introduced. Co-developed-by: Andreas Grapentin Signed-off-by: Andreas Grapentin Co-developed-by: Nina Schoetterl-Glausch Signed-off-by: Nina Schoetterl-Glausch Co-developed-by: Gautam Gala Signed-off-by: Gautam Gala Signed-off-by: Steffen Eiden --- arch/s390/include/asm/Kbuild | 1 + arch/s390/kvm/Kconfig | 28 +++++++---- arch/s390/kvm/Makefile | 1 + arch/s390/kvm/arm64/Makefile | 93 ++++++++++++++++++++++++++++++++++++ arch/s390/kvm/arm64/arm.c | 2 +- 5 files changed, 115 insertions(+), 10 deletions(-) create mode 100644 arch/s390/kvm/arm64/Makefile diff --git a/arch/s390/include/asm/Kbuild b/arch/s390/include/asm/Kbuild index 0c1fc47c3ba0..9409970a2123 100644 --- a/arch/s390/include/asm/Kbuild +++ b/arch/s390/include/asm/Kbuild @@ -8,3 +8,4 @@ generic-y +=3D asm-offsets.h generic-y +=3D mcs_spinlock.h generic-y +=3D mmzone.h generic-y +=3D ring_buffer.h + diff --git a/arch/s390/kvm/Kconfig b/arch/s390/kvm/Kconfig index a6ff2e5aa19b..4e060185c2fb 100644 --- a/arch/s390/kvm/Kconfig +++ b/arch/s390/kvm/Kconfig @@ -19,6 +19,7 @@ if VIRTUALIZATION config KVM def_tristate y prompt "Kernel-based Virtual Machine (KVM) support" + depends on HAS_IOMEM select HAVE_KVM_CPU_RELAX_INTERCEPT select KVM_ASYNC_PF select KVM_ASYNC_PF_SYNC @@ -28,16 +29,25 @@ config KVM select KVM_VFIO select VIRT_XFER_TO_GUEST_WORK select KVM_MMU_LOCKLESS_AGING + select GUEST_PERF_EVENTS if PERF_EVENTS + select SCHED_INFO help - Support hosting paravirtualized guest machines using the SIE - virtualization capability on the mainframe. This should work - on any 64bit machine. - - This module provides access to the hardware capabilities through - a character device node named /dev/kvm. - - To compile this as a module, choose M here: the module - will be called kvm. + Enable support for hosting virtualized, hardware-accelerated + virtual machines via two modules: kvm and kvm_arm64. + + The kvm module provides access to host hardware-accelerated s390 + guests using the Start Interpretive Execution (SIE) instruction via a + character device node named /dev/kvm. This requires a 64-bit machine + (hardware model). + + The kvm_arm64 module provides access to host hardware-accelerated + arm64 guests using the Start ARM Execution (SAE) instruction via a + character device node named /dev/kvm_arm64. This requires hardware + models that support the Arm execution facility (AEF). + + To compile this driver as a module, choose M here. The module will be + called kvm for the SIE acceleration and kvm_arm64 for the SAE + acceleration. =20 If unsure, say N. =20 diff --git a/arch/s390/kvm/Makefile b/arch/s390/kvm/Makefile index a4e3875b5bdd..380db443a0e9 100644 --- a/arch/s390/kvm/Makefile +++ b/arch/s390/kvm/Makefile @@ -4,3 +4,4 @@ # Copyright IBM Corp. 2008 =20 obj-$(CONFIG_KVM) +=3D s390/ +obj-$(CONFIG_KVM) +=3D arm64/ diff --git a/arch/s390/kvm/arm64/Makefile b/arch/s390/kvm/arm64/Makefile new file mode 100644 index 000000000000..bd78d64939d1 --- /dev/null +++ b/arch/s390/kvm/arm64/Makefile @@ -0,0 +1,93 @@ +# SPDX-License-Identifier: GPL-2.0 + +KVM :=3D ../../../../virt/kvm +KVM_DEV_NAME =3D kvm_arm64 +KVM_DEV_MINOR =3D MISC_DYNAMIC_MINOR +include $(srctree)/virt/kvm/Makefile.kvm +include $(srctree)/arch/s390/kvm/gmap/Makefile +include $(src)/Makefile.gen + +ccflags-y +=3D -I $(src) -I $(objtree)/$(obj) -I$(srctree)/arch/s390/kvm/g= map -DKVM_S390_ARM64 + +kvm-arm64-obj :=3D \ + arm.o \ + guest.o \ + handle_exit.o \ + inject_fault.o \ + mmio.o \ + mmu.o \ + reset.o \ + +kvm-arm64-obj +=3D $(patsubst %.o,%-arm64.o,$(kvm-y)) +kvm-arm64-obj +=3D $(patsubst %.o,%-arm64.o,$(gmap-y)) + +targets +=3D $(kvm-arm64-obj) + +$(obj)/%-arm64.o: $(src)/%.c FORCE + @mkdir -p $(dir $@) + $(call if_changed_rule,cc_o_c) + +ifeq ($(CONFIG_KVM),m) + +kvm-arm64-y =3D $(kvm-arm64-obj) + +else ifeq ($(CONFIG_KVM),y) + +KVM_ARM64_GEN_DIR :=3D $(objtree)/arch/${SRCARCH}/include/generated/asm +KVM_ARM64_MODNAME_H :=3D $(KVM_ARM64_GEN_DIR)/kvm_arm64_modname.h +ccflags-y +=3D -include $(KVM_ARM64_MODNAME_H) + +targets +=3D $(KVM_ARM64_MODNAME_H) + +quiet_cmd_kvm_arm64_modname_h =3D GEN $@ + cmd_kvm_arm64_modname_h =3D { \ + echo '/* Automatically generated; do not edit. */'; \ + echo '\#ifndef _KVM_ARM64_MODNAME_H'; \ + echo '\#define _KVM_ARM64_MODNAME_H'; \ + echo '\#undef KBUILD_MODNAME'; \ + echo '\#define KBUILD_MODNAME "kvm_arm64"'; \ + echo '\#endif /* _KVM_ARM64_MODNAME_H */'; \ + } > $@ + +$(addprefix $(obj)/,$(kvm-arm64-obj)): $(KVM_ARM64_MODNAME_H) + +$(KVM_ARM64_MODNAME_H): + @mkdir -p $(KVM_ARM64_GEN_DIR) + $(call cmd,kvm_arm64_modname_h) + +prereq-o-cmd =3D $(foreach o, $(filter %.o, $^), $(dir $(o)).$(notdir $(o)= ).cmd) +cmd_gen_symversions_o =3D \ + grep --no-filename "^\#SYMVER" $(prereq-o-cmd) >> $(dot-target).cmd || tr= ue + +define rule_ld_o_o + $(call cmd_and_savecmd,ld) + $(call cmd,gen_symversions_o) +endef + +LDFLAGS_kvm-unnamespaced.o :=3D -r +$(obj)/kvm-unnamespaced.o: $(addprefix $(obj)/,$(kvm-arm64-obj)) FORCE + $(call if_changed_rule,ld_o_o) + +quiet_cmd_nm_filter =3D NMFLTR $@ + cmd_nm_filter =3D $(NM) --defined-only --format=3Djust-symbols $< | sort = -u > $@ + +$(obj)/kvm_symbol_list: $(obj)/kvm-unnamespaced.o FORCE + $(call if_changed,nm_filter) + +define rule_oc_o_o + $(call cmd_and_savecmd,objcopy) + $(call cmd,gen_objtooldep) + $(call cmd,gen_symversions_o) +endef + +OBJCOPYFLAGS_kvm-namespaced.o :=3D -O $(LD_BFD) --localize-symbols=3D$(obj= )/kvm_symbol_list +$(obj)/kvm-namespaced.o: $(obj)/kvm-unnamespaced.o $(obj)/kvm_symbol_list = FORCE + $(call if_changed_rule,oc_o_o) + +kvm-arm64-y =3D kvm-namespaced.o + +targets +=3D kvm-unnamespaced.o kvm_symbol_list kvm-namespaced.o + +endif + +obj-$(CONFIG_KVM) +=3D kvm-arm64.o diff --git a/arch/s390/kvm/arm64/arm.c b/arch/s390/kvm/arm64/arm.c index bb3e7fa8cad5..43e40fc78501 100644 --- a/arch/s390/kvm/arm64/arm.c +++ b/arch/s390/kvm/arm64/arm.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 =20 -#define KMSG_COMPONENT "kvm-s390-arm64" +#define KMSG_COMPONENT "kvm_arm64" #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt =20 #include --=20 2.53.0 From nobody Fri Sep 25 00:01:58 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0858B502D46; Fri, 18 Sep 2026 13:32:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738330; cv=none; b=lp1nHWk3lkBDmCpoi0D5SQSVRTyBnjcjUgeHs/Qit4QUyWyQzViWz07UV8dKC2+cyymKdu5ylXrWdzzD96vvFhSoCsbi3wmAXrYRAEFO5kWyfQAWtGYo7qN2Qr3iXb3bN7VFc4Niw+RDexNa2L04Hq8//bVDTSEn8CZAj06ObG0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738330; c=relaxed/simple; bh=aoV+5a5Z4iuGJ35qmrd0zOsIb5IvTgcwx1xkzzEjUKY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FtkKK/pBj/cG8eYhfuGtilzyrS+6lFfw0mg/qh5RT9QhOwsYopTxnX78bcLf1wYJox4bjyQ0l7mKMqvQH0wzXg28QPnuogPtAQ0clA7hNFf2mhGSUgPLTPkl2bdCRh2MIYis+CsD4KKHXu12ERP7LNCItj/sEAKDDtLRkZfXyNY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=Ng7dJ5l0; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="Ng7dJ5l0" Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDVOT61378352; Fri, 18 Sep 2026 13:31:28 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=WCL+CA7pTX69IiknF 0LM7xJ6P4tgzKbQdTZYtTbfrv8=; b=Ng7dJ5l0KJktT8YucRQbjpsZ7Ya/5ZANe zBluefEEky4NgtdfmAMTZJ+66ZLHY48uKTg4TPz4hOp/azjCjsm/1fWnrJwd1wTH LRv52FfHOEmG8vlQbe5v1FBuqWHd/+cCZ4ZGu8w815r4zXdTDWv03Ak2d9aMUTHz qDREDdNDmEGetkikEF97IStY/dhMxPe+rfisDXPf9H58PKRhUJzazqIDtwK92NuB o5Kc+feQyrt0dEuLJY3jUI6FK1/otCZmaw84SnGPEkPFYXR+vJ8W410P5RZzWRjb nH/AHIX2vVFGOhHli3WnsuivH3cSahwXZF4o9QxN+ooSUsHLJ+cuQ== Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gmx848a6w-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:27 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68IDNs9f771781; Fri, 18 Sep 2026 13:31:26 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gr5fffhd0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 18 Sep 2026 13:31:26 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay07.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68IDVIYY51511726 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 18 Sep 2026 13:31:19 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D038E20040; Fri, 18 Sep 2026 13:31:18 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 829712004B; Fri, 18 Sep 2026 13:31:18 +0000 (GMT) Received: from tuxmaker.lnxne.boe (unknown [9.87.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 18 Sep 2026 13:31:18 +0000 (GMT) From: Steffen Eiden To: kvm@vger.kernel.org, kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Cc: Alexander Gordeev , Andreas Grapentin , Arnd Bergmann , Catalin Marinas , Christian Borntraeger , Claudio Imbrenda , David Hildenbrand , Friedrich Welter , Fuad Tabba , Gautam Gala , Hariharan Mari , Heiko Carstens , Hendrik Brueckner , Ilya Leoshkevich , Janosch Frank , Joey Gouly , Marc Zyngier , Nico Boehr , Nina Schoetterl-Glausch , Oliver Upton , Paolo Bonzini , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v8 29/29] KVM: s390: Enforce no unexpected external symbol exports in s390 KVM Date: Fri, 18 Sep 2026 15:31:06 +0200 Message-ID: <20260918133107.1042730-30-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260918133107.1042730-1-seiden@linux.ibm.com> References: <20260918133107.1042730-1-seiden@linux.ibm.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 X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE4MDE5MiBTYWx0ZWRfXy6qgH+KHIi4l DepgFH3mLaQBLw17bC4HCSFeciPpdFxhfb6dSsDtaggdjh93h/l0tf4zeD9FRCJqqlmhVLpv72t +sT3zeQMLT09IVX10Xb8wVqIwuVifOH4oJajXEEsw5qMexlB9/bb3hmM450II72zEYPDbR/gGUl jjQKAlM1bxjyNaYSnAX5NOR4XWLSolKqcRLDOEHNzM68VkBN+/LdvpbDW0cw5CrXY0G3qffTnWP whF0kK55LOrp76uqoGd5Pufgx2SRdjQMMw/4AZg4myW39nAS0PUQ87pqdn9ZYmwJMIieYuzX4+a h335zQPYPWyXQ0adqXDXURADgDQTm3jXwtVU2FlCwb6Pw25Ny9v0prC/VuTS7YOQLbjyawjjRHd ZkFva0/diMdAzwYP+0dcjwAc0WgjhpUstNUmDjXyjeGcZXXWwMXiUV3aOz9lGgzkHwa7YgwW+qZ Mxw7rP1hz7EsrQOUXgA== X-Proofpoint-ORIG-GUID: zvGj3enOp3CadNtbS38DnRKI3uoq46V4 X-Proofpoint-GUID: CK-Htzt2iMw14alug5hpUMBDv9Xuwa9G X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE4MDE5MiBTYWx0ZWRfXzwKyHnhxKqz0 IeRxDXTiVO5ZVklAPLaKFCS0Y9Du1FRKba6zFWKr+ZzbTXXnNHzysHARjwCeSXu7PMuGBSexw/Z hOorftFQwkzFgM+7xk48f/wBR+KfLSM= X-Authority-Analysis: v=2.4 cv=cY9HPXDM c=1 sm=1 tr=0 ts=6aad3d2f cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VnNF1IyMAAAA:8 a=DPUpadGSCr_GuARIGB0A:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-18_04,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 spamscore=0 bulkscore=0 clxscore=1015 suspectscore=0 impostorscore=0 malwarescore=0 phishscore=0 adultscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609180192 Content-Type: text/plain; charset="utf-8" Add a Makefile check to arch/s390/kvm that fails the build on any EXPORT_SYMBOL_GPL or EXPORT_SYMBOL not in the allowed list. A symbol may only use EXPORT_SYMBOL_GPL if it is defined in exactly one of the two s390 KVM modules (kvm or kvm-arm64). A symbol defined in both modules could cause a link conflict if built builtin. While at it remove the unnecessary EXPORT_SYMBOL_GPL from kvm_s390_pv_is_protected, which has no external callers. Signed-off-by: Steffen Eiden --- arch/s390/kvm/Makefile | 1 + arch/s390/kvm/arm64/Makefile | 14 ++++++++++++++ arch/s390/kvm/s390/Makefile | 16 ++++++++++++++++ arch/s390/kvm/s390/pv.c | 1 - 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/arch/s390/kvm/Makefile b/arch/s390/kvm/Makefile index 380db443a0e9..0e474335bb78 100644 --- a/arch/s390/kvm/Makefile +++ b/arch/s390/kvm/Makefile @@ -5,3 +5,4 @@ =20 obj-$(CONFIG_KVM) +=3D s390/ obj-$(CONFIG_KVM) +=3D arm64/ + diff --git a/arch/s390/kvm/arm64/Makefile b/arch/s390/kvm/arm64/Makefile index bd78d64939d1..d84d3be74037 100644 --- a/arch/s390/kvm/arm64/Makefile +++ b/arch/s390/kvm/arm64/Makefile @@ -3,6 +3,7 @@ KVM :=3D ../../../../virt/kvm KVM_DEV_NAME =3D kvm_arm64 KVM_DEV_MINOR =3D MISC_DYNAMIC_MINOR +KVM_CHECK_EXPORT_DIRS ?=3D $(srctree)/virt/kvm $(srctree)/arch/s390/kvm/gm= ap $(src) include $(srctree)/virt/kvm/Makefile.kvm include $(srctree)/arch/s390/kvm/gmap/Makefile include $(src)/Makefile.gen @@ -91,3 +92,16 @@ targets +=3D kvm-unnamespaced.o kvm_symbol_list kvm-name= spaced.o endif =20 obj-$(CONFIG_KVM) +=3D kvm-arm64.o + +# Fail the build if there is unexpected EXPORT_SYMBOL_GPL (or EXPORT_SYMBO= L) +# usage in arm64 KVM code. A symbol may only use EXPORT_SYMBOL_GPL if it is +# defined in exactly one of the two s390 KVM modules (kvm or kvm_arm64). A +# symbol defined in both would cause a conflict during linking if builtin = is +# selected. Catch the issue early. + +# This "symbol" is not exported by arm on s390 but still in the source cod= e and the +# export check scans unexpanded source code. +kvm_exports_allowed :=3D kvm_file_to_kvm_fn + +$(eval $(call kvm_check_exports,EXPORT_SYMBOL_GPL)) +$(eval $(call kvm_check_exports,EXPORT_SYMBOL)) diff --git a/arch/s390/kvm/s390/Makefile b/arch/s390/kvm/s390/Makefile index b91334db90a2..5d6eb45d3037 100644 --- a/arch/s390/kvm/s390/Makefile +++ b/arch/s390/kvm/s390/Makefile @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 =20 KVM :=3D ../../../../virt/kvm +KVM_CHECK_EXPORT_DIRS ?=3D $(srctree)/virt/kvm $(srctree)/arch/$(ARCH)/kvm= /gmap $(src) include $(srctree)/virt/kvm/Makefile.kvm include $(srctree)/arch/s390/kvm/gmap/Makefile =20 @@ -12,3 +13,18 @@ kvm-y +=3D $(gmap-y) =20 kvm-$(CONFIG_VFIO_PCI_ZDEV_KVM) +=3D pci.o obj-$(CONFIG_KVM) +=3D kvm.o + +# Fail the build if there is unexpected EXPORT_SYMBOL_GPL (or EXPORT_SYMBO= L) +# usage in s390 KVM code. A symbol may only use EXPORT_SYMBOL_GPL if it is +# defined in exactly one of the two s390 KVM modules (kvm or kvm_arm64). A +# symbol defined in both would cause a conflict during linking if builtin = is +# selected. Catch the issue early. +kvm_exports_allowed :=3D kvm_s390_pv_cpu_is_protected \ + kvm_arch_crypto_set_masks \ + kvm_arch_crypto_clear_masks \ + kvm_s390_gisc_register \ + kvm_s390_gisc_unregister \ + kvm_file_to_kvm_fn + +$(eval $(call kvm_check_exports,EXPORT_SYMBOL_GPL)) +$(eval $(call kvm_check_exports,EXPORT_SYMBOL)) diff --git a/arch/s390/kvm/s390/pv.c b/arch/s390/kvm/s390/pv.c index b18abd0e29ef..1fec224e4d2b 100644 --- a/arch/s390/kvm/s390/pv.c +++ b/arch/s390/kvm/s390/pv.c @@ -29,7 +29,6 @@ bool kvm_s390_pv_is_protected(struct kvm *kvm) lockdep_assert_held(&kvm->lock); return !!kvm_s390_pv_get_handle(kvm); } -EXPORT_SYMBOL_GPL(kvm_s390_pv_is_protected); =20 bool kvm_s390_pv_cpu_is_protected(struct kvm_vcpu *vcpu) { --=20 2.53.0