[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2 2/3] linux-user: Emulate /proc/cpuinfo on aarch64 and arm
From: |
Richard Henderson |
Subject: |
Re: [PATCH v2 2/3] linux-user: Emulate /proc/cpuinfo on aarch64 and arm |
Date: |
Wed, 2 Aug 2023 11:15:14 -0700 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.13.0 |
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~