From nobody Sat Sep 26 14:38:30 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 CF087375F80; Mon, 31 Aug 2026 14:48:32 +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=1788187716; cv=none; b=pEcxK0Gu2kTPRj/yhOUCZA1fLq79gpLZCV92DuknfgmFM3UsD1r0kiMJzFgV1X4u3cJH40oBSbwQ/QR/xX9q18jkhdzY2wAfw6Xf2Uu5H8K0Ghzs75v67i2ZJURDr7ZhQeHaTLSE42gwBHnd3ra8nAxFLy57yhZZegKvGAHQVbY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788187716; c=relaxed/simple; bh=26gziGi2HwmdVjE4u72mW6p0XNm/qrTyjMenzyhGxDk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=P8H+x31GWCfHB6TDcmh5d/489wGAXHKhwYmWQDoQGX4q8rM8IzUbpPNgjB0iOucKZYqUbVBau/0ZEJORehufzLgkrSoyKXb6hUcjDcSGDSMdjqhcWrboR6rO6Puh3XRyOm44j3+aBAqh0xSfqsEYPCLrvAqk8YSKl05gl8kqME8= 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=qeqsiQm2; 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="qeqsiQm2" 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 67VEZBOF1398288; Mon, 31 Aug 2026 14:48:09 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pp1; bh=7kaI+/ UPeDpXa5Qci0g2WEyi5wxbt+xukphIht2Cyqk=; b=qeqsiQm2MnrroSczHORote /gs0e9Kyc29tvSatf3pJeD5p+VhwUf+sM32z8+BEnQAPtMVpcEA6hVM7uML00eCo i8oTMXB52LY9GmC+yOpgPeCds4gQPKHoOVQ01bsG7nq5iJLkrXhAbSW65osLkV5H 8Ujw38wxIkjEyeqtT5f7tpiQOajNLPaWxPyOX19Xj7GBim7HPoqemsIsxGoIwsN5 ClwWa5GPwTwc7k44UfhWgqPlMGxllsqxsk/uxk7ZpoFtYuLarKjrVaX8OlopSt7p P9K3OWpMm959dP5tQDVCFo3qBjau1UNt3Sh+/h22yez2FIlbjHA/luyw8+oF/0bg == 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 4gbnudhyrq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:08 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfbQD015523; Mon, 31 Aug 2026 14:48:07 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gc9rq6m63-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:07 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEm3Is43188718 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:03 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A4A7020043; Mon, 31 Aug 2026 14:48:03 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2FE082004F; Mon, 31 Aug 2026 14:48:03 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48:03 +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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 01/23] vfio: Use file-based reference counting for KVM Date: Mon, 31 Aug 2026 16:47:38 +0200 Message-ID: <20260831144802.834315-2-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Reinject: loops=2 maxloops=12 X-Proofpoint-GUID: grjCtHBEg3MoNxpQpoi92VvbIRSBtAbZ X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfXziSPzJVeJWat Zudf8a1OU4z9vSKbQH2cyvFiHIKqqWifNLuePh+ZVKk0YdUZgcq2743i7mxj4H14uIIqSPfAFRH DhdFO+N4LjpcDCzATxLLKuaixRGpPikWgabROpfnidn0iz7FhirsHbALLC8U6cCvL3v09Hh2R6z 6ppskZPd6KaCVXlM5PcZH8dDKwsqbzIr+vzT4fnicEa9kUuOvmVZ+0+earoMVZ18R8c7l1pr7kV d+qQrCf4aPOxaV8knURHRPjt4/9f6CXfoMbytNTG4IWHHVD4rFCcSyeSb/yiEhrik0eh/lk4/Mu AwmRpf3RaVhMwg8shU4IQx8+rwYoPSeqduXnPdBIQ0ODjffoJgLVrJRCtVYsBQSXeGeAtd5o2YW Ethp8GjCtsQROuib+8AS7G5OO+faqy+BUOnd+XH11P0vakb/xQcXhYAkqxKQVyItp7RJxgr1aYF BaPNwNlqPa025ZTHCdQ== X-Proofpoint-ORIG-GUID: Eeush9WWXkx4w75GgqXJx8Uzs6k8IDcQ X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX/IVBGuAyAvXE yZ/2SZUYCbKc1ZPZE8zf1UWIXioD2oPdQPtSYUt8vQOTlvELprsBh2sAUmIMCnQqh7JUuvAIGx1 a9MQNH0p09cwx4C3M08n2RhIngxZ83k= X-Authority-Analysis: v=2.4 cv=B92JFutM c=1 sm=1 tr=0 ts=6a959428 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=Ikd4Dj_1AAAA:8 a=1XWaLZrsAAAA:8 a=VnNF1IyMAAAA:8 a=cFm4mksYcdg9GKIP9xkA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA: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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 spamscore=0 clxscore=1015 suspectscore=0 phishscore=0 lowpriorityscore=0 bulkscore=0 priorityscore=1501 impostorscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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. Remove the put_kvm field in struct vfio_device as is it no longer used. Pass struct file pointers instead of struct kvm pointers throughout the VFIO-KVM interface. This leverages the kernel's existing file reference counting mechanism via get_file()/get_file_active() and fput(), eliminating the need for manual module reference tracking. The file->private_data field provides access to the underlying struct kvm when needed. group->kvm and df->kvm hold a reference of their own, taken when the pointer is stored and dropped when it is overwritten or cleared. They have to: the kvm-vfio device fd holds a VM reference of its own, so the VM file can be closed and released while the kvm-vfio device is still alive and still pointing at it. filp_cachep is SLAB_TYPESAFE_BY_RCU, so a stale pointer left in those slots could be made to reference a recycled, unrelated file. kvm->file itself carries no reference, so that it does not pin the VM. It is only ever read with get_file_active(), which is safe because kvm_vm_release() clears it, i.e. before the struct file is freed. This simplifies the code and removes all remaining externally exported symbols for KVM, paving the path for a second concurrent KVM module. 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/Makefile | 5 +-- arch/x86/kvm/mmu/page_track.c | 20 ++++++---- 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 | 10 ++--- drivers/vfio/vfio_main.c | 57 +++++++++------------------ include/linux/kvm_host.h | 8 ++++ include/linux/vfio.h | 5 +-- virt/kvm/kvm_main.c | 20 ++++++++-- virt/kvm/vfio.c | 13 ++++-- 12 files changed, 107 insertions(+), 78 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/Makefile b/arch/x86/kvm/Makefile index 0474604ab8a1..96f89d6f7e6a 100644 --- a/arch/x86/kvm/Makefile +++ b/arch/x86/kvm/Makefile @@ -60,10 +60,7 @@ exports_grep_trailer :=3D --include=3D'*.[ch]' -nrw $(sr= ctree)/virt/kvm $(srctree)/a 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_get_kvm \ - -e kvm_get_kvm_safe \ - -e kvm_put_kvm + -e kvm_write_track_remove_gfn =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/arch/x86/kvm/mmu/page_track.c b/arch/x86/kvm/mmu/page_track.c index 7e8195a311bb..98f133e4f0b3 100644 --- a/arch/x86/kvm/mmu/page_track.c +++ b/arch/x86/kvm/mmu/page_track.c @@ -237,10 +237,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(file); int r; =20 if (!kvm || kvm->mm !=3D current->mm) @@ -252,7 +253,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 +268,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(file); =20 head =3D &kvm->arch.track_notifier_head; =20 @@ -279,7 +281,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 +338,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(file); struct kvm_memory_slot *slot; int idx; =20 @@ -366,11 +369,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(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..f160e1945fbc 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 kvm_file->private_data; + 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..3dc302062a67 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,8 +196,13 @@ int vfio_pci_zdev_open_device(struct vfio_pci_core_dev= ice *vdev) return 0; =20 ret =3D -ENOENT; + + kvm =3D vdev->vdev.kvm->private_data; + if (!kvm) + return ret; + 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 if (ret) zpci_stop_mediated_recovery(zdev); diff --git a/drivers/vfio/vfio.h b/drivers/vfio/vfio.h index 7728bc99b63d..f76504d707e1 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); @@ -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/kvm_host.h b/include/linux/kvm_host.h index 03bfc92864b6..bfecce1b5955 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -784,6 +784,13 @@ 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. Access via get_file_active(&kvm->fi= le) + * only=E2=80=94safe because cleared in kvm_vm_release() before file free= d. Callers + * storing the result must take their own reference via get_file() + */ + 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) */ @@ -1082,6 +1089,7 @@ 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); +struct kvm *file_to_kvm(struct file *file); 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/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/kvm_main.c b/virt/kvm/kvm_main.c index 65eb26a0520d..34b4c43908b3 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 @@ -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; } @@ -5496,6 +5498,15 @@ bool file_is_kvm(struct file *file) } EXPORT_SYMBOL_FOR_KVM_INTERNAL(file_is_kvm); =20 +struct kvm *file_to_kvm(struct file *file) +{ + if (!file_is_kvm(file)) + return NULL; + + return file->private_data; +} +EXPORT_SYMBOL_FOR_KVM_INTERNAL(file_to_kvm); + static int kvm_dev_ioctl_create_vm(unsigned long type) { char fdname[ITOA_MAX_LEN + 1]; @@ -5527,6 +5538,9 @@ static int kvm_dev_ioctl_create_vm(unsigned long type) * cases it will be called by the final fput(file) and will take * care of doing kvm_put_kvm(kvm). */ + + kvm->file =3D file; + kvm_uevent_notify_change(KVM_EVENT_CREATE_VM, kvm); =20 fd_install(fd, file); 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 Sat Sep 26 14:38:30 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 C053639936E; Mon, 31 Aug 2026 14:53:33 +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=1788188015; cv=none; b=iAkvQ0lvPkl2Yyl3H04mMkAZWX5jEbl9Juk464z9N2f3/3uvaH9taqNcxB5UI1jhx473gf7d83XEXJeCDdvacSu24F3+r48HJ363J21Cy8reiXLembvtxSrEG+DJctuN+fee+68EXA2bc3qMh85SBpq7o9DaJvOPC1SXjg22E2E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788188015; c=relaxed/simple; bh=75h27E2GFq2pGEuURQaDXGwk6WX7k2Ho3Xa6aJm+ZNs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=E0gRQWtfbkgWhidso3U/0K/D1GDBPJiZs2YnwakmESPMe2xTLL1RgPHo34e6/kFCtzdD7p1S+nrMA57NY/56d7pMEbX1AGT5SJszMHh/P8TyZt4W1Gu7GhWbEIoC+neXfbwLnbq+7U/ahe/bm470nEY37wTYOMhgKX8C7txq6Y0= 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=iA7xIH89; 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="iA7xIH89" 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 67VEZFre2415072; Mon, 31 Aug 2026 14:48:10 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=MciimgfRQy+dNXl2h v/jOjY0mlqh6s0MBTSE9WarVjg=; b=iA7xIH89SScWnNr+dm9W8maLuYAWNGfDc 3O2yLZwB8BuFA648W9YucAWVfyPKP9J/pWRUUMEE7tNIxOma51GazyvXFQzaNeXO 7+Yz41AwnS+2Ds1F7sipQXsIHAqra0lm9zlG6QnR3ls+LQAJbrDM9v+bz/B/0R1g W79ScK/dkHiDpr4NkfphgJLuifmfVYUKJthAulDYqsa6J2CTtdBnWQVXZxdXY+E7 kjRG5tX/Jt2j27WDXsqFYHedNzHtH/m7KOJZuOpa87Q4phBnrA2zdlkKEU9f9v7j zlJiY6WZ2djUmsBoykAGomkxh/kdFRStJAYmXax4NaFeQoqcNGCJA== 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 4gbmuhj4qv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:09 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfk9e017006; Mon, 31 Aug 2026 14:48:08 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gcb8h6cja-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:08 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay02.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEm4u349938908 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:04 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 19CFD20043; Mon, 31 Aug 2026 14:48:04 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AB1E02004B; Mon, 31 Aug 2026 14:48:03 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48:03 +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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 02/23] KVM: Make device name configurable Date: Mon, 31 Aug 2026 16:47:39 +0200 Message-ID: <20260831144802.834315-3-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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: zpotYHMueYHFGubXaUIHPDiOC7l6lDzE X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX5GLMaBLxW+pA bvPwDgZruDKbdCiSSO7YYAjDW+6AdYqdfJJ2xhp6sEAV7mVks/yZhKvOnTlf7TnzIP1IA6Lyxwj 8g1VMEQEzOcQU7oazIDhk8BOWqIcXVZBFHcY9c/uyJZyC+hPmmSnKJZUiO9MH6YISfBZrO0OtrH CdHPZxc+yrnkrqvIkrbHh3isuSnKSW8bnns6CQMeanC6nOWlP21R3E3LKCAGv0TNNuqRcxWGjqv N+IdSPzQKOSln2/afuoXgAGsLwI4ZltxLYZY3SiXPPXABuizFmAUnbeIOGARaM16twutsNf/UYK VmMTgl+l79LT2MOESqGGUI93TaONswwrPyEkMqvro/fMqXd+U/dqMZhOF+JafOJFftCXm0hNyJ/ jKbsnfIvcjKU+3dPHjFxJFCZRRvZg0VI7XclfhmFluA8BNsY9EfbCYUIFw/j/TFeXvUaDQUdPLe c1QvyozmoUeDAAt4z3w== X-Authority-Analysis: v=2.4 cv=Osl/DS/t c=1 sm=1 tr=0 ts=6a959429 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VnNF1IyMAAAA:8 a=unCO0wLouRnWOUCqr6wA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX2CbcRsElhazX wTwq83xHKJWHfpMvWULuBwajM8STYNyy15Smr9F/hM+y8zS6zjuva7Ydb9ml/jnfVnTqeexooAq hzh2al+gC13EkYpqf71QG/LodfsVM6c= X-Proofpoint-ORIG-GUID: ThPWlD9sCPR0zB_LX2qX7O2uKsuQng9N 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 malwarescore=0 suspectscore=0 bulkscore=0 lowpriorityscore=0 adultscore=0 impostorscore=0 phishscore=0 clxscore=1015 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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. Co-developed-by: Nina Schoetterl-Glausch Signed-off-by: Nina Schoetterl-Glausch Signed-off-by: Steffen Eiden --- include/linux/kvm_host.h | 4 +++- virt/kvm/async_pf.c | 13 +++++++++++-- virt/kvm/async_pf.h | 4 ++-- virt/kvm/kvm_main.c | 42 ++++++++++++++++++++++++++++++---------- 4 files changed, 48 insertions(+), 15 deletions(-) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index bfecce1b5955..ec294e419762 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -1082,7 +1082,9 @@ static inline void kvm_irqfd_exit(void) { } #endif -int kvm_init(unsigned vcpu_size, unsigned vcpu_align, struct module *modul= e); +int kvm_init(unsigned int vcpu_size, unsigned int vcpu_align, struct modul= e *module); +int kvm_init_with_dev(unsigned int vcpu_size, unsigned int vcpu_align, + struct module *module, const char *dev_name, int minor); void kvm_exit(void); =20 void kvm_get_kvm(struct kvm *kvm); diff --git a/virt/kvm/async_pf.c b/virt/kvm/async_pf.c index b8aaa96b799b..015761249107 100644 --- a/virt/kvm/async_pf.c +++ b/virt/kvm/async_pf.c @@ -19,9 +19,18 @@ =20 static struct kmem_cache *async_pf_cache; =20 -int kvm_async_pf_init(void) +int kvm_async_pf_init(const char *cache_name) { - async_pf_cache =3D KMEM_CACHE(kvm_async_pf, 0); + char *full_cache_name; + + full_cache_name =3D kasprintf(GFP_KERNEL, "%s_async_pf", cache_name); + if (!full_cache_name) + return -ENOMEM; + + async_pf_cache =3D kmem_cache_create(full_cache_name, + sizeof(struct kvm_async_pf), 0, + SLAB_ACCOUNT, NULL); + kfree(full_cache_name); =20 if (!async_pf_cache) return -ENOMEM; diff --git a/virt/kvm/async_pf.h b/virt/kvm/async_pf.h index 90d1a7d8c6de..4a7b81743248 100644 --- a/virt/kvm/async_pf.h +++ b/virt/kvm/async_pf.h @@ -12,11 +12,11 @@ #define __KVM_ASYNC_PF_H__ =20 #ifdef CONFIG_KVM_ASYNC_PF -int kvm_async_pf_init(void); +int kvm_async_pf_init(const char *cache_name); void kvm_async_pf_deinit(void); void kvm_async_pf_vcpu_init(struct kvm_vcpu *vcpu); #else -#define kvm_async_pf_init() (0) +#define kvm_async_pf_init(_name) (0) #define kvm_async_pf_deinit() do {} while (0) #define kvm_async_pf_vcpu_init(C) do {} while (0) #endif diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 34b4c43908b3..823b693d89e6 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -5595,9 +5595,7 @@ static struct file_operations kvm_chardev_ops =3D { }; =20 static struct miscdevice kvm_dev =3D { - KVM_MINOR, - "kvm", - &kvm_chardev_ops, + .fops =3D &kvm_chardev_ops, }; =20 #ifdef CONFIG_KVM_GENERIC_HARDWARE_ENABLING @@ -6369,13 +6367,13 @@ static void kvm_uevent_notify_change(unsigned int t= ype, struct kvm *kvm) kfree(env); } =20 -static void kvm_init_debug(void) +static void kvm_init_debug(const char *dev_name) { const struct file_operations *fops; 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(dev_name, NULL); =20 for (i =3D 0; i < kvm_vm_stats_header.num_desc; ++i) { pdesc =3D &kvm_vm_stats_desc[i]; @@ -6511,23 +6509,42 @@ void kvm_unregister_perf_callbacks(void) } #endif =20 -int kvm_init(unsigned vcpu_size, unsigned vcpu_align, struct module *modul= e) +int kvm_init(unsigned int vcpu_size, unsigned int vcpu_align, struct modul= e *module) { + return kvm_init_with_dev(vcpu_size, vcpu_align, module, "kvm", KVM_MINOR); +} + +int kvm_init_with_dev(unsigned int vcpu_size, unsigned int vcpu_align, + struct module *module, const char *dev_name, int minor) +{ + char *cache_name; int r; int cpu; =20 + kvm_dev.minor =3D minor; + kvm_dev.name =3D kstrdup_const(dev_name, GFP_KERNEL); + if (!kvm_dev.name) + return -ENOMEM; + /* A kmem cache lets us meet the alignment requirements of fx_save. */ if (!vcpu_align) vcpu_align =3D __alignof__(struct kvm_vcpu); + + r =3D -ENOMEM; + cache_name =3D kasprintf(GFP_KERNEL, "%s_vcpu", dev_name); + if (!cache_name) + goto err_dev_name; kvm_vcpu_cache =3D - kmem_cache_create_usercopy("kvm_vcpu", vcpu_size, vcpu_align, + kmem_cache_create_usercopy(cache_name, vcpu_size, vcpu_align, SLAB_ACCOUNT, offsetof(struct kvm_vcpu, arch), offsetofend(struct kvm_vcpu, stats_id) - offsetof(struct kvm_vcpu, arch), NULL); + kfree(cache_name); + if (!kvm_vcpu_cache) - return -ENOMEM; + goto err_dev_name; =20 for_each_possible_cpu(cpu) { if (!alloc_cpumask_var_node(&per_cpu(cpu_kick_mask, cpu), @@ -6541,7 +6558,7 @@ int kvm_init(unsigned vcpu_size, unsigned vcpu_align,= struct module *module) if (r) goto err_irqfd; =20 - r =3D kvm_async_pf_init(); + r =3D kvm_async_pf_init(dev_name); if (r) goto err_async_pf; =20 @@ -6553,7 +6570,7 @@ int kvm_init(unsigned vcpu_size, unsigned vcpu_align,= struct module *module) kvm_preempt_ops.sched_in =3D kvm_sched_in; kvm_preempt_ops.sched_out =3D kvm_sched_out; =20 - kvm_init_debug(); + kvm_init_debug(kvm_dev.name); =20 r =3D kvm_vfio_ops_init(); if (WARN_ON_ONCE(r)) @@ -6595,6 +6612,8 @@ int kvm_init(unsigned vcpu_size, unsigned vcpu_align,= struct module *module) for_each_possible_cpu(cpu) free_cpumask_var(per_cpu(cpu_kick_mask, cpu)); kmem_cache_destroy(kvm_vcpu_cache); +err_dev_name: + kfree_const(kvm_dev.name); return r; } EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_init); @@ -6620,5 +6639,8 @@ void kvm_exit(void) kvm_vfio_ops_exit(); kvm_async_pf_deinit(); kvm_irqfd_exit(); + + kfree_const(kvm_dev.name); + kvm_dev.name =3D NULL; } EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_exit); --=20 2.53.0 From nobody Sat Sep 26 14:38:30 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 3EDB637646C; Mon, 31 Aug 2026 14:48:33 +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=1788187715; cv=none; b=foq8Vrgr3XMTWRy2+xj+O2CcovPRSFdPAlB9IpYa7bAOrLR20EFU5nt2cvJECECjhKHZHzsJzCwTAS4DKWaIN+0ZqZ2imzyPL7l+KHo5srE/rO28UUESCpB7U6YXY8dhI19fKcXInNHIs380WCgFpArZi582bk9gltpYEKhafVc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788187715; c=relaxed/simple; bh=CeH09pt7vIYul3jPdQFCDPibyk3JwItNfJmX1KxMLRA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LUYbWms6I9HUpM13gZ+zk4s0ZvqFiBQ5pemCtkb+qlqibyRBNLmxC2G5TthjQEGpKTUNKpa98gzd9WeDipDTkvxh6qJL6gd5GM/Ce0x0P56eHXOA0nG7tOCL2vYnJWjI/JDV//1vHQwx43i1vBusYNhnmpt5EcPexMOOS2SCABA= 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=Fmw8/Zgm; 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="Fmw8/Zgm" 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 67VEZ0862525249; Mon, 31 Aug 2026 14:48:10 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=lm81A7q8yUyeyAYX/ W1p02VJiYIZujE9pM4JMcxdrYw=; b=Fmw8/Zgm0hjQ/jjbUirB02oIHKuby/ol9 VYBKs7fj/fdDP7WC5Tk/gU0mP43hBEJ2BcLJDBebtzDYGwtnVsRQ43s4Cc/wJ1aq oSXctwlJl+Wjg/hxj32kWqjt+n/RNNc/HFqQeVNoT/zylezGfuxokdFBQnxxudxk ayu9+kta3SlVwZDMqLHJAwGmRUOTefkzf7cO6oy2usX6WuFG3tNh7QkTNB1fvBSJ Opxe8rPBhZ/N4NmQA7S4/LuFOA3v1J8Ss5ENGgdvyXge0k/PH/KchwK96sgyaSvz W4faU19M0OIfWN0zgwW36YPxvM49yUc96layQyKNFdkI1wgKl0zVQ== 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 4gbq54hyay-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:09 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfdOW000453; Mon, 31 Aug 2026 14:48:08 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gcbyg694q-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:08 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay02.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEm4WG37093718 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:04 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 893B02004B; Mon, 31 Aug 2026 14:48:04 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 204302004E; Mon, 31 Aug 2026 14:48:04 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48:04 +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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 03/23] KVM: Allow KVM implementations to switch off MMIO independent of Kconfig Date: Mon, 31 Aug 2026 16:47:40 +0200 Message-ID: <20260831144802.834315-4-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfXyea0EW5cY30x R49s/wnf8QDs5g7TqQFqng8ArIqTQk3isFN6UaHvz1tEQKd+RH9kHil67Awpz/e9REOfRRDIr9g 6lAJ5uQPWf0KbOK6Z9dPcVsu6YumhLfv5Oplsv7ccgFR+1c/rRX3YOFbezUWiig/hyOhraSalzZ xxsUWFIylv2dyFTucrbowZov3whamCdLUhvhNHpMV6lDU5p4YVooys/P+3jfud/oxHTO/yJqLNJ mRo4Ij4VNCmh7wvkSX7PFBvdj7iUuBYJKGwZZpvioqzCPNMLnfSVTnUJv/IQa9XB2w7tYfBMZY4 hySG8k8ZZbqMWoRMJJITNb+OEdqYSDb7HC/SOq+IlfMlUsvCjWpKfmwx3uzqO2yph99X9Lkx2uZ H81Zsq3pulkJyxGZfYCVerUMC2EnA3UBsn/P7GP2EtuOK8VcOJl+iRsylWet4FIj3y/YJVuyq3r jYPifPWqA5KKlq4g9Og== X-Proofpoint-ORIG-GUID: YiytUqZHHjArbaiFh6H0IRcZUVP0zVLN X-Authority-Analysis: v=2.4 cv=CNgamxrD c=1 sm=1 tr=0 ts=6a959429 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VnNF1IyMAAAA:8 a=-AqJVl6EvvwGbS2dlloA:9 X-Proofpoint-GUID: -RNe0SPTagOhxDtVZBKNWb90rqdgXg6b X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX3oWhY03thxTU dficWllLcdrU8C3uEMdu0kV7weYDkukeDdGX1qheMYqxEcuYlfRpRB3uGpkmHROTnK/k/wyAeG5 0b86hX4m+G3nyt9NP3zbZwTxMuPnhfM= 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 bulkscore=0 suspectscore=0 phishscore=0 lowpriorityscore=0 priorityscore=1501 clxscore=1015 impostorscore=0 adultscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 Content-Type: text/plain; charset="utf-8" Only defining KVM_MMIO is not flexible enough for multi-KVM systems where one KVM implements MMIO but others do not. Solve this by additionally testing for the non-existence of KVM_NO_MMIO before including MMIO code to KVM. Signed-off-by: Steffen Eiden --- virt/kvm/coalesced_mmio.c | 4 ++++ virt/kvm/coalesced_mmio.h | 2 +- virt/kvm/kvm_main.c | 8 ++++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/virt/kvm/coalesced_mmio.c b/virt/kvm/coalesced_mmio.c index 6b1d90161099..8ff9d9a6f47a 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 /* ifndef KVM_NO_MMIO */ diff --git a/virt/kvm/coalesced_mmio.h b/virt/kvm/coalesced_mmio.h index 36f84264ed25..826af421a5be 100644 --- a/virt/kvm/coalesced_mmio.h +++ b/virt/kvm/coalesced_mmio.h @@ -11,7 +11,7 @@ * */ =20 -#ifdef CONFIG_KVM_MMIO +#if defined(CONFIG_KVM_MMIO) && !defined(KVM_NO_MMIO) =20 #include =20 diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 823b693d89e6..7f37d3b5af48 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 +#if defined(CONFIG_KVM_MMIO) && !defined(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 +#if defined(CONFIG_KVM_MMIO) && !defined(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 +#if defined(CONFIG_KVM_MMIO) && !defined(KVM_NO_MMIO) case KVM_REGISTER_COALESCED_MMIO: { struct kvm_coalesced_mmio_zone zone; =20 @@ -5577,7 +5577,7 @@ static long kvm_dev_ioctl(struct file *filp, #ifdef CONFIG_X86 r +=3D PAGE_SIZE; /* pio data page */ #endif -#ifdef CONFIG_KVM_MMIO +#if defined(CONFIG_KVM_MMIO) && !defined(KVM_NO_MMIO) r +=3D PAGE_SIZE; /* coalesced mmio ring page */ #endif break; --=20 2.53.0 From nobody Sat Sep 26 14:38:30 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 74B95373BE0; Mon, 31 Aug 2026 14:48:30 +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=1788187711; cv=none; b=uMtr2JxowGaCvlVrVGxWIGYZIYvKRlxsIv/gkIMZxavXvoWYmA+kp9hoStZxl1AHqiW48Twnyw21ahTmPOAH/Xr0fJCAW1UljqdX9VFoTeR4i7fg8bJ0GZQzRSmVi3gHFtG1cZdEoC/1xZbA4u8Coia8go0TTN7r9K4jpn/fons= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788187711; c=relaxed/simple; bh=y4kyAuseVXdZvFmiHOyd9Ag8SRcIgA5Vfg3SW8qRIWU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=inpJ2Hln+UrIUxdapar4AL5y86KoIw0uQ8/c+kPX2RCA4j2kVPMuVKfFppmrBz9xGSxFu0AuqfO6L2oPi2/XkM35yGPwxpfZB04SdNcKOoDk2y8z/x50ix43ccfnVuoCZiRoweZJiEdHgFxIMtnLnc8zHX0b/aZDuDtYc/1aTgo= 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=K/JrSwj7; 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="K/JrSwj7" 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 67VEZAP6652970; Mon, 31 Aug 2026 14:48:10 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=K/JrSwj7HU6X+MLLYxBEkD9JL8oe8FD28 YA3s/DjeJm272CTmY6hYMBfRmcvwei7iUOcnkg0OQVUJU+Wa473y84fHCg0YJGp6 JkLhUuNsNG0NgKQ2qlDh+zLNG6djLhI1TQZqfUh7CMaCnEJQMwaBsTafNEbe97QO CC7U+0dm1+OUdaRYoWDqWJJ70/xcoDC7A7VWULrBblZ2OjBx1htVnHz23m84eTzL SNWaax4dQL3fZBL6VXwpcS8RkH5LZWrhF53zhDcJbHj6KW5Atj/P2AEE554hkGCC AJ7J6PEr6PnALNaA52yIHVmbBkuUIMe1TuEuLM4M2QZVCMBr3pOPg== 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 4gbq3r1xu5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:09 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfjHe000540; Mon, 31 Aug 2026 14:48:08 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gcbyg694r-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:08 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEm53w51970354 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:05 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id F279020043; Mon, 31 Aug 2026 14:48:04 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8FBB22004F; Mon, 31 Aug 2026 14:48:04 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48:04 +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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 04/23] arm64: Use proper include variant Date: Mon, 31 Aug 2026 16:47:41 +0200 Message-ID: <20260831144802.834315-5-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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-Authority-Analysis: v=2.4 cv=EIc2FVZC c=1 sm=1 tr=0 ts=6a95942a cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=d3WjOe2bLlXSZPWdUOEA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX/0+Zy+2aqMpF WWNrXdV/If8KIOlcqBy1qx/8vqhpSnztW0OokTSvhkSSAgdwiAxXul1jjtrYyB8o8S4JySa7Nny XU532B5vJHLZ52VyYHFDpebpdWqzqA5OLl14F3lAQHypKOMlcMPFqdwlkdFkdoNB03OSkaERdIq FByhhtkxF5gFgA3WFWo84kevzzPmWhGzkdrqFmMMAXg2/s4Gf+0xxk/dsbjajqmDLdDTYOdvd49 e7wp3nsL1B7AZ8Vexl/ldUp9YnfFXqbWDxkJp0h2yaOLHp571WK523Obm7y9M7WhVivo5+fy4G+ IACPWp/Wmy/bXRELj27FfaIEvH/8BDRhFZ4ihB3SUpC+WWKiImpTX9Mth5cVRUniVXY35i1bw5s wFLtZ4YyL8CTLBIrPnAuEV3qj3TByhbo5JOCeHOpHV21vgyi9eXa0olFaXIyGIEOp1dUAHoyTto fis/zTSsgkEE5/u3L+g== X-Proofpoint-GUID: aoW96-2q4-UH_MP5aZ-1Oje6uUNugt2H X-Proofpoint-ORIG-GUID: RuqSfEEyvLl0yV5nxPurGRu-S4UVoxx6 X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX1Tr4ntBwjwmw Kc+2tgaYaHfm3kvtZ1ZHywwFfZ1SpzzcJ52ZEZe4/B+C7fd0FPKt3BPxzY7if0Tly3xiyGWqQ/r goZ5XVFIuZVDGxBYfnEudGWTxNQglTE= 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 impostorscore=0 suspectscore=0 priorityscore=1501 clxscore=1015 phishscore=0 spamscore=0 adultscore=0 lowpriorityscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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 Sat Sep 26 14:38:30 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 AD5EC3750BC; Mon, 31 Aug 2026 14:48:32 +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=1788187714; cv=none; b=b98L9I2eEhzDNey0hrTPm1SepK3vjVIIcXED6ht0E4FGG5NQwr662USzKF39h82k63H/okCVoF+udTttxufNGM6MZPzvUxZsY68rBJ3RqY/84QDsLyyKJbDnl0WWr4BIxXz38n8flYf6GGsWQC3H5hiVNpxh56NjBv03RLO5c3s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788187714; c=relaxed/simple; bh=FKAS5JM0YtlqsygrtUhVlasxecpfNmansRMVSSV7FM0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sDXLJukJLNwjEdUr8rK+9eXPnowcggdHnSFUYcc9cwQGeC91p0AQesttFvKpUsNDbEVv+7FLNth7y1OyC9ti/orFqwbdbw2wSZI+IQ3LHe1y0mdEsjauDcdVnE9Dd4220c0wHRg8OFFXpY2yjjGQOMvPyxKkLozs8WTcwfbr688= 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=IQuRavFz; 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="IQuRavFz" 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 67VEZB5K1398307; Mon, 31 Aug 2026 14:48:10 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=IQuRavFzrhIkFIM+v1LRPMMBJYLHrSxD7 gbRySdBzdhjAcotrFWG0eZY64U6id3fBgso/8aBryA2f2N4waUtmZ3JcRK2PINUq OqeJ/Q12wvLV4AfodSQdw/yIShX5XAMFuiKSZCklrIcAXnKOgALmrzdFHPISKnuv 3uk+WocXMk3RMgijEOfczU4NbpODmPKA24MvTVmGuOdD3y26P6wSEwb+Se/nmFed bZhyGcXTqNlCS9nFkWVg2Rvo94XbLjQ7czgtsHZhP7e+BbkEKd48WZfVQZyDmSBq NCjfPA0NmoueQ/snpJjTNKlL/QrkbjwN8N6ltboJ3nZIdhCNRH6yA== 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 4gbnudhyrw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:10 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfcCM029530; Mon, 31 Aug 2026 14:48:09 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gccexx7nf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:09 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEm5YJ51970358 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:05 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 66F8420043; Mon, 31 Aug 2026 14:48:05 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0468C2004E; Mon, 31 Aug 2026 14:48:05 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48:04 +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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 05/23] arm64: ptrace: Use constants for compat register numbers Date: Mon, 31 Aug 2026 16:47:42 +0200 Message-ID: <20260831144802.834315-6-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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: N7EzIVXekhao_KlC2qo9hiQmtSOK0s0j X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfXyz1vqdRWVCVy 5yXnwtUxMpyJbMgGvjnyWBlEvutMdPaI/LikW7H62ot0qT4l7wA0mZ51kWpvjymNWPV50OBjmAE 2RJwoB43hKToCKcH/9sXPZOmpt34YUupAXeXNWvSWIqT3JBU9t70mvUdUIx7vR+6wEyG8HIF+zw EBJoDEQydFxZKhKXw5xWT52Qt3ZgVqF+UAyday61AzkBC3eitF2ESirIuBaZyftWRemO6m+AlHd SnhwLbXYZBpvIgTquX4UVgUCMYH7lJBiFz/DUOGzGuH77M6F7VagvZV2M/y7rfalPnEVAzl2VOY 5It9r9S2/pQ0lUrSd0Uy3nQWMNn+8fpp7wGsLD7MGE4/ZefDWsWNKnHAxplo/eH78mU6CxgytiQ bXGxd045ellGSGWfPEouoxvJPzHGYJ4e7dhsUROCsbVGQW1FyGD9HwS//UV4LmTqrbI5UdGHuf+ TpzgtgeyXJuwyFvRQYQ== X-Proofpoint-ORIG-GUID: 4fyJHe-23G76FwA_MKSnAexW_LOErLar X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX1rEhu5mzYrE+ ZNXwWILMiKJTMyDmmde5e0dMQoLXv3L4e+EDaGR1YpmEA7Mq8pBdZbD6bUMxRakuAfTdo0/HdFe HkWNgZtSkCyn5QfAoTWIyyZ3H8qZT8Y= X-Authority-Analysis: v=2.4 cv=B92JFutM c=1 sm=1 tr=0 ts=6a95942a cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h: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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 spamscore=0 clxscore=1015 suspectscore=0 phishscore=0 lowpriorityscore=0 bulkscore=0 priorityscore=1501 impostorscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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 Sat Sep 26 14:38:30 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 E2BF8373BEC; Mon, 31 Aug 2026 14:48:30 +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=1788187712; cv=none; b=cPF4vcZ+tgUO30/UTl2Ao8RaocGJpvEBGui9ncoO0CutMBEonQ1fSGBzhjbuSORxrDk/lqDHdWujKJf6jmeYWZw+hqdUFztFP2OzhHCALA6OOLfaQLpTNZ2PgUIR2AmMtGPUDkeWpWh7oNluNDjM07PrDvnaw3R83SF0y5pR05I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788187712; c=relaxed/simple; bh=2mUB/Zb+wJR8Brxh3hdGKTIWjCCl94nE9bkIKMoxed4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Vl9u1WsHa7pYYpQ8Rtcqy0pTVDuerkjC94GSYlsmgVfIkV0PtEHp7BncFf8m9pDRynNDKF2bKKZ1gKmeOhQBpkKEhs+JTVoJLIIXerUoXWyYje96386RO6yHkcPv2ryxjpNUwOsSu4kScoKjzizxMaKFXvbv+EnHSTvAVlB3NOY= 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=cXKGlmpe; 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="cXKGlmpe" 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 67VEZ7nK2530426; Mon, 31 Aug 2026 14:48:12 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=kXpGqjwL3LJiqnjvi NTG1AYP8Ty1ye94cTF+5lhO3IQ=; b=cXKGlmpeOrB47DkUFSKnkfoNi8+m3tB9n YPfGSLM+TLwZ+BZjht0MehKIVNmKAfV6oCE04RzWMsqueqW+SP1Z2NFRxIrMiSGX p5OzJZ6eiPu9KtmTlaS/bWl75O7oMM9vkPrY5XNhnLJhrx2APejAUwmQBFdLswOe MbFj8NuoPWOI0OxUrOTuTnYWviYN/dmVpUgzl68E9oXnUvBkqA+WnPOVJrzDmFAz QaI9psT3RFQtk3nOBmjbNA0Y5B2tO8IgD10ASBHslNMp7L3FJV/fS+AwDQ+CPBh8 tQlUb+MxDniZwQPZgl4/WFhoCM9svcX3W4jJTHvd5J691MYW8nnKA== 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 4gbpx5a0ca-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:11 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfgVg016964; Mon, 31 Aug 2026 14:48:10 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gcb8h6cjc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:09 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEm5Gq51708206 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:06 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CEB6120043; Mon, 31 Aug 2026 14:48:05 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6D0EF2004B; Mon, 31 Aug 2026 14:48:05 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48:05 +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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 06/23] arm64: sysreg: Convert SPSR_ELx to automatic register generation Date: Mon, 31 Aug 2026 16:47:43 +0200 Message-ID: <20260831144802.834315-7-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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-Authority-Analysis: v=2.4 cv=PPc/P/qC c=1 sm=1 tr=0 ts=6a95942b cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VnNF1IyMAAAA:8 a=qAnUzrOnmDNqMeXR4cMA:9 X-Proofpoint-GUID: 9lZ4dDKGEWl_lnL3Pp7S052-LsVXpeHn X-Proofpoint-ORIG-GUID: ueiIeIa4ZQzrONzuU4KI3jeOZQdNnZP4 X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX5KXfKinaDrEM 527hnzeHlWVWQX/8P3uoPzJvkE/0VpIY7nr/gKYegdBBAG/YGrfKUy9KyNiwsFIxYqtSpjLECgz ofwz7KZkhONBKLwH6FgUhByLjJWD7rw= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX1iDjhFmF3fGC 2vKOZwgCeGQNOWOOqj96gp3Hlcvr4TRD2qsISRwMZAxEPs9Xep79V1AgwuUrI4Uc4By7G/mGbo/ 11AEHoQMMGfRI/0ZIn8fx7CMZzRugIJPi+WC+IkHlCVVHxJ7KBi02Gu7Gg9t/H9B3zzDF57z8VY 6GTUhoIZQnY041Rxw1rCTyNP7R2GQ7Rnk774lXSxB/FYbutJUkNUejHi8amO0KHFQS/SSDNYQAR Sb0ZHV3jGCyu02kD8fX/K85y7RQ+UkQHy/QouKlcW9JpWnrwbWPg//zCoCGAjF8EgGr6y5/5sNQ Gvoc1Y54jgWwoPNhnCrbQfgT9j1vIUFsYjaf3ZZkvFEzLSkq8sVKo+wMIovpyV16ogJ2A6+lI/v JIT8p2S+QvoMeMQKz2i5bn4/HDdwVUjmoKFZMfVG32cr8ihh402pY19+jGJwygrFP7r7eK3vCWU Jtb9zZsaSFPy89BO8Ag== 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 phishscore=0 adultscore=0 suspectscore=0 bulkscore=0 spamscore=0 priorityscore=1501 impostorscore=0 malwarescore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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 94bf065c8ac7..553d3859fb00 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 UNIJ +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 Sat Sep 26 14:38:30 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 C00BE375F62; Mon, 31 Aug 2026 14:48:32 +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=1788187715; cv=none; b=p224CX76/0mPCqpUOYWairOes5coGeQ6tL6soRobFIVakE2M3Jbf3iXQzQoU0qx65y1Md9RFMLOZ0TjFdLhUZSBcftT1NtGbsP6Hi4Qi8m2Hu6AgGf24/3YbBGD7jY+fDsZB46NCk3QLj1CI77mQd7oMRpPRl6GbZecAfsEP6Jo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788187715; c=relaxed/simple; bh=jtNBS71aQXq22ZSUm41WfuY4TEvpWdU1BjK3vcScWok=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Qh3XiaCT9gCaLzDk8wwlrgmw4pAg+Kb3OoZbieXcShmQKJ/QW++/dLBPc8+9Ka6VAgcelqHLjLlpl5lxVIKrEzvK4/dCtd2KbxNGodGEOQxVUuEb7veV4C/QQYB21HkJARrWlo92HVSJiv59DrRRWIyXE11t5lV9fzuLhBuZuI0= 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=KXNeXGg5; 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="KXNeXGg5" 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 67VEZ7Vq2530423; Mon, 31 Aug 2026 14:48:12 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=BrNOBYUqnpKBpk/Nx xO8EZFeU5sJQbQy3wviy6DxLe4=; b=KXNeXGg5w7wdDWtYT/hV+UAm99TFqFoPA +uuL+/ESQ4FemC3otqGZz6c+lpzPlA1XXCVBsXfy1jPhwPQUE0IYYckoY9f4cBms hgzC+r1LMZfY/mSw7Cs3wYWz8JlNtr0QnxDTqR2gbuxxwSGLArPpRIO549BoZe/O 1byww6w1A24P5XGvWzeNSFD8CyuLijT9WamThug7E/Jgi2rf2/9JGhwa/ZkZL7os kFfCyDJw4LrZiDEZji4Dp4zhzbmUxQx4bH+M/u5hjjJ+ZN424Nqh13+cDVWUdTK9 5ojFBZeyEB1k9Sl3aw2bHvDNNusuU9lcM7rkAnwnPtJGiadMHSYzg== 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 4gbpx5a0cc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:11 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfjKE016993; Mon, 31 Aug 2026 14:48:10 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gcb8h6cjg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:10 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEm6f837683630 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:06 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5370E20043; Mon, 31 Aug 2026 14:48:06 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D5D382004E; Mon, 31 Aug 2026 14:48:05 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48:05 +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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 07/23] KVM: arm64: Access elements of vcpu_gp_regs individually Date: Mon, 31 Aug 2026 16:47:44 +0200 Message-ID: <20260831144802.834315-8-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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-Authority-Analysis: v=2.4 cv=PPc/P/qC c=1 sm=1 tr=0 ts=6a95942c cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VnNF1IyMAAAA:8 a=2bnsYzwZQeDic6pRC-MA:9 X-Proofpoint-GUID: P27L6EQ-sKn-qb8yuT1Y6u4CaSBj9tri X-Proofpoint-ORIG-GUID: tbkJqI6-mXtAId9-UDCXoAtx_sy_1-lg X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX9/oToOKnjvID CnYLmhl7b5ndaiD0E6FRk/PdNS4dPfzBR0cfx0ydo/rHZ1a9kUxIJDTlJBy+H8YNN7UVLA+EnjN 0UaRtDvR5WtbT2c73OxaV9A9c23j6Cc= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX6wJMuYTJgroj CxEdAcRAJKh2+yk+VpsJgbzV20hK/np0kjBDTwxGhVzZULlHYqIJKog0p3hfbSATW08Xe4a0laR WNOt2aeDH8L42effuxXNnLBaZmtR6dq0UU+NnP+n/lYq7301ErF+MtdqiSN+2ipvLSr7aVOfXkf /iIGCak5CC1CUX3qsk5hvicHd5nNcszFASDgRzexO1OjbAuzpGuBv2z28M0mtNoCDaTSuGqxiHk BsXsAFbO5IEyp7Ml0zfrv5WUdR60xUcjUJJOvsG5pkLOWN/mhOY5gfctJx0jWMgMRJCZdc2DM8r CHebKesoTjsRrrtAOx5PspEjHBulefbj8wuwl3MhUdQm13uRpDzv8cZxbP5l3jZf3eizkMwVBLK gM18mS8SB4l+dV34zgmV/X+UUTvCefCeEnP7uS66dh3PSYc1mslwD2QUjjInOlMBh7oRaZHlCFi FxrhOhrxjCUpBIKiLXA== 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 phishscore=0 adultscore=0 suspectscore=0 bulkscore=0 spamscore=0 priorityscore=1501 impostorscore=0 malwarescore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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 27fe0cd5b2d7..46c8d7928b3f 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -1158,7 +1158,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 Sat Sep 26 14:38:30 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 7278C372EEC; Mon, 31 Aug 2026 14:48:30 +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=1788187711; cv=none; b=Cb25XhFuaDvfn6TTIIlWw4wqgETWc0Mxmnl51K8xF//0a2uzwCbahzpVKYlX9uJaAuNOqYK4e7TiuU+URwKa6kLuRRkt2PN/g40p8+VsYpw3rkjMP5WAzLwdtdsFpcWpk3EpFz+IIAA9hez4Hw3C6yhKKhXGBcDb2Iqy+p/zRnQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788187711; c=relaxed/simple; bh=fYxVuEPp2zoMzRtiZky5z8P9uLwUlo4R6fWMNGygexA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ATEFM0zn99QcFYQPHB6ZDODoWniYQ+ehFieICZi5ckezZzadepzQ7K/Zi5flTxdLnkv1Ag95yQwIqnAV23GgbmGcpv1MxFwvNd6WvDWwi6BfH0NPfpP9gTPlr/bwrxj3wMuv6HJptQge7xHIZCIOOwizdnnl8j5ZivThTNWhqMU= 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=FcPdOCgI; 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="FcPdOCgI" 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 67VEZSS62415322; Mon, 31 Aug 2026 14:48:12 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=Pue/hbxchQPNeEsdd XL86T3H83khYsyD2h/Nv3W6fyY=; b=FcPdOCgIqIN10eF863oa8StEXgm1d+sRW lXG8EfQyadiLrWpSFO1pqACAuDvKBghfq4Y6GguxG3YSl4yOovGlJVOoJhi91FQm mJhqRQLg73xHyfeoEOoha8jLReMpkrctk4mMLopcQasK2M/ynwxYIFxPMWyFNlD6 HCRTodl9YXmDP6pdMLFaHJHS0xqRWO/stJLmqzxM5ulnaj3TyBJ+3EpD8ywxGXj6 /AuSpwYa11RiDk6x09fAKUIGH5Og5Kc9qwkedpyRPdBPLsO5Dlt+SNnkKuk3zZqI E/C9qLJq+5P6DOc90WbW9Zyn8ONyeuvwUpSOqGGiDPM6G36Qbg9VA== 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 4gbmuhj4r4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:11 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfe7R000458; Mon, 31 Aug 2026 14:48:10 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gcbyg694w-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:10 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEm6hQ37683632 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:06 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id BC95620043; Mon, 31 Aug 2026 14:48:06 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5A30E2004F; Mon, 31 Aug 2026 14:48:06 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48:06 +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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 08/23] KVM: arm64: Use accessor functions for core regs Date: Mon, 31 Aug 2026 16:47:45 +0200 Message-ID: <20260831144802.834315-9-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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: 1zK3oBXbNNxGR2EXxhhHdmdbRgRuFZS2 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX+vcTo7yy7HS4 Wto4QJsDhSX8OAUN9EIgsJxu/MujafoBnkDLA0uBZI40f/hXpLlIHrxIRWjgv5tCt2egyIMFHzd Vm54yGGwlVTV4Q0pQqFUD4vsvG7R3dv57MwFNMESDPPhyYMF5Xa9XegLfMgCtY1r3q7YhqzF8ea ZRdEvL/EBGQvcMZEYkoMe/Ec9A9byei2dT3M6BfPqNMFZJqItNLmHHF/OxRyi0w3ZMewDeaa5g7 pmcYiGoYlJYMQO0jHCVZ/1QeOapzApT7bmPyg4oNS3yUAjo/dFt6yRCTPW0QXyq5jxoVeBLhz88 G0mSdYstMTfZ5jrPhAOWJtRITBntL/XfOZpO0uc8LyqxGy3wApW4uF0Uy9uNNUt5vPdjP3X0V6Q xG4Pa7JSuGttISXjbikmYwEtAKkIaXNFW054VwFt12Ci75ejm8q+pfM7/lr6eJiBZKkMzG12B6L npeckVOv6Lo8cRXigkw== X-Authority-Analysis: v=2.4 cv=Osl/DS/t c=1 sm=1 tr=0 ts=6a95942c cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VnNF1IyMAAAA:8 a=5d8JqmD_1xC0DvqtPZgA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX89usLFrmOumW jYc4JbERmuLag87vfTdIljrGOUbuzOdmuS517AM7aEKj1RxUC67lRfqP5M2lStJyoXZCw/4vcGC JO9hKU7dsljG6ri1DxLFjetMjrrgE0k= X-Proofpoint-ORIG-GUID: O6xM98xvsvzV9BNaSI3gyssBojBLKXcR 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 malwarescore=0 suspectscore=0 bulkscore=0 lowpriorityscore=0 adultscore=0 impostorscore=0 phishscore=0 clxscore=1015 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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. Enable 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 Sat Sep 26 14:38:30 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 D4F2A399CF2; Mon, 31 Aug 2026 14:53:34 +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=1788188016; cv=none; b=r+gBBg9xF0EihKQu6O8i0Wcx/SOzs0mzxxxx5sAdbTnvRi9okPxANHHL4e9NU42OUmdbjjRy7X33abXJPzOBwsNb73wAAgSbyiLmUFOrNFfyPCxk8/R5z4EGC5myJ+kL/G2TF0ovXUV6tbNiL+MbY6i6UQwOiSP7WDk9fjBaWVw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788188016; c=relaxed/simple; bh=SXiPdYGNp4E2OOHewIjU/5VUjuzMufL+cFE2T6b623w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OO2tQQfsuFBlUXh3B1xeXJybdcUURCEBred0NaCVDmgetxxnZ58frTE4iy9sFAkaQOuWFZRaCNsNsFtj/SIWRht1EgCf5mWAneud3/fgrIzmWjwNHiTthX2DXuSl+SFWJoDhyMcn0HzXIy0JkjFcLNEPX0Cp8B3pIxtuv9Y/k4Y= 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=llVe6qlM; 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="llVe6qlM" 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 67VEZ1qK2525384; Mon, 31 Aug 2026 14:48:13 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=XjMZ72QkIAfvl03zE IDDez0RX8+3bwKHuLZI2jFnFpQ=; b=llVe6qlM8K9W6tijf6Yy+pJSK6qmpTbA5 QuErNV03CEDYL2cwGsDlfiBKLPWmW9NLE4V3jCgCHB90gzNUfJf3KvwhA+WUGw1i Lpe6qzbyQCV9U7uljOHHxUFspC+z9OrnQcAdo99Rr51CvGJy1Pj17cinAeldZM+Q JLSBm2wOHpzZ/9Xb7PPgyLuXGglF9XX5ARgUzpSKjkoxAbUU7QK+hdRa1VIFfhKB Fot+g80MNjBCtDap5oRBCFsufqFNcUQZcBQt/QCRjWjValZVJVqsfemJCD0OREqO qp4CE8hF1q4pqWwHhQTwYDo9c3dLECjQ8ijLEt4N9U8Ot0TdqrvlQ== 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 4gbq54hybb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:12 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfgVh016964; Mon, 31 Aug 2026 14:48:11 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gcb8h6cjj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:11 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay07.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEm7vh49807786 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:07 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 399EE2004F; Mon, 31 Aug 2026 14:48:07 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C2A102004E; Mon, 31 Aug 2026 14:48:06 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48:06 +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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 09/23] arm64: Prepare sharing arm64 headers with s390 Date: Mon, 31 Aug 2026 16:47:46 +0200 Message-ID: <20260831144802.834315-10-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX11R8GA3D6GJO tBNdxZkyYO9F+imifcTbrRYR9DvpzyzEVA2mQDaOrazboj43rdoy/HCRe/+NQOLcSkh1QDOLR74 gzIFn04gC1PtQewqAkeaPNnSYzMLq98znqetDVFBVKMf2lT7g2OjoFdU9dA12cigLE1jtRmhsH0 opWF0JCEBsj0mkVuhKiy0FK4+5c6KgYNS5c1IZxzVADXymF96Os6RFOjO/5KkWYUlpgrH2t1psf F2DIfbo4EtH0fDhgs9eejzJ5RmGrLHrlSR50ScwB83sfLO83oh2Ry8/zRBvyrDUUjQU3/Vhi/Zy /MluULgQ20bTBB46WaYpkEH1ELXRI/KfgWopAFvJoikgEmhEjVglPIxe+/f6BHavDqowbQOPbt0 1kZ+/3CL4TMCMBXFmPi2MAYpf8/kCKS92tZ2KAHVs8VIA1+zb4DUn1g1tyRUeDBkOtNdfjbfLHS 6xjCRCcOoSGUC1K/cQA== X-Proofpoint-ORIG-GUID: fgP9tMEL2YHDwYuTD8kpZy8NAA7dQ3LA X-Authority-Analysis: v=2.4 cv=CNgamxrD c=1 sm=1 tr=0 ts=6a95942d cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VnNF1IyMAAAA:8 a=eg9QoaqSYRrbe55da3AA:9 X-Proofpoint-GUID: yB2PL5ZBn7z_pqZpK3UxM_rOeMqpj7zn X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX1ad0jdUV9oGk yKoCgdfbi8c+dpyb0AvV2mChMfMO+ah6bYgNycnNRLb7A3zhjZvg5LF5uhvziMpn1Z0XRm1keJY OtG1EBQGioUIEejv8KTlw8AaiD5TU0A= 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 bulkscore=0 suspectscore=0 phishscore=0 lowpriorityscore=0 priorityscore=1501 clxscore=1015 impostorscore=0 adultscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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 46c8d7928b3f..5261c21a437c 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -56,6 +56,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 @@ -338,35 +378,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 */ @@ -835,13 +846,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 { @@ -1046,6 +1050,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)) /* @@ -1239,14 +1248,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 @@ -1325,6 +1326,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); @@ -1508,11 +1517,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 Sat Sep 26 14:38:30 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 1785C3603D8; Mon, 31 Aug 2026 14:53:33 +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=1788188014; cv=none; b=BVaUGYPi2mfH4C+sYwTc9b64OSAhC8m7PeIQku1Ns14D9CUdMFK7A+vwWFDSBRcyWb20oBJ5tN33LItg1QEQ/fJaGszACY8ZkzKJpfpm7gea9hmpSyPfReWjSTjQZyl3QwzdkIYhdOB52UroVTx4wQSQ5eo2D1zJR7eoIw9uYQY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788188014; c=relaxed/simple; bh=xuszOJjItc1HZMFu1xGbLa3afP99/D1Cgki/3qGLiGM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=izcYALcoMRgTv7Krhg3kiU1BxxeLOU3Rdk5+9EzLMtXr2nS4eOK8IOgfly91JhxECLKjVKYO7S7snmuQqe2x32MT1HZSU+RBzBvVhfQGo6yXWu92HXaFH8cWTu7IzIJXpYvpTxYrs6938Eb+zcsUQ5IfziD9yM8987SQq7lZyC4= 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=Nu74pWgk; 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="Nu74pWgk" 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 67VEZEuf2414993; Mon, 31 Aug 2026 14:48:13 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=GzfG6OHacUUS+/3v3 s120WahVcAG8XJRKZTCvo15A34=; b=Nu74pWgklyyHwNL1OyQnKa6Gt0QW2hR6l IO+8HHB9VWk/vvceBbvXGjzrKrqDQWa9JkrT89Sfpz+Uhga8MSBn04Np6cQ+KNTa fHDgpZMEyi0hmfb862rr4Euqm/eOkc54tFgZntee3KVjkx/AbMwXH8NVpM98pn5Q qeBsSIxilIc/HkTMatrcUSGOiggItWlzs0Q8Fh6VHUgYpcfrD9//54KzrYYQlomu pDUz6oJQGRIUZjNxEMsVL4oNacrojw2DzPZ3/Xxv7KeoQCjQZc2hE1kavHn5k091 2A7tnKJJ4zKt0auiRYWz8K1xxrKqMsJTPAXsZ9OuC0qM8yLbN6y4Q== 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 4gbmuhj4rc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:12 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfj29016988; Mon, 31 Aug 2026 14:48:11 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gcb8h6cjk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:11 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay07.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEm7Qj39190792 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:07 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A8BD62004B; Mon, 31 Aug 2026 14:48:07 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3F0202005A; Mon, 31 Aug 2026 14:48:07 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48:07 +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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 10/23] arm64: Share arm64 headers with s390 Date: Mon, 31 Aug 2026 16:47:47 +0200 Message-ID: <20260831144802.834315-11-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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: ERopwA1YF0xGs7xKgKFIO14XMMCMgeip X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX7FbnQMdLKS1a dbvKxabxMB8BwTa3oyG2L7YqBB/5V9cak7Hbw4hJSoMZuNTTFLLJjzqUv7WQBaQ7rfskeF5Je7l bUQJ+PTYlDmBG7CAtQwmtWb6gaFENdgTEjriSaXXMJXM5Pmw7fUF5KQu8x+lV3bdwCQXC8FfDJ7 NYCsiPS2meEWP5VrgjBroZWsjXAzVeF8CYMhKBtys/VDZJMf70t+BYLn1dRJJ5rrHjL8G4BUAiz bz2a1vNxSMtEF5r+CF9O6sVh1u5FJbQ+70IHnYQlFYu7pEbEszZLr65IOgeafB1UJ8L+2P/MDt4 ygNf66biKWJBYcuEQ8HdnXZHrWYFO+Vy8BuIrkBGlvQyd0AInXig1gAe5rAeCrNzdiZH5klrSTl LLtt22CXCoeoYyRxRURLqy5hBYAv/UdWD+e/DgmeFx67m4SPyVT/Y5kFk1EiOo6+4WDiyJ6tioL 9LhM9skOjicXbABvWxA== X-Authority-Analysis: v=2.4 cv=Osl/DS/t c=1 sm=1 tr=0 ts=6a95942d cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VnNF1IyMAAAA:8 a=7CQSdrXTAAAA:8 a=EmdgIBuBJ6aLKJQMbmsA:9 a=a-qgeE7W1pNrGK8U0ZQC:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX66hc3Jv1S95X ls3//Vod78CRIhPSwRX8mz1KARtAtkrBHanTYGcycBNEwk+9waoDSXGIKaYBxYbKnuU6khvC6Gy nSsrSuD9dCySqYIJwiNDU96BuVm8y10= X-Proofpoint-ORIG-GUID: -6D8BOHyqU9hK1QvXDyCmFEuG_amZZMH 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 malwarescore=0 suspectscore=0 bulkscore=0 lowpriorityscore=0 adultscore=0 impostorscore=0 phishscore=0 clxscore=1015 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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 5261c21a437c..a8ddce3921b8 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -39,6 +39,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 @@ -96,6 +97,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 @@ -955,6 +958,7 @@ struct kvm_vcpu_arch { pid_t pid; }; =20 +#ifdef ARM64_S390_COMMON /* * Each 'flag' is composed of a comma-separated triplet: * @@ -1113,6 +1117,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) \ @@ -1326,6 +1332,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); @@ -1341,6 +1348,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 @@ -1533,11 +1542,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 Sat Sep 26 14:38:30 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 3EC8C37646A; Mon, 31 Aug 2026 14:48:33 +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=1788187715; cv=none; b=BKAnJHRT1X0ArupCfTcV8LGXcvUTqS6nT4VzQSb45VpZaHF1cy2UMNbHkXMWAd8f/TBQRYFj+MMaiN2vT8dW1fbG2a7wJM/8pwAQU2vFkZsPtXOu15GJWENxQhHWP1gI0ib0q/UMvheiQD2eickjUwAWO5dSSkve2OpMpvNrHmE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788187715; c=relaxed/simple; bh=Xvt3Ljt9jL7N5UVabIN180L9H2XDFIejYGSN9SEOO+E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ri4BPquhT+Wr4jnf1MqazInwOLKAhvD6EgrXrqcHyhVx4BcDuO9BpZg4o4soSmTwSfxkGeocn02Bx7GFvhnbI4p0y/88+6ie8wkdjsGMq7PeGkZntGYBDFTNUVX/eMcjxRi9aG91Siz7/9+pNBLLtcKTbfG6GhQ7E11yYupL8wI= 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=X7+EHAWH; 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="X7+EHAWH" 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 67VEZAe8652869; Mon, 31 Aug 2026 14:48:13 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=UZikNadauoJ9WUsbk MAriJySa5d+g40856nDw8OS+c4=; b=X7+EHAWHji5/EhPiMTtHk8EdMCNL1jAf/ E9Eu0aTFDgUBXngV401da58lZm+zpnXprukHp8k+LHcj9y6+xntFzcBy1VKBtVmI EVX0ftuH3SMM74XHNJ7/cGThstAUgrV/M4idUD5YyWIdnDOjh9dGGCaJxbFwzpaW /YbHpO490zYTcz9w/yPbNZ4BYaTQFDjNYQCirNuNgoF1VkV43R8cuqu+X2KhFjIT 7is3s64wiJgCxN2jZ+SJhVHWTMO3L+FbupeqdRRFQnu6OXIyxH8JTM5+dCwxLcQ+ sEuTGLuDaBJKw1U6pEarDZvjUkNhyTXve3XBMSaSqdUHHrJJbm5qQ== 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 4gbq3r1xum-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:12 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfjHg000540; Mon, 31 Aug 2026 14:48:11 GMT Received: from smtprelay03.fra02v.mail.ibm.com ([9.218.2.224]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gcbyg6951-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:11 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay03.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEm87N31457760 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:08 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1D57D2004B; Mon, 31 Aug 2026 14:48:08 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AF4142004E; Mon, 31 Aug 2026 14:48:07 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48:07 +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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 11/23] KVM: arm64: Share arm64 code with s390 Date: Mon, 31 Aug 2026 16:47:48 +0200 Message-ID: <20260831144802.834315-12-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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-Authority-Analysis: v=2.4 cv=EIc2FVZC c=1 sm=1 tr=0 ts=6a95942d cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VnNF1IyMAAAA:8 a=DWVxlzv4wnVo_M8M_fcA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX6g8tYiv86ftf fRfunSgcjYJYGkb1CCTMEAcBSZCD1gxADpZ70aTSZWiUpWAT/IP+609Geqg2P6UKv5vmH8FdERS kCb3Adup9kgHRlbC8UY6UJOEjS0oC1Bs2euLbX1KGpecgSXyfDuh9KWUtVlwiwiiVyv/mGKrU08 SHplyt9B246p0YwZuthJRz0cCIkhZ2ATZ1zPjw4o1ss9/kIlkhX0hod1W6y9CR7X6CKCBKFvQBa 6mIPhRqUQn/K9WKJ7qv50jAYyp+7zePnBt+s6HDb/r1GpIExfzcA3kdz5cfAC6eDuYVWvrDKBKj YlurtmHCjpPkdfPkVK4xw6redbxevqRDy3XeNtLQvd4RnUHZ3kZLmjbU4oKvUfxMJ9IoHuFtRk1 3CKrGvotGtxnJvDUAttBhTBwH8+ihPWE92dnRYeoNt+0sk9Nrm+LXQakRkvQugjf2dCDbPccq0+ GMPWfzHdNigRtWHsHew== X-Proofpoint-GUID: KAmFnX8TjvRoUndHcphTjmCsW6Yi2BQC X-Proofpoint-ORIG-GUID: QD8NKJDr-4RNY0Te8IFffMLkImZwLa0D X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX0ETVpFJLh1hN 5FaTMhtrWAmvi9wKp7OE2KYHSKdjA+9tEke3ZmussGwyqmkiaZ45GHFizmaGGD7sA+lff3jqT+q lMaceJk3l2kppb8bdB4aETEIC4Eeh44= 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 impostorscore=0 suspectscore=0 priorityscore=1501 clxscore=1015 phishscore=0 spamscore=0 adultscore=0 lowpriorityscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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/handle_exit.c | 6 ++++++ arch/arm64/kvm/mmio.c | 2 ++ 4 files changed, 17 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/handle_exit.c b/arch/arm64/kvm/handle_exit.c index db37678dcb05..6e59a7b12d40 100644 --- a/arch/arm64/kvm/handle_exit.c +++ b/arch/arm64/kvm/handle_exit.c @@ -213,6 +213,7 @@ static int kvm_handle_guest_debug(struct kvm_vcpu *vcpu) return 0; } =20 +#ifdef ARM64_S390_COMMON static int kvm_handle_unknown_ec(struct kvm_vcpu *vcpu) { u64 esr =3D kvm_vcpu_get_esr(vcpu); @@ -224,6 +225,8 @@ static int kvm_handle_unknown_ec(struct kvm_vcpu *vcpu) return 1; } =20 +#endif /* ARM64_S390_COMMON */ + /* * Guest access to SVE registers should be routed to this handler only * when the system doesn't support SVE. @@ -404,6 +407,7 @@ static exit_handle_fn arm_exit_handlers[] =3D { [ESR_ELx_EC_GCS] =3D kvm_handle_gcs, }; =20 +#ifdef ARM64_S390_COMMON static exit_handle_fn kvm_get_exit_handler(struct kvm_vcpu *vcpu) { u64 esr =3D kvm_vcpu_get_esr(vcpu); @@ -439,6 +443,8 @@ static int handle_trap_exceptions(struct kvm_vcpu *vcpu) return handled; } =20 +#endif /* ARM64_S390_COMMON */ + /* * Return > 0 to return to guest, < 0 on error, 0 (and set exit_reason) on * proper exit to userspace. 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 Sat Sep 26 14:38:30 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 ABF9937DAD0; Mon, 31 Aug 2026 14:48:39 +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=1788187722; cv=none; b=hswPonceFmTfqBBVO1NHh8rKHEAwrwKUxDhITeStnx/24LWUUutlOXMM2u0ZRfK4mrKusa1qpbLjdSVqDXySmM+oY2K8nexYHCS8XlS/1xeuy5yjR08D/FZmxoI2u6UfL4ieZ3Bs2RQmyVbqEmXM8sERGXyhlJ4CQs6otJMPvvY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788187722; c=relaxed/simple; bh=CHXEeyWyRWcNp7YHa2doAj9NXh80V/QBgOHmAYFzQUk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fxupUemSWGCheVYqxm/pq5muh98pBRPhJ7xmhNmo/MnFUfnzO1IxD0eDd0OrjJLLhjYXYwMwomT5OlOXp30DlUF/szW9j3gQa+PcKXzdNAPV8BTMOWNWY35v1wLydYPd0t6FsPRGltE1A71iH+EbLeb6HlmWwXidOZJvHHxF6W4= 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=WvaPDLbn; 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="WvaPDLbn" 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 67VEZ9f02525537; Mon, 31 Aug 2026 14:48:14 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=l4M69OHkEqZ2QH552 1kyUpniC2kMp2JdeYoAJ/ugjjk=; b=WvaPDLbnn1Wy3xlbfRII+cfhXFYUFOXfg 8AVpeeOQlgXsAy+Epf1fmbwaASzzY6Kl9ior18of8yrg1x4a70PtekGH4nyNchIK HZ3ubmnRVH68mdSsMYSRNQ0m5pZAuZDhRN2PicoUztMZ47SeN2khywLO9yk0RO+e oPcclGlOAubBjoE6qpswutNAR+QQDzgV0ZQJGxJ1FxKoSiYlzjokdo7YET7DfW+N Gdzh4Iz0FABQK80powpKIoOCpf4clPpgWlmIc0kEXrPvEW+c36SfzzhU9+y2u0Nf TVr+82e5tEz2jAKIztPRD5ySbd30pvnKlgQqJhcUTjDnq0BJbj6VA== 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 4gbq54hybk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:13 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfgYs016996; Mon, 31 Aug 2026 14:48:12 GMT Received: from smtprelay03.fra02v.mail.ibm.com ([9.218.2.224]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gca4vxhgw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:12 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay03.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEm8Mb31457764 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:08 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8F0702004B; Mon, 31 Aug 2026 14:48:08 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 240CE20043; Mon, 31 Aug 2026 14:48:08 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48: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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 12/23] s390/tools: Use arm64 headers Date: Mon, 31 Aug 2026 16:47:49 +0200 Message-ID: <20260831144802.834315-13-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfXzxTjJXVx8/cD atS2cO9VWwkXw6JTYxy50pygPj1sUOeLZRusdyZHkNET15flRJlwB+UGV50EKwzMoqX+5sIaO+9 cye2kteiD3j4tWtt7TZeEYN9b8G1/Bcil41XOnZDDmtCRw1NTIh5SH1La8+kfe2R+kh+VgzG9aG pRVc4mDeu9xC22BYm2BsUSSqipLfslEGTiSX+TvAo98h5oCtmCKTg6kIqOV8CxJ+NSQ93pVbzah aRnZjTz5O5pmY6xE5Hg9gAkwtjLuukmwe43RWbw7oKzo6iuhNm5peSxPOY5EQjbYYUMgPErT534 iyLMm+WvVFAZqIczXKDv2kscBJ5YCaRhe06nPb5E8dpTJgFuCNUTXCoeOufFY4oekOQVnCmwDJO 9lVi15JQyAa+ddNT+f5S9xKnLJY8qP0h1DrMI+nRdO2A2AWUBe1l0UojvxCWC8hmtDxgCxp+WPJ s6Y7kq/nWAsQPOBufMA== X-Proofpoint-ORIG-GUID: 8x9vAQWluUX6HExLj30BW4NHCZqxL6M2 X-Authority-Analysis: v=2.4 cv=CNgamxrD c=1 sm=1 tr=0 ts=6a95942e cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VnNF1IyMAAAA:8 a=ZhoKsAT7EqIUtuKD8d0A:9 X-Proofpoint-GUID: MdU_BO0Ic32ZSptjrc6LnmXMDiocKjEk X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX1+rPY+kSI0oj SfFqLiknubMlz2yqXzg5TgxIV1sMspvka+TV/n2XnAueKPg9t5KrwbbBgdbILeDoFVI3IXFgbNO aa1PYtTKm/MWt/jZjqREUXXCxi+P258= 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 bulkscore=0 suspectscore=0 phishscore=0 lowpriorityscore=0 priorityscore=1501 clxscore=1015 impostorscore=0 adultscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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 (the not yet existing) CONFIG_KVM_ARM64. 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 | 72 ++++++++++++++++++++++++++++ 4 files changed, 183 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..b19e8bbfbf5f 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_S390_ARM64) +=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. +#TODO verification script or c file for arm to verify the ifdef things kee= p working +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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 13/23] KVM: s390: Use arm64 code Date: Mon, 31 Aug 2026 16:47:50 +0200 Message-ID: <20260831144802.834315-14-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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-Authority-Analysis: v=2.4 cv=bc1bluPB c=1 sm=1 tr=0 ts=6a95942e cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VnNF1IyMAAAA:8 a=x1b9RNJZmR4nZInT6RoA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX+j6iD69HI84S 4u45reHGT9PVDIHRmoTulFTdIsTSS0Fsm2vPP7W4hzMvB4uj9vPHqnFL0BNKbNShziXtfuocBlL Aqt54tNlxz4LMu5f1BTt028qepKn1Sk= X-Proofpoint-ORIG-GUID: 6rw_PrP8qaW0qAdBYcCHTi3CgosDnQh9 X-Proofpoint-GUID: 1QdcAan5lJduifdpptSbzUojg8jeTdg2 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX8Vuw6NpOjrPi ok8mlu0x0XaUPpqUBMDv3Dim86kuMGKwMRIcTDbtYxwMS7xKV71wpZ7TjBeQ3nnKHZcKLdDXRy5 bv6GhhCm0KjvnLI5tgU3c0g909Vs8lRc6VCPLIlpbXmpUojm6VDGC+gomqQWCzN16Piw3VYXgFK mcPnt8viLMvP9A7n/IJXwcVZUJ+dPfNosv3L+kDhPOhi3MWsrzJJUnOa5NZQrpsMZa8CfGqaNvU 19ivnaibRRt3sPPJIMTmMAxD6cskqHf+3aHPeINkuf5SyIHdlA2yGZw1oVRgQ6A5NsFLCEDNUMM 35yR3ksOM4D1AuRlQi24XvEL6Zv4Q//E4bPFR0LO1J2pTUuBslKbUqvte0jCfuSrl9NgtiuyuQc X2b4GN7Qh9gnM+jwpM4V7moM7ZVAG/GqG3rnH1W95NIh9o0Z6zyc1NlZWb4bljlmjAfu1uDmio2 M8evNXcJtsndX47mJtw== 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 suspectscore=0 adultscore=0 malwarescore=0 spamscore=0 lowpriorityscore=0 phishscore=0 clxscore=1015 priorityscore=1501 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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 | 27 +++++++++++ arch/s390/kvm/arm64/copy-arm64c.awk | 72 +++++++++++++++++++++++++++++ 3 files changed, 101 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..6ac7602b57cb --- /dev/null +++ b/arch/s390/kvm/arm64/Makefile.gen @@ -0,0 +1,27 @@ +# 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 \ + handle_exit.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..20bd73c52ec4 --- /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: share-arm64-cfile.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) { exit 1 } + copying =3D found_marker =3D 1 + next +} + +$0 ~ end_pattern { + if (!copying) { exit 1 } + 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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 14/23] KVM: s390: Prepare KVM/s390 for a second KVM module Date: Mon, 31 Aug 2026 16:47:51 +0200 Message-ID: <20260831144802.834315-15-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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-Authority-Analysis: v=2.4 cv=EIc2FVZC c=1 sm=1 tr=0 ts=6a95942e cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VnNF1IyMAAAA:8 a=m33X-YrdrFVFgJ0cfecA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX3BbrAGFertYJ P9NDlfIhGqvRWkFjQCMLjT2pDEgZiT8JwNFuvfWSeLwB7gi1E6DFVg/P4dyUREP8SZhL0FSlZdY OsiRMU5xwVKqQzn8vThDArsXe0Lz0IkJtvJewKznTv5P4LCiMcc6wYfL28WmIR9BzAg47vrrzwD P2q+cCQorwmN6xXqp8L55l7kZUa/DbMh6BfWIjQDn9EwLpG6JGIpIJ3rjMsecK4yNISSEkBx+cI aNhm0WX1qhjUYZ+CBnmJnRLryCdgh1XgVUCYfmrDiIDSyZgoPK0Ele/t2vcHL60D+yMgxnKTQ1x 4zEYBztcB3WRCt0U5rpph7F6dnFvMSzbV+tL5DIz3I+Qask2HTuu+ZCJ7p3+goLhL3sCCQExaU2 FYLTtdTtVWoWFbURySMut1FhSI4+pAK6tsd6I6D1piP6CNRz8f91j6Pj9wNFu8r20bHv97c4kOK 3uxCo8RORhr+C0PFdmw== X-Proofpoint-GUID: A7e99TjC0FXe58-GIop_ZnTb0VBCrpMC X-Proofpoint-ORIG-GUID: IQ84wxL4bJFlgPBhpxz6T78_KO9pFfYb X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfXxntVxCVh4Zwm NqUF6G51YJZZ+jcsxSjbZFyu+90Y6yLyKtQ9hjtPuZD51MJswq/5bbcIi3V3wv0UsF/fmvVKRWq 4H5YVAYCmL9j/s4v46iQv7HXzaqTtCQ= 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 impostorscore=0 suspectscore=0 priorityscore=1501 clxscore=1015 phishscore=0 spamscore=0 adultscore=0 lowpriorityscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 Content-Type: text/plain; charset="utf-8" The second KVM module will have a different Kconfig set. When both modules are compiled the Kconfig sets get merged and the native s390 KVM needs to implement functionality required by the respective config options. Ensure that s390-KVM will still compile by implementing a stub for kvm_arch_vcpu_run_pid_change if CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE is enabled and defining KVM_NO_MMIO to disable KVM_MMIO. Signed-off-by: Steffen Eiden --- arch/s390/include/asm/kvm_host_s390.h | 1 + arch/s390/kvm/s390/s390.c | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/arch/s390/include/asm/kvm_host_s390.h b/arch/s390/include/asm/= kvm_host_s390.h index cd692f8fb764..207f44cb86d9 100644 --- a/arch/s390/include/asm/kvm_host_s390.h +++ b/arch/s390/include/asm/kvm_host_s390.h @@ -29,6 +29,7 @@ =20 #define KVM_HAVE_MMU_RWLOCK #define KVM_MAX_VCPUS 255 +#define KVM_NO_MMIO =20 #define KVM_INTERNAL_MEM_SLOTS 1 =20 diff --git a/arch/s390/kvm/s390/s390.c b/arch/s390/kvm/s390/s390.c index b0839e887221..697be391f0aa 100644 --- a/arch/s390/kvm/s390/s390.c +++ b/arch/s390/kvm/s390/s390.c @@ -5873,6 +5873,14 @@ 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); } =20 +#ifdef CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE +/* Make s390 compile if arm64-on-s390 is selected */ +int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu) +{ + return 0; +} +#endif /* CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE */ + static inline unsigned long nonhyp_mask(int i) { unsigned int nonhyp_fai =3D (sclp.hmfai << i * 2) >> 30; --=20 2.53.0 From nobody Sat Sep 26 14:38:30 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 9D2AB37DAA6; Mon, 31 Aug 2026 14:48: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=1788187722; cv=none; b=Itl1eR2Fxd4vOApVdAV1zNAgKvYCz+wOFtCsB2cQ4j38wcNvzVxvd2vIPPNGU64/YYkZelEAShcydhsCxEZ1uVAiAFuAcyLQuEifKaa12YGTZqaMJGtEd6NbsfzmBu/K2Pd351Y5z1FsF5nnnuqmoxTIL27/2Z7Np77L/f8f2ZY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788187722; c=relaxed/simple; bh=8PhGAXIk6PJAQ8SyWmhxdjUQ/UNAWc4tHMxbehwCpis=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hXP0MQg+ESMXoiVGdh0x0FTpMf+itdsteUyDBFIgrMKnkkjfVTCancFH5ofQBcH47hHnF8lfg327ZPQrduC8gVzH4riI2WRv3v8915LS9YcebOntvqGFPmo4HGRvOHkpgfbQ7gEmnbEWcVhNFNh7smhCwXhZA9C/rwZ2mkALab4= 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=kotvhDRE; 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="kotvhDRE" 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 67VEZG2d2583359; Mon, 31 Aug 2026 14:48:15 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=y2i1ppx4KEdn2s4dv T8pDjxVz97YXlJmGOsVRf5XqIc=; b=kotvhDRETHr6o5QoYstY+vsMhTcMxGEIm +40URwCrYPXVa4yfWQNjrgHbdS1LQW9tJRCb09/aX6YqJvSKTkpMnzyEKtSTgXcm INlYXhuyECZv9qJ3kapsYW57IxqhveE/EdD/O9hRJ3TrcoQne1qzo9I98zlHcSS+ qZyo0PxfmL6mmkG8Jn3F29BjyqYplQK4H1ZEvEho90RWXa66oZV9oACM7dUzive+ 77lzcVJF4KHGGLTTZBg/77OSbJmYNPq/9WNGPWpheFYfS0VTYaMi2AiER+n+5rq2 xcTC6oM+fzOeCIuI00/BC3GVhqw8ZIyYtmwbaWLAHLlLYQ71fAIYw== 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 4gbq2t1swe-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:14 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfjHh000540; Mon, 31 Aug 2026 14:48:13 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gcbyg6957-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:13 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEmA9441877798 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:10 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E015A20043; Mon, 31 Aug 2026 14:48:09 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 75AF72004E; Mon, 31 Aug 2026 14:48:09 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48: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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 15/23] s390: Introduce Start Arm Execution instruction Date: Mon, 31 Aug 2026 16:47:52 +0200 Message-ID: <20260831144802.834315-16-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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-Authority-Analysis: v=2.4 cv=bc1bluPB c=1 sm=1 tr=0 ts=6a95942f cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VnNF1IyMAAAA:8 a=D7HF9d94yUUfLUezzdoA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX+y1tQZwFMSc2 girItwUEGEEpOQvgc4IB5Zmug0UbPH4cqzTCc8QBjKN1WEErG634LrYjdm1iQlkLBPwmY5YcGs0 S65wP7UO+oVmEGZOBm9d1nDRagsK4aU= X-Proofpoint-ORIG-GUID: klSajshz3wU9W6YysMZs439jBjVmpoUn X-Proofpoint-GUID: awqTiRKPZZaFPCSO4F0pgFtjt38XhtIw X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfXy0G1MyO34L1H +o46PgNzXhQ3F88UJrHoDcWjnKuDxJKcdOnFsJCQ9IYqLSnq+Y8RMkFMMCIYea2XjTOBLCRZwD8 hF1/MHykJEIKN9WHbM+frF8iay0Ih7SqmPij3GAUkQlDrm3aR6/WLGyXX+ZHpuK8iL1o+Q0Yuh/ CIQMyemIQsloo9VVC33A1NiDlYIbkerSTj0DqvP2y6WyXSvJiLORJ1OxlNq0ww9uvo+dhhpFqbu 3hp5+5yX3rSbZnmRcOYzO7f16Jj+dY/FKssifwoE8/UF7/Y+DTR1oZinMVirrqdy8kRDaUegYgA yN34Fr9pHPoo+hSiHqYrybR2oDXSzqk4UjNvEHEHiLOoJ17leog/aZoE9q1+0MAipkYceiqHXKA 4bYXLUyxSzt3zEw75pPsskE4cK3mWXV3kNKLr4JYbs6BrlK0KVbdnUPah6KPpzWRqLeVkChJUm9 w4DdRbz8g5bG7419u1w== 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 suspectscore=0 adultscore=0 malwarescore=0 spamscore=0 lowpriorityscore=0 phishscore=0 clxscore=1015 priorityscore=1501 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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 | 118 +++++++++++++++++++ arch/s390/include/asm/kvm_host_types.h | 4 + arch/s390/include/asm/sae.h | 57 +++++++++ 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, 211 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..2c922ef478d1 --- /dev/null +++ b/arch/s390/include/asm/kvm_host_arm64_types.h @@ -0,0 +1,118 @@ +/* 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]; /* 0x00b0 */ + 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 */ + u64 fpcr; /* 0x02b0 */ + u64 fpsr; /* 0x02b8 */ + 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_elz; /* 0x0400 */ + u8 _0408[6]; /* 0x0408 */ + u16 pic; /* 0x040e */ + union teid teid; /* 0x0410 */ + gva_t far_elz; /* 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_elz; /* 0x0400 */ + u64 _0408[2]; /* 0x0408 */ + gva_t far_elz; /* 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..389c5ac2a36c --- /dev/null +++ b/arch/s390/include/asm/sae.h @@ -0,0 +1,57 @@ +/* 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 + */ +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 register to the save area. + * The values in the guest are not valid anymore.. + */ +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..6f6f8f6ff9c4 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_S390_ARM64) +/* + * __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 Sat Sep 26 14:38:30 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 E63CE374A1D; Mon, 31 Aug 2026 14:48:35 +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=1788187718; cv=none; b=cAsXTnX+s4oMxSjEGKbL2/rk2qJmj4qn8pKBKz0vp4ERqsN5SVtWo/BV7TU8drAA1qfukmIYbYE3pdU8Oa5GJ1YsSRqEpLsgvndxZdQK+7h5xNclvpWd/nRLCttRfVD4/3W0jyhaJiWDRtwHEEdGL+opCYfH1cLCR6dti5Ih8Rg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788187718; c=relaxed/simple; bh=uAFcd8HQIqh0gz9X0Fd7BXVaB2dY5KFUiz6/VWzDECI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jnXNZ9d68xVZbQSrtlOn4PPPWgVVbKVqAujcYVI3B8TeMSUPW2urtEpZ2rxVb/2EIhp+SOUcVjGgf/9DHFO4zbpZRaT/T+41ya05kgNvCspjkrJFD4LrqEeaP3zfK8gNUAxkdPWJFAugwcGTkl+CukmYesowhHsF37UC6AxJmZs= 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=WF3oihdM; 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="WF3oihdM" 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 67VEZBwB1398300; Mon, 31 Aug 2026 14:48: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=Hkd03Tw3GQhq5aCfJ fTH2yNNeWWRwh+ubgEBypEn00Y=; b=WF3oihdMCht2FvJxrlHga8YU8W8+3SD0i vsNPgGBvlEvi9Cp+C7PMxaxuTWosWA3sZ1tZ6CQ8CCiVqGlpTCApp+mlHa0T02ml v4h7nSe477EF9iKCGCFaUP3/cmO5RMHX9uXp878YDocW0hVfc5akAlvRBps/13p9 cor/tfjai1grkzotHsYWghzvXbfrrpyJj0TSqi812eMgIdj/xZc/SbmdJ8iEfzcP x8bNCkGmCydhWv7oLvVjNTq+Wz930sJp7u++pdK1hNSquN3FlR+5oyVUZH3nQQVd G+5R++WapPOQX/WbIPLNTukH0tnciY7T0aYHCxsr5wYTxVbJnxmgg== 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 4gbnudhysc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:15 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfe53029556; Mon, 31 Aug 2026 14:48:14 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gccexx7nu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:14 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEmAgf42926508 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:10 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5C8462004B; Mon, 31 Aug 2026 14:48:10 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E63D82004F; Mon, 31 Aug 2026 14:48:09 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48: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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 16/23] KVM: s390: arm64: Introduce host definitions Date: Mon, 31 Aug 2026 16:47:53 +0200 Message-ID: <20260831144802.834315-17-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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: dOXOye89J-4tGjxxIHRLSN1sL3Ey_WZP X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX+45iQunjxgxh ODJCEvJWxRkbZ1c2NJJ91i7LVMmRTXOSz7zMQlFEM0tBKC2Qm8nOt+Ue8jYOZi9Ji/J51bLWdHD RY+GZgtQ/Xl2ZuKv4thraMvGAVwbcDd4OdtLCjtVEgkAlVvgAutD/gOB7zioh4xLuu9jMBZYlf2 BciB137T3jSm8QGfwJtihpsDukPNbCYRVW9oYXRAAGo2ccLLOqq9eJQa1OiM502lbXCUTxyr1rL Cbn/Mvq/Mlu/6D93ocUoR0245RGyRVtAzzx0xUvJZ4qFdPoYhc3LDhStZMY1vmU7nhmHtwzrDJx X037CgST1voGIgiA+cYVKJmz3bWVixe2fV4bMm54tibjSQBHAT0euTUHcp7bEh7dhUvxTihYGD3 ttoTtu2GrbW5kc29ZV+6/yGLY7rRb9zYtQjrIslOYv3n4soVwYskyyfXv27p98Y0Hwotr0JgaGV wVBF0Z3yeFsJqK/EO+Q== X-Proofpoint-ORIG-GUID: YFM_mUXa0ArZzfUnEE5hMEgweSV6CH0a X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX6MJCeZJx11Sf ET4+JZ4Y2+wMm269RAHZCf+mKSyWXDYPnOpJympH3ZHZLTVPrcUFTiTGL6KbCD0J/pQmOg3FhP5 njWAabiRDW2NAWCrIm9MmwYERHQ1Zv8= X-Authority-Analysis: v=2.4 cv=B92JFutM c=1 sm=1 tr=0 ts=6a95942f cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VnNF1IyMAAAA:8 a=NkYWUXnGwG2_pH3cPtwA: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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 spamscore=0 clxscore=1015 suspectscore=0 phishscore=0 lowpriorityscore=0 bulkscore=0 priorityscore=1501 impostorscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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 | 211 +++++++++++++++++++++++++ 3 files changed, 226 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..b8a689c649bd --- /dev/null +++ b/arch/s390/include/asm/kvm_host_arm64.h @@ -0,0 +1,211 @@ +/* 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_S390_ARM64_IMPL_FEATURES \ + (BIT(KVM_ARM_VCPU_PTRAUTH_ADDRESS) | BIT(KVM_ARM_VCPU_PTRAUTH_GENERIC)) + +#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_elz; + + /* 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 Sat Sep 26 14:38:30 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 781BA37996B; Mon, 31 Aug 2026 14:48:36 +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=1788187718; cv=none; b=Ht6NtJCUEWvXa813uokcw0fFDj45DWOwUOJgIOv9V7iDOt3oSqJmA8mOVso8LkGVUsPeeOUCh+h84k67fUCsv6gKUnrgUv1IrWV+hbldqUO9urmc/7qv07oltCstxr5owVJcp4qVVLXFLI71I/IHt04GMrebCW0ufnmJZrWDGwY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788187718; c=relaxed/simple; bh=tmItWwCbeld3hacr1W/IAEWGRv9LaAVfUr4NMchFF/M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hSTN99HBnMrfqcetAha/T9pW5hjEKvFxNnV0tuJ2bdFiV5SQSHAUiNk1p2FrUJgFsUUSZ1hD4N0NVZLS/Cp6HJ6VXi2Ip3GDoUkVxfwxO5KIPKqlPjP9+zDJnWCflQ9s7G/GO2K1bj4t7K4TDbb9ZkWLKNQjvkpL0FlvlhCfpko= 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=eKIdLzgz; 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="eKIdLzgz" 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 67VEZ9co652825; Mon, 31 Aug 2026 14:48: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=ywId08J7Tbx4MqC2r zjHWK754WaVxW5lbY11LpqyFpM=; b=eKIdLzgzJmZ0jhjLGd0gfawMGlxHtWuF9 isR6/nMOlFBKks6F4AX1plor8FxLe/vIsxIV3Ejan/Ih2dNBwjQVCMTzKyxb7iS/ MFVL2N+cvXPBzy6Ep6zjYMpCCsTHpFsZQzqH9ClhjN1sPxMccXbxuumFm0bXu8jj yPZ6/nfJF5mwb4aP0oO4fYyCqp4pi4Q96JZZb1VZ+IffyyITxi0UHFdZK2NJW6qf ALWQUp7RFj265kz3tbuoPsbbVYwkIgNIUUKf2l8HVHH7g5kw0GQ/z9p56lZnOkPX 0p9Gf+beZYVA+rQyC4BHTsAbpLyOImA1vXIjdLHY5ntiNIZoEzu1A== 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 4gbq3r1xuy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:16 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfgVj016964; Mon, 31 Aug 2026 14:48:14 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gcb8h6cjv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:14 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEmACD42926512 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:10 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C6B9920043; Mon, 31 Aug 2026 14:48:10 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 633A32005A; Mon, 31 Aug 2026 14:48:10 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48: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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 17/23] s390/hwcaps: Report SAE support as hwcap Date: Mon, 31 Aug 2026 16:47:54 +0200 Message-ID: <20260831144802.834315-18-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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-Authority-Analysis: v=2.4 cv=EIc2FVZC c=1 sm=1 tr=0 ts=6a959430 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=uAbxVGIbfxUO_5tXvNgY:22 a=VnNF1IyMAAAA:8 a=MMtvGDNtdIwsdepEW5QA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX9HIjzTrf8CuY DEwceEpV+6pXNZkoy0wu3QrdafG4mm/Ca3xQncIdCeAFerXcKed7f+k53xyVKZCHMmtUselpUaT eB8HZhjGSPh+LoXeKs5bNZLSlnq70/YVFRn0xXPYIelSVmdtuRRlLiDWulNbU/iUAnkGlSwMfXy S5ArdhgUd2EYSldUfr8egaxvvlQuO+4Jn6/vhc6LumGUSSTdrk7wZuZTydeI0UELxE+HnlLRy+1 cpJUYUIxzWcuGd/51P5LumjY3oImedXHNJgSkRhO4sQE0mmeTqP3RdE+BayzOf6c5low+PN/2Z6 +F6RWUDWq5EWd+XzmpSGE6sHTawR+I1y8NgKvbzoypGUlZNKRAuJfRf+/bV21Us4MVu0u/aCHHg Og2lmeqo6iL+LqG8Bwvsq1Ky4jiRQ89RtZRH8xa5g5zOCeRbN6vqdUrB3E2ol7MUGOec/dCT92N hu2Z2C0aWmq1SXad9Cg== X-Proofpoint-GUID: bvZjkqjR1ktNiZX6EJxoVMRoIYYIst0K X-Proofpoint-ORIG-GUID: KUz9DYN33Ji3dCI-CPQUV1NxDmqhcceU X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX0M1QX2DUg8Qn C5MR5OUEwWCSHow10yw1Ca2QylUGPlAQJukhb+gOT321Bcs7myxA0zPhNFBiX90TresqShWXjYo VqzPv7U2ko58tI7MdEjDBBB8/t3e2qs= 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 impostorscore=0 suspectscore=0 priorityscore=1501 clxscore=1015 phishscore=0 spamscore=0 adultscore=0 lowpriorityscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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 Sat Sep 26 14:38:30 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 B332537DE84; Mon, 31 Aug 2026 14:48: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=1788187722; cv=none; b=QkM7Fz4BAhQmQLLaJDOt1MkdwzcnYKYBOgUt2Ngw3ydwvOFLGQJ8v8g+MXuXMgJN23WdFnenkGb6FCFr6ptp9D0wTtL72M+AoCHwW4x42D9PRGgtAa89uWkeFtpoCwf4/85IL8/Dk03ZJgwuOwvrPYw2zWU/6ttxCl13iJxslZo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788187722; c=relaxed/simple; bh=v1n5lsuvbtgaTR+sY1T6V3DpRuNDIdzXKsTitlkAgkw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=o2Tf0wjew3QiHFUA0uMzrPn1ZxVs3ehJaidMo5PBCxpuXHoio8oqDK9HTUbiifQRwiZOX2FsI3ivAUHmC5czE/PbLTL1Gc9dQovbHuUituPa1VLUkeOYDFehIYwHjFZOS6B/zWGuRkfYpDQL8rW9kwic9jnc9d1fwQJ3RcG/fhM= 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=UFwveDWP; 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="UFwveDWP" 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 67VEZ9rr2582947; Mon, 31 Aug 2026 14:48: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=965Gh40s6kkkdjxR9 BPoVC45S+fIjwFlpgEt9usOIG4=; b=UFwveDWPaiP1PdiOQcgXF/dENI61dV+Je +u5OgsJHYpXRnz6WJgMzx/b0yakHtGmiwwt9IQzDnyf5D0xU5XaSwvCXWCrCYufX 51U32KRKu4YrRoEjgL6UU1LxWfiGKMAObMRnJsKlHE3OTCPKxb+fu193+lW/l7wX 75bN1Zf1TH+PtYgt3YXXubte8YkbAEvOPmnB1Z60PXFGcsq1RZ3kLG8uDxNA8Bea 6qKCpAfHqPcRWX389tzWgKVkhYA/zybg24wRgxSttKZnY3zgEwuVmFXSjOFQeCHI WnOvfeIb7YhStrM/M0j3mlIVJ8hoKQGWV8zCN5pihETHAxJltZBKw== 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 4gbq2t1swm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:15 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfkYi015618; Mon, 31 Aug 2026 14:48:15 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gc9rq6m6n-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:14 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay02.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEmBIx53477736 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:11 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 439392004B; Mon, 31 Aug 2026 14:48:11 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CD5522004E; Mon, 31 Aug 2026 14:48:10 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48: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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 18/23] KVM: s390: Add basic arm64 kvm module Date: Mon, 31 Aug 2026 16:47:55 +0200 Message-ID: <20260831144802.834315-19-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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-Authority-Analysis: v=2.4 cv=bc1bluPB c=1 sm=1 tr=0 ts=6a959430 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VnNF1IyMAAAA:8 a=36xwF7fJQ_K8JzKkrRgA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX1vXt5RyfjThU j9OHUCPCDPNTD/defh4IGLny6R6psL/42sXWMr18SXdvxIzVAXd3H4j4Ipo7CSgBE3Vf66hhp3N IJ6Z/BvODOqcdsKTUJNcIHmoV1DwNPY= X-Proofpoint-ORIG-GUID: x0JGviGsH8aEQzKh-3jkMloUJkx7jv6_ X-Proofpoint-GUID: Ysi-7JE6uI4kXm6d1fmqmKd_61tEncLq X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX54gygIOiEjyG dBPGP2Q8eAxwA58pU++Mq7N9enJrkgM22hPAttNh7pD4vQUwBNk2avwZQEPjJ6irSuIMkcCBMda AtGQheEOpi9wKfnlUTFx4k37OFoRDo4qGNWT50iT3F8fn4UOBPcIoR9TbtfeZeA4cseY7ZH4VZU g2gHmR+1uVXusZ32tYa9zy+eEJHypoBGirNYgw3wdseGdP8f6v4FJuj1yIXw/OCTyWtjcs6JGwX MeeqjGjjZE3upWtuDr/BdcGr7pj8u+zdK3vyn0WGld42321sfnLWO5fyD4VS9c6vLzLaQ17vdXN NOQugmkw9zv5f02rf6V8cwHEhMUMVDnLEesqSQ4lYOcWIBwvPJ5sm9cXXO2WF+QDdoUeH6s4P/X Ky7PJ/0FlvNYT9K99MULMGLE1IYGhJOJa3S+vKFUCa/EykohGzh9oZ+obXuMuAuHJ7tA3/7aFkz 44bY1RvZGMiObTly3/Q== 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 suspectscore=0 adultscore=0 malwarescore=0 spamscore=0 lowpriorityscore=0 phishscore=0 clxscore=1015 priorityscore=1501 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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 | 155 ++++++++++++++++++++++++++++++++++++ arch/s390/kvm/arm64/arm.h | 7 ++ arch/s390/kvm/arm64/guest.c | 92 +++++++++++++++++++++ arch/s390/kvm/arm64/trace.h | 18 +++++ 4 files changed, 272 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..299b070f8b6d --- /dev/null +++ b/arch/s390/kvm/arm64/arm.c @@ -0,0 +1,155 @@ +// 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; +} + +#ifdef CONFIG_HAVE_KVM_NO_POLL +__weak bool kvm_arch_no_poll(struct kvm_vcpu *vcpu) +{ + return false; +} +#endif + +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_with_dev(sizeof(struct kvm_vcpu), 0, THIS_MODULE, + KVM_DEV_NAME, MISC_DYNAMIC_MINOR); +} + +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..a3db254462c0 --- /dev/null +++ b/arch/s390/kvm/arm64/arm.h @@ -0,0 +1,7 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef ARCH_S390_KVM_ARM64_H +#define ARCH_S390_KVM_ARM64_H + +#define KVM_DEV_NAME "kvm-arm64" + +#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 Sat Sep 26 14:38:30 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 D807937E5D5; Mon, 31 Aug 2026 14:48:40 +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=1788187723; cv=none; b=buxg9beKWnII19PHK6zIRPg122XODg1dqGDjhyTS7rXmp3NX4k0jEe7mOmu680QANi23J5DBQ45m6xKk9Wf2Hx7oYafHuZ/jIJWXNqK10iycZsegHK2aQysi+qQFgVhmInbK/fCo3ahUm4R1ZNt67MbEp+S3HYmriFQcyb0iwMM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788187723; c=relaxed/simple; bh=tTRi/pLpY0L5sswAKmLFiZt+GJovpCvzCuh94Ej1Yrs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ColNHaypVE1/5HaE+RuEAOgND2jOMDTt1PG/Cyu4BFQmysTJjqjweNm1eV1eZHxsNdlAcqGF+AK8TiMzvkZuxAVLvJFBQgaa0mSvQl6PJ8oH7RtvmfvXZXzCA5q7976v9Xyo2cCNpCkjEtTA5AVEzc5gVzAMtn3HIPvRCG0YYF4= 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=FzqoIvzT; 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="FzqoIvzT" 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 67VEZ68x2525500; Mon, 31 Aug 2026 14:48: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=cyG5TU/Rr+3/HEPXt TYbkSehPWLB4h88m/MGvSerxgQ=; b=FzqoIvzTfTEZ0EAT3hIbXhj0czs5jz92L 0fAxhYdbp8uspCnHWMS1oFju5QSLSJkWdLlaN2kXgCb80Axn8zalpNTkySyJSsdK 0qZsLwgPeRJXIbk/5UahCMTDJ6tw5UteKuazRMWwH2ZqjrlY32SaG0TL01I9ojTL bfnDvWdaTr/pL2nwyzvGoUjE1iRGVK8vFixUd1qR0G6auLEgsiGAn0rzeAl8Qhn8 7B2AT2fwWe80zwHLAmJS2Xcsgwd0SemjN0LS+XWUyAPVI92uaahykYlNBDbMy5yl cjff2QjC+PBMKUPF9loKwfoEE6csPD6ZxL0S5OSypYTLqEBTLPoYQ== 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 4gbq54hybx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:17 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfecT003393; Mon, 31 Aug 2026 14:48:16 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gcarjxf6q-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:16 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay02.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEmBMt53477738 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:11 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B617120043; Mon, 31 Aug 2026 14:48:11 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4B8572004F; Mon, 31 Aug 2026 14:48:11 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48: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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 19/23] KVM: s390: arm64: Implement required functions Date: Mon, 31 Aug 2026 16:47:56 +0200 Message-ID: <20260831144802.834315-20-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfXzz5AQI07ksaw Xp36UHRNT02+wLiN2VlJonvbDaEBHCoBmevEAmelUlVHnVX6Ma90IhxuKDNDqkirf9jkMG/c3BV 9/JZVunly6rheqyA49XanzoV0kihFwP/fWJrk6+X95YXLlHEywQHfSXmQidaPqbrmLNK/TLYFHb zst2rsn9q9ViWMQ/e6ynmyCDztypWsq2RTnNV4txAPXwN+M4+rAUrV3xH2Ni5hRy0FIFhnx+Ly+ SOJaXdwBNfI7woUF7MR9dcZsTno1vlQoFLi4YSryeJhcdJl56WhMUAG2sLOj49HschgNF612cpX 0Fr+LPnMGZpIlNTYTkDVvWZnzCeiPgYhlgFWeWlL4HlTy5M1KOC3xsN3KZHSHySE+l0l+4SH3qK tkmj/Ug25vQymYaxvzys4U0qMaJfJeeNDTTrG+AG5WTDoy9l43Cw27WmomuK3Z16u493KpDlSbg QnwtnYGTv5p2o/K/7hw== X-Proofpoint-ORIG-GUID: 4-SQun_hkjLsJZfQi3vZvgU76SQsfMf0 X-Authority-Analysis: v=2.4 cv=CNgamxrD c=1 sm=1 tr=0 ts=6a959432 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VnNF1IyMAAAA:8 a=VwQbUJbxAAAA:8 a=ZB4-hMFPjOdVrSTFiSQA:9 X-Proofpoint-GUID: QqbhHvALUGpzJ5c2RYIuGMXnww8WhWGR X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfXx+MsOVRNcJKD /MAaFqFCtGk6WpNUliX/2TxbHELX1uAnvx+7o1tkAeDD3q55KQiBCC//ogEcaiCLeDCy3xTyn1c Ukp/J1MUgW4RLE+tpwO1zrxDs7SEckg= 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 bulkscore=0 suspectscore=0 phishscore=0 lowpriorityscore=0 priorityscore=1501 clxscore=1015 impostorscore=0 adultscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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 | 98 +++++++++++++++++++ arch/s390/kvm/arm64/inject_fault.c | 21 +++++ 7 files changed, 285 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 3a19da74d00c..8399f48ffcf7 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -14379,6 +14379,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..9840f811d43d --- /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 u64 *vcpu_fpsr(struct kvm_vcpu *vcpu) +{ + return &vcpu->arch.sae_block.fpsr; +} + +static __always_inline u64 *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_elz; +} + +static inline unsigned long *vcpu_hcr(struct kvm_vcpu *vcpu) +{ + return (unsigned long *)&vcpu->arch.hcr_elz; +} + +static __always_inline unsigned long kvm_vcpu_get_hfar(const struct kvm_vc= pu *vcpu) +{ + return vcpu->arch.sae_block.hai.far_elz; +} + +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..ed872cd804dc --- /dev/null +++ b/arch/s390/kvm/arm64/handle_exit.c @@ -0,0 +1,98 @@ +// 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 __INCL_GEN_ARM_FILE +#include "generated/handle_exit.inc" +#undef __INCL_GEN_ARM_FILE + +#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 + */ +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); + } + kvm_make_all_cpus_request(vcpu->kvm, KVM_REQ_SLEEP); + 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 exit_handle_fn arm_exit_handlers[] =3D { + [0 ... ESR_ELx_EC_MAX] =3D kvm_handle_unknown_ec, + [ESR_ELx_EC_HVC64] =3D handle_hvc, +}; + +/* 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 Sat Sep 26 14:38:30 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 7C5E839A07C; Mon, 31 Aug 2026 14:53:36 +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=1788188018; cv=none; b=qvUZZEOkVuNsCooaJg3gLbTqdoqziVxqqGXdeYaggYR2BhAx3LjBkUM9uuD1LGKVI58FJ9wmpXnqSD8l5ipzttsmgnrnaxKSwr4ncSJ+AHDKaBFqj5EdBtmtaG2GG93TDpjSIZplD5VHWxQLkPZdkwCJAXka99vrnbX71oT3Sww= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788188018; c=relaxed/simple; bh=K5hslXH3obRHZ9Aro2YbOsSBK/pIRvwCnZkVW/uL33A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lAz19UXWXBpvlG/oGeQDmkf3P2OStIjY1dtxNl4L1TDECGjX723CIrR6di1vq3yyq//G876cdmQpPPVViubCRhipPKk0BX6yrHdkSXpXZO91YwdH19rHA6mfrPMHCbzDoHdUcQDibG2uBol+PjVt1d1Njj8wv2W/jXSUCSSuEJA= 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=syk4eqYy; 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="syk4eqYy" 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 67VEZSBP2415331; Mon, 31 Aug 2026 14:48: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=XmQKJFd7T+gJLXlbn BN7pAYs13ZWmNadfOS+q2PMYSY=; b=syk4eqYy0yZiTw1WxfYuTkbjh0Hb7trBp +ZcnIAOH/0mmEzqsWucMPwhLckPqKB6AH2QCFtgF6z6onnbVot6tAPluTfaTbDiq JtfNU/G6KZdmCorQUR6Wb1xyE7AhGfzP7gMKcmc1nAE5V81M/5Pf616FtMPBM0pG 0Cbp5dPKdAD4IfyqczCCAtki5zCQik1sd6s/4YBmk5hnYYg3njIu12G4IaHgkZEF klcfEezNoekxE61hKsnNi/riz55k+CWeReXVL4mwmLkydTlle7Sicw9VstcuarWg Ak3iWnCa5E2xU8/JSy1o3wCtJBxkJeJdvLoLrsSgJZXnzg/KrktFg== 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 4gbmuhj4rq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:17 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfgUg003411; Mon, 31 Aug 2026 14:48:16 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gcarjxf6r-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:16 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEmCnp44368298 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:12 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 484412004E; Mon, 31 Aug 2026 14:48:12 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id BCBD82004B; Mon, 31 Aug 2026 14:48:11 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48: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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 20/23] KVM: s390: arm64: Implement vm/vcpu create destroy. Date: Mon, 31 Aug 2026 16:47:57 +0200 Message-ID: <20260831144802.834315-21-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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: o33gGe4JgELQPtxv_P7xWpNlG-PlQRG1 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfXy9q4WbCLketG genZY6cdLbW7bM7OLO9pqcafBsBU3RzGsmHBVXDMug/PveJ4n143yAcwNY8HTCPfJFRi6XjTlsN KS9IL+BLW5MEzwHKwNYAS8Fu2Cj032U9xiXCTN7l38gaKxyel/1nPZRYxZujjlRDVkcBDbj0rAh fpgZudos9lG6gYurCsLRgFn8Mk7dVicKGt+IG+dI71u60hs328v2oF51Of+XVVGLEStNQ67NoM9 kWsO91rzoMxtCMlhGLE4eeXYFWnjik6qFuVHQZ/unrpouwPiv3u5mWCdjQlBJPx4hNSlLRokvvN Ijyj1FH9aQ7hGJPdgoN/BSIjPt25nHT2e6Nbr3mRIZ6dAYh+rJedB0S0amkG8W9BTURzrTsJfJi dAMWYyz3P2Y/iqbWdCBYct/dr2j/f0QHMBUdSKQ3cJqzVOVGuaEc4CK7CI7pBAe7KbEGsSMukUg 8S3gXmzGeODlMSXHEPw== X-Authority-Analysis: v=2.4 cv=Osl/DS/t c=1 sm=1 tr=0 ts=6a959431 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VnNF1IyMAAAA:8 a=vzHPSaZuyQoW_AfhFoEA:9 a=O8hF6Hzn-FEA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX9V5jgy9dwnij 36FL3BBCZJtLWJpcaDfx7rXsQpDqJGkx9MkMxRSm6zSYEdp4szJ3NjujuOFSQPKsUGg4Mw6lNMx ZeTV4N84earq3Y+NTFe/ImaSR/XizTs= X-Proofpoint-ORIG-GUID: YCBYpcauluWu-obBwJcQPr2FUeI4cpfH 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 malwarescore=0 suspectscore=0 bulkscore=0 lowpriorityscore=0 adultscore=0 impostorscore=0 phishscore=0 clxscore=1015 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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 | 197 ++++++++++++++++++++++++++++++++ arch/s390/kvm/arm64/arm.h | 54 +++++++++ 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 | 17 +++ 6 files changed, 281 insertions(+) diff --git a/arch/s390/kvm/arm64/arm.c b/arch/s390/kvm/arm64/arm.c index 299b070f8b6d..7df0e4e697e8 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; + 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,81 @@ 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); +} + +#ifdef CONFIG_KVM_GENERIC_PRE_FAULT_MEMORY +long kvm_arch_vcpu_pre_fault_memory(struct kvm_vcpu *vcpu, + struct kvm_pre_fault_memory *range) +{ + return -EOPNOTSUPP; +} +#endif /* CONFIG_KVM_GENERIC_PRE_FAULT_MEMORY*/ + +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 a3db254462c0..093a638e2cf9 100644 --- a/arch/s390/kvm/arm64/arm.h +++ b/arch/s390/kvm/arm64/arm.h @@ -2,6 +2,60 @@ #ifndef ARCH_S390_KVM_ARM64_H #define ARCH_S390_KVM_ARM64_H =20 +#include +#include + #define KVM_DEV_NAME "kvm-arm64" =20 +#define VM_EVENT(d_kvm, d_loglevel, d_string, d_args...) \ + debug_sprintf_event((d_kvm)->arch.dbf, d_loglevel, KVM_DEV_NAME ": " d_st= ring "\n", d_args) + +#define VCPU_EVENT(d_vcpu, d_loglevel, d_string, d_args...) \ + do { \ + debug_sprintf_event( \ + (d_vcpu)->kvm->arch.dbf, d_loglevel, \ + 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); \ + } while (0) + +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/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 15ec88bdce55..431c9442b10c 100644 --- a/arch/s390/kvm/gmap/trace_gmap.h +++ b/arch/s390/kvm/gmap/trace_gmap.h @@ -5,12 +5,28 @@ #include =20 #undef TRACE_SYSTEM +#ifdef KVM_S390_ARM64 +#define TRACE_SYSTEM kvm_arm64 +#else #define TRACE_SYSTEM kvm +#endif #undef TRACE_INCLUDE_PATH #define TRACE_INCLUDE_PATH ../gmap #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) @@ -21,6 +37,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 Sat Sep 26 14:38:30 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 3CEBE37F738; Mon, 31 Aug 2026 14:48:42 +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=1788187725; cv=none; b=FNMkjtj8GOqHo6Ld5XALdOopKc0oRvNNGcDKyayHVCajpqZ+JU13qtZyMaWNTUv9FT4Y1ykDgzA/lZ/C4qrs0cW3quH9C1usFuUNm/zG83y9FaPuQugbmp56YoK6cBxutyderl9upFb/cWlbdDGD2HgZy6n7+jdHDycgQhVqXYI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788187725; c=relaxed/simple; bh=iPigm5RHHzbNrzhmPp3RcSpfc7dxAL6Kg6B4zKe403c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qN7x/qLPRF2kK3rQJJ7biAilGZnnSxZc1CDg7vCmLmc37MTn7kfP9DKcTJOVycLFHpwnkQxibIWqWBhW0N0VAKU8D0iEXdpFgkrwW+AAHxIT/lHRxIBFnb0hiu9eo0M7LZ6m0cErBBZwvT3KMW4o2ib6tBBUyRl5eLAZAYdAQxg= 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=JIgBfZ+5; 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="JIgBfZ+5" 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 67VEZ1ae2525369; Mon, 31 Aug 2026 14:48: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=gzUS5dzEaZEiI00zA cLLQpUmuXPxNGOtPIusHbmPyf8=; b=JIgBfZ+5PGdcQ2TKR2+s5UBzM7mj4075v iLJewvC7DHC35GGmfjBsNkLEzPUZsB2K/7KXbIIP4hK+mF5l5XNRGxFAlLTOW87h RcpUmsSuROqwiGGCS7te/fqE8Fx4NOjHqEEgsysopc/jWiBIKa12kTdtrR4zWW2q Y9/FOdVLniKaS4h82a73l7fwZ8uk0OIC+Tut5EXkF3A/gtqUKZOtVVXV6kAOoWLP RRIcQyI2YRLy3xp9YV4g4AZnnrzlSFctm7BmANBsHfnkJG+A/jlZ6AJ1UCXAdq2n NUVvANbka2iLSQKYKJZQRlHI0ZyOFd5zwpj/hOatfkpLjwpz6sZCw== 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 4gbq54hyby-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:17 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfdOY000453; Mon, 31 Aug 2026 14:48:16 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gcbyg6959-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:16 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEmCXH51577280 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:12 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C28762004B; Mon, 31 Aug 2026 14:48:12 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4EE2C2004F; Mon, 31 Aug 2026 14:48:12 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48: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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 21/23] KVM: s390: arm64: Implement vCPU IOCTLs Date: Mon, 31 Aug 2026 16:47:58 +0200 Message-ID: <20260831144802.834315-22-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX7QEYkLa6JH5N 6OIRKsG5yoQzGtnxwLezVj8iSk3tM8s8GFcIqKE9L1BJd09hdPaBEp606YJqg1uUQ3qJHIKkdw7 BeBrP0dLfl55ogOx/XVArBaFMGsFRxILKT3Zpwff4jx/0Zk6So7+RYpti2HhlurLzXa9LNI680+ PhunrVVCNu9xJ/br9rmhBGlzvgMLVIRzVBi5k00jaV05LB+voMRflrt2WBt+YkunlSeHW0k1skD cl3U+Otq7iA6eqFfqd+08mF9S0MCy6EjAWXoF6xO0fpFVn7s5bNl1M9N4xNuZi4F2Sfz5HFladA uq+oX/cK+GlUN3EAjLma25X5KpYAzIsvoLvcSvWII7PTQQQ9DSP8zRTCM54+EK29Sl2dPr6v2n4 Fa/pCjdQ+8ZGw0VESVWbItSC3HGcEJTxkrEoWbr2GkLulnkBcIKhAkoKCCvqG5V7K6igHlnrW8M yvp9QHlSsOXtAfKXSRA== X-Proofpoint-ORIG-GUID: Lu6c4jVBb5sHM_NvEAaIRTLpsOGAksVe X-Authority-Analysis: v=2.4 cv=CNgamxrD c=1 sm=1 tr=0 ts=6a959432 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VnNF1IyMAAAA:8 a=_G_Zda0_olWuzeEGfu4A:9 X-Proofpoint-GUID: lShQFO1nEYnUfo8f26cQb13MZcQk5rC4 X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX98QXoJogcV1Z TcDXG1D5ywzkMuv2HIs8+K5nZipJfrRVIsYd0IjP3pPLdDXeF7FGl4z5T4+/YTEt5si5T6CSR4R 8mCGjnArXNSonL0YZI52JxMRe6QZQNE= 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 bulkscore=0 suspectscore=0 phishscore=0 lowpriorityscore=0 priorityscore=1501 clxscore=1015 impostorscore=0 adultscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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 | 406 ++++++++++++++++++++++++++++++ arch/s390/kvm/arm64/guest.c | 47 +++- arch/s390/kvm/arm64/handle_exit.c | 31 +++ 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, 563 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 7df0e4e697e8..3caa72f780a5 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,388 @@ 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); + } + + 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(); + + sae_block->icptr =3D 0; + + 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; + do { + if (signal_pending(current)) { + kvm_run->exit_reason =3D KVM_EXIT_INTR; + ret =3D -EINTR; + break; + } + + if (need_resched()) + schedule(); + + if (ret > 0) + ret =3D check_vcpu_requests(vcpu); + + 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; + + kvm_vcpu_srcu_read_lock(vcpu); + + ret =3D handle_exit(vcpu); + + } while (ret > 0); + + 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 ed872cd804dc..1286a64783e0 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 @@ -55,6 +57,35 @@ static exit_handle_fn arm_exit_handlers[] =3D { [ESR_ELx_EC_HVC64] =3D handle_hvc, }; =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); + ret =3D -EINVAL; + break; + case SAE_ICPTR_HOST_ACCESS_EXCEPTION: + case SAE_ICPTR_SYNCHRONOUS_EXCEPTION: + ret =3D handle_trap_exceptions(vcpu); + break; + default: + WARN_ONCE(true, "SAE: unknown interception reason 0x%02x", + icptr); + ret =3D -EINVAL; + } + 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..0e162be1bcd5 --- /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_elz =3D HCR_EL2_E2H | HCR_EL2_RW | HCR_EL2_AMO | + HCR_EL2_IMO | HCR_EL2_FMO | HCR_EL2_PTW; + /* traps */ + vcpu->arch.hcr_elz |=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 0; +} 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 Sat Sep 26 14:38:30 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 B7018385D62; Mon, 31 Aug 2026 14:48: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=1788187728; cv=none; b=EGH+uDqw7+4ENKrFsx4HWLIcmFw4xz3lU6k0Xf8Zq2pevjQ3U3hdsHTGhMMraJQDkxgMpmtpJ+1A2qs3sJAc+OjahNMcCmgpj2lySOI15hm3cG8INUIWH6pmAPs7qvQhtTKRDNRz37t3qWS9W0xbWXVALbaNTQI0oi54MJajZ2s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788187728; c=relaxed/simple; bh=QdKzGFC5tG7HwtTAU5W+lSxJ7HO+4XOV9T+1ZlnKVEA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NvZcSv+lof+Ks0KEA8lHmp/XztbKI/wj1PuMfPllbP5sNRn844811pInuVorZ5gQmPYKrtCg/OqnNlv8DmXEdTWyU4sVU6eUVCbPAWXFfdXEdrfpDo0Iw0qNX315x+B6dDutBDS1R4kECHNwmduV8p9/p6cLssgsqeo24sYyySY= 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=ogOA58Gb; 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="ogOA58Gb" 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 67VEZEug2414993; Mon, 31 Aug 2026 14:48: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=9LBTdGYp74bdOKDbL W9CAifa+vwRdpP6uAQrWUX/B6U=; b=ogOA58Gb/V+igRba5gg5WEXOi8KIAANT+ JogMk+ikh2rz3GjQSGsvXkrRPKONgJXmfWp6+OKNSqECaDKJB2jExmEwa6Ede3eo /8pXpQEat7rSo3/yjloZfBjyJedi0Kq9+R7NCKHkpbtsI3SSDLnpjvc7B7km/VWg 9drNx1KjdY1QRM7ZOCbRfp0vUnfb8RgXdGdS7KC+U9Zt8KoOGe0ECjJE2qeA/qGh RZQNooAJN93NSz0u7kM3EQKGVbo+czRkh8eIOqXz/T4qEovfbczS3qQA92Olq/B5 1MHrveItiwZI0ILigIVJTS3HUfpZztxsA6Uo4CxrB6O4ehWlFJCDg== 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 4gbmuhj4rt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:18 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfkj3017001; Mon, 31 Aug 2026 14:48:17 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gcb8h6ck3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:17 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEmDUF39649770 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:13 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3FE9420043; Mon, 31 Aug 2026 14:48:13 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C8C842004E; Mon, 31 Aug 2026 14:48:12 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48: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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 22/23] KVM: s390: arm64: Implement basic page fault handler Date: Mon, 31 Aug 2026 16:47:59 +0200 Message-ID: <20260831144802.834315-23-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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: k3mp160bxF5mgXhnXzzAI8he8oSHMBSp X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX03j3MJppJwi/ 9bplz1+lRky/WMexRWjhNj960TnAlyNhKb/Z2wa4SQGamqEhR2ZShQgMMbsbaHwMxbeEEmrXwHs dgJEdiinXsyPkvz852LruPqfvUcbNNB4Vi/eDI3JPf2fqScSPukbdMOP8RRbrEqOJplaiu4MXwX Acph3Bivy9as3LUqiXibTmPrY7tUoTRUAhwQCXhf2crVaGrkiVXf2rUiVbr9wauxCwg2m6GSs0x 5MTkdJ3Mm+OAyHXgRDGIikH1sPulnKEwwIrGP/GB0wd18Y4zF1Neve6Aq/dYDPEP7zmb+Nyfmo5 w/HHe8mqdnurQmxVoyITJpxUUgv/k5E1yFknN/3AzXFXWPwuXXVgJxiSQPfmYCiDDu8ctMz6GfO EUcKLR42Vl8vP2Ek+BkKl2xL7yon+MvKJZxVPU77euu3rrx8oWIJpEz1N4AnOif3osMavQNFtPJ fmBNkhBXJgsZ3QFB+IA== X-Authority-Analysis: v=2.4 cv=Osl/DS/t c=1 sm=1 tr=0 ts=6a959432 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VnNF1IyMAAAA:8 a=SwCwYoEPLhOQ47qcL8QA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX0vOhS1Hf8j9o OLcFWKMPySU8IMqN0iSDukJc4FTPvPu80na1LNpvh01ooT2K2T6SEVsfA7O1YG76ecpA52hZ4HK XObclX3Wd9vD3Q53BORusiuMPQBoG68= X-Proofpoint-ORIG-GUID: sMJGdYUULO5uzMjDZzkXE8XdTypL0FcA 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 malwarescore=0 suspectscore=0 bulkscore=0 lowpriorityscore=0 adultscore=0 impostorscore=0 phishscore=0 clxscore=1015 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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 | 177 ++++++++++++++++++++++++++++++ arch/s390/kvm/arm64/trace.h | 24 ++++ 4 files changed, 218 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 1286a64783e0..8b03e8ee5acf 100644 --- a/arch/s390/kvm/arm64/handle_exit.c +++ b/arch/s390/kvm/arm64/handle_exit.c @@ -55,6 +55,8 @@ static int handle_hvc(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 /* 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..bf3442d3609b --- /dev/null +++ b/arch/s390/kvm/arm64/mmu.c @@ -0,0 +1,177 @@ +// SPDX-License-Identifier: GPL-2.0 +#include + +#include + +#include + +static inline bool kvm_s390_cur_gmap_fault_is_write(struct kvm_vcpu *vcpu) +{ + return vcpu->arch.sae_block.hai.pic =3D=3D PGM_PROTECTION || + 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 esr; + unsigned long hva; + bool write_fault; + bool guest_size_err; + bool writable; + bool is_iabt; + int ret; + gfn_t gfn; + int idx; + + esr =3D kvm_vcpu_get_esr(vcpu); + 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; + } + + 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..2a205ba0165c 100644 --- a/arch/s390/kvm/arm64/trace.h +++ b/arch/s390/kvm/arm64/trace.h @@ -7,6 +7,30 @@ #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) +); + #endif /* KVM_ARM64_TRACE_KVM_H */ =20 #undef TRACE_INCLUDE_PATH --=20 2.53.0 From nobody Sat Sep 26 14:38:30 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 CB7E737FF6D; Mon, 31 Aug 2026 14:48:42 +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=1788187725; cv=none; b=Oc8gQe98OrHjqlTZlxX5I/kRB4aomm08RcezF37dKj/n/nirUfjLemTGVglWNqAjYDD91zjz94iznqivO5bh95Gc2WXm+gpucy8mzflt/bLWHD6rtUP3ZSlUhwJXh0iANAXbqgLZ0mmVHvAcvLJNpn4sCHrXBtgtPHcS4+iP2sA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788187725; c=relaxed/simple; bh=UxkgQ1zM3tPtDn3b1aBgHZD2AgschunhvctLf5/mPKQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mSInKHT17vapeBUJ//lpz/wRRKvfhmBpPlbc9WpwGWyMvj4wO/mXb7gxcEC9A3cNkuckeIEI0+3IMNjUF4sdOQIuO0QguiqtVvThlMHE4xjuGhAYk7IdDXB72gHtPazxgTfFf3F4LXpIT/r6Dbx7Sme0d1dFrBXgNryOjkaqbKU= 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=VHdyAIT7; 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="VHdyAIT7" 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 67VEZ7Vr2530423; Mon, 31 Aug 2026 14:48: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=49n4XnmGFcb3P+ATI hXMoae7qqVIE2kvV302o4Yk0Gg=; b=VHdyAIT7tG32sbU9qUzTjV/J0k3bP4R+y /wD29v0C7pjlrApnBvQ9PZzythv/xWwNz6Ukb4dC5GLBPCW5hejWZGsaQqJ8drNM 572/Rq4do904U+Px/FUfcZpTUyuwsKc/MYPJ4uW5rdtL5VW8hbiNhkltQ10VrIyZ Ln/xY5X/LdIqCRbzfDhmcl+9N9qFg3uyMkNqu3bLFvm/Sefym6eZ/l/AmjWeZzb0 lEipC+5MYJat7RwjqQ4HImeqMErS68WxgkNkNbZseEvoglao3X4cEDl1PFlnLzhe 30tQSe7rb+TFWn5YK7PEdlBZlAk99jzYIatHI8D5iNodQ0Xu84leA== 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 4gbpx5a0d1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:18 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67VEfeMM000476; Mon, 31 Aug 2026 14:48:17 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gcbyg695a-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 31 Aug 2026 14:48:17 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (smtpav02.fra02v.mail.ibm.com [10.20.54.101]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67VEmDMu45613376 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 31 Aug 2026 14:48:13 GMT Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AFFCE20043; Mon, 31 Aug 2026 14:48:13 +0000 (GMT) Received: from smtpav02.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 464722004B; Mon, 31 Aug 2026 14:48:13 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.87.85.9]) by smtpav02.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 31 Aug 2026 14:48: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 , Sean Christopherson , Suzuki K Poulose , Sven Schnelle , Ulrich Weigand , Vasily Gorbik , Will Deacon , Zenghui Yu Subject: [PATCH v7 23/23] KVM: s390: arm64: Add KVM_S390_ARM64 Kconfig and Makefile Date: Mon, 31 Aug 2026 16:48:00 +0200 Message-ID: <20260831144802.834315-24-seiden@linux.ibm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260831144802.834315-1-seiden@linux.ibm.com> References: <20260831144802.834315-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-Authority-Analysis: v=2.4 cv=PPc/P/qC c=1 sm=1 tr=0 ts=6a959433 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VnNF1IyMAAAA:8 a=5Rhiwhz_oZ9PaowiqMUA:9 X-Proofpoint-GUID: lOlaZ4-tD4Bxv3pInqZ6mfUupYyIQgFw X-Proofpoint-ORIG-GUID: Qi8dhpCXkXbrts8L_m_E550eTj86X_Lh X-Proofpoint-Spam-Info: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfX1uG84JCZ+Y+6 QGE+TIeWtot0HNBXvUqHr339W/1Dvq/pJGhFIM7tLMM69cytpB8Ybm/SE/PaqDo4JOIyC81LC2O Z603Bl80S5+v7G7fjr9LZD2QDyfEAo0= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODMxMDEyNSBTYWx0ZWRfXws/WG1rgzMgs GOBOO+ntubP3JMwQ0VwYDXwj76UvvQoG12mU9HwDOSFLXcJmoPS5XKkUsT+lSSLlGt4iJwY1foH ds0+NF2JCYiCYPtrZx4Z6nZ5AkLry/vctxWuuw1F9ICvxhgeciRDqVkXpy+s9SVUBBmQFAR4v5q rcle+pBQeb0YnszDsfrnfFuo5Q2cdGvRkPESQzhA+BL6xDSpogofhZqW/2SkCGClnsUBuLPK2ES zYsxrB7/es9+Mvu6ylbnM+sok5YrxDTHmQ35R/eN1scdWdywUkW6ikhR1G0mFwQ6JsYmYredhjI RAXQaTuywt+slTuYNhol8K+A+TnGdZOBzgVAM4/jp3PUVZ3htbUn0Nth87l0UX6YpJsVRYXW+xQ pB/4j++na9RV42+BaroVZRpg9z/Fe9vkSETV2eyflBf+YShjHl7+kIRrmI8vdj0sHeXofSJIA6e MA5WRguUS05PkQoT3Tg== 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-08-31_05,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 phishscore=0 adultscore=0 suspectscore=0 bulkscore=0 spamscore=0 priorityscore=1501 impostorscore=0 malwarescore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608310125 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/configs/debug_defconfig | 1 + arch/s390/configs/defconfig | 1 + arch/s390/include/asm/Kbuild | 3 + arch/s390/kvm/Kconfig | 29 ++++++++++ arch/s390/kvm/Makefile | 1 + arch/s390/kvm/arm64/Makefile | 91 +++++++++++++++++++++++++++++++ 6 files changed, 126 insertions(+) create mode 100644 arch/s390/kvm/arm64/Makefile diff --git a/arch/s390/configs/debug_defconfig b/arch/s390/configs/debug_de= fconfig index 3dae71474333..ed9a38e763cd 100644 --- a/arch/s390/configs/debug_defconfig +++ b/arch/s390/configs/debug_defconfig @@ -66,6 +66,7 @@ CONFIG_CMM=3Dm CONFIG_APPLDATA_BASE=3Dy CONFIG_S390_HYPFS_FS=3Dy CONFIG_KVM=3Dm +CONFIG_KVM_S390_ARM64=3Dm CONFIG_KVM_S390_UCONTROL=3Dy CONFIG_S390_UNWIND_SELFTEST=3Dm CONFIG_S390_KPROBES_SANITY_TEST=3Dm diff --git a/arch/s390/configs/defconfig b/arch/s390/configs/defconfig index 6f5722634b4d..92d3c6442b0c 100644 --- a/arch/s390/configs/defconfig +++ b/arch/s390/configs/defconfig @@ -64,6 +64,7 @@ CONFIG_CMM=3Dm CONFIG_APPLDATA_BASE=3Dy CONFIG_S390_HYPFS_FS=3Dy CONFIG_KVM=3Dm +CONFIG_KVM_S390_ARM64=3Dm CONFIG_S390_UNWIND_SELFTEST=3Dm CONFIG_S390_KPROBES_SANITY_TEST=3Dm CONFIG_S390_MODULES_SANITY_TEST=3Dm diff --git a/arch/s390/include/asm/Kbuild b/arch/s390/include/asm/Kbuild index 0c1fc47c3ba0..40a81419e353 100644 --- a/arch/s390/include/asm/Kbuild +++ b/arch/s390/include/asm/Kbuild @@ -8,3 +8,6 @@ generic-y +=3D asm-offsets.h generic-y +=3D mcs_spinlock.h generic-y +=3D mmzone.h generic-y +=3D ring_buffer.h + +generated-y +=3D sysreg-defs.h +generated-y +=3D kvm_arm64_modname.h diff --git a/arch/s390/kvm/Kconfig b/arch/s390/kvm/Kconfig index 8d3ee17a1bcb..9c69ea16031e 100644 --- a/arch/s390/kvm/Kconfig +++ b/arch/s390/kvm/Kconfig @@ -53,4 +53,33 @@ config KVM_S390_UCONTROL =20 If unsure, say N. =20 +config KVM_S390_ARM64 + def_tristate y + prompt "KVM support for hardware accelerated arm64 guests" + depends on HAS_IOMEM + depends on KVM + select GUEST_PERF_EVENTS if PERF_EVENTS + select HAVE_KVM_CPU_RELAX_INTERCEPT + select HAVE_KVM_IRQCHIP + select HAVE_KVM_VCPU_RUN_PID_CHANGE + select IRQ_BYPASS_MANAGER + select KVM_COMMON + select KVM_MMIO + select KVM_VFIO + select SCHED_INFO + select XARRAY_MULTI + help + Enable support for hosting virtualized, hardware-accelerated arm64 + virtual machines on s390 systems using the Start ARM Execution (SAE) + instruction. This requires hardware models that support the Arm + execution facility (AEF). + + The module provides a character device named /dev/kvm-arm64 to expose + the hardware capabilities. + + To compile this driver as a module, choose M here. The module will + be called kvm-arm64. + + If unsure, say N. + endif # VIRTUALIZATION diff --git a/arch/s390/kvm/Makefile b/arch/s390/kvm/Makefile index a4e3875b5bdd..00fabbdaac80 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_S390_ARM64) +=3D arm64/ diff --git a/arch/s390/kvm/arm64/Makefile b/arch/s390/kvm/arm64/Makefile new file mode 100644 index 000000000000..ae614a62f7b5 --- /dev/null +++ b/arch/s390/kvm/arm64/Makefile @@ -0,0 +1,91 @@ +# SPDX-License-Identifier: GPL-2.0 + +KVM :=3D ../../../../virt/kvm +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_S390_ARM64),m) + +kvm-arm64-y =3D $(kvm-arm64-obj) + +else ifeq ($(CONFIG_KVM_S390_ARM64),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 --whole-archive +$(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_S390_ARM64) +=3D kvm-arm64.o --=20 2.53.0