mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
linux-user: Move get_elf_hwcap to mips/elfload.c
Change the return type to abi_ulong, and pass in the cpu. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
+1
-51
@@ -834,57 +834,7 @@ static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUMIPSState *e
|
||||
#define USE_ELF_CORE_DUMP
|
||||
#define ELF_EXEC_PAGESIZE 4096
|
||||
|
||||
/* See arch/mips/include/uapi/asm/hwcap.h. */
|
||||
enum {
|
||||
HWCAP_MIPS_R6 = (1 << 0),
|
||||
HWCAP_MIPS_MSA = (1 << 1),
|
||||
HWCAP_MIPS_CRC32 = (1 << 2),
|
||||
HWCAP_MIPS_MIPS16 = (1 << 3),
|
||||
HWCAP_MIPS_MDMX = (1 << 4),
|
||||
HWCAP_MIPS_MIPS3D = (1 << 5),
|
||||
HWCAP_MIPS_SMARTMIPS = (1 << 6),
|
||||
HWCAP_MIPS_DSP = (1 << 7),
|
||||
HWCAP_MIPS_DSP2 = (1 << 8),
|
||||
HWCAP_MIPS_DSP3 = (1 << 9),
|
||||
HWCAP_MIPS_MIPS16E2 = (1 << 10),
|
||||
HWCAP_LOONGSON_MMI = (1 << 11),
|
||||
HWCAP_LOONGSON_EXT = (1 << 12),
|
||||
HWCAP_LOONGSON_EXT2 = (1 << 13),
|
||||
HWCAP_LOONGSON_CPUCFG = (1 << 14),
|
||||
};
|
||||
|
||||
#define ELF_HWCAP get_elf_hwcap()
|
||||
|
||||
#define GET_FEATURE_INSN(_flag, _hwcap) \
|
||||
do { if (cpu->env.insn_flags & (_flag)) { hwcaps |= _hwcap; } } while (0)
|
||||
|
||||
#define GET_FEATURE_REG_SET(_reg, _mask, _hwcap) \
|
||||
do { if (cpu->env._reg & (_mask)) { hwcaps |= _hwcap; } } while (0)
|
||||
|
||||
#define GET_FEATURE_REG_EQU(_reg, _start, _length, _val, _hwcap) \
|
||||
do { \
|
||||
if (extract32(cpu->env._reg, (_start), (_length)) == (_val)) { \
|
||||
hwcaps |= _hwcap; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
static uint32_t get_elf_hwcap(void)
|
||||
{
|
||||
MIPSCPU *cpu = MIPS_CPU(thread_cpu);
|
||||
uint32_t hwcaps = 0;
|
||||
|
||||
GET_FEATURE_REG_EQU(CP0_Config0, CP0C0_AR, CP0C0_AR_LENGTH,
|
||||
2, HWCAP_MIPS_R6);
|
||||
GET_FEATURE_REG_SET(CP0_Config3, 1 << CP0C3_MSAP, HWCAP_MIPS_MSA);
|
||||
GET_FEATURE_INSN(ASE_LMMI, HWCAP_LOONGSON_MMI);
|
||||
GET_FEATURE_INSN(ASE_LEXT, HWCAP_LOONGSON_EXT);
|
||||
|
||||
return hwcaps;
|
||||
}
|
||||
|
||||
#undef GET_FEATURE_REG_EQU
|
||||
#undef GET_FEATURE_REG_SET
|
||||
#undef GET_FEATURE_INSN
|
||||
#define ELF_HWCAP get_elf_hwcap(thread_cpu)
|
||||
|
||||
#endif /* TARGET_MIPS */
|
||||
|
||||
|
||||
+1
-1
@@ -103,7 +103,7 @@ const char *get_elf_cpu_model(uint32_t eflags);
|
||||
|
||||
#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(TARGET_ARM) \
|
||||
|| defined(TARGET_SPARC) || defined(TARGET_PPC) \
|
||||
|| defined(TARGET_LOONGARCH64)
|
||||
|| defined(TARGET_LOONGARCH64) || defined(TARGET_MIPS)
|
||||
abi_ulong get_elf_hwcap(CPUState *cs);
|
||||
abi_ulong get_elf_hwcap2(CPUState *cs);
|
||||
#endif
|
||||
|
||||
@@ -42,3 +42,53 @@ const char *get_elf_cpu_model(uint32_t eflags)
|
||||
return "24Kf";
|
||||
#endif
|
||||
}
|
||||
|
||||
/* See arch/mips/include/uapi/asm/hwcap.h. */
|
||||
enum {
|
||||
HWCAP_MIPS_R6 = (1 << 0),
|
||||
HWCAP_MIPS_MSA = (1 << 1),
|
||||
HWCAP_MIPS_CRC32 = (1 << 2),
|
||||
HWCAP_MIPS_MIPS16 = (1 << 3),
|
||||
HWCAP_MIPS_MDMX = (1 << 4),
|
||||
HWCAP_MIPS_MIPS3D = (1 << 5),
|
||||
HWCAP_MIPS_SMARTMIPS = (1 << 6),
|
||||
HWCAP_MIPS_DSP = (1 << 7),
|
||||
HWCAP_MIPS_DSP2 = (1 << 8),
|
||||
HWCAP_MIPS_DSP3 = (1 << 9),
|
||||
HWCAP_MIPS_MIPS16E2 = (1 << 10),
|
||||
HWCAP_LOONGSON_MMI = (1 << 11),
|
||||
HWCAP_LOONGSON_EXT = (1 << 12),
|
||||
HWCAP_LOONGSON_EXT2 = (1 << 13),
|
||||
HWCAP_LOONGSON_CPUCFG = (1 << 14),
|
||||
};
|
||||
|
||||
#define GET_FEATURE_INSN(_flag, _hwcap) \
|
||||
do { if (cpu->env.insn_flags & (_flag)) { hwcaps |= _hwcap; } } while (0)
|
||||
|
||||
#define GET_FEATURE_REG_SET(_reg, _mask, _hwcap) \
|
||||
do { if (cpu->env._reg & (_mask)) { hwcaps |= _hwcap; } } while (0)
|
||||
|
||||
#define GET_FEATURE_REG_EQU(_reg, _start, _length, _val, _hwcap) \
|
||||
do { \
|
||||
if (extract32(cpu->env._reg, (_start), (_length)) == (_val)) { \
|
||||
hwcaps |= _hwcap; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
abi_ulong get_elf_hwcap(CPUState *cs)
|
||||
{
|
||||
MIPSCPU *cpu = MIPS_CPU(cs);
|
||||
abi_ulong hwcaps = 0;
|
||||
|
||||
GET_FEATURE_REG_EQU(CP0_Config0, CP0C0_AR, CP0C0_AR_LENGTH,
|
||||
2, HWCAP_MIPS_R6);
|
||||
GET_FEATURE_REG_SET(CP0_Config3, 1 << CP0C3_MSAP, HWCAP_MIPS_MSA);
|
||||
GET_FEATURE_INSN(ASE_LMMI, HWCAP_LOONGSON_MMI);
|
||||
GET_FEATURE_INSN(ASE_LEXT, HWCAP_LOONGSON_EXT);
|
||||
|
||||
return hwcaps;
|
||||
}
|
||||
|
||||
#undef GET_FEATURE_REG_EQU
|
||||
#undef GET_FEATURE_REG_SET
|
||||
#undef GET_FEATURE_INSN
|
||||
|
||||
@@ -8,4 +8,6 @@
|
||||
#ifndef MIPS_TARGET_ELF_H
|
||||
#define MIPS_TARGET_ELF_H
|
||||
|
||||
#define HAVE_ELF_HWCAP 1
|
||||
|
||||
#endif
|
||||
|
||||
@@ -8,4 +8,6 @@
|
||||
#ifndef MIPS64_TARGET_ELF_H
|
||||
#define MIPS64_TARGET_ELF_H
|
||||
|
||||
#define HAVE_ELF_HWCAP 1
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user