Loading arch/arm/kernel/setup.c +22 −7 Original line number Diff line number Diff line Loading @@ -393,19 +393,34 @@ static void __init cpuid_init_hwcaps(void) elf_hwcap |= HWCAP_LPAE; } static void __init feat_v6_fixup(void) static void __init elf_hwcap_fixup(void) { int id = read_cpuid_id(); if ((id & 0xff0f0000) != 0x41070000) return; unsigned id = read_cpuid_id(); unsigned sync_prim; /* * HWCAP_TLS is available only on 1136 r1p0 and later, * see also kuser_get_tls_init. */ if ((((id >> 4) & 0xfff) == 0xb36) && (((id >> 20) & 3) == 0)) if (read_cpuid_part() == ARM_CPU_PART_ARM1136 && ((id >> 20) & 3) == 0) { elf_hwcap &= ~HWCAP_TLS; return; } /* Verify if CPUID scheme is implemented */ if ((id & 0x000f0000) != 0x000f0000) return; /* * If the CPU supports LDREX/STREX and LDREXB/STREXB, * avoid advertising SWP; it may not be atomic with * multiprocessing cores. */ sync_prim = ((read_cpuid_ext(CPUID_EXT_ISAR3) >> 8) & 0xf0) | ((read_cpuid_ext(CPUID_EXT_ISAR4) >> 20) & 0x0f); if (sync_prim >= 0x13) elf_hwcap &= ~HWCAP_SWP; } /* Loading Loading @@ -609,7 +624,7 @@ static void __init setup_processor(void) #endif erratum_a15_798181_init(); feat_v6_fixup(); elf_hwcap_fixup(); cacheid_init(); cpu_init(); Loading arch/arm/kernel/swp_emulate.c +4 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ #include <linux/perf_event.h> #include <asm/opcodes.h> #include <asm/system_info.h> #include <asm/traps.h> #include <asm/uaccess.h> Loading Loading @@ -266,6 +267,9 @@ static struct undef_hook swp_hook = { */ static int __init swp_emulation_init(void) { if (cpu_architecture() < CPU_ARCH_ARMv7) return 0; #ifdef CONFIG_PROC_FS if (!proc_create("cpu/swp_emulation", S_IRUGO, NULL, &proc_status_fops)) return -ENOMEM; Loading arch/arm/mm/Kconfig +1 −1 Original line number Diff line number Diff line Loading @@ -669,7 +669,7 @@ config ARM_VIRT_EXT details. config SWP_EMULATE bool "Emulate SWP/SWPB instructions" bool "Emulate SWP/SWPB instructions" if !SMP depends on CPU_V7 default y if SMP select HAVE_PROC_CPU if PROC_FS Loading Loading
arch/arm/kernel/setup.c +22 −7 Original line number Diff line number Diff line Loading @@ -393,19 +393,34 @@ static void __init cpuid_init_hwcaps(void) elf_hwcap |= HWCAP_LPAE; } static void __init feat_v6_fixup(void) static void __init elf_hwcap_fixup(void) { int id = read_cpuid_id(); if ((id & 0xff0f0000) != 0x41070000) return; unsigned id = read_cpuid_id(); unsigned sync_prim; /* * HWCAP_TLS is available only on 1136 r1p0 and later, * see also kuser_get_tls_init. */ if ((((id >> 4) & 0xfff) == 0xb36) && (((id >> 20) & 3) == 0)) if (read_cpuid_part() == ARM_CPU_PART_ARM1136 && ((id >> 20) & 3) == 0) { elf_hwcap &= ~HWCAP_TLS; return; } /* Verify if CPUID scheme is implemented */ if ((id & 0x000f0000) != 0x000f0000) return; /* * If the CPU supports LDREX/STREX and LDREXB/STREXB, * avoid advertising SWP; it may not be atomic with * multiprocessing cores. */ sync_prim = ((read_cpuid_ext(CPUID_EXT_ISAR3) >> 8) & 0xf0) | ((read_cpuid_ext(CPUID_EXT_ISAR4) >> 20) & 0x0f); if (sync_prim >= 0x13) elf_hwcap &= ~HWCAP_SWP; } /* Loading Loading @@ -609,7 +624,7 @@ static void __init setup_processor(void) #endif erratum_a15_798181_init(); feat_v6_fixup(); elf_hwcap_fixup(); cacheid_init(); cpu_init(); Loading
arch/arm/kernel/swp_emulate.c +4 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ #include <linux/perf_event.h> #include <asm/opcodes.h> #include <asm/system_info.h> #include <asm/traps.h> #include <asm/uaccess.h> Loading Loading @@ -266,6 +267,9 @@ static struct undef_hook swp_hook = { */ static int __init swp_emulation_init(void) { if (cpu_architecture() < CPU_ARCH_ARMv7) return 0; #ifdef CONFIG_PROC_FS if (!proc_create("cpu/swp_emulation", S_IRUGO, NULL, &proc_status_fops)) return -ENOMEM; Loading
arch/arm/mm/Kconfig +1 −1 Original line number Diff line number Diff line Loading @@ -669,7 +669,7 @@ config ARM_VIRT_EXT details. config SWP_EMULATE bool "Emulate SWP/SWPB instructions" bool "Emulate SWP/SWPB instructions" if !SMP depends on CPU_V7 default y if SMP select HAVE_PROC_CPU if PROC_FS Loading