On Thursday 01 September 2011, Andrew Stubbs wrote:
> Hi all,
> 
> I'm currently trying to get GCC to auto-detect what CPU to optimize for 
> by finding out what CPU it's actually running on (the user would only 
> have to pass -mcpu=native). It does this simply by reading /proc/cpuinfo.
> 
> The problem is finding what magic numbers correspond to what CPU. I've 
> found the numbers for A8 and A9 empirically, but I'd like a longer list 
> than that!
> 
> Does anybody have a list of such numbers?
> 
> Or else, perhaps people could just post any number they happen to know?
> 
> I do have a few devices other than A8 and A9 lying around I can look at, 
> but the problem there is I don't actually know for certain what exact 
> CPU model those numbers map to, so confirmed numbers only please.

This is what we use in the kernel: to find out the architecture level:

#define CPU_ARCH_UNKNOWN        0
#define CPU_ARCH_ARMv3          1
#define CPU_ARCH_ARMv4          2
#define CPU_ARCH_ARMv4T         3
#define CPU_ARCH_ARMv5          4
#define CPU_ARCH_ARMv5T         5
#define CPU_ARCH_ARMv5TE        6
#define CPU_ARCH_ARMv5TEJ       7
#define CPU_ARCH_ARMv6          8
#define CPU_ARCH_ARMv7          9

int cpu_architecture(void)
{
        int cpu_arch;

        if ((read_cpuid_id() & 0x0008f000) == 0) {
                cpu_arch = CPU_ARCH_UNKNOWN;
        } else if ((read_cpuid_id() & 0x0008f000) == 0x00007000) {
                cpu_arch = (read_cpuid_id() & (1 << 23)) ? CPU_ARCH_ARMv4T : 
CPU_ARCH_ARMv3;
        } else if ((read_cpuid_id() & 0x00080000) == 0x00000000) {
                cpu_arch = (read_cpuid_id() >> 16) & 7;
                if (cpu_arch)
                        cpu_arch += CPU_ARCH_ARMv3;
        } else if ((read_cpuid_id() & 0x000f0000) == 0x000f0000) {
                unsigned int mmfr0;

                /* Revised CPUID format. Read the Memory Model Feature
                 * Register 0 and check for VMSAv7 or PMSAv7 */
                asm("mrc        p15, 0, %0, c0, c1, 4"
                    : "=r" (mmfr0));
                if ((mmfr0 & 0x0000000f) >= 0x00000003 ||
                    (mmfr0 & 0x000000f0) >= 0x00000030)
                        cpu_arch = CPU_ARCH_ARMv7;
                else if ((mmfr0 & 0x0000000f) == 0x00000002 ||
                         (mmfr0 & 0x000000f0) == 0x00000020)
                        cpu_arch = CPU_ARCH_ARMv6;
                else
                        cpu_arch = CPU_ARCH_UNKNOWN;
        } else
                cpu_arch = CPU_ARCH_UNKNOWN;

        return cpu_arch;
}


[ within the /proc/cpuinfo code: ]
        ...
        seq_printf(m, "\nCPU implementer\t: 0x%02x\n", read_cpuid_id() >> 24);
        seq_printf(m, "CPU architecture: %s\n", proc_arch[cpu_architecture()]);

        if ((read_cpuid_id() & 0x0008f000) == 0x00000000) {
                /* pre-ARM7 */
                seq_printf(m, "CPU part\t: %07x\n", read_cpuid_id() >> 4);
        } else {
                if ((read_cpuid_id() & 0x0008f000) == 0x00007000) {
                        /* ARM7 */
                        seq_printf(m, "CPU variant\t: 0x%02x\n",
                                   (read_cpuid_id() >> 16) & 127);
                } else {
                        /* post-ARM7 */
                        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);
        ...



        Arnd

_______________________________________________
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev

Reply via email to