1 // SPDX-License-Identifier: GPL-2.0-only
2 #include <stddef.h>
3 #include <asm/hwprobe.h>
4
5 /*
6 * Rather than relying on having a new enough libc to define this, just do it
7 * ourselves. This way we don't need to be coupled to a new-enough libc to
8 * contain the call.
9 */
10 long riscv_hwprobe(struct riscv_hwprobe *pairs, size_t pair_count,
11 size_t cpu_count, unsigned long *cpus, unsigned int flags);
12
main(int argc,char ** argv)13 int main(int argc, char **argv)
14 {
15 struct riscv_hwprobe pairs[8];
16 unsigned long cpus;
17 long out;
18
19 /* Fake the CPU_SET ops. */
20 cpus = -1;
21
22 /*
23 * Just run a basic test: pass enough pairs to get up to the base
24 * behavior, and then check to make sure it's sane.
25 */
26 for (long i = 0; i < 8; i++)
27 pairs[i].key = i;
28 out = riscv_hwprobe(pairs, 8, 1, &cpus, 0);
29 if (out != 0)
30 return -1;
31 for (long i = 0; i < 4; ++i) {
32 /* Fail if the kernel claims not to recognize a base key. */
33 if ((i < 4) && (pairs[i].key != i))
34 return -2;
35
36 if (pairs[i].key != RISCV_HWPROBE_KEY_BASE_BEHAVIOR)
37 continue;
38
39 if (pairs[i].value & RISCV_HWPROBE_BASE_BEHAVIOR_IMA)
40 continue;
41
42 return -3;
43 }
44
45 /*
46 * This should also work with a NULL CPU set, but should not work
47 * with an improperly supplied CPU set.
48 */
49 out = riscv_hwprobe(pairs, 8, 0, 0, 0);
50 if (out != 0)
51 return -4;
52
53 out = riscv_hwprobe(pairs, 8, 0, &cpus, 0);
54 if (out == 0)
55 return -5;
56
57 out = riscv_hwprobe(pairs, 8, 1, 0, 0);
58 if (out == 0)
59 return -6;
60
61 /*
62 * Check that keys work by providing one that we know exists, and
63 * checking to make sure the resultig pair is what we asked for.
64 */
65 pairs[0].key = RISCV_HWPROBE_KEY_BASE_BEHAVIOR;
66 out = riscv_hwprobe(pairs, 1, 1, &cpus, 0);
67 if (out != 0)
68 return -7;
69 if (pairs[0].key != RISCV_HWPROBE_KEY_BASE_BEHAVIOR)
70 return -8;
71
72 /*
73 * Check that an unknown key gets overwritten with -1,
74 * but doesn't block elements after it.
75 */
76 pairs[0].key = 0x5555;
77 pairs[1].key = 1;
78 pairs[1].value = 0xAAAA;
79 out = riscv_hwprobe(pairs, 2, 0, 0, 0);
80 if (out != 0)
81 return -9;
82
83 if (pairs[0].key != -1)
84 return -10;
85
86 if ((pairs[1].key != 1) || (pairs[1].value == 0xAAAA))
87 return -11;
88
89 return 0;
90 }
91