Skip to content

Commit 2105209

Browse files
Add starfive-visionfive-v2 as example rv64 board
We should ideally have at least one RISC-V board in our test group to limit future regression. Further work will have to be done to actually enable a toolchain that can build this test. The Starfive VisionFive V2 board was chosen here as an open-source board that has been referenced in the public issues. Confirmed success of this mocked device test on a RISC-V QEMU instance.
1 parent 9d80992 commit 2105209

File tree

6 files changed

+515
-5
lines changed

6 files changed

+515
-5
lines changed

CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,13 @@ IF(CPUINFO_SUPPORTED_PLATFORM AND CPUINFO_BUILD_MOCK_TESTS)
384384
TARGET_COMPILE_DEFINITIONS(cpuinfo_mock PRIVATE _GNU_SOURCE=1)
385385
ENDIF()
386386

387+
IF(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(riscv(32|64))$")
388+
ADD_EXECUTABLE(starfive-visionfive-v2-test test/mock/starfive-visionfive-v2.cc)
389+
TARGET_INCLUDE_DIRECTORIES(starfive-visionfive-v2-test BEFORE PRIVATE test/mock)
390+
TARGET_LINK_LIBRARIES(starfive-visionfive-v2-test PRIVATE cpuinfo_mock gtest)
391+
ADD_TEST(NAME starfive-visionfive-v2-test COMMAND starfive-visionfive-v2-test)
392+
ENDIF()
393+
387394
IF(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(armv5te|armv7-a)$")
388395
ADD_EXECUTABLE(atm7029b-tablet-test test/mock/atm7029b-tablet.cc)
389396
TARGET_INCLUDE_DIRECTORIES(atm7029b-tablet-test BEFORE PRIVATE test/mock)

include/cpuinfo-mock.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,22 @@ struct cpuinfo_mock_property {
5858
int CPUINFO_ABI cpuinfo_mock_close(int fd);
5959
ssize_t CPUINFO_ABI cpuinfo_mock_read(int fd, void* buffer, size_t capacity);
6060

61-
#if CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
61+
#if CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64 \
62+
|| CPUINFO_ARCH_RISCV32 || CPUINFO_ARCH_RISCV64
6263
void CPUINFO_ABI cpuinfo_set_hwcap(uint32_t hwcap);
6364
#endif
6465
#if CPUINFO_ARCH_ARM
6566
void CPUINFO_ABI cpuinfo_set_hwcap2(uint32_t hwcap2);
6667
#endif
68+
#if CPUINFO_ARCH_RISCV32 || CPUINFO_ARCH_RISCV64
69+
#include <sys/hwprobe.h>
70+
typedef int (*cpuinfo_mock_riscv_hwprobe)(struct riscv_hwprobe* pairs,
71+
size_t pair_count,
72+
size_t cpu_count,
73+
unsigned long *cpus,
74+
unsigned int flags);
75+
void CPUINFO_ABI cpuinfo_set_riscv_hwprobe(cpuinfo_mock_riscv_hwprobe riscv_hwprobe);
76+
#endif
6777
#endif
6878

6979
#if defined(__ANDROID__)

src/riscv/linux/riscv-hw.c

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,17 @@
55
#include <riscv/api.h>
66
#include <riscv/linux/api.h>
77

8+
#if CPUINFO_MOCK
9+
#include <cpuinfo-mock.h>
10+
#endif // CPUINFO_MOCK
11+
12+
#if CPUINFO_MOCK
13+
static cpuinfo_mock_riscv_hwprobe g_riscv_hwprobe;
14+
void cpuinfo_set_riscv_hwprobe(cpuinfo_mock_riscv_hwprobe riscv_hwprobe) {
15+
g_riscv_hwprobe = riscv_hwprobe;
16+
}
17+
#endif // CPUINFO_MOCK
18+
819
void cpuinfo_riscv_linux_decode_vendor_uarch_from_hwprobe(
920
uint32_t processor,
1021
enum cpuinfo_vendor vendor[restrict static 1],
@@ -33,9 +44,13 @@ void cpuinfo_riscv_linux_decode_vendor_uarch_from_hwprobe(
3344
CPU_SET_S(processor, cpu_set_size, cpu_set);
3445

3546
/* Request all available information from hwprobe. */
36-
int ret = __riscv_hwprobe(pairs, pairs_count,
37-
cpu_set_size, (unsigned long*)cpu_set,
38-
0 /* flags */);
47+
#if CPUINFO_MOCK
48+
int ret = g_riscv_hwprobe(pairs, pairs_count, cpu_set_size,
49+
(unsigned long*)cpu_set, 0 /* flags */);
50+
#else
51+
int ret = __riscv_hwprobe(pairs, pairs_count, cpu_set_size,
52+
(unsigned long*)cpu_set, 0 /* flags */);
53+
#endif
3954
if (ret < 0) {
4055
cpuinfo_log_warning("failed to get hwprobe information, err: %d", ret);
4156
goto cleanup;

src/riscv/linux/riscv-isa.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33

44
#include <riscv/linux/api.h>
55

6+
#if CPUINFO_MOCK
7+
#include <cpuinfo-mock.h>
8+
#endif // CPUINFO_MOCK
9+
610
/**
711
* arch/riscv/include/uapi/asm/hwcap.h
812
*
@@ -16,9 +20,20 @@
1620
#define COMPAT_HWCAP_ISA_C (1 << ('C' - 'A'))
1721
#define COMPAT_HWCAP_ISA_V (1 << ('V' - 'A'))
1822

23+
#if CPUINFO_MOCK
24+
static uint32_t g_mock_hwcap = 0;
25+
void cpuinfo_set_hwcap(uint32_t hwcap) {
26+
g_mock_hwcap = hwcap;
27+
}
28+
#endif // CPUINFO_MOCK
29+
1930
void cpuinfo_riscv_linux_decode_isa_from_hwcap(
2031
struct cpuinfo_riscv_isa isa[restrict static 1]) {
21-
const unsigned long hwcap = getauxval(AT_HWCAP);
32+
#if CPUINFO_MOCK
33+
const uint32_t hwcap = g_mock_hwcap;
34+
#else
35+
const uint32_t hwcap = getauxval(AT_HWCAP);
36+
#endif // CPUINFO_MOCK
2237

2338
if (hwcap & COMPAT_HWCAP_ISA_I) {
2439
isa->i = true;

test/mock/starfive-visionfive-v2.cc

Lines changed: 276 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,276 @@
1+
#include <gtest/gtest.h>
2+
3+
#include <cpuinfo.h>
4+
#include <cpuinfo-mock.h>
5+
6+
7+
TEST(PROCESSORS, count) {
8+
ASSERT_EQ(4, cpuinfo_get_processors_count());
9+
}
10+
11+
TEST(PROCESSORS, non_null) {
12+
ASSERT_TRUE(cpuinfo_get_processors());
13+
}
14+
15+
TEST(PROCESSORS, core) {
16+
for (uint32_t i = 0; i < cpuinfo_get_processors_count(); i++) {
17+
ASSERT_EQ(cpuinfo_get_core(i), cpuinfo_get_processor(i)->core);
18+
}
19+
}
20+
21+
TEST(PROCESSORS, cluster) {
22+
for (uint32_t i = 0; i < cpuinfo_get_processors_count(); i++) {
23+
ASSERT_EQ(cpuinfo_get_cluster(0), cpuinfo_get_processor(i)->cluster);
24+
}
25+
}
26+
27+
TEST(PROCESSORS, package) {
28+
for (uint32_t i = 0; i < cpuinfo_get_processors_count(); i++) {
29+
ASSERT_EQ(cpuinfo_get_package(0), cpuinfo_get_processor(i)->package);
30+
}
31+
}
32+
33+
TEST(PROCESSORS, linux_id) {
34+
for (uint32_t i = 0; i < cpuinfo_get_processors_count(); i++) {
35+
ASSERT_EQ(i, cpuinfo_get_processor(i)->linux_id);
36+
}
37+
}
38+
39+
TEST(PROCESSORS, l1i) {
40+
for (uint32_t i = 0; i < cpuinfo_get_processors_count(); i++) {
41+
ASSERT_EQ(cpuinfo_get_l1i_cache(i), cpuinfo_get_processor(i)->cache.l1i);
42+
}
43+
}
44+
45+
TEST(PROCESSORS, l1d) {
46+
for (uint32_t i = 0; i < cpuinfo_get_processors_count(); i++) {
47+
ASSERT_EQ(cpuinfo_get_l1d_cache(i), cpuinfo_get_processor(i)->cache.l1d);
48+
}
49+
}
50+
51+
TEST(PROCESSORS, l2) {
52+
for (uint32_t i = 0; i < cpuinfo_get_processors_count(); i++) {
53+
ASSERT_EQ(cpuinfo_get_l2_cache(0), cpuinfo_get_processor(i)->cache.l2);
54+
}
55+
}
56+
57+
TEST(PROCESSORS, l3) {
58+
for (uint32_t i = 0; i < cpuinfo_get_processors_count(); i++) {
59+
ASSERT_FALSE(cpuinfo_get_processor(i)->cache.l3);
60+
}
61+
}
62+
63+
TEST(PROCESSORS, l4) {
64+
for (uint32_t i = 0; i < cpuinfo_get_processors_count(); i++) {
65+
ASSERT_FALSE(cpuinfo_get_processor(i)->cache.l4);
66+
}
67+
}
68+
69+
TEST(CORES, count) {
70+
ASSERT_EQ(4, cpuinfo_get_cores_count());
71+
}
72+
73+
TEST(CORES, non_null) {
74+
ASSERT_TRUE(cpuinfo_get_cores());
75+
}
76+
77+
TEST(CORES, processor_start) {
78+
for (uint32_t i = 0; i < cpuinfo_get_cores_count(); i++) {
79+
ASSERT_EQ(i, cpuinfo_get_core(i)->processor_start);
80+
}
81+
}
82+
83+
TEST(CORES, processor_count) {
84+
for (uint32_t i = 0; i < cpuinfo_get_cores_count(); i++) {
85+
ASSERT_EQ(1, cpuinfo_get_core(i)->processor_count);
86+
}
87+
}
88+
89+
TEST(CORES, core_id) {
90+
for (uint32_t i = 0; i < cpuinfo_get_cores_count(); i++) {
91+
ASSERT_EQ(i, cpuinfo_get_core(i)->core_id);
92+
}
93+
}
94+
95+
TEST(CORES, cluster) {
96+
for (uint32_t i = 0; i < cpuinfo_get_cores_count(); i++) {
97+
ASSERT_EQ(cpuinfo_get_cluster(0), cpuinfo_get_core(i)->cluster);
98+
}
99+
}
100+
101+
TEST(CORES, package) {
102+
for (uint32_t i = 0; i < cpuinfo_get_cores_count(); i++) {
103+
ASSERT_EQ(cpuinfo_get_package(0), cpuinfo_get_core(i)->package);
104+
}
105+
}
106+
107+
TEST(CORES, vendor) {
108+
for (uint32_t i = 0; i < cpuinfo_get_cores_count(); i++) {
109+
ASSERT_EQ(cpuinfo_vendor_sifive, cpuinfo_get_core(i)->vendor);
110+
}
111+
}
112+
113+
TEST(CORES, uarch) {
114+
for (uint32_t i = 0; i < cpuinfo_get_cores_count(); i++) {
115+
ASSERT_EQ(cpuinfo_uarch_unknown, cpuinfo_get_core(i)->uarch);
116+
}
117+
}
118+
119+
TEST(CLUSTERS, count) {
120+
ASSERT_EQ(1, cpuinfo_get_clusters_count());
121+
}
122+
123+
TEST(CLUSTERS, non_null) {
124+
ASSERT_TRUE(cpuinfo_get_clusters());
125+
}
126+
127+
TEST(CLUSTERS, processor_start) {
128+
for (uint32_t i = 0; i < cpuinfo_get_clusters_count(); i++) {
129+
ASSERT_EQ(0, cpuinfo_get_cluster(i)->processor_start);
130+
}
131+
}
132+
133+
TEST(CLUSTERS, processor_count) {
134+
for (uint32_t i = 0; i < cpuinfo_get_clusters_count(); i++) {
135+
ASSERT_EQ(4, cpuinfo_get_cluster(i)->processor_count);
136+
}
137+
}
138+
139+
TEST(CLUSTERS, core_start) {
140+
for (uint32_t i = 0; i < cpuinfo_get_clusters_count(); i++) {
141+
ASSERT_EQ(0, cpuinfo_get_cluster(i)->core_start);
142+
}
143+
}
144+
145+
TEST(CLUSTERS, core_count) {
146+
for (uint32_t i = 0; i < cpuinfo_get_clusters_count(); i++) {
147+
ASSERT_EQ(4, cpuinfo_get_cluster(i)->core_count);
148+
}
149+
}
150+
151+
TEST(CLUSTERS, cluster_id) {
152+
for (uint32_t i = 0; i < cpuinfo_get_clusters_count(); i++) {
153+
ASSERT_EQ(i, cpuinfo_get_cluster(i)->cluster_id);
154+
}
155+
}
156+
157+
TEST(CLUSTERS, package) {
158+
for (uint32_t i = 0; i < cpuinfo_get_clusters_count(); i++) {
159+
ASSERT_EQ(cpuinfo_get_package(0), cpuinfo_get_cluster(i)->package);
160+
}
161+
}
162+
163+
TEST(CLUSTERS, vendor) {
164+
for (uint32_t i = 0; i < cpuinfo_get_clusters_count(); i++) {
165+
ASSERT_EQ(cpuinfo_vendor_sifive, cpuinfo_get_cluster(i)->vendor);
166+
}
167+
}
168+
169+
TEST(CLUSTERS, uarch) {
170+
for (uint32_t i = 0; i < cpuinfo_get_clusters_count(); i++) {
171+
ASSERT_EQ(cpuinfo_uarch_unknown, cpuinfo_get_cluster(i)->uarch);
172+
}
173+
}
174+
175+
TEST(PACKAGES, count) {
176+
ASSERT_EQ(1, cpuinfo_get_packages_count());
177+
}
178+
179+
TEST(PACKAGES, name) {
180+
for (uint32_t i = 0; i < cpuinfo_get_packages_count(); i++) {
181+
ASSERT_EQ("",
182+
std::string(cpuinfo_get_package(i)->name,
183+
strnlen(cpuinfo_get_package(i)->name, CPUINFO_PACKAGE_NAME_MAX)));
184+
}
185+
}
186+
187+
TEST(PACKAGES, processor_start) {
188+
for (uint32_t i = 0; i < cpuinfo_get_packages_count(); i++) {
189+
ASSERT_EQ(0, cpuinfo_get_package(i)->processor_start);
190+
}
191+
}
192+
193+
TEST(PACKAGES, processor_count) {
194+
for (uint32_t i = 0; i < cpuinfo_get_packages_count(); i++) {
195+
ASSERT_EQ(4, cpuinfo_get_package(i)->processor_count);
196+
}
197+
}
198+
199+
TEST(PACKAGES, core_start) {
200+
for (uint32_t i = 0; i < cpuinfo_get_packages_count(); i++) {
201+
ASSERT_EQ(0, cpuinfo_get_package(i)->core_start);
202+
}
203+
}
204+
205+
TEST(PACKAGES, core_count) {
206+
for (uint32_t i = 0; i < cpuinfo_get_packages_count(); i++) {
207+
ASSERT_EQ(4, cpuinfo_get_package(i)->core_count);
208+
}
209+
}
210+
211+
TEST(PACKAGES, cluster_start) {
212+
for (uint32_t i = 0; i < cpuinfo_get_packages_count(); i++) {
213+
ASSERT_EQ(0, cpuinfo_get_package(i)->cluster_start);
214+
}
215+
}
216+
217+
TEST(PACKAGES, cluster_count) {
218+
for (uint32_t i = 0; i < cpuinfo_get_packages_count(); i++) {
219+
ASSERT_EQ(1, cpuinfo_get_package(i)->cluster_count);
220+
}
221+
}
222+
223+
TEST(ISA, i) {
224+
ASSERT_TRUE(cpuinfo_isa.i);
225+
}
226+
227+
TEST(ISA, m) {
228+
ASSERT_TRUE(cpuinfo_isa.m);
229+
}
230+
231+
TEST(ISA, a) {
232+
ASSERT_TRUE(cpuinfo_isa.a);
233+
}
234+
235+
TEST(ISA, f) {
236+
ASSERT_TRUE(cpuinfo_isa.f);
237+
}
238+
239+
TEST(ISA, d) {
240+
ASSERT_TRUE(cpuinfo_isa.d);
241+
}
242+
243+
TEST(ISA, c) {
244+
ASSERT_TRUE(cpuinfo_isa.c);
245+
}
246+
247+
TEST(ISA, v) {
248+
ASSERT_FALSE(cpuinfo_isa.v);
249+
}
250+
251+
#include <starfive-visionfive-v2.h>
252+
253+
int riscv_hwprobe(struct riscv_hwprobe* pairs, size_t pair_count,
254+
size_t /* cpu_count */, unsigned long * /* cpus */,
255+
unsigned int /* flags */) {
256+
for (size_t pair = 0; pair < pair_count; pair++) {
257+
switch (pairs[pair].key) {
258+
case RISCV_HWPROBE_KEY_MVENDORID:
259+
pairs[pair].value = 0x489;
260+
break;
261+
default:
262+
pairs[pair].key = -1;
263+
break;
264+
}
265+
}
266+
return 0;
267+
}
268+
269+
int main(int argc, char* argv[]) {
270+
cpuinfo_mock_filesystem(filesystem);
271+
cpuinfo_set_hwcap(UINT32_C(0x0000112D));
272+
cpuinfo_set_riscv_hwprobe(&riscv_hwprobe);
273+
cpuinfo_initialize();
274+
::testing::InitGoogleTest(&argc, argv);
275+
return RUN_ALL_TESTS();
276+
}

0 commit comments

Comments
 (0)