Guillaume Chatelet | 439d371 | 2018-02-01 10:03:09 +0100 | [diff] [blame] | 1 | // Copyright 2017 Google Inc. |
| 2 | // |
| 3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 | // you may not use this file except in compliance with the License. |
| 5 | // You may obtain a copy of the License at |
| 6 | // |
| 7 | // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 | // |
| 9 | // Unless required by applicable law or agreed to in writing, software |
| 10 | // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 | // See the License for the specific language governing permissions and |
| 13 | // limitations under the License. |
| 14 | |
| 15 | #include "cpuinfo_arm.h" |
| 16 | #include "filesystem_for_testing.h" |
| 17 | #include "hwcaps_for_testing.h" |
| 18 | |
| 19 | #include "gtest/gtest.h" |
| 20 | |
| 21 | namespace cpu_features { |
| 22 | namespace { |
| 23 | |
| 24 | void DisableHardwareCapabilities() { SetHardwareCapabilities(0, 0); } |
| 25 | |
| 26 | TEST(CpuinfoArmTest, FromHardwareCap) { |
| 27 | SetHardwareCapabilities(ARM_HWCAP_NEON, ARM_HWCAP2_AES | ARM_HWCAP2_CRC32); |
| 28 | GetEmptyFilesystem(); // disabling /proc/cpuinfo |
| 29 | const auto info = GetArmInfo(); |
| 30 | EXPECT_TRUE(info.features.vfp); // triggered by vfpv3 |
| 31 | EXPECT_TRUE(info.features.vfpv3); // triggered by neon |
| 32 | EXPECT_TRUE(info.features.neon); |
| 33 | EXPECT_TRUE(info.features.aes); |
| 34 | EXPECT_TRUE(info.features.crc32); |
| 35 | |
| 36 | EXPECT_FALSE(info.features.vfpv4); |
| 37 | EXPECT_FALSE(info.features.iwmmxt); |
Dr.-Ing. Patrick Siegl | bfd109b | 2019-06-26 12:56:52 +0200 | [diff] [blame] | 38 | EXPECT_FALSE(info.features.crunch); |
| 39 | EXPECT_FALSE(info.features.thumbee); |
Guillaume Chatelet | 439d371 | 2018-02-01 10:03:09 +0100 | [diff] [blame] | 40 | EXPECT_FALSE(info.features.vfpv3d16); |
| 41 | EXPECT_FALSE(info.features.idiva); |
| 42 | EXPECT_FALSE(info.features.idivt); |
| 43 | EXPECT_FALSE(info.features.pmull); |
| 44 | EXPECT_FALSE(info.features.sha1); |
| 45 | EXPECT_FALSE(info.features.sha2); |
| 46 | } |
| 47 | |
| 48 | TEST(CpuinfoArmTest, ODroidFromCpuInfo) { |
| 49 | DisableHardwareCapabilities(); |
| 50 | auto& fs = GetEmptyFilesystem(); |
| 51 | fs.CreateFile("/proc/cpuinfo", R"(processor : 0 |
| 52 | model name : ARMv7 Processor rev 3 (v71) |
| 53 | BogoMIPS : 120.00 |
| 54 | Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae |
| 55 | CPU implementer : 0x41 |
| 56 | CPU architecture: 7 |
| 57 | CPU variant : 0x2 |
| 58 | CPU part : 0xc0f |
| 59 | CPU revision : 3)"); |
| 60 | const auto info = GetArmInfo(); |
| 61 | EXPECT_EQ(info.implementer, 0x41); |
| 62 | EXPECT_EQ(info.variant, 0x2); |
| 63 | EXPECT_EQ(info.part, 0xc0f); |
| 64 | EXPECT_EQ(info.revision, 3); |
| 65 | EXPECT_EQ(info.architecture, 7); |
| 66 | |
Dr.-Ing. Patrick Siegl | bfd109b | 2019-06-26 12:56:52 +0200 | [diff] [blame] | 67 | EXPECT_FALSE(info.features.swp); |
Dr.-Ing. Patrick Siegl | 6482bad | 2019-06-18 12:53:08 +0200 | [diff] [blame] | 68 | EXPECT_TRUE(info.features.half); |
| 69 | EXPECT_TRUE(info.features.thumb); |
Dr.-Ing. Patrick Siegl | bfd109b | 2019-06-26 12:56:52 +0200 | [diff] [blame] | 70 | EXPECT_FALSE(info.features._26bit); |
Dr.-Ing. Patrick Siegl | 6482bad | 2019-06-18 12:53:08 +0200 | [diff] [blame] | 71 | EXPECT_TRUE(info.features.fastmult); |
Dr.-Ing. Patrick Siegl | bfd109b | 2019-06-26 12:56:52 +0200 | [diff] [blame] | 72 | EXPECT_FALSE(info.features.fpa); |
Guillaume Chatelet | 439d371 | 2018-02-01 10:03:09 +0100 | [diff] [blame] | 73 | EXPECT_TRUE(info.features.vfp); |
Dr.-Ing. Patrick Siegl | 6482bad | 2019-06-18 12:53:08 +0200 | [diff] [blame] | 74 | EXPECT_TRUE(info.features.edsp); |
| 75 | EXPECT_FALSE(info.features.java); |
Guillaume Chatelet | 439d371 | 2018-02-01 10:03:09 +0100 | [diff] [blame] | 76 | EXPECT_FALSE(info.features.iwmmxt); |
Dr.-Ing. Patrick Siegl | bfd109b | 2019-06-26 12:56:52 +0200 | [diff] [blame] | 77 | EXPECT_FALSE(info.features.crunch); |
| 78 | EXPECT_FALSE(info.features.thumbee); |
Guillaume Chatelet | 439d371 | 2018-02-01 10:03:09 +0100 | [diff] [blame] | 79 | EXPECT_TRUE(info.features.neon); |
| 80 | EXPECT_TRUE(info.features.vfpv3); |
| 81 | EXPECT_FALSE(info.features.vfpv3d16); |
Dr.-Ing. Patrick Siegl | 6482bad | 2019-06-18 12:53:08 +0200 | [diff] [blame] | 82 | EXPECT_TRUE(info.features.tls); |
Guillaume Chatelet | 439d371 | 2018-02-01 10:03:09 +0100 | [diff] [blame] | 83 | EXPECT_TRUE(info.features.vfpv4); |
| 84 | EXPECT_TRUE(info.features.idiva); |
| 85 | EXPECT_TRUE(info.features.idivt); |
Dr.-Ing. Patrick Siegl | bfd109b | 2019-06-26 12:56:52 +0200 | [diff] [blame] | 86 | EXPECT_TRUE(info.features.vfpd32); |
| 87 | EXPECT_TRUE(info.features.lpae); |
| 88 | EXPECT_FALSE(info.features.evtstrm); |
Guillaume Chatelet | 439d371 | 2018-02-01 10:03:09 +0100 | [diff] [blame] | 89 | EXPECT_FALSE(info.features.aes); |
| 90 | EXPECT_FALSE(info.features.pmull); |
| 91 | EXPECT_FALSE(info.features.sha1); |
| 92 | EXPECT_FALSE(info.features.sha2); |
| 93 | EXPECT_FALSE(info.features.crc32); |
| 94 | } |
| 95 | |
Dr.-Ing. Patrick Siegl | 1834278 | 2019-06-25 17:58:31 +0200 | [diff] [blame] | 96 | // Linux test-case |
Dr.-Ing. Patrick Siegl | bfd109b | 2019-06-26 12:56:52 +0200 | [diff] [blame] | 97 | TEST(CpuinfoArmTest, RaspberryPiZeroFromCpuInfo) { |
Dr.-Ing. Patrick Siegl | 6482bad | 2019-06-18 12:53:08 +0200 | [diff] [blame] | 98 | DisableHardwareCapabilities(); |
| 99 | auto& fs = GetEmptyFilesystem(); |
Dr.-Ing. Patrick Siegl | bfd109b | 2019-06-26 12:56:52 +0200 | [diff] [blame] | 100 | fs.CreateFile("/proc/cpuinfo", R"(processor : 0 |
Dr.-Ing. Patrick Siegl | 6482bad | 2019-06-18 12:53:08 +0200 | [diff] [blame] | 101 | model name : ARMv6-compatible processor rev 7 (v6l) |
| 102 | BogoMIPS : 697.95 |
| 103 | Features : half thumb fastmult vfp edsp java tls |
| 104 | CPU implementer : 0x41 |
| 105 | CPU architecture: 7 |
| 106 | CPU variant : 0x0 |
| 107 | CPU part : 0xb76 |
| 108 | CPU revision : 7 |
| 109 | |
| 110 | Hardware : BCM2835 |
| 111 | Revision : 9000c1 |
| 112 | Serial : 000000006cd946f3)"); |
| 113 | const auto info = GetArmInfo(); |
| 114 | EXPECT_EQ(info.implementer, 0x41); |
| 115 | EXPECT_EQ(info.variant, 0x0); |
| 116 | EXPECT_EQ(info.part, 0xb76); |
| 117 | EXPECT_EQ(info.revision, 7); |
Dr.-Ing. Patrick Siegl | 1834278 | 2019-06-25 17:58:31 +0200 | [diff] [blame] | 118 | EXPECT_EQ(info.architecture, 6); |
Dr.-Ing. Patrick Siegl | 6482bad | 2019-06-18 12:53:08 +0200 | [diff] [blame] | 119 | |
Dr.-Ing. Patrick Siegl | bfd109b | 2019-06-26 12:56:52 +0200 | [diff] [blame] | 120 | EXPECT_FALSE(info.features.swp); |
Dr.-Ing. Patrick Siegl | 6482bad | 2019-06-18 12:53:08 +0200 | [diff] [blame] | 121 | EXPECT_TRUE(info.features.half); |
| 122 | EXPECT_TRUE(info.features.thumb); |
Dr.-Ing. Patrick Siegl | bfd109b | 2019-06-26 12:56:52 +0200 | [diff] [blame] | 123 | EXPECT_FALSE(info.features._26bit); |
Dr.-Ing. Patrick Siegl | 6482bad | 2019-06-18 12:53:08 +0200 | [diff] [blame] | 124 | EXPECT_TRUE(info.features.fastmult); |
Dr.-Ing. Patrick Siegl | bfd109b | 2019-06-26 12:56:52 +0200 | [diff] [blame] | 125 | EXPECT_FALSE(info.features.fpa); |
Dr.-Ing. Patrick Siegl | 6482bad | 2019-06-18 12:53:08 +0200 | [diff] [blame] | 126 | EXPECT_TRUE(info.features.vfp); |
| 127 | EXPECT_TRUE(info.features.edsp); |
| 128 | EXPECT_TRUE(info.features.java); |
| 129 | EXPECT_FALSE(info.features.iwmmxt); |
Dr.-Ing. Patrick Siegl | bfd109b | 2019-06-26 12:56:52 +0200 | [diff] [blame] | 130 | EXPECT_FALSE(info.features.crunch); |
| 131 | EXPECT_FALSE(info.features.thumbee); |
Dr.-Ing. Patrick Siegl | 6482bad | 2019-06-18 12:53:08 +0200 | [diff] [blame] | 132 | EXPECT_FALSE(info.features.neon); |
| 133 | EXPECT_FALSE(info.features.vfpv3); |
| 134 | EXPECT_FALSE(info.features.vfpv3d16); |
| 135 | EXPECT_TRUE(info.features.tls); |
| 136 | EXPECT_FALSE(info.features.vfpv4); |
| 137 | EXPECT_FALSE(info.features.idiva); |
| 138 | EXPECT_FALSE(info.features.idivt); |
Dr.-Ing. Patrick Siegl | bfd109b | 2019-06-26 12:56:52 +0200 | [diff] [blame] | 139 | EXPECT_FALSE(info.features.vfpd32); |
| 140 | EXPECT_FALSE(info.features.lpae); |
| 141 | EXPECT_FALSE(info.features.evtstrm); |
| 142 | EXPECT_FALSE(info.features.aes); |
| 143 | EXPECT_FALSE(info.features.pmull); |
| 144 | EXPECT_FALSE(info.features.sha1); |
| 145 | EXPECT_FALSE(info.features.sha2); |
| 146 | EXPECT_FALSE(info.features.crc32); |
| 147 | } |
| 148 | |
| 149 | TEST(CpuinfoArmTest, MarvellArmadaFromCpuInfo) { |
| 150 | DisableHardwareCapabilities(); |
| 151 | auto& fs = GetEmptyFilesystem(); |
| 152 | fs.CreateFile("/proc/cpuinfo", R"(processor : 0 |
| 153 | model name : ARMv7 Processor rev 1 (v7l) |
| 154 | BogoMIPS : 50.00 |
| 155 | Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32 |
| 156 | CPU implementer : 0x41 |
| 157 | CPU architecture: 7 |
| 158 | CPU variant : 0x4 |
| 159 | CPU part : 0xc09 |
| 160 | CPU revision : 1 |
| 161 | |
| 162 | processor : 1 |
| 163 | model name : ARMv7 Processor rev 1 (v7l) |
| 164 | BogoMIPS : 50.00 |
| 165 | Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32 |
| 166 | CPU implementer : 0x41 |
| 167 | CPU architecture: 7 |
| 168 | CPU variant : 0x4 |
| 169 | CPU part : 0xc09 |
| 170 | CPU revision : 1 |
| 171 | |
| 172 | Hardware : Marvell Armada 380/385 (Device Tree) |
| 173 | Revision : 0000 |
| 174 | Serial : 0000000000000000)"); |
| 175 | const auto info = GetArmInfo(); |
| 176 | EXPECT_EQ(info.implementer, 0x41); |
| 177 | EXPECT_EQ(info.variant, 0x4); |
| 178 | EXPECT_EQ(info.part, 0xc09); |
| 179 | EXPECT_EQ(info.revision, 1); |
| 180 | EXPECT_EQ(info.architecture, 7); |
| 181 | |
| 182 | EXPECT_FALSE(info.features.swp); |
| 183 | EXPECT_TRUE(info.features.half); |
| 184 | EXPECT_TRUE(info.features.thumb); |
| 185 | EXPECT_FALSE(info.features._26bit); |
| 186 | EXPECT_TRUE(info.features.fastmult); |
| 187 | EXPECT_FALSE(info.features.fpa); |
| 188 | EXPECT_TRUE(info.features.vfp); |
| 189 | EXPECT_TRUE(info.features.edsp); |
| 190 | EXPECT_FALSE(info.features.java); |
| 191 | EXPECT_FALSE(info.features.iwmmxt); |
| 192 | EXPECT_FALSE(info.features.crunch); |
| 193 | EXPECT_FALSE(info.features.thumbee); |
| 194 | EXPECT_TRUE(info.features.neon); |
| 195 | EXPECT_TRUE(info.features.vfpv3); |
| 196 | EXPECT_FALSE(info.features.vfpv3d16); |
| 197 | EXPECT_TRUE(info.features.tls); |
| 198 | EXPECT_FALSE(info.features.vfpv4); |
| 199 | EXPECT_FALSE(info.features.idiva); |
| 200 | EXPECT_FALSE(info.features.idivt); |
| 201 | EXPECT_TRUE(info.features.vfpd32); |
| 202 | EXPECT_FALSE(info.features.lpae); |
| 203 | EXPECT_FALSE(info.features.evtstrm); |
Dr.-Ing. Patrick Siegl | 6482bad | 2019-06-18 12:53:08 +0200 | [diff] [blame] | 204 | EXPECT_FALSE(info.features.aes); |
| 205 | EXPECT_FALSE(info.features.pmull); |
| 206 | EXPECT_FALSE(info.features.sha1); |
| 207 | EXPECT_FALSE(info.features.sha2); |
| 208 | EXPECT_FALSE(info.features.crc32); |
| 209 | } |
| 210 | |
Dr.-Ing. Patrick Siegl | 1834278 | 2019-06-25 17:58:31 +0200 | [diff] [blame] | 211 | // Android test-case |
Guillaume Chatelet | 439d371 | 2018-02-01 10:03:09 +0100 | [diff] [blame] | 212 | // http://code.google.com/p/android/issues/detail?id=10812 |
| 213 | TEST(CpuinfoArmTest, InvalidArmv7) { |
| 214 | DisableHardwareCapabilities(); |
| 215 | auto& fs = GetEmptyFilesystem(); |
| 216 | fs.CreateFile("/proc/cpuinfo", |
Guillaume Chatelet | 918553a | 2019-01-17 15:28:04 +0100 | [diff] [blame] | 217 | R"(Processor : ARMv6-compatible processor rev 6 (v6l) |
| 218 | BogoMIPS : 199.47 |
| 219 | Features : swp half thumb fastmult vfp edsp java |
| 220 | CPU implementer : 0x41 |
| 221 | CPU architecture: 7 |
| 222 | CPU variant : 0x0 |
| 223 | CPU part : 0xb76 |
| 224 | CPU revision : 6 |
Guillaume Chatelet | 439d371 | 2018-02-01 10:03:09 +0100 | [diff] [blame] | 225 | |
Guillaume Chatelet | 918553a | 2019-01-17 15:28:04 +0100 | [diff] [blame] | 226 | Hardware : SPICA |
| 227 | Revision : 0020 |
Guillaume Chatelet | 439d371 | 2018-02-01 10:03:09 +0100 | [diff] [blame] | 228 | Serial : 33323613546d00ec )"); |
| 229 | const auto info = GetArmInfo(); |
| 230 | EXPECT_EQ(info.architecture, 6); |
Dr.-Ing. Patrick Siegl | 6482bad | 2019-06-18 12:53:08 +0200 | [diff] [blame] | 231 | |
Dr.-Ing. Patrick Siegl | bfd109b | 2019-06-26 12:56:52 +0200 | [diff] [blame] | 232 | EXPECT_TRUE(info.features.swp); |
Dr.-Ing. Patrick Siegl | 6482bad | 2019-06-18 12:53:08 +0200 | [diff] [blame] | 233 | EXPECT_TRUE(info.features.half); |
| 234 | EXPECT_TRUE(info.features.thumb); |
Dr.-Ing. Patrick Siegl | bfd109b | 2019-06-26 12:56:52 +0200 | [diff] [blame] | 235 | EXPECT_FALSE(info.features._26bit); |
Dr.-Ing. Patrick Siegl | 6482bad | 2019-06-18 12:53:08 +0200 | [diff] [blame] | 236 | EXPECT_TRUE(info.features.fastmult); |
Dr.-Ing. Patrick Siegl | bfd109b | 2019-06-26 12:56:52 +0200 | [diff] [blame] | 237 | EXPECT_FALSE(info.features.fpa); |
Dr.-Ing. Patrick Siegl | 6482bad | 2019-06-18 12:53:08 +0200 | [diff] [blame] | 238 | EXPECT_TRUE(info.features.vfp); |
| 239 | EXPECT_TRUE(info.features.edsp); |
| 240 | EXPECT_TRUE(info.features.java); |
| 241 | EXPECT_FALSE(info.features.iwmmxt); |
Dr.-Ing. Patrick Siegl | bfd109b | 2019-06-26 12:56:52 +0200 | [diff] [blame] | 242 | EXPECT_FALSE(info.features.crunch); |
| 243 | EXPECT_FALSE(info.features.thumbee); |
Dr.-Ing. Patrick Siegl | 6482bad | 2019-06-18 12:53:08 +0200 | [diff] [blame] | 244 | EXPECT_FALSE(info.features.neon); |
| 245 | EXPECT_FALSE(info.features.vfpv3); |
| 246 | EXPECT_FALSE(info.features.vfpv3d16); |
| 247 | EXPECT_FALSE(info.features.tls); |
| 248 | EXPECT_FALSE(info.features.vfpv4); |
| 249 | EXPECT_FALSE(info.features.idiva); |
| 250 | EXPECT_FALSE(info.features.idivt); |
Dr.-Ing. Patrick Siegl | bfd109b | 2019-06-26 12:56:52 +0200 | [diff] [blame] | 251 | EXPECT_FALSE(info.features.vfpd32); |
| 252 | EXPECT_FALSE(info.features.lpae); |
| 253 | EXPECT_FALSE(info.features.evtstrm); |
Dr.-Ing. Patrick Siegl | 6482bad | 2019-06-18 12:53:08 +0200 | [diff] [blame] | 254 | EXPECT_FALSE(info.features.aes); |
| 255 | EXPECT_FALSE(info.features.pmull); |
| 256 | EXPECT_FALSE(info.features.sha1); |
| 257 | EXPECT_FALSE(info.features.sha2); |
| 258 | EXPECT_FALSE(info.features.crc32); |
Guillaume Chatelet | 439d371 | 2018-02-01 10:03:09 +0100 | [diff] [blame] | 259 | } |
| 260 | |
Dr.-Ing. Patrick Siegl | 1834278 | 2019-06-25 17:58:31 +0200 | [diff] [blame] | 261 | // Android test-case |
Guillaume Chatelet | 439d371 | 2018-02-01 10:03:09 +0100 | [diff] [blame] | 262 | // https://crbug.com/341598. |
| 263 | TEST(CpuinfoArmTest, InvalidNeon) { |
| 264 | auto& fs = GetEmptyFilesystem(); |
| 265 | fs.CreateFile("/proc/cpuinfo", |
| 266 | R"(Processor: ARMv7 Processory rev 0 (v71) |
| 267 | processor: 0 |
| 268 | BogoMIPS: 13.50 |
| 269 | |
| 270 | Processor: 1 |
| 271 | BogoMIPS: 13.50 |
| 272 | |
| 273 | Features: swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt |
| 274 | CPU implementer : 0x51 |
| 275 | CPU architecture: 7 |
| 276 | CPU variant: 0x1 |
| 277 | CPU part: 0x04d |
| 278 | CPU revision: 0 |
| 279 | |
| 280 | Hardware: SAMSUNG M2 |
| 281 | Revision: 0010 |
| 282 | Serial: 00001e030000354e)"); |
| 283 | const auto info = GetArmInfo(); |
Dr.-Ing. Patrick Siegl | bfd109b | 2019-06-26 12:56:52 +0200 | [diff] [blame] | 284 | EXPECT_TRUE(info.features.swp); |
Guillaume Chatelet | 439d371 | 2018-02-01 10:03:09 +0100 | [diff] [blame] | 285 | EXPECT_FALSE(info.features.neon); |
| 286 | } |
| 287 | |
| 288 | // The Nexus 4 (Qualcomm Krait) kernel configuration forgets to report IDIV |
| 289 | // support. |
| 290 | TEST(CpuinfoArmTest, Nexus4_0x510006f2) { |
| 291 | DisableHardwareCapabilities(); |
| 292 | auto& fs = GetEmptyFilesystem(); |
| 293 | fs.CreateFile("/proc/cpuinfo", |
| 294 | R"(CPU implementer : 0x51 |
| 295 | CPU architecture: 7 |
| 296 | CPU variant : 0x0 |
| 297 | CPU part : 0x6f |
| 298 | CPU revision : 2)"); |
| 299 | const auto info = GetArmInfo(); |
| 300 | EXPECT_TRUE(info.features.idiva); |
| 301 | EXPECT_TRUE(info.features.idivt); |
Guillaume Chatelet | 918553a | 2019-01-17 15:28:04 +0100 | [diff] [blame] | 302 | |
| 303 | EXPECT_EQ(GetArmCpuId(&info), 0x510006f2); |
Guillaume Chatelet | 439d371 | 2018-02-01 10:03:09 +0100 | [diff] [blame] | 304 | } |
| 305 | |
| 306 | // The Nexus 4 (Qualcomm Krait) kernel configuration forgets to report IDIV |
| 307 | // support. |
| 308 | TEST(CpuinfoArmTest, Nexus4_0x510006f3) { |
| 309 | DisableHardwareCapabilities(); |
| 310 | auto& fs = GetEmptyFilesystem(); |
| 311 | fs.CreateFile("/proc/cpuinfo", |
| 312 | R"(CPU implementer : 0x51 |
| 313 | CPU architecture: 7 |
| 314 | CPU variant : 0x0 |
| 315 | CPU part : 0x6f |
| 316 | CPU revision : 3)"); |
| 317 | const auto info = GetArmInfo(); |
| 318 | EXPECT_TRUE(info.features.idiva); |
| 319 | EXPECT_TRUE(info.features.idivt); |
Guillaume Chatelet | 918553a | 2019-01-17 15:28:04 +0100 | [diff] [blame] | 320 | |
| 321 | EXPECT_EQ(GetArmCpuId(&info), 0x510006f3); |
Guillaume Chatelet | 439d371 | 2018-02-01 10:03:09 +0100 | [diff] [blame] | 322 | } |
| 323 | |
| 324 | // The emulator-specific Android 4.2 kernel fails to report support for the |
| 325 | // 32-bit ARM IDIV instruction. Technically, this is a feature of the virtual |
| 326 | // CPU implemented by the emulator. |
| 327 | TEST(CpuinfoArmTest, EmulatorSpecificIdiv) { |
| 328 | DisableHardwareCapabilities(); |
| 329 | auto& fs = GetEmptyFilesystem(); |
| 330 | fs.CreateFile("/proc/cpuinfo", |
| 331 | R"(Processor : ARMv7 Processor rev 0 (v7l) |
| 332 | BogoMIPS : 629.14 |
| 333 | Features : swp half thumb fastmult vfp edsp neon vfpv3 |
| 334 | CPU implementer : 0x41 |
| 335 | CPU architecture: 7 |
| 336 | CPU variant : 0x0 |
| 337 | CPU part : 0xc08 |
| 338 | CPU revision : 0 |
| 339 | |
| 340 | Hardware : Goldfish |
| 341 | Revision : 0000 |
| 342 | Serial : 0000000000000000)"); |
| 343 | const auto info = GetArmInfo(); |
| 344 | EXPECT_TRUE(info.features.idiva); |
| 345 | } |
| 346 | |
| 347 | } // namespace |
| 348 | } // namespace cpu_features |