|
@@ -43,6 +43,7 @@
|
|
|
#include <linux/of_fdt.h>
|
|
|
#include <linux/of_platform.h>
|
|
|
#include <linux/efi.h>
|
|
|
+#include <linux/personality.h>
|
|
|
|
|
|
#include <asm/fixmap.h>
|
|
|
#include <asm/cpu.h>
|
|
@@ -78,7 +79,6 @@ unsigned int compat_elf_hwcap2 __read_mostly;
|
|
|
#endif
|
|
|
|
|
|
static const char *cpu_name;
|
|
|
-static const char *machine_name;
|
|
|
phys_addr_t __fdt_pointer __initdata;
|
|
|
|
|
|
/*
|
|
@@ -315,8 +315,7 @@ static void __init setup_machine_fdt(phys_addr_t dt_phys)
|
|
|
cpu_relax();
|
|
|
}
|
|
|
|
|
|
- machine_name = of_flat_dt_get_machine_name();
|
|
|
- dump_stack_set_arch_desc("%s (DT)", machine_name);
|
|
|
+ dump_stack_set_arch_desc("%s (DT)", of_flat_dt_get_machine_name());
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -451,14 +450,50 @@ static const char *hwcap_str[] = {
|
|
|
NULL
|
|
|
};
|
|
|
|
|
|
+#ifdef CONFIG_COMPAT
|
|
|
+static const char *compat_hwcap_str[] = {
|
|
|
+ "swp",
|
|
|
+ "half",
|
|
|
+ "thumb",
|
|
|
+ "26bit",
|
|
|
+ "fastmult",
|
|
|
+ "fpa",
|
|
|
+ "vfp",
|
|
|
+ "edsp",
|
|
|
+ "java",
|
|
|
+ "iwmmxt",
|
|
|
+ "crunch",
|
|
|
+ "thumbee",
|
|
|
+ "neon",
|
|
|
+ "vfpv3",
|
|
|
+ "vfpv3d16",
|
|
|
+ "tls",
|
|
|
+ "vfpv4",
|
|
|
+ "idiva",
|
|
|
+ "idivt",
|
|
|
+ "vfpd32",
|
|
|
+ "lpae",
|
|
|
+ "evtstrm"
|
|
|
+};
|
|
|
+
|
|
|
+static const char *compat_hwcap2_str[] = {
|
|
|
+ "aes",
|
|
|
+ "pmull",
|
|
|
+ "sha1",
|
|
|
+ "sha2",
|
|
|
+ "crc32",
|
|
|
+ NULL
|
|
|
+};
|
|
|
+#endif /* CONFIG_COMPAT */
|
|
|
+
|
|
|
static int c_show(struct seq_file *m, void *v)
|
|
|
{
|
|
|
- int i;
|
|
|
-
|
|
|
- seq_printf(m, "Processor\t: %s rev %d (%s)\n",
|
|
|
- cpu_name, read_cpuid_id() & 15, ELF_PLATFORM);
|
|
|
+ int i, j;
|
|
|
|
|
|
for_each_online_cpu(i) {
|
|
|
+ struct cpuinfo_arm64 *cpuinfo = &per_cpu(cpu_data, i);
|
|
|
+ u32 midr = cpuinfo->reg_midr;
|
|
|
+
|
|
|
/*
|
|
|
* glibc reads /proc/cpuinfo to determine the number of
|
|
|
* online processors, looking for lines beginning with
|
|
@@ -467,24 +502,38 @@ static int c_show(struct seq_file *m, void *v)
|
|
|
#ifdef CONFIG_SMP
|
|
|
seq_printf(m, "processor\t: %d\n", i);
|
|
|
#endif
|
|
|
- }
|
|
|
-
|
|
|
- /* dump out the processor features */
|
|
|
- seq_puts(m, "Features\t: ");
|
|
|
-
|
|
|
- for (i = 0; hwcap_str[i]; i++)
|
|
|
- if (elf_hwcap & (1 << i))
|
|
|
- seq_printf(m, "%s ", hwcap_str[i]);
|
|
|
-
|
|
|
- seq_printf(m, "\nCPU implementer\t: 0x%02x\n", read_cpuid_id() >> 24);
|
|
|
- seq_printf(m, "CPU architecture: AArch64\n");
|
|
|
- seq_printf(m, "CPU variant\t: 0x%x\n", (read_cpuid_id() >> 20) & 15);
|
|
|
- seq_printf(m, "CPU part\t: 0x%03x\n", (read_cpuid_id() >> 4) & 0xfff);
|
|
|
- seq_printf(m, "CPU revision\t: %d\n", read_cpuid_id() & 15);
|
|
|
|
|
|
- seq_puts(m, "\n");
|
|
|
-
|
|
|
- seq_printf(m, "Hardware\t: %s\n", machine_name);
|
|
|
+ /*
|
|
|
+ * Dump out the common processor features in a single line.
|
|
|
+ * Userspace should read the hwcaps with getauxval(AT_HWCAP)
|
|
|
+ * rather than attempting to parse this, but there's a body of
|
|
|
+ * software which does already (at least for 32-bit).
|
|
|
+ */
|
|
|
+ seq_puts(m, "Features\t:");
|
|
|
+ if (personality(current->personality) == PER_LINUX32) {
|
|
|
+#ifdef CONFIG_COMPAT
|
|
|
+ for (j = 0; compat_hwcap_str[j]; j++)
|
|
|
+ if (compat_elf_hwcap & (1 << j))
|
|
|
+ seq_printf(m, " %s", compat_hwcap_str[j]);
|
|
|
+
|
|
|
+ for (j = 0; compat_hwcap2_str[j]; j++)
|
|
|
+ if (compat_elf_hwcap2 & (1 << j))
|
|
|
+ seq_printf(m, " %s", compat_hwcap2_str[j]);
|
|
|
+#endif /* CONFIG_COMPAT */
|
|
|
+ } else {
|
|
|
+ for (j = 0; hwcap_str[j]; j++)
|
|
|
+ if (elf_hwcap & (1 << j))
|
|
|
+ seq_printf(m, " %s", hwcap_str[j]);
|
|
|
+ }
|
|
|
+ seq_puts(m, "\n");
|
|
|
+
|
|
|
+ seq_printf(m, "CPU implementer\t: 0x%02x\n",
|
|
|
+ MIDR_IMPLEMENTOR(midr));
|
|
|
+ seq_printf(m, "CPU architecture: 8\n");
|
|
|
+ seq_printf(m, "CPU variant\t: 0x%x\n", MIDR_VARIANT(midr));
|
|
|
+ seq_printf(m, "CPU part\t: 0x%03x\n", MIDR_PARTNUM(midr));
|
|
|
+ seq_printf(m, "CPU revision\t: %d\n\n", MIDR_REVISION(midr));
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
}
|