ARM: elf: add new hwcap for identifying atomic ldrd/strd instructions
authorWill Deacon <will.deacon@arm.com>
Mon, 8 Apr 2013 16:13:12 +0000 (17:13 +0100)
committerWill Deacon <will.deacon@arm.com>
Thu, 30 May 2013 15:02:34 +0000 (16:02 +0100)
CPUs implementing LPAE have atomic ldrd/strd instructions, meaning that
userspace software can avoid having to use the exclusive variants of
these instructions if they wish.

This patch advertises the atomicity of these instructions via the
hwcaps, so userspace can detect this CPU feature.

Reported-by: Vladimir Danushevsky <vladimir.danushevsky@oracle.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm/include/uapi/asm/hwcap.h
arch/arm/kernel/setup.c

index 3688fd15a32dd5a5e5f81aef148cf397022fc2d7..6d34d080372abe0fd14769c7c6e7360aece5dfdd 100644 (file)
@@ -25,6 +25,6 @@
 #define HWCAP_IDIVT    (1 << 18)
 #define HWCAP_VFPD32   (1 << 19)       /* set if VFP has 32 regs (not 16) */
 #define HWCAP_IDIV     (HWCAP_IDIVA | HWCAP_IDIVT)
-
+#define HWCAP_LPAE     (1 << 20)
 
 #endif /* _UAPI__ASMARM_HWCAP_H */
index 1522c7ae31b0c239901237569bad5cbb4ec7b02e..bdcd4dd13230a3e05f3176f0a146bad7c3b4df48 100644 (file)
@@ -355,7 +355,7 @@ void __init early_print(const char *str, ...)
 
 static void __init cpuid_init_hwcaps(void)
 {
-       unsigned int divide_instrs;
+       unsigned int divide_instrs, vmsa;
 
        if (cpu_architecture() < CPU_ARCH_ARMv7)
                return;
@@ -368,6 +368,11 @@ static void __init cpuid_init_hwcaps(void)
        case 1:
                elf_hwcap |= HWCAP_IDIVT;
        }
+
+       /* LPAE implies atomic ldrd/strd instructions */
+       vmsa = (read_cpuid_ext(CPUID_EXT_MMFR0) & 0xf) >> 0;
+       if (vmsa >= 5)
+               elf_hwcap |= HWCAP_LPAE;
 }
 
 static void __init feat_v6_fixup(void)
@@ -872,6 +877,7 @@ static const char *hwcap_str[] = {
        "vfpv4",
        "idiva",
        "idivt",
+       "lpae",
        NULL
 };