Commit 7af33504 authored by Will Deacon's avatar Will Deacon Committed by Peter Zijlstra
Browse files

arm64: Advertise CPUs capable of running 32-bit applications in sysfs



Since 32-bit applications will be killed if they are caught trying to
execute on a 64-bit-only CPU in a mismatched system, advertise the set
of 32-bit capable CPUs to userspace in sysfs.

Signed-off-by: default avatarWill Deacon <will@kernel.org>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Link: https://lore.kernel.org/r/20210730112443.23245-14-will@kernel.org
parent df950811
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -494,6 +494,15 @@ Description: AArch64 CPU registers
		'identification' directory exposes the CPU ID registers for
		identifying model and revision of the CPU.

What:		/sys/devices/system/cpu/aarch32_el0
Date:		May 2021
Contact:	Linux ARM Kernel Mailing list <linux-arm-kernel@lists.infradead.org>
Description:	Identifies the subset of CPUs in the system that can execute
		AArch32 (32-bit ARM) applications. If present, the same format as
		/sys/devices/system/cpu/{offline,online,possible,present} is used.
		If absent, then all or none of the CPUs can execute AArch32
		applications and execve() will behave accordingly.

What:		/sys/devices/system/cpu/cpu#/cpu_capacity
Date:		December 2016
Contact:	Linux kernel mailing list <linux-kernel@vger.kernel.org>
+19 −0
Original line number Diff line number Diff line
@@ -67,6 +67,7 @@
#include <linux/crash_dump.h>
#include <linux/sort.h>
#include <linux/stop_machine.h>
#include <linux/sysfs.h>
#include <linux/types.h>
#include <linux/minmax.h>
#include <linux/mm.h>
@@ -1321,6 +1322,24 @@ const struct cpumask *system_32bit_el0_cpumask(void)
	return cpu_possible_mask;
}

static ssize_t aarch32_el0_show(struct device *dev,
				struct device_attribute *attr, char *buf)
{
	const struct cpumask *mask = system_32bit_el0_cpumask();

	return sysfs_emit(buf, "%*pbl\n", cpumask_pr_args(mask));
}
static const DEVICE_ATTR_RO(aarch32_el0);

static int __init aarch32_el0_sysfs_init(void)
{
	if (!allow_mismatched_32bit_el0)
		return 0;

	return device_create_file(cpu_subsys.dev_root, &dev_attr_aarch32_el0);
}
device_initcall(aarch32_el0_sysfs_init);

static bool has_32bit_el0(const struct arm64_cpu_capabilities *entry, int scope)
{
	if (!has_cpuid_feature(entry, scope))