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~

Reply via email to