1 #include <stdint.h>
2
3 #if CPUINFO_MOCK
4 extern uint32_t cpuinfo_arm_fpsid;
5 extern uint32_t cpuinfo_arm_mvfr0;
6 extern uint32_t cpuinfo_arm_wcid;
7
read_fpsid(void)8 static inline uint32_t read_fpsid(void) {
9 return cpuinfo_arm_fpsid;
10 }
11
read_mvfr0(void)12 static inline uint32_t read_mvfr0(void) {
13 return cpuinfo_arm_mvfr0;
14 }
15
read_wcid(void)16 static inline uint32_t read_wcid(void) {
17 return cpuinfo_arm_wcid;
18 }
19 #else
20 #if !defined(__ARM_ARCH_7A__) && !defined(__ARM_ARCH_8A__) && !(defined(__ARM_ARCH) && (__ARM_ARCH >= 7))
21 /*
22 * CoProcessor 10 is inaccessible from user mode since ARMv7,
23 * and clang refuses to compile inline assembly when targeting ARMv7+
24 */
read_fpsid(void)25 static inline uint32_t read_fpsid(void) {
26 uint32_t fpsid;
27 __asm__ __volatile__("MRC p10, 0x7, %[fpsid], cr0, cr0, 0" : [fpsid] "=r"(fpsid));
28 return fpsid;
29 }
30
read_mvfr0(void)31 static inline uint32_t read_mvfr0(void) {
32 uint32_t mvfr0;
33 __asm__ __volatile__("MRC p10, 0x7, %[mvfr0], cr7, cr0, 0" : [mvfr0] "=r"(mvfr0));
34 return mvfr0;
35 }
36 #endif
37 #if !defined(__ARM_ARCH_8A__) && !(defined(__ARM_ARCH) && (__ARM_ARCH >= 8))
38 /*
39 * In ARMv8, AArch32 state supports only conceptual coprocessors CP10, CP11,
40 * CP14, and CP15. AArch64 does not support the concept of coprocessors. and
41 * clang refuses to compile inline assembly when targeting ARMv8+
42 */
read_wcid(void)43 static inline uint32_t read_wcid(void) {
44 uint32_t wcid;
45 __asm__ __volatile__("MRC p1, 0, %[wcid], c0, c0" : [wcid] "=r"(wcid));
46 return wcid;
47 }
48 #endif
49 #endif
50