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 "disas/disas.h"
|
||||
#include "qemu/bitops.h"
|
||||
#include "qemu/path.h"
|
||||
#include "qemu/queue.h"
|
||||
#include "qemu/guest-random.h"
|
||||
|
@ -995,17 +996,26 @@ enum {
|
|||
#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_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);
|
||||
|
||||
return hwcaps;
|
||||
}
|
||||
|
||||
#undef GET_FEATURE_REG_EQU
|
||||
#undef GET_FEATURE_REG_SET
|
||||
#undef GET_FEATURE_INSN
|
||||
|
||||
|
|
|
@ -844,6 +844,7 @@ struct CPUMIPSState {
|
|||
#define CP0C0_MT 7 /* 9..7 */
|
||||
#define CP0C0_VI 3
|
||||
#define CP0C0_K0 0 /* 2..0 */
|
||||
#define CP0C0_AR_LENGTH 3
|
||||
int32_t CP0_Config1;
|
||||
#define CP0C1_M 31
|
||||
#define CP0C1_MMU 25 /* 30..25 */
|
||||
|
|
Loading…
Reference in New Issue