blob: 9ddf90fc487e3c70c48cb9f3d3055f2f88a96830 [file] [log] [blame]
Guillaume Chatelet439d3712018-02-01 10:03:09 +01001// 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
21namespace cpu_features {
22namespace {
23
24void DisableHardwareCapabilities() { SetHardwareCapabilities(0, 0); }
25
26TEST(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 Sieglbfd109b2019-06-26 12:56:52 +020038 EXPECT_FALSE(info.features.crunch);
39 EXPECT_FALSE(info.features.thumbee);
Guillaume Chatelet439d3712018-02-01 10:03:09 +010040 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
48TEST(CpuinfoArmTest, ODroidFromCpuInfo) {
49 DisableHardwareCapabilities();
50 auto& fs = GetEmptyFilesystem();
51 fs.CreateFile("/proc/cpuinfo", R"(processor : 0
52model name : ARMv7 Processor rev 3 (v71)
53BogoMIPS : 120.00
54Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae
55CPU implementer : 0x41
56CPU architecture: 7
57CPU variant : 0x2
58CPU part : 0xc0f
59CPU 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 Sieglbfd109b2019-06-26 12:56:52 +020067 EXPECT_FALSE(info.features.swp);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +020068 EXPECT_TRUE(info.features.half);
69 EXPECT_TRUE(info.features.thumb);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +020070 EXPECT_FALSE(info.features._26bit);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +020071 EXPECT_TRUE(info.features.fastmult);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +020072 EXPECT_FALSE(info.features.fpa);
Guillaume Chatelet439d3712018-02-01 10:03:09 +010073 EXPECT_TRUE(info.features.vfp);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +020074 EXPECT_TRUE(info.features.edsp);
75 EXPECT_FALSE(info.features.java);
Guillaume Chatelet439d3712018-02-01 10:03:09 +010076 EXPECT_FALSE(info.features.iwmmxt);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +020077 EXPECT_FALSE(info.features.crunch);
78 EXPECT_FALSE(info.features.thumbee);
Guillaume Chatelet439d3712018-02-01 10:03:09 +010079 EXPECT_TRUE(info.features.neon);
80 EXPECT_TRUE(info.features.vfpv3);
81 EXPECT_FALSE(info.features.vfpv3d16);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +020082 EXPECT_TRUE(info.features.tls);
Guillaume Chatelet439d3712018-02-01 10:03:09 +010083 EXPECT_TRUE(info.features.vfpv4);
84 EXPECT_TRUE(info.features.idiva);
85 EXPECT_TRUE(info.features.idivt);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +020086 EXPECT_TRUE(info.features.vfpd32);
87 EXPECT_TRUE(info.features.lpae);
88 EXPECT_FALSE(info.features.evtstrm);
Guillaume Chatelet439d3712018-02-01 10:03:09 +010089 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 Siegl18342782019-06-25 17:58:31 +020096// Linux test-case
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +020097TEST(CpuinfoArmTest, RaspberryPiZeroFromCpuInfo) {
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +020098 DisableHardwareCapabilities();
99 auto& fs = GetEmptyFilesystem();
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200100 fs.CreateFile("/proc/cpuinfo", R"(processor : 0
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200101model name : ARMv6-compatible processor rev 7 (v6l)
102BogoMIPS : 697.95
103Features : half thumb fastmult vfp edsp java tls
104CPU implementer : 0x41
105CPU architecture: 7
106CPU variant : 0x0
107CPU part : 0xb76
108CPU revision : 7
109
110Hardware : BCM2835
111Revision : 9000c1
112Serial : 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 Siegl18342782019-06-25 17:58:31 +0200118 EXPECT_EQ(info.architecture, 6);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200119
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200120 EXPECT_FALSE(info.features.swp);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200121 EXPECT_TRUE(info.features.half);
122 EXPECT_TRUE(info.features.thumb);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200123 EXPECT_FALSE(info.features._26bit);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200124 EXPECT_TRUE(info.features.fastmult);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200125 EXPECT_FALSE(info.features.fpa);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200126 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 Sieglbfd109b2019-06-26 12:56:52 +0200130 EXPECT_FALSE(info.features.crunch);
131 EXPECT_FALSE(info.features.thumbee);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200132 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 Sieglbfd109b2019-06-26 12:56:52 +0200139 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
149TEST(CpuinfoArmTest, MarvellArmadaFromCpuInfo) {
150 DisableHardwareCapabilities();
151 auto& fs = GetEmptyFilesystem();
152 fs.CreateFile("/proc/cpuinfo", R"(processor : 0
153model name : ARMv7 Processor rev 1 (v7l)
154BogoMIPS : 50.00
155Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32
156CPU implementer : 0x41
157CPU architecture: 7
158CPU variant : 0x4
159CPU part : 0xc09
160CPU revision : 1
161
162processor : 1
163model name : ARMv7 Processor rev 1 (v7l)
164BogoMIPS : 50.00
165Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32
166CPU implementer : 0x41
167CPU architecture: 7
168CPU variant : 0x4
169CPU part : 0xc09
170CPU revision : 1
171
172Hardware : Marvell Armada 380/385 (Device Tree)
173Revision : 0000
174Serial : 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 Siegl6482bad2019-06-18 12:53:08 +0200204 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 Siegl18342782019-06-25 17:58:31 +0200211// Android test-case
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100212// http://code.google.com/p/android/issues/detail?id=10812
213TEST(CpuinfoArmTest, InvalidArmv7) {
214 DisableHardwareCapabilities();
215 auto& fs = GetEmptyFilesystem();
216 fs.CreateFile("/proc/cpuinfo",
Guillaume Chatelet918553a2019-01-17 15:28:04 +0100217 R"(Processor : ARMv6-compatible processor rev 6 (v6l)
218BogoMIPS : 199.47
219Features : swp half thumb fastmult vfp edsp java
220CPU implementer : 0x41
221CPU architecture: 7
222CPU variant : 0x0
223CPU part : 0xb76
224CPU revision : 6
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100225
Guillaume Chatelet918553a2019-01-17 15:28:04 +0100226Hardware : SPICA
227Revision : 0020
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100228Serial : 33323613546d00ec )");
229 const auto info = GetArmInfo();
230 EXPECT_EQ(info.architecture, 6);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200231
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200232 EXPECT_TRUE(info.features.swp);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200233 EXPECT_TRUE(info.features.half);
234 EXPECT_TRUE(info.features.thumb);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200235 EXPECT_FALSE(info.features._26bit);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200236 EXPECT_TRUE(info.features.fastmult);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200237 EXPECT_FALSE(info.features.fpa);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200238 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 Sieglbfd109b2019-06-26 12:56:52 +0200242 EXPECT_FALSE(info.features.crunch);
243 EXPECT_FALSE(info.features.thumbee);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200244 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 Sieglbfd109b2019-06-26 12:56:52 +0200251 EXPECT_FALSE(info.features.vfpd32);
252 EXPECT_FALSE(info.features.lpae);
253 EXPECT_FALSE(info.features.evtstrm);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200254 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 Chatelet439d3712018-02-01 10:03:09 +0100259}
260
Dr.-Ing. Patrick Siegl18342782019-06-25 17:58:31 +0200261// Android test-case
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100262// https://crbug.com/341598.
263TEST(CpuinfoArmTest, InvalidNeon) {
264 auto& fs = GetEmptyFilesystem();
265 fs.CreateFile("/proc/cpuinfo",
266 R"(Processor: ARMv7 Processory rev 0 (v71)
267processor: 0
268BogoMIPS: 13.50
269
270Processor: 1
271BogoMIPS: 13.50
272
273Features: swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt
274CPU implementer : 0x51
275CPU architecture: 7
276CPU variant: 0x1
277CPU part: 0x04d
278CPU revision: 0
279
280Hardware: SAMSUNG M2
281Revision: 0010
282Serial: 00001e030000354e)");
283 const auto info = GetArmInfo();
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200284 EXPECT_TRUE(info.features.swp);
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100285 EXPECT_FALSE(info.features.neon);
286}
287
288// The Nexus 4 (Qualcomm Krait) kernel configuration forgets to report IDIV
289// support.
290TEST(CpuinfoArmTest, Nexus4_0x510006f2) {
291 DisableHardwareCapabilities();
292 auto& fs = GetEmptyFilesystem();
293 fs.CreateFile("/proc/cpuinfo",
294 R"(CPU implementer : 0x51
295CPU architecture: 7
296CPU variant : 0x0
297CPU part : 0x6f
298CPU revision : 2)");
299 const auto info = GetArmInfo();
300 EXPECT_TRUE(info.features.idiva);
301 EXPECT_TRUE(info.features.idivt);
Guillaume Chatelet918553a2019-01-17 15:28:04 +0100302
303 EXPECT_EQ(GetArmCpuId(&info), 0x510006f2);
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100304}
305
306// The Nexus 4 (Qualcomm Krait) kernel configuration forgets to report IDIV
307// support.
308TEST(CpuinfoArmTest, Nexus4_0x510006f3) {
309 DisableHardwareCapabilities();
310 auto& fs = GetEmptyFilesystem();
311 fs.CreateFile("/proc/cpuinfo",
312 R"(CPU implementer : 0x51
313CPU architecture: 7
314CPU variant : 0x0
315CPU part : 0x6f
316CPU revision : 3)");
317 const auto info = GetArmInfo();
318 EXPECT_TRUE(info.features.idiva);
319 EXPECT_TRUE(info.features.idivt);
Guillaume Chatelet918553a2019-01-17 15:28:04 +0100320
321 EXPECT_EQ(GetArmCpuId(&info), 0x510006f3);
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100322}
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.
327TEST(CpuinfoArmTest, EmulatorSpecificIdiv) {
328 DisableHardwareCapabilities();
329 auto& fs = GetEmptyFilesystem();
330 fs.CreateFile("/proc/cpuinfo",
331 R"(Processor : ARMv7 Processor rev 0 (v7l)
332BogoMIPS : 629.14
333Features : swp half thumb fastmult vfp edsp neon vfpv3
334CPU implementer : 0x41
335CPU architecture: 7
336CPU variant : 0x0
337CPU part : 0xc08
338CPU revision : 0
339
340Hardware : Goldfish
341Revision : 0000
342Serial : 0000000000000000)");
343 const auto info = GetArmInfo();
344 EXPECT_TRUE(info.features.idiva);
345}
346
347} // namespace
348} // namespace cpu_features