mirror of https://github.com/xemu-project/xemu.git
linux-user/elfload: Introduce MIPS GET_FEATURE_REG_EQU() macro
ISA features are usually denoted in read-only bits from CPU registers. Add the GET_FEATURE_REG_EQU() macro which checks if a CPU register has bits set to a specific value. Use the macro to check the 'Architecture Revision' level of the Config0 register, which is '2' when the Release 6 ISA is implemented. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-Id: <20201214003215.344522-5-f4bug@amsat.org> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
This commit is contained in:
parent
388765a05b
commit
ce54384405
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
#include "qemu.h"
|
#include "qemu.h"
|
||||||
#include "disas/disas.h"
|
#include "disas/disas.h"
|
||||||
|
#include "qemu/bitops.h"
|
||||||
#include "qemu/path.h"
|
#include "qemu/path.h"
|
||||||
#include "qemu/queue.h"
|
#include "qemu/queue.h"
|
||||||
#include "qemu/guest-random.h"
|
#include "qemu/guest-random.h"
|
||||||
|
@ -995,17 +996,26 @@ enum {
|
||||||
#define GET_FEATURE_REG_SET(_reg, _mask, _hwcap) \
|
#define GET_FEATURE_REG_SET(_reg, _mask, _hwcap) \
|
||||||
do { if (cpu->env._reg & (_mask)) { hwcaps |= _hwcap; } } while (0)
|
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)
|
static uint32_t get_elf_hwcap(void)
|
||||||
{
|
{
|
||||||
MIPSCPU *cpu = MIPS_CPU(thread_cpu);
|
MIPSCPU *cpu = MIPS_CPU(thread_cpu);
|
||||||
uint32_t hwcaps = 0;
|
uint32_t hwcaps = 0;
|
||||||
|
|
||||||
GET_FEATURE_INSN(ISA_MIPS32R6 | ISA_MIPS64R6, HWCAP_MIPS_R6);
|
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_REG_SET(CP0_Config3, 1 << CP0C3_MSAP, HWCAP_MIPS_MSA);
|
||||||
|
|
||||||
return hwcaps;
|
return hwcaps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef GET_FEATURE_REG_EQU
|
||||||
#undef GET_FEATURE_REG_SET
|
#undef GET_FEATURE_REG_SET
|
||||||
#undef GET_FEATURE_INSN
|
#undef GET_FEATURE_INSN
|
||||||
|
|
||||||
|
|
|
@ -844,6 +844,7 @@ struct CPUMIPSState {
|
||||||
#define CP0C0_MT 7 /* 9..7 */
|
#define CP0C0_MT 7 /* 9..7 */
|
||||||
#define CP0C0_VI 3
|
#define CP0C0_VI 3
|
||||||
#define CP0C0_K0 0 /* 2..0 */
|
#define CP0C0_K0 0 /* 2..0 */
|
||||||
|
#define CP0C0_AR_LENGTH 3
|
||||||
int32_t CP0_Config1;
|
int32_t CP0_Config1;
|
||||||
#define CP0C1_M 31
|
#define CP0C1_M 31
|
||||||
#define CP0C1_MMU 25 /* 30..25 */
|
#define CP0C1_MMU 25 /* 30..25 */
|
||||||
|
|
Loading…
Reference in New Issue