Home | History | Annotate | Download | only in crypto
      1 /* Copyright (c) 2018, Google Inc.
      2  *
      3  * Permission to use, copy, modify, and/or distribute this software for any
      4  * purpose with or without fee is hereby granted, provided that the above
      5  * copyright notice and this permission notice appear in all copies.
      6  *
      7  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
      8  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
      9  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
     10  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     11  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
     12  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
     13  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
     14 
     15 #include "cpu-arm-linux.h"
     16 
     17 #include <string.h>
     18 
     19 #include <gtest/gtest.h>
     20 
     21 
     22 TEST(ARMLinuxTest, CPUInfo) {
     23   struct CPUInfoTest {
     24     const char *cpuinfo;
     25     unsigned long hwcap;
     26     unsigned long hwcap2;
     27     bool broken_neon;
     28   } kTests[] = {
     29       // https://crbug.com/341598#c33
     30       {
     31           "Processor: ARMv7 Processory rev 0 (v71)\n"
     32           "processor: 0\n"
     33           "BogoMIPS: 13.50\n"
     34           "\n"
     35           "Processor: 1\n"
     36           "BogoMIPS: 13.50\n"
     37           "\n"
     38           "Features: swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 "
     39           "idiva idivt\n"
     40           "CPU implementer : 0x51\n"
     41           "CPU architecture: 7\n"
     42           "CPU variant: 0x1\n"
     43           "CPU part: 0x04d\n"
     44           "CPU revision: 0\n"
     45           "\n"
     46           "Hardware: SAMSUNG M2\n"
     47           "Revision: 0010\n"
     48           "Serial: 00001e030000354e\n",
     49           HWCAP_NEON,
     50           0,
     51           true,
     52       },
     53       // https://crbug.com/341598#c39
     54       {
     55           "Processor       : ARMv7 Processor rev 0 (v7l)\n"
     56           "processor       : 0\n"
     57           "BogoMIPS        : 13.53\n"
     58           "\n"
     59           "Features        : swp half thumb fastmult vfp edsp neon vfpv3 tls "
     60           "vfpv4\n"
     61           "CPU implementer : 0x51\n"
     62           "CPU architecture: 7\n"
     63           "CPU variant     : 0x1\n"
     64           "CPU part        : 0x04d\n"
     65           "CPU revision    : 0\n"
     66           "\n"
     67           "Hardware        : SAMSUNG M2_ATT\n"
     68           "Revision        : 0010\n"
     69           "Serial          : 0000df0c00004d4c\n",
     70           HWCAP_NEON,
     71           0,
     72           true,
     73       },
     74       // Nexus 4 from https://crbug.com/341598#c43
     75       {
     76           "Processor       : ARMv7 Processor rev 2 (v7l)\n"
     77           "processor       : 0\n"
     78           "BogoMIPS        : 13.53\n"
     79           "\n"
     80           "processor       : 1\n"
     81           "BogoMIPS        : 13.53\n"
     82           "\n"
     83           "processor       : 2\n"
     84           "BogoMIPS        : 13.53\n"
     85           "\n"
     86           "processor       : 3\n"
     87           "BogoMIPS        : 13.53\n"
     88           "\n"
     89           "Features        : swp half thumb fastmult vfp edsp neon vfpv3 tls "
     90           "vfpv4 \n"
     91           "CPU implementer : 0x51\n"
     92           "CPU architecture: 7\n"
     93           "CPU variant     : 0x0\n"
     94           "CPU part        : 0x06f\n"
     95           "CPU revision    : 2\n"
     96           "\n"
     97           "Hardware        : QCT APQ8064 MAKO\n"
     98           "Revision        : 000b\n"
     99           "Serial          : 0000000000000000\n",
    100           HWCAP_NEON,
    101           0,
    102           false,
    103       },
    104       // Razr M from https://crbug.com/341598#c43
    105       {
    106           "Processor       : ARMv7 Processor rev 4 (v7l)\n"
    107           "processor       : 0\n"
    108           "BogoMIPS        : 13.53\n"
    109           "\n"
    110           "Features        : swp half thumb fastmult vfp edsp neon vfpv3 tls "
    111           "vfpv4\n"
    112           "CPU implementer : 0x51\n"
    113           "CPU architecture: 7\n"
    114           "CPU variant     : 0x1\n"
    115           "CPU part        : 0x04d\n"
    116           "CPU revision    : 4\n"
    117           "\n"
    118           "Hardware        : msm8960dt\n"
    119           "Revision        : 82a0\n"
    120           "Serial          : 0001000201fe37a5\n",
    121           HWCAP_NEON,
    122           0,
    123           false,
    124       },
    125       // Pixel 2 (truncated slightly)
    126       {
    127           "Processor       : AArch64 Processor rev 1 (aarch64)\n"
    128           "processor       : 0\n"
    129           "BogoMIPS        : 38.00\n"
    130           "Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32\n"
    131           "CPU implementer : 0x51\n"
    132           "CPU architecture: 8\n"
    133           "CPU variant     : 0xa\n"
    134           "CPU part        : 0x801\n"
    135           "CPU revision    : 4\n"
    136           "\n"
    137           "processor       : 1\n"
    138           "BogoMIPS        : 38.00\n"
    139           "Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32\n"
    140           "CPU implementer : 0x51\n"
    141           "CPU architecture: 8\n"
    142           "CPU variant     : 0xa\n"
    143           "CPU part        : 0x801\n"
    144           "CPU revision    : 4\n"
    145           "\n"
    146           "processor       : 2\n"
    147           "BogoMIPS        : 38.00\n"
    148           "Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32\n"
    149           "CPU implementer : 0x51\n"
    150           "CPU architecture: 8\n"
    151           "CPU variant     : 0xa\n"
    152           "CPU part        : 0x801\n"
    153           "CPU revision    : 4\n"
    154           "\n"
    155           "processor       : 3\n"
    156           "BogoMIPS        : 38.00\n"
    157           "Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32\n"
    158           "CPU implementer : 0x51\n"
    159           "CPU architecture: 8\n"
    160           "CPU variant     : 0xa\n"
    161           "CPU part        : 0x801\n"
    162           "CPU revision    : 4\n"
    163           // (Extra processors omitted.)
    164           "\n"
    165           "Hardware        : Qualcomm Technologies, Inc MSM8998\n",
    166           HWCAP_NEON,  // CPU architecture 8 implies NEON.
    167           HWCAP2_AES | HWCAP2_PMULL | HWCAP2_SHA1 | HWCAP2_SHA2,
    168           false,
    169       },
    170       // Nexus 4 from
    171       // Garbage should be tolerated.
    172       {
    173           "Blah blah blah this is definitely an ARM CPU",
    174           0,
    175           0,
    176           false,
    177       },
    178       // A hypothetical ARMv8 CPU without crc32 (and thus no trailing space
    179       // after the last crypto entry).
    180       {
    181           "Features        : aes pmull sha1 sha2\n"
    182           "CPU architecture: 8\n",
    183           HWCAP_NEON,
    184           HWCAP2_AES | HWCAP2_PMULL | HWCAP2_SHA1 | HWCAP2_SHA2,
    185           false,
    186       },
    187       // Various combinations of ARMv8 flags.
    188       {
    189           "Features        : aes sha1 sha2\n"
    190           "CPU architecture: 8\n",
    191           HWCAP_NEON,
    192           HWCAP2_AES | HWCAP2_SHA1 | HWCAP2_SHA2,
    193           false,
    194       },
    195       {
    196           "Features        : pmull sha2\n"
    197           "CPU architecture: 8\n",
    198           HWCAP_NEON,
    199           HWCAP2_PMULL | HWCAP2_SHA2,
    200           false,
    201       },
    202       {
    203           "Features        : aes aes   aes not_aes aes aes \n"
    204           "CPU architecture: 8\n",
    205           HWCAP_NEON,
    206           HWCAP2_AES,
    207           false,
    208       },
    209       {
    210           "Features        : \n"
    211           "CPU architecture: 8\n",
    212           HWCAP_NEON,
    213           0,
    214           false,
    215       },
    216       {
    217           "Features        : nothing\n"
    218           "CPU architecture: 8\n",
    219           HWCAP_NEON,
    220           0,
    221           false,
    222       },
    223   };
    224 
    225   for (const auto &t : kTests) {
    226     SCOPED_TRACE(t.cpuinfo);
    227     STRING_PIECE sp = {t.cpuinfo, strlen(t.cpuinfo)};
    228     EXPECT_EQ(t.hwcap, crypto_get_arm_hwcap_from_cpuinfo(&sp));
    229     EXPECT_EQ(t.hwcap2, crypto_get_arm_hwcap2_from_cpuinfo(&sp));
    230     EXPECT_EQ(t.broken_neon ? 1 : 0, crypto_cpuinfo_has_broken_neon(&sp));
    231   }
    232 }
    233