blob: e0b08a4a69767be658c350938655c53d8d2a60bc [file] [log] [blame]
Guillaume Chatelet3cc8f312020-10-12 08:55:20 +00001// Copyright 2017 Google LLC
Guillaume Chatelet439d3712018-02-01 10:03:09 +01002//
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"
Guillaume Chatelet439d3712018-02-01 10:03:09 +010016
Guillaume Chatelet22a53622020-09-23 11:52:20 +020017#include "filesystem_for_testing.h"
Guillaume Chatelet439d3712018-02-01 10:03:09 +010018#include "gtest/gtest.h"
Guillaume Chatelet22a53622020-09-23 11:52:20 +020019#include "hwcaps_for_testing.h"
Guillaume Chatelet439d3712018-02-01 10:03:09 +010020
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);
Patrick Siegl3d71a962019-12-14 11:58:36 +000046
47 // check some random features with EnumValue():
48 EXPECT_TRUE(GetArmFeaturesEnumValue(&info.features, ARM_VFP));
49 EXPECT_FALSE(GetArmFeaturesEnumValue(&info.features, ARM_VFPV4));
50 // out of bound EnumValue() check
51 EXPECT_FALSE(GetArmFeaturesEnumValue(&info.features, (ArmFeaturesEnum)~0x0));
Guillaume Chatelet439d3712018-02-01 10:03:09 +010052}
53
54TEST(CpuinfoArmTest, ODroidFromCpuInfo) {
55 DisableHardwareCapabilities();
56 auto& fs = GetEmptyFilesystem();
57 fs.CreateFile("/proc/cpuinfo", R"(processor : 0
58model name : ARMv7 Processor rev 3 (v71)
59BogoMIPS : 120.00
60Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae
61CPU implementer : 0x41
62CPU architecture: 7
63CPU variant : 0x2
64CPU part : 0xc0f
65CPU revision : 3)");
66 const auto info = GetArmInfo();
67 EXPECT_EQ(info.implementer, 0x41);
68 EXPECT_EQ(info.variant, 0x2);
69 EXPECT_EQ(info.part, 0xc0f);
70 EXPECT_EQ(info.revision, 3);
71 EXPECT_EQ(info.architecture, 7);
72
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +020073 EXPECT_FALSE(info.features.swp);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +020074 EXPECT_TRUE(info.features.half);
75 EXPECT_TRUE(info.features.thumb);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +020076 EXPECT_FALSE(info.features._26bit);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +020077 EXPECT_TRUE(info.features.fastmult);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +020078 EXPECT_FALSE(info.features.fpa);
Guillaume Chatelet439d3712018-02-01 10:03:09 +010079 EXPECT_TRUE(info.features.vfp);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +020080 EXPECT_TRUE(info.features.edsp);
81 EXPECT_FALSE(info.features.java);
Guillaume Chatelet439d3712018-02-01 10:03:09 +010082 EXPECT_FALSE(info.features.iwmmxt);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +020083 EXPECT_FALSE(info.features.crunch);
84 EXPECT_FALSE(info.features.thumbee);
Guillaume Chatelet439d3712018-02-01 10:03:09 +010085 EXPECT_TRUE(info.features.neon);
86 EXPECT_TRUE(info.features.vfpv3);
87 EXPECT_FALSE(info.features.vfpv3d16);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +020088 EXPECT_TRUE(info.features.tls);
Guillaume Chatelet439d3712018-02-01 10:03:09 +010089 EXPECT_TRUE(info.features.vfpv4);
90 EXPECT_TRUE(info.features.idiva);
91 EXPECT_TRUE(info.features.idivt);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +020092 EXPECT_TRUE(info.features.vfpd32);
93 EXPECT_TRUE(info.features.lpae);
94 EXPECT_FALSE(info.features.evtstrm);
Guillaume Chatelet439d3712018-02-01 10:03:09 +010095 EXPECT_FALSE(info.features.aes);
96 EXPECT_FALSE(info.features.pmull);
97 EXPECT_FALSE(info.features.sha1);
98 EXPECT_FALSE(info.features.sha2);
99 EXPECT_FALSE(info.features.crc32);
100}
101
Dr.-Ing. Patrick Siegl18342782019-06-25 17:58:31 +0200102// Linux test-case
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200103TEST(CpuinfoArmTest, RaspberryPiZeroFromCpuInfo) {
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200104 DisableHardwareCapabilities();
105 auto& fs = GetEmptyFilesystem();
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200106 fs.CreateFile("/proc/cpuinfo", R"(processor : 0
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200107model name : ARMv6-compatible processor rev 7 (v6l)
108BogoMIPS : 697.95
109Features : half thumb fastmult vfp edsp java tls
110CPU implementer : 0x41
111CPU architecture: 7
112CPU variant : 0x0
113CPU part : 0xb76
114CPU revision : 7
115
116Hardware : BCM2835
117Revision : 9000c1
118Serial : 000000006cd946f3)");
119 const auto info = GetArmInfo();
120 EXPECT_EQ(info.implementer, 0x41);
121 EXPECT_EQ(info.variant, 0x0);
122 EXPECT_EQ(info.part, 0xb76);
123 EXPECT_EQ(info.revision, 7);
Dr.-Ing. Patrick Siegl18342782019-06-25 17:58:31 +0200124 EXPECT_EQ(info.architecture, 6);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200125
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200126 EXPECT_FALSE(info.features.swp);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200127 EXPECT_TRUE(info.features.half);
128 EXPECT_TRUE(info.features.thumb);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200129 EXPECT_FALSE(info.features._26bit);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200130 EXPECT_TRUE(info.features.fastmult);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200131 EXPECT_FALSE(info.features.fpa);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200132 EXPECT_TRUE(info.features.vfp);
133 EXPECT_TRUE(info.features.edsp);
134 EXPECT_TRUE(info.features.java);
135 EXPECT_FALSE(info.features.iwmmxt);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200136 EXPECT_FALSE(info.features.crunch);
137 EXPECT_FALSE(info.features.thumbee);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200138 EXPECT_FALSE(info.features.neon);
139 EXPECT_FALSE(info.features.vfpv3);
140 EXPECT_FALSE(info.features.vfpv3d16);
141 EXPECT_TRUE(info.features.tls);
142 EXPECT_FALSE(info.features.vfpv4);
143 EXPECT_FALSE(info.features.idiva);
144 EXPECT_FALSE(info.features.idivt);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200145 EXPECT_FALSE(info.features.vfpd32);
146 EXPECT_FALSE(info.features.lpae);
147 EXPECT_FALSE(info.features.evtstrm);
148 EXPECT_FALSE(info.features.aes);
149 EXPECT_FALSE(info.features.pmull);
150 EXPECT_FALSE(info.features.sha1);
151 EXPECT_FALSE(info.features.sha2);
152 EXPECT_FALSE(info.features.crc32);
153}
154
155TEST(CpuinfoArmTest, MarvellArmadaFromCpuInfo) {
156 DisableHardwareCapabilities();
157 auto& fs = GetEmptyFilesystem();
158 fs.CreateFile("/proc/cpuinfo", R"(processor : 0
159model name : ARMv7 Processor rev 1 (v7l)
160BogoMIPS : 50.00
161Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32
162CPU implementer : 0x41
163CPU architecture: 7
164CPU variant : 0x4
165CPU part : 0xc09
166CPU revision : 1
167
168processor : 1
169model name : ARMv7 Processor rev 1 (v7l)
170BogoMIPS : 50.00
171Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32
172CPU implementer : 0x41
173CPU architecture: 7
174CPU variant : 0x4
175CPU part : 0xc09
176CPU revision : 1
177
178Hardware : Marvell Armada 380/385 (Device Tree)
179Revision : 0000
180Serial : 0000000000000000)");
181 const auto info = GetArmInfo();
182 EXPECT_EQ(info.implementer, 0x41);
183 EXPECT_EQ(info.variant, 0x4);
184 EXPECT_EQ(info.part, 0xc09);
185 EXPECT_EQ(info.revision, 1);
186 EXPECT_EQ(info.architecture, 7);
187
188 EXPECT_FALSE(info.features.swp);
189 EXPECT_TRUE(info.features.half);
190 EXPECT_TRUE(info.features.thumb);
191 EXPECT_FALSE(info.features._26bit);
192 EXPECT_TRUE(info.features.fastmult);
193 EXPECT_FALSE(info.features.fpa);
194 EXPECT_TRUE(info.features.vfp);
195 EXPECT_TRUE(info.features.edsp);
196 EXPECT_FALSE(info.features.java);
197 EXPECT_FALSE(info.features.iwmmxt);
198 EXPECT_FALSE(info.features.crunch);
199 EXPECT_FALSE(info.features.thumbee);
200 EXPECT_TRUE(info.features.neon);
201 EXPECT_TRUE(info.features.vfpv3);
202 EXPECT_FALSE(info.features.vfpv3d16);
203 EXPECT_TRUE(info.features.tls);
204 EXPECT_FALSE(info.features.vfpv4);
205 EXPECT_FALSE(info.features.idiva);
206 EXPECT_FALSE(info.features.idivt);
207 EXPECT_TRUE(info.features.vfpd32);
208 EXPECT_FALSE(info.features.lpae);
209 EXPECT_FALSE(info.features.evtstrm);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200210 EXPECT_FALSE(info.features.aes);
211 EXPECT_FALSE(info.features.pmull);
212 EXPECT_FALSE(info.features.sha1);
213 EXPECT_FALSE(info.features.sha2);
214 EXPECT_FALSE(info.features.crc32);
215}
216
Dr.-Ing. Patrick Siegl18342782019-06-25 17:58:31 +0200217// Android test-case
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100218// http://code.google.com/p/android/issues/detail?id=10812
219TEST(CpuinfoArmTest, InvalidArmv7) {
220 DisableHardwareCapabilities();
221 auto& fs = GetEmptyFilesystem();
222 fs.CreateFile("/proc/cpuinfo",
Guillaume Chatelet918553a2019-01-17 15:28:04 +0100223 R"(Processor : ARMv6-compatible processor rev 6 (v6l)
224BogoMIPS : 199.47
225Features : swp half thumb fastmult vfp edsp java
226CPU implementer : 0x41
227CPU architecture: 7
228CPU variant : 0x0
229CPU part : 0xb76
230CPU revision : 6
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100231
Guillaume Chatelet918553a2019-01-17 15:28:04 +0100232Hardware : SPICA
233Revision : 0020
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100234Serial : 33323613546d00ec )");
235 const auto info = GetArmInfo();
236 EXPECT_EQ(info.architecture, 6);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200237
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200238 EXPECT_TRUE(info.features.swp);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200239 EXPECT_TRUE(info.features.half);
240 EXPECT_TRUE(info.features.thumb);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200241 EXPECT_FALSE(info.features._26bit);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200242 EXPECT_TRUE(info.features.fastmult);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200243 EXPECT_FALSE(info.features.fpa);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200244 EXPECT_TRUE(info.features.vfp);
245 EXPECT_TRUE(info.features.edsp);
246 EXPECT_TRUE(info.features.java);
247 EXPECT_FALSE(info.features.iwmmxt);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200248 EXPECT_FALSE(info.features.crunch);
249 EXPECT_FALSE(info.features.thumbee);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200250 EXPECT_FALSE(info.features.neon);
251 EXPECT_FALSE(info.features.vfpv3);
252 EXPECT_FALSE(info.features.vfpv3d16);
253 EXPECT_FALSE(info.features.tls);
254 EXPECT_FALSE(info.features.vfpv4);
255 EXPECT_FALSE(info.features.idiva);
256 EXPECT_FALSE(info.features.idivt);
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200257 EXPECT_FALSE(info.features.vfpd32);
258 EXPECT_FALSE(info.features.lpae);
259 EXPECT_FALSE(info.features.evtstrm);
Dr.-Ing. Patrick Siegl6482bad2019-06-18 12:53:08 +0200260 EXPECT_FALSE(info.features.aes);
261 EXPECT_FALSE(info.features.pmull);
262 EXPECT_FALSE(info.features.sha1);
263 EXPECT_FALSE(info.features.sha2);
264 EXPECT_FALSE(info.features.crc32);
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100265}
266
Dr.-Ing. Patrick Siegl18342782019-06-25 17:58:31 +0200267// Android test-case
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100268// https://crbug.com/341598.
269TEST(CpuinfoArmTest, InvalidNeon) {
270 auto& fs = GetEmptyFilesystem();
271 fs.CreateFile("/proc/cpuinfo",
272 R"(Processor: ARMv7 Processory rev 0 (v71)
273processor: 0
274BogoMIPS: 13.50
275
276Processor: 1
277BogoMIPS: 13.50
278
279Features: swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt
280CPU implementer : 0x51
281CPU architecture: 7
282CPU variant: 0x1
283CPU part: 0x04d
284CPU revision: 0
285
286Hardware: SAMSUNG M2
287Revision: 0010
288Serial: 00001e030000354e)");
289 const auto info = GetArmInfo();
Dr.-Ing. Patrick Sieglbfd109b2019-06-26 12:56:52 +0200290 EXPECT_TRUE(info.features.swp);
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100291 EXPECT_FALSE(info.features.neon);
292}
293
294// The Nexus 4 (Qualcomm Krait) kernel configuration forgets to report IDIV
295// support.
296TEST(CpuinfoArmTest, Nexus4_0x510006f2) {
297 DisableHardwareCapabilities();
298 auto& fs = GetEmptyFilesystem();
299 fs.CreateFile("/proc/cpuinfo",
300 R"(CPU implementer : 0x51
301CPU architecture: 7
302CPU variant : 0x0
303CPU part : 0x6f
304CPU revision : 2)");
305 const auto info = GetArmInfo();
306 EXPECT_TRUE(info.features.idiva);
307 EXPECT_TRUE(info.features.idivt);
Guillaume Chatelet918553a2019-01-17 15:28:04 +0100308
309 EXPECT_EQ(GetArmCpuId(&info), 0x510006f2);
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100310}
311
312// The Nexus 4 (Qualcomm Krait) kernel configuration forgets to report IDIV
313// support.
314TEST(CpuinfoArmTest, Nexus4_0x510006f3) {
315 DisableHardwareCapabilities();
316 auto& fs = GetEmptyFilesystem();
317 fs.CreateFile("/proc/cpuinfo",
318 R"(CPU implementer : 0x51
319CPU architecture: 7
320CPU variant : 0x0
321CPU part : 0x6f
322CPU revision : 3)");
323 const auto info = GetArmInfo();
324 EXPECT_TRUE(info.features.idiva);
325 EXPECT_TRUE(info.features.idivt);
Guillaume Chatelet918553a2019-01-17 15:28:04 +0100326
327 EXPECT_EQ(GetArmCpuId(&info), 0x510006f3);
Guillaume Chatelet439d3712018-02-01 10:03:09 +0100328}
329
330// The emulator-specific Android 4.2 kernel fails to report support for the
331// 32-bit ARM IDIV instruction. Technically, this is a feature of the virtual
332// CPU implemented by the emulator.
333TEST(CpuinfoArmTest, EmulatorSpecificIdiv) {
334 DisableHardwareCapabilities();
335 auto& fs = GetEmptyFilesystem();
336 fs.CreateFile("/proc/cpuinfo",
337 R"(Processor : ARMv7 Processor rev 0 (v7l)
338BogoMIPS : 629.14
339Features : swp half thumb fastmult vfp edsp neon vfpv3
340CPU implementer : 0x41
341CPU architecture: 7
342CPU variant : 0x0
343CPU part : 0xc08
344CPU revision : 0
345
346Hardware : Goldfish
347Revision : 0000
348Serial : 0000000000000000)");
349 const auto info = GetArmInfo();
350 EXPECT_TRUE(info.features.idiva);
351}
352
353} // namespace
354} // namespace cpu_features