On 8/1/23 16:08, Helge Deller wrote:
+#if defined(TARGET_AARCH64) || defined(TARGET_ARM) +static int open_cpuinfo(CPUArchState *cpu_env, int fd) +{ + const int is64 = TARGET_ABI_BITS == 64; + ARMCPU *cpu = ARM_CPU(thread_cpu); + uint64_t midr = cpu->midr; + const int rev = (midr & 0xf); + const int arch = is64 ? 8 : 7;
The 32-bit arch is not automatically v7: -cpu max is v8 and -cpu ti925t is v4. You need an if ladder for this: if (arm_feature(&cpu->env, ARM_FEATURE_V8)) { arch = 8; } else if (arm_feature(&cpu->env, ARM_FEATURE_V7)) { arch = 7; } else if (arm_feature(&cpu->env, ARM_FEATURE_V6)) { arch = 6; } else if (arm_feature(&cpu->env, ARM_FEATURE_V5)) { arch = 5; } else { arch = 4; } Also, ref = FIELD_EX64(cpu->midr, MIDR_EL1, REVISION); etc, instead of masking by hand.
+ dprintf(fd, "model name\t: ARMv%d Processor rev %d (%s%c)\n", + arch, rev, is64 ? "v8" : "armv7",
Will need adjustment.
+#if TARGET_BIG_ENDIAN + 'b' +#else + 'l' +#endif
Don't need an ifdef: (TARGET_BIG_ENDIAN ? 'b' : 'l').
+ dprintf(fd, "CPU implementer\t: %#02x\n", (int)(midr >> 24) & 0xff); + dprintf(fd, "CPU architecture: %d\n", arch); + dprintf(fd, "CPU variant\t: %#x\n", (int)(midr >> 20) & 0xf ); + dprintf(fd, "CPU part\t: %#03x\n", (int)(midr >> 4) & 0xfff); + dprintf(fd, "CPU revision\t: %d\n\n", rev); + }
FIELD_EX64(midr, MIDR_EL1, ...) Though I have some memory of these fields changing across arch versions. You might need to extract them earlier, within the if ladder. r~