2 * Arm specific proc functions for linux-user
4 * SPDX-License-Identifier: GPL-2.0-or-later
6 #ifndef ARM_TARGET_PROC_H
7 #define ARM_TARGET_PROC_H
9 static int open_cpuinfo(CPUArchState
*cpu_env
, int fd
)
11 ARMCPU
*cpu
= env_archcpu(cpu_env
);
12 int arch
, midr_rev
, midr_part
, midr_var
, midr_impl
;
13 target_ulong elf_hwcap
= get_elf_hwcap();
14 target_ulong elf_hwcap2
= get_elf_hwcap2();
16 int num_cpus
, len_part
, len_var
;
19 # define END_SUFFIX "b"
21 # define END_SUFFIX "l"
25 elf_name
= "v8" END_SUFFIX
;
26 midr_rev
= FIELD_EX32(cpu
->midr
, MIDR_EL1
, REVISION
);
27 midr_part
= FIELD_EX32(cpu
->midr
, MIDR_EL1
, PARTNUM
);
28 midr_var
= FIELD_EX32(cpu
->midr
, MIDR_EL1
, VARIANT
);
29 midr_impl
= FIELD_EX32(cpu
->midr
, MIDR_EL1
, IMPLEMENTER
);
33 #ifndef TARGET_AARCH64
34 /* For simplicity, treat ARMv8 as an arm64 kernel with CONFIG_COMPAT. */
35 if (!arm_feature(&cpu
->env
, ARM_FEATURE_V8
)) {
36 if (arm_feature(&cpu
->env
, ARM_FEATURE_V7
)) {
38 midr_var
= (cpu
->midr
>> 16) & 0x7f;
40 if (arm_feature(&cpu
->env
, ARM_FEATURE_M
)) {
41 elf_name
= "armv7m" END_SUFFIX
;
43 elf_name
= "armv7" END_SUFFIX
;
46 midr_part
= cpu
->midr
>> 4;
48 if (arm_feature(&cpu
->env
, ARM_FEATURE_V6
)) {
50 elf_name
= "armv6" END_SUFFIX
;
51 } else if (arm_feature(&cpu
->env
, ARM_FEATURE_V5
)) {
53 elf_name
= "armv5t" END_SUFFIX
;
56 elf_name
= "armv4" END_SUFFIX
;
64 num_cpus
= sysconf(_SC_NPROCESSORS_ONLN
);
65 for (int i
= 0; i
< num_cpus
; i
++) {
68 "model name\t: ARMv%d Processor rev %d (%s)\n"
69 "BogoMIPS\t: 100.00\n"
71 i
, arch
, midr_rev
, elf_name
);
73 for (target_ulong j
= elf_hwcap
; j
; j
&= j
- 1) {
74 dprintf(fd
, " %s", elf_hwcap_str(ctz64(j
)));
76 for (target_ulong j
= elf_hwcap2
; j
; j
&= j
- 1) {
77 dprintf(fd
, " %s", elf_hwcap2_str(ctz64(j
)));
81 "CPU implementer\t: 0x%02x\n"
82 "CPU architecture: %d\n"
83 "CPU variant\t: 0x%0*x\n",
84 midr_impl
, arch
, len_var
, midr_var
);
86 dprintf(fd
, "CPU part\t: 0x%0*x\n", len_part
, midr_part
);
88 dprintf(fd
, "CPU revision\t: %d\n\n", midr_rev
);
92 dprintf(fd
, "Hardware\t: QEMU v%s %s\n", QEMU_VERSION
,
93 cpu
->dtb_compatible
? : "");
94 dprintf(fd
, "Revision\t: 0000\n");
95 dprintf(fd
, "Serial\t\t: 0000000000000000\n");
99 #define HAVE_ARCH_PROC_CPUINFO
101 #endif /* ARM_TARGET_PROC_H */