]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
arm64: Expose AIDR_EL1 via sysfs
authorOliver Upton <oliver.upton@linux.dev>
Thu, 3 Apr 2025 23:16:26 +0000 (16:16 -0700)
committerWill Deacon <will@kernel.org>
Tue, 29 Apr 2025 13:03:18 +0000 (14:03 +0100)
The KVM PV ABI recently added a feature that allows the VM to discover
the set of physical CPU implementations, identified by a tuple of
{MIDR_EL1, REVIDR_EL1, AIDR_EL1}. Unlike other KVM PV features, the
expectation is that the VMM implements the hypercall instead of KVM as
it has the authoritative view of where the VM gets scheduled.

To do this the VMM needs to know the values of these registers on any
CPU in the system. While MIDR_EL1 and REVIDR_EL1 are already exposed,
AIDR_EL1 is not. Provide it in sysfs along with the other identification
registers.

Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
Link: https://lore.kernel.org/r/20250403231626.3181116-1-oliver.upton@linux.dev
Signed-off-by: Will Deacon <will@kernel.org>
Documentation/ABI/testing/sysfs-devices-system-cpu
Documentation/arch/arm64/cpu-feature-registers.rst
arch/arm64/include/asm/cpu.h
arch/arm64/kernel/cpuinfo.c

index 206079d3bd5b127b0ccddfd4be50c978563a0b46..9bbf4c27c23774c77f42e9092b8061cb3bd51f1f 100644 (file)
@@ -485,6 +485,7 @@ What:               /sys/devices/system/cpu/cpuX/regs/
                /sys/devices/system/cpu/cpuX/regs/identification/
                /sys/devices/system/cpu/cpuX/regs/identification/midr_el1
                /sys/devices/system/cpu/cpuX/regs/identification/revidr_el1
+               /sys/devices/system/cpu/cpuX/regs/identification/aidr_el1
                /sys/devices/system/cpu/cpuX/regs/identification/smidr_el1
 Date:          June 2016
 Contact:       Linux ARM Kernel Mailing list <linux-arm-kernel@lists.infradead.org>
index 253e9743de2f96de515ee844f7b3e3a671a368b1..add66afc7b032a299ad4f7fbf35e620e07ffd4d3 100644 (file)
@@ -72,14 +72,15 @@ there are some issues with their usage.
     process could be migrated to another CPU by the time it uses the
     register value, unless the CPU affinity is set. Hence, there is no
     guarantee that the value reflects the processor that it is
-    currently executing on. The REVIDR is not exposed due to this
-    constraint, as REVIDR makes sense only in conjunction with the
-    MIDR. Alternately, MIDR_EL1 and REVIDR_EL1 are exposed via sysfs
-    at::
+    currently executing on. REVIDR and AIDR are not exposed due to this
+    constraint, as these registers only make sense in conjunction with
+    the MIDR. Alternately, MIDR_EL1, REVIDR_EL1, and AIDR_EL1 are exposed
+    via sysfs at::
 
        /sys/devices/system/cpu/cpu$ID/regs/identification/
-                                                     \- midr
-                                                     \- revidr
+                                                     \- midr_el1
+                                                     \- revidr_el1
+                                                     \- aidr_el1
 
 3. Implementation
 --------------------
index 81e4157f92b741ab4b94436dba7f88c041b4267e..71493b760b8394c8f5adb491f291ae9cfd551382 100644 (file)
@@ -44,6 +44,7 @@ struct cpuinfo_arm64 {
        u64             reg_dczid;
        u64             reg_midr;
        u64             reg_revidr;
+       u64             reg_aidr;
        u64             reg_gmid;
        u64             reg_smidr;
        u64             reg_mpamidr;
index 285d7d53834205b4eb966de3776a34bef326b930..621218d2a99171cf4b565085e3c50586ef3ea5e6 100644 (file)
@@ -328,11 +328,13 @@ static const struct kobj_type cpuregs_kobj_type = {
 
 CPUREGS_ATTR_RO(midr_el1, midr);
 CPUREGS_ATTR_RO(revidr_el1, revidr);
+CPUREGS_ATTR_RO(aidr_el1, aidr);
 CPUREGS_ATTR_RO(smidr_el1, smidr);
 
 static struct attribute *cpuregs_id_attrs[] = {
        &cpuregs_attr_midr_el1.attr,
        &cpuregs_attr_revidr_el1.attr,
+       &cpuregs_attr_aidr_el1.attr,
        NULL
 };
 
@@ -469,6 +471,7 @@ static void __cpuinfo_store_cpu(struct cpuinfo_arm64 *info)
        info->reg_dczid = read_cpuid(DCZID_EL0);
        info->reg_midr = read_cpuid_id();
        info->reg_revidr = read_cpuid(REVIDR_EL1);
+       info->reg_aidr = read_cpuid(AIDR_EL1);
 
        info->reg_id_aa64dfr0 = read_cpuid(ID_AA64DFR0_EL1);
        info->reg_id_aa64dfr1 = read_cpuid(ID_AA64DFR1_EL1);