[PATCH] arm64: Expose AIDR_EL1 via sysfs
Anshuman Khandual
anshuman.khandual at arm.com
Fri Apr 4 02:44:21 PDT 2025
On 4/4/25 04:46, Oliver Upton wrote:
> 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 at linux.dev>
> ---
> Documentation/ABI/testing/sysfs-devices-system-cpu | 1 +
> Documentation/arch/arm64/cpu-feature-registers.rst | 13 +++++++------
> arch/arm64/include/asm/cpu.h | 1 +
> arch/arm64/kernel/cpuinfo.c | 3 +++
> 4 files changed, 12 insertions(+), 6 deletions(-)
>
> diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu b/Documentation/ABI/testing/sysfs-devices-system-cpu
> index 206079d3bd5b..9bbf4c27c237 100644
> --- a/Documentation/ABI/testing/sysfs-devices-system-cpu
> +++ b/Documentation/ABI/testing/sysfs-devices-system-cpu
> @@ -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 at lists.infradead.org>
> diff --git a/Documentation/arch/arm64/cpu-feature-registers.rst b/Documentation/arch/arm64/cpu-feature-registers.rst
> index 253e9743de2f..add66afc7b03 100644
> --- a/Documentation/arch/arm64/cpu-feature-registers.rst
> +++ b/Documentation/arch/arm64/cpu-feature-registers.rst
> @@ -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
Right, the existing ones are also marked with _el1 suffix as well.
>
> 3. Implementation
> --------------------
> diff --git a/arch/arm64/include/asm/cpu.h b/arch/arm64/include/asm/cpu.h
> index 81e4157f92b7..71493b760b83 100644
> --- a/arch/arm64/include/asm/cpu.h
> +++ b/arch/arm64/include/asm/cpu.h
> @@ -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;
> diff --git a/arch/arm64/kernel/cpuinfo.c b/arch/arm64/kernel/cpuinfo.c
> index 285d7d538342..621218d2a991 100644
> --- a/arch/arm64/kernel/cpuinfo.c
> +++ b/arch/arm64/kernel/cpuinfo.c
> @@ -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);
>
> base-commit: e8b471285262d1561feb2eb266aab6ebe7094124
LGTM
Reviewed-by: Anshuman Khandual <anshuman.khandual at arm.com>
More information about the linux-arm-kernel
mailing list