• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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