target_proc.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. * Arm specific proc functions for linux-user
  3. *
  4. * SPDX-License-Identifier: GPL-2.0-or-later
  5. */
  6. #ifndef ARM_TARGET_PROC_H
  7. #define ARM_TARGET_PROC_H
  8. static int open_cpuinfo(CPUArchState *cpu_env, int fd)
  9. {
  10. ARMCPU *cpu = env_archcpu(cpu_env);
  11. int arch, midr_rev, midr_part, midr_var, midr_impl;
  12. target_ulong elf_hwcap = get_elf_hwcap();
  13. target_ulong elf_hwcap2 = get_elf_hwcap2();
  14. const char *elf_name;
  15. int num_cpus, len_part, len_var;
  16. #if TARGET_BIG_ENDIAN
  17. # define END_SUFFIX "b"
  18. #else
  19. # define END_SUFFIX "l"
  20. #endif
  21. arch = 8;
  22. elf_name = "v8" END_SUFFIX;
  23. midr_rev = FIELD_EX32(cpu->midr, MIDR_EL1, REVISION);
  24. midr_part = FIELD_EX32(cpu->midr, MIDR_EL1, PARTNUM);
  25. midr_var = FIELD_EX32(cpu->midr, MIDR_EL1, VARIANT);
  26. midr_impl = FIELD_EX32(cpu->midr, MIDR_EL1, IMPLEMENTER);
  27. len_part = 3;
  28. len_var = 1;
  29. #ifndef TARGET_AARCH64
  30. /* For simplicity, treat ARMv8 as an arm64 kernel with CONFIG_COMPAT. */
  31. if (!arm_feature(&cpu->env, ARM_FEATURE_V8)) {
  32. if (arm_feature(&cpu->env, ARM_FEATURE_V7)) {
  33. arch = 7;
  34. midr_var = (cpu->midr >> 16) & 0x7f;
  35. len_var = 2;
  36. if (arm_feature(&cpu->env, ARM_FEATURE_M)) {
  37. elf_name = "armv7m" END_SUFFIX;
  38. } else {
  39. elf_name = "armv7" END_SUFFIX;
  40. }
  41. } else {
  42. midr_part = cpu->midr >> 4;
  43. len_part = 7;
  44. if (arm_feature(&cpu->env, ARM_FEATURE_V6)) {
  45. arch = 6;
  46. elf_name = "armv6" END_SUFFIX;
  47. } else if (arm_feature(&cpu->env, ARM_FEATURE_V5)) {
  48. arch = 5;
  49. elf_name = "armv5t" END_SUFFIX;
  50. } else {
  51. arch = 4;
  52. elf_name = "armv4" END_SUFFIX;
  53. }
  54. }
  55. }
  56. #endif
  57. #undef END_SUFFIX
  58. num_cpus = sysconf(_SC_NPROCESSORS_ONLN);
  59. for (int i = 0; i < num_cpus; i++) {
  60. dprintf(fd,
  61. "processor\t: %d\n"
  62. "model name\t: ARMv%d Processor rev %d (%s)\n"
  63. "BogoMIPS\t: 100.00\n"
  64. "Features\t:",
  65. i, arch, midr_rev, elf_name);
  66. for (target_ulong j = elf_hwcap; j ; j &= j - 1) {
  67. dprintf(fd, " %s", elf_hwcap_str(ctz64(j)));
  68. }
  69. for (target_ulong j = elf_hwcap2; j ; j &= j - 1) {
  70. dprintf(fd, " %s", elf_hwcap2_str(ctz64(j)));
  71. }
  72. dprintf(fd, "\n"
  73. "CPU implementer\t: 0x%02x\n"
  74. "CPU architecture: %d\n"
  75. "CPU variant\t: 0x%0*x\n",
  76. midr_impl, arch, len_var, midr_var);
  77. if (arch >= 7) {
  78. dprintf(fd, "CPU part\t: 0x%0*x\n", len_part, midr_part);
  79. }
  80. dprintf(fd, "CPU revision\t: %d\n\n", midr_rev);
  81. }
  82. if (arch < 8) {
  83. dprintf(fd, "Hardware\t: QEMU v%s %s\n", QEMU_VERSION,
  84. cpu->dtb_compatible ? : "");
  85. dprintf(fd, "Revision\t: 0000\n");
  86. dprintf(fd, "Serial\t\t: 0000000000000000\n");
  87. }
  88. return 0;
  89. }
  90. #define HAVE_ARCH_PROC_CPUINFO
  91. #endif /* ARM_TARGET_PROC_H */