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

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
...@@ -494,6 +494,15 @@ Description: AArch64 CPU registers ...@@ -494,6 +494,15 @@ Description: AArch64 CPU registers
'identification' directory exposes the CPU ID registers for 'identification' directory exposes the CPU ID registers for
identifying model and revision of the CPU. 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 What: /sys/devices/system/cpu/cpu#/cpu_capacity
Date: December 2016 Date: December 2016
Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org> Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org>
......
...@@ -67,6 +67,7 @@ ...@@ -67,6 +67,7 @@
#include <linux/crash_dump.h> #include <linux/crash_dump.h>
#include <linux/sort.h> #include <linux/sort.h>
#include <linux/stop_machine.h> #include <linux/stop_machine.h>
#include <linux/sysfs.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/minmax.h> #include <linux/minmax.h>
#include <linux/mm.h> #include <linux/mm.h>
...@@ -1321,6 +1322,24 @@ const struct cpumask *system_32bit_el0_cpumask(void) ...@@ -1321,6 +1322,24 @@ const struct cpumask *system_32bit_el0_cpumask(void)
return cpu_possible_mask; 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) static bool has_32bit_el0(const struct arm64_cpu_capabilities *entry, int scope)
{ {
if (!has_cpuid_feature(entry, scope)) if (!has_cpuid_feature(entry, scope))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment