Kyrill,

Here's what I get on an Exynos M1:


$ cat /proc/cpuinfo                                       <
Processor       : AArch64 Processor rev 0 (aarch64)
...
Features        : fp asimd aes pmull sha1 sha2 crc32
CPU implementer : 0x53
CPU architecture: AArch64
CPU variant     : 0x0
CPU part        : 0x001
CPU revision    : 0

Please, let me know if you need any help.

Thank you,

-- 
Evandro Menezes                              Austin, TX

> -----Original Message-----
> From: Kyrill Tkachov [mailto:kyrylo.tkac...@arm.com]
> Sent: Monday, April 20, 2015 10:48
> To: GCC Patches
> Cc: Marcus Shawcroft; Richard Earnshaw; James Greenhalgh; Evandro Menezes;
> Andrew Pinski; James Greenhalgh
> Subject: [PATCH][AArch64] Implement -m{cpu,tune,arch}=native using only
> /proc/cpuinfo
> 
> Hi all,
> 
> This is an attempt to add native CPU detection to AArch64 GNU/Linux targets.
> Similar to other ports we use SPEC rewriting to rewrite -
> m{cpu,tune,arch}=native options into the appropriate CPU/architecture and the
> architecture extension options when appropriate (i.e. +crypto/+crc etc).
> 
> For CPU/architecture detection it gets a bit involved, especially when
> running on a big.LITTLE system. My proposed approach is to look at
> /proc/cpuinfo/ and search for the implementer id and part number fields that
> uniquely identify each core (appropriate identifying information is added to
> aarch64-cores.def). If we find two types of core we have a big.LITTLE system,
> so search through the core definitions extracted from aarch64-cores.def to
> find if we support such a combination (currently only cortex-a57.cortex-a53
> and cortex-a72.cortex-a53) and make sure that the implementer id field
> matches up.
> 
> I tested this on a 4xCortex-A53 + 2xCortex-A57 big.LITTLE Ubuntu GNU/Linux
> system.
> There are two formats for /proc/cpuinfo/ that I'm aware of. The first (old)
> one has the format:
> --------------------------------------
> processor    : 0
> processor    : 1
> processor    : 2
> processor    : 3
> processor    : 4
> processor    : 5
> Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32
> CPU implementer    : 0x41
> CPU architecture: AArch64
> CPU variant    : 0x0
> CPU part    : 0xd03
> --------------------------------------
> 
> In this format it lists the 6 cores but the CPU part it reports is only the
> one for the core from which /proc/cpuinfo was read from (!), in this case one
> of the Cortex-A53 cores.
> This means we detect a different CPU depending on which core GCC was invoked
> on. Not ideal really, but there's no more information that we can extract.
> Given the /proc/cpuinfo above, this patch will rewrite -mcpu=native into -
> mcpu=cortex-a53+fp+simd+crypto+crc
> 
> The newer /proc/cpuinfo format proposed at
> https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=44
> b82b7700d05a52cd983799d3ecde1a976b3bed
> looks like this:
> 
> --------------------------------------------------------------
> processor       : 0
> Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
> CPU implementer : 0x41
> CPU architecture: 8
> CPU variant     : 0x0
> CPU part        : 0xd03
> CPU revision    : 0
> 
> processor       : 1
> Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
> CPU implementer : 0x41
> CPU architecture: 8
> CPU variant     : 0x0
> CPU part        : 0xd03
> CPU revision    : 0
> 
> processor       : 2
> Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
> CPU implementer : 0x41
> CPU architecture: 8
> CPU variant     : 0x0
> CPU part        : 0xd03
> CPU revision    : 0
> 
> processor       : 3
> Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
> CPU implementer : 0x41
> CPU architecture: 8
> CPU variant     : 0x0
> CPU part        : 0xd03
> CPU revision    : 0
> 
> processor       : 4
> Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
> CPU implementer : 0x41
> CPU architecture: 8
> CPU variant     : 0x0
> CPU part        : 0xd07
> CPU revision    : 0
> 
> processor       : 5
> Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
> CPU implementer : 0x41
> CPU architecture: 8
> CPU variant     : 0x0
> CPU part        : 0xd07
> CPU revision    : 0
> --------------------------------------------------------------
> 
> The Features field is used to detect the architectural features that we map
> to GCC option extensions i.e. +fp,+crypto,+simd,+crc etc.
> 
> Similarly, -march=native would be rewritten into -march=armv8-
> a+fp+simd+crypto+crc while -mtune=native into -march=cortex-a57.cortex-a53
> (the arch extension options are not valid for -mtune).
> 
> If it detects more than one implementer ID or the implementer IDs not
> matching up somewhere or some other weirdness /proc/cpuinfo or fails to
> recognise the CPU it will bail out and ignore the option entirely (similarly
> to other ports).
> 
> The patch works fine with both /proc/cpuinfo formats although, as mentioned
> above, it will not be able to detect the big.LITTLE combination from the
> first format.
> 
> I've filled in the implementer ID and part numbers for the Cortex-A57,
> Cortex-A53, Cortex-A72, X-Gene 1 cores, but I don't have that info for
> thunderx or exynosm1. Could someone from Cavium and Samsung help me out here?
> At present this patch has some false dummy values that I'd like to fill out
> before committing this.
> 
> I've bootstrapped this on the system mentioned above with -mcpu=native in the
> BOOT_CFLAGS and regtested as well.
> For the bootstrap I've used the 2nd /proc/cpuinfo format.
> 
> I've also tested it on AArch64 hardware from ARM Ltd. and the ecosystem.
> 
> If using the first format the bootstrap fails the comparison because,
> depending on the OS scheduling, some files are compiled with Cortex-A57
> tuning and some with Cortex-A53 tuning and this is practically non-
> deterministic across stage2 and stage3!
> 
> What do people think of this approach?
> 
> 2014-04-20  Kyrylo Tkachov  <kyrylo.tkac...@arm.com>
> 
>      * config.host (case ${host}): Add aarch64*-*-linux case.
>      * config/aarch64/aarch64-cores.def: Add IMPLEMENTER_ID and PART_NUMBER
>      fields to all the cores.
>      * config/aarch64/aarch64-elf.h (DRIVER_SELF_SPECS): Add
>      MCPU_MTUNE_NATIVE_SPECS.
>      * config/aarch64/aarch64-option-extensions.def: Add FEAT_STRING field to
> all
>      extensions.
>      * config/aarch64/aarch64-opts.h: Adjust definition of AARCH64_CORE.
>      * config/aarch64/aarch64.c: Adjust definition of AARCH64_CORE.
>      Adjust definition of AARCH64_OPT_EXTENSION.
>      * config/aarch64/aarch64.h: Adjust definition of AARCH64_CORE.
>      (MCPU_MTUNE_NATIVE_SPECS): Define.
>      * config/aarch64/driver-aarch64.c: New file.
>      * config/aarch64/x-arch64: New file.
>      * doc/invoke.texi (AArch64 Options): Document native value for -mcpu,
>      -mtune and -march.

Reply via email to