| /* | 
 |  * Arm specific proc functions for linux-user | 
 |  * | 
 |  * SPDX-License-Identifier: GPL-2.0-or-later | 
 |  */ | 
 | #ifndef ARM_TARGET_PROC_H | 
 | #define ARM_TARGET_PROC_H | 
 |  | 
 | static int open_cpuinfo(CPUArchState *cpu_env, int fd) | 
 | { | 
 |     ARMCPU *cpu = env_archcpu(cpu_env); | 
 |     int arch, midr_rev, midr_part, midr_var, midr_impl; | 
 |     target_ulong elf_hwcap = get_elf_hwcap(); | 
 |     target_ulong elf_hwcap2 = get_elf_hwcap2(); | 
 |     const char *elf_name; | 
 |     int num_cpus, len_part, len_var; | 
 |  | 
 | #if TARGET_BIG_ENDIAN | 
 | # define END_SUFFIX "b" | 
 | #else | 
 | # define END_SUFFIX "l" | 
 | #endif | 
 |  | 
 |     arch = 8; | 
 |     elf_name = "v8" END_SUFFIX; | 
 |     midr_rev = FIELD_EX32(cpu->midr, MIDR_EL1, REVISION); | 
 |     midr_part = FIELD_EX32(cpu->midr, MIDR_EL1, PARTNUM); | 
 |     midr_var = FIELD_EX32(cpu->midr, MIDR_EL1, VARIANT); | 
 |     midr_impl = FIELD_EX32(cpu->midr, MIDR_EL1, IMPLEMENTER); | 
 |     len_part = 3; | 
 |     len_var = 1; | 
 |  | 
 | #ifndef TARGET_AARCH64 | 
 |     /* For simplicity, treat ARMv8 as an arm64 kernel with CONFIG_COMPAT. */ | 
 |     if (!arm_feature(&cpu->env, ARM_FEATURE_V8)) { | 
 |         if (arm_feature(&cpu->env, ARM_FEATURE_V7)) { | 
 |             arch = 7; | 
 |             midr_var = (cpu->midr >> 16) & 0x7f; | 
 |             len_var = 2; | 
 |             if (arm_feature(&cpu->env, ARM_FEATURE_M)) { | 
 |                 elf_name = "armv7m" END_SUFFIX; | 
 |             } else { | 
 |                 elf_name = "armv7" END_SUFFIX; | 
 |             } | 
 |         } else { | 
 |             midr_part = cpu->midr >> 4; | 
 |             len_part = 7; | 
 |             if (arm_feature(&cpu->env, ARM_FEATURE_V6)) { | 
 |                 arch = 6; | 
 |                 elf_name = "armv6" END_SUFFIX; | 
 |             } else if (arm_feature(&cpu->env, ARM_FEATURE_V5)) { | 
 |                 arch = 5; | 
 |                 elf_name = "armv5t" END_SUFFIX; | 
 |             } else { | 
 |                 arch = 4; | 
 |                 elf_name = "armv4" END_SUFFIX; | 
 |             } | 
 |         } | 
 |     } | 
 | #endif | 
 |  | 
 | #undef END_SUFFIX | 
 |  | 
 |     num_cpus = sysconf(_SC_NPROCESSORS_ONLN); | 
 |     for (int i = 0; i < num_cpus; i++) { | 
 |         dprintf(fd, | 
 |                 "processor\t: %d\n" | 
 |                 "model name\t: ARMv%d Processor rev %d (%s)\n" | 
 |                 "BogoMIPS\t: 100.00\n" | 
 |                 "Features\t:", | 
 |                 i, arch, midr_rev, elf_name); | 
 |  | 
 |         for (target_ulong j = elf_hwcap; j ; j &= j - 1) { | 
 |             dprintf(fd, " %s", elf_hwcap_str(ctz64(j))); | 
 |         } | 
 |         for (target_ulong j = elf_hwcap2; j ; j &= j - 1) { | 
 |             dprintf(fd, " %s", elf_hwcap2_str(ctz64(j))); | 
 |         } | 
 |  | 
 |         dprintf(fd, "\n" | 
 |                 "CPU implementer\t: 0x%02x\n" | 
 |                 "CPU architecture: %d\n" | 
 |                 "CPU variant\t: 0x%0*x\n", | 
 |                 midr_impl, arch, len_var, midr_var); | 
 |         if (arch >= 7) { | 
 |             dprintf(fd, "CPU part\t: 0x%0*x\n", len_part, midr_part); | 
 |         } | 
 |         dprintf(fd, "CPU revision\t: %d\n\n", midr_rev); | 
 |     } | 
 |  | 
 |     if (arch < 8) { | 
 |         dprintf(fd, "Hardware\t: QEMU v%s %s\n", QEMU_VERSION, | 
 |                 cpu->dtb_compatible ? : ""); | 
 |         dprintf(fd, "Revision\t: 0000\n"); | 
 |         dprintf(fd, "Serial\t\t: 0000000000000000\n"); | 
 |     } | 
 |     return 0; | 
 | } | 
 | #define HAVE_ARCH_PROC_CPUINFO | 
 |  | 
 | #endif /* ARM_TARGET_PROC_H */ |