From: Steffen Eiden <seiden@linux.ibm.com>
To: Marc Zyngier <maz@kernel.org>, Oliver Upton <oupton@kernel.org>,
Fuad Tabba <fuad.tabba@linux.dev>,
Joey Gouly <joey.gouly@arm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Zenghui Yu <yuzenghui@huawei.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Andreas Grapentin <gra@linux.ibm.com>,
Christian Borntraeger <borntraeger@linux.ibm.com>,
Janosch Frank <frankja@linux.ibm.com>,
Claudio Imbrenda <imbrenda@linux.ibm.com>,
David Hildenbrand <david@kernel.org>,
Heiko Carstens <hca@linux.ibm.com>,
Vasily Gorbik <gor@linux.ibm.com>,
Alexander Gordeev <agordeev@linux.ibm.com>,
Sven Schnelle <svens@linux.ibm.com>,
Friedrich Welter <fritz@linux.ibm.com>,
Gautam Gala <ggala@linux.ibm.com>,
Hariharan Mari <hari55@linux.ibm.com>,
Hendrik Brueckner <brueckner@linux.ibm.com>,
Nico Boehr <nrb@linux.ibm.com>,
Ulrich Weigand <Ulrich.Weigand@de.ibm.com>,
Arnd Bergmann <arnd@arndb.de>,
Paolo Bonzini <pbonzini@redhat.com>
Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev,
linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
linux-s390@vger.kernel.org, Steffen Eiden <seiden@linux.ibm.com>
Subject: [PATCH v3 23/23] s390: Report AEF features to sysfs
Date: Fri, 06 Nov 2026 17:07:56 +0100 [thread overview]
Message-ID: <20261106-sysreg-v3-23-75e95980fb10@linux.ibm.com> (raw)
In-Reply-To: <20261106-sysreg-v3-0-75e95980fb10@linux.ibm.com>
Display various information about the Arm execution Facility (AEF) to
userspace. The files are located in /sys/firmware/aef/. Show if the
feature is available and usable for the host, which formats are
available, and how many arm vCPUS per guest are supported by the
machine. Additionally, provide the raw binary output of QAAF fc1 (Query
Model Capabilities) in the file qmc and fc2 (Initial
System-Registers-Save Area) in the file save_area.
Co-developed-by: Janosch Frank <frankja@linux.ibm.com>
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Co-developed-by: Andreas Grapentin <gra@linux.ibm.com>
Signed-off-by: Andreas Grapentin <gra@linux.ibm.com>
Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
---
Documentation/ABI/testing/sysfs-firmware-aef | 70 +++++++++++++++++
arch/s390/kernel/aef.c | 113 +++++++++++++++++++++++++++
2 files changed, 183 insertions(+)
diff --git a/Documentation/ABI/testing/sysfs-firmware-aef b/Documentation/ABI/testing/sysfs-firmware-aef
new file mode 100644
index 000000000000..6ccd8491a017
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-firmware-aef
@@ -0,0 +1,70 @@
+What: /sys/firmware/aef/
+KernelVersion: 7.5
+Contact: linux-s390@vger.kernel.org
+Description: Various interfaces to query information about the ARM
+ Execution Facility (AEF).
+
+ The directory is present only on machines that provide
+ the AEF (SCLP facility bit).
+
+What: /sys/firmware/aef/arm_guest_supp
+KernelVersion: 7.5
+Contact: linux-s390@vger.kernel.org
+Description: Read-only, decimal boolean. Reports 1 if all requirements
+ for running arm64 KVM guests (KVM module kvm_arm64) are
+ satisfied by the machine, 0 otherwise. This is equivalent to the
+ logical AND of sae_avail, ptff_avail and edat2_avail below.
+
+What: /sys/firmware/aef/query/
+KernelVersion: 7.5
+Contact: linux-s390@vger.kernel.org
+Description: Raw machine characteristics as reported by the QAAF
+ instruction.
+
+What: /sys/firmware/aef/query/sae_avail
+KernelVersion: 7.5
+Contact: linux-s390@vger.kernel.org
+Description: Read-only, decimal boolean. Reports 1 if the machine
+ provides the SAE instruction.
+
+What: /sys/firmware/aef/query/ptff_avail
+KernelVersion: 7.5
+Contact: linux-s390@vger.kernel.org
+Description: Read-only, decimal boolean. Reports 1 if the PTFF
+ instruction supports the QAGTO and QAGPT subfunctions.
+
+What: /sys/firmware/aef/query/edat2_avail
+KernelVersion: 7.5
+Contact: linux-s390@vger.kernel.org
+Description: Read-only, decimal boolean. Reports 1 if the EDAT-2
+ facility is available.
+
+What: /sys/firmware/aef/query/supp_state_desc_formats
+KernelVersion: 7.5
+Contact: linux-s390@vger.kernel.org
+Description: Read-only, 0x-prefixed hexadecimal bitmask. Bitmask of
+ the SAE state description formats supported by the machine.
+
+What: /sys/firmware/aef/query/supp_save_area_formats
+KernelVersion: 7.5
+Contact: linux-s390@vger.kernel.org
+Description: Read-only, 0x-prefixed hexadecimal bitmask. Bitmask of
+ the SAE save area formats supported by the machine.
+
+What: /sys/firmware/aef/query/max_num_vcpu
+KernelVersion: 7.5
+Contact: linux-s390@vger.kernel.org
+Description: Read-only, decimal number. Maximum number of guest CPUs
+ per VM.
+
+What: /sys/firmware/aef/query/qmc
+KernelVersion: 7.5
+Contact: linux-s390@vger.kernel.org
+Description: Read-only binary attribute, 4096 bytes. Contains the
+ unmodified, machine specific QMC response block.
+
+What: /sys/firmware/aef/query/save_area
+KernelVersion: 7.5
+Contact: linux-s390@vger.kernel.org
+Description: Read-only binary attribute, 4096 bytes. Contains the
+ unmodified, machine specific GISRSA block.
diff --git a/arch/s390/kernel/aef.c b/arch/s390/kernel/aef.c
index 31e18953d7b3..96a6d63b2695 100644
--- a/arch/s390/kernel/aef.c
+++ b/arch/s390/kernel/aef.c
@@ -11,6 +11,15 @@
static struct qaaf_qmc_block qmc = {};
static struct kvm_sae_save_area save_area = {};
+static struct aef_info {
+ unsigned long arm_guest_supp;
+ unsigned long sae_avail;
+ unsigned long ptff_avail;
+ unsigned long edat2_avail;
+ unsigned long supp_state_desc_formats;
+ unsigned long supp_save_area_formats;
+ unsigned long max_num_vcpu;
+} info = {};
const struct kvm_sae_save_area *aef_gisrsa(void)
{
@@ -38,6 +47,68 @@ bool aef_usable(void)
}
EXPORT_SYMBOL_GPL(aef_usable);
+static struct kset *aef_query_kset;
+static struct kobject *aef_kobj;
+
+#define aef_sysfs_qval_def(_name, _fmt) \
+ static ssize_t _name##_show(struct kobject *kobj, \
+ struct kobj_attribute *attr, \
+ char *buf) \
+ { \
+ return sysfs_emit(buf, _fmt "\n", info._name); \
+ } \
+ static struct kobj_attribute _name##_attr = __ATTR_RO(_name)
+
+#define aef_sysfs_qval_attr(_name) &_name##_attr.attr
+
+aef_sysfs_qval_def(arm_guest_supp, "%lu");
+aef_sysfs_qval_def(sae_avail, "%lu");
+aef_sysfs_qval_def(ptff_avail, "%lu");
+aef_sysfs_qval_def(edat2_avail, "%lu");
+aef_sysfs_qval_def(supp_state_desc_formats, "0x%lx");
+aef_sysfs_qval_def(supp_save_area_formats, "0x%lx");
+aef_sysfs_qval_def(max_num_vcpu, "%lu");
+
+static ssize_t qmc_read(struct file *filp, struct kobject *kobj,
+ const struct bin_attribute *attr, char *buf, loff_t off,
+ size_t count)
+{
+ return memory_read_from_buffer(buf, count, &off, &qmc, sizeof(qmc));
+}
+
+BIN_ATTR_RO(qmc, sizeof(qmc));
+
+static ssize_t save_area_read(struct file *filp, struct kobject *kobj,
+ const struct bin_attribute *attr, char *buf,
+ loff_t off, size_t count)
+{
+ return memory_read_from_buffer(buf, count, &off, &save_area,
+ sizeof(save_area));
+}
+
+BIN_ATTR_RO(save_area, sizeof(save_area));
+
+static struct attribute *aef_query_attrs[] = {
+ aef_sysfs_qval_attr(sae_avail),
+ aef_sysfs_qval_attr(ptff_avail),
+ aef_sysfs_qval_attr(edat2_avail),
+ aef_sysfs_qval_attr(supp_state_desc_formats),
+ aef_sysfs_qval_attr(supp_save_area_formats),
+ aef_sysfs_qval_attr(max_num_vcpu),
+ NULL,
+};
+
+static const struct bin_attribute *aef_query_bin_attrs[] = {
+ &bin_attr_qmc,
+ &bin_attr_save_area,
+ NULL,
+};
+
+static struct attribute_group aef_query_attr_group = {
+ .attrs = aef_query_attrs,
+ .bin_attrs = aef_query_bin_attrs,
+};
+
static int __init aef_init_save_area(void)
{
int ret;
@@ -71,6 +142,17 @@ static int __init aef_query_info(void)
return 0;
}
+static void __init aef_info_init(void)
+{
+ info.sae_avail = sclp.has_aef;
+ info.ptff_avail = ptff_query(PTFF_QAGTO) && ptff_query(PTFF_QAGPT);
+ info.edat2_avail = cpu_has_edat2();
+ info.arm_guest_supp = info.sae_avail && info.ptff_avail && info.edat2_avail;
+ info.supp_state_desc_formats = qmc.ssdf;
+ info.supp_save_area_formats = qmc.ssaf;
+ info.max_num_vcpu = qmc.maxncpu + 1;
+}
+
static int __init aef_sysfs_init(void)
{
int rc;
@@ -86,9 +168,40 @@ static int __init aef_sysfs_init(void)
if (rc)
return rc;
+ /* sysfs failure below does not invalidate the AEF data */
aef_valid = true;
+ aef_info_init();
+
+ aef_kobj = kobject_create_and_add("aef", firmware_kobj);
+ if (!aef_kobj)
+ return -ENOMEM;
+
+ rc = sysfs_create_file(aef_kobj, aef_sysfs_qval_attr(arm_guest_supp));
+ if (rc)
+ goto out_kobj;
+
+ aef_query_kset = kset_create_and_add("query", NULL, aef_kobj);
+ if (!aef_query_kset) {
+ rc = -ENOMEM;
+ goto out_arm_guest_supp;
+ }
+
+ rc = sysfs_create_group(&aef_query_kset->kobj, &aef_query_attr_group);
+ if (rc)
+ goto out_kset;
+
return 0;
+
+out_kset:
+ kset_unregister(aef_query_kset);
+out_arm_guest_supp:
+ sysfs_remove_file(aef_kobj, &arm_guest_supp_attr.attr);
+out_kobj:
+ kobject_del(aef_kobj);
+ kobject_put(aef_kobj);
+
+ return rc;
}
arch_initcall(aef_sysfs_init);
--
2.56.0
prev parent reply other threads:[~2026-11-06 16:08 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-06 16:07 [PATCH v3 00/23] KVM: arm64 on s390 System Register Handling Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 01/23] KVM: arm64: Refactor idreg caching into dedicated structure Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 02/23] KVM: arm64: Extract number of sys_reg_desc into a constant Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 03/23] arm64: sysreg: Convert OSLSR to automatic register generation Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 04/23] arm64: Prepare headers for sysreg sharing with s390 Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 05/23] arm64: Share system register related headers and functions " Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 06/23] KVM: s390: arm64: Prepare for sharing arm64 SVE and ftr-reg code Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 07/23] KVM: arm64: Prepare sys_regs.c for sharing with s390 Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 08/23] KVM: arm64: Share system register code " Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 09/23] s390: tools: Share arm64/kvm headers Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 10/23] s390: Add range check asm macro Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 11/23] s390: Read/write ARM system registers Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 12/23] s390: Query arm guest time Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 13/23] KVM: s390: arm64: Query Available Arm features Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 14/23] KVM: s390: arm64: Verify machine feature set before loading Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 15/23] KVM: s390: arm64: Implement feature sanitisation Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 16/23] KVM: s390: arm64: Implement arm sysreg managing infrastructure Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 17/23] KVM: s390: arm64: Integrate sysreg into the host Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 18/23] KVM: s390: arm64: Use QAAF init save area Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 19/23] KVM: s390: arm64: Implement exception injection Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 20/23] KVM: s390: arm64: Finalize page fault handling Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 21/23] KVM: s390: arm64: Implement SVE for arm guests Steffen Eiden
2026-11-06 16:07 ` [PATCH v3 22/23] KVM: s390: arm64: Promote PTRAUTH capability Steffen Eiden
2026-11-06 16:07 ` Steffen Eiden [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261106-sysreg-v3-23-75e95980fb10@linux.ibm.com \
--to=seiden@linux.ibm.com \
--cc=Ulrich.Weigand@de.ibm.com \
--cc=agordeev@linux.ibm.com \
--cc=arnd@arndb.de \
--cc=borntraeger@linux.ibm.com \
--cc=brueckner@linux.ibm.com \
--cc=catalin.marinas@arm.com \
--cc=david@kernel.org \
--cc=frankja@linux.ibm.com \
--cc=fritz@linux.ibm.com \
--cc=fuad.tabba@linux.dev \
--cc=ggala@linux.ibm.com \
--cc=gor@linux.ibm.com \
--cc=gra@linux.ibm.com \
--cc=hari55@linux.ibm.com \
--cc=hca@linux.ibm.com \
--cc=imbrenda@linux.ibm.com \
--cc=joey.gouly@arm.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=maz@kernel.org \
--cc=nrb@linux.ibm.com \
--cc=oupton@kernel.org \
--cc=pbonzini@redhat.com \
--cc=suzuki.poulose@arm.com \
--cc=svens@linux.ibm.com \
--cc=will@kernel.org \
--cc=yuzenghui@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®