2020-11-13 21:27:28 +03:00
|
|
|
/*
|
|
|
|
* MIPS translation routines.
|
|
|
|
*
|
|
|
|
* Copyright (c) 2004-2005 Jocelyn Mayer
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: LGPL-2.1-or-later
|
|
|
|
*/
|
|
|
|
#ifndef TARGET_MIPS_TRANSLATE_H
|
|
|
|
#define TARGET_MIPS_TRANSLATE_H
|
|
|
|
|
|
|
|
#include "exec/translator.h"
|
|
|
|
|
2020-11-29 21:13:28 +03:00
|
|
|
#define MIPS_DEBUG_DISAS 0
|
|
|
|
|
2020-11-13 21:27:28 +03:00
|
|
|
typedef struct DisasContext {
|
|
|
|
DisasContextBase base;
|
|
|
|
target_ulong saved_pc;
|
|
|
|
target_ulong page_start;
|
|
|
|
uint32_t opcode;
|
|
|
|
uint64_t insn_flags;
|
|
|
|
int32_t CP0_Config1;
|
|
|
|
int32_t CP0_Config2;
|
|
|
|
int32_t CP0_Config3;
|
|
|
|
int32_t CP0_Config5;
|
|
|
|
/* Routine used to access memory */
|
|
|
|
int mem_idx;
|
|
|
|
MemOp default_tcg_memop_mask;
|
|
|
|
uint32_t hflags, saved_hflags;
|
|
|
|
target_ulong btarget;
|
|
|
|
bool ulri;
|
|
|
|
int kscrexist;
|
|
|
|
bool rxi;
|
|
|
|
int ie;
|
|
|
|
bool bi;
|
|
|
|
bool bp;
|
|
|
|
uint64_t PAMask;
|
|
|
|
bool mvh;
|
|
|
|
bool eva;
|
|
|
|
bool sc;
|
|
|
|
int CP0_LLAddr_shift;
|
|
|
|
bool ps;
|
|
|
|
bool vp;
|
|
|
|
bool cmgcr;
|
|
|
|
bool mrp;
|
|
|
|
bool nan2008;
|
|
|
|
bool abs2008;
|
|
|
|
bool saar;
|
|
|
|
bool mi;
|
|
|
|
int gi;
|
|
|
|
} DisasContext;
|
|
|
|
|
2020-11-29 21:13:28 +03:00
|
|
|
/* MIPS major opcodes */
|
|
|
|
#define MASK_OP_MAJOR(op) (op & (0x3F << 26))
|
|
|
|
|
|
|
|
void generate_exception(DisasContext *ctx, int excp);
|
|
|
|
void generate_exception_err(DisasContext *ctx, int excp, int err);
|
|
|
|
void generate_exception_end(DisasContext *ctx, int excp);
|
2020-12-10 22:44:23 +03:00
|
|
|
void gen_reserved_instruction(DisasContext *ctx);
|
2020-11-29 21:13:28 +03:00
|
|
|
|
|
|
|
void check_insn(DisasContext *ctx, uint64_t flags);
|
|
|
|
#ifdef TARGET_MIPS64
|
|
|
|
void check_mips_64(DisasContext *ctx);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void gen_base_offset_addr(DisasContext *ctx, TCGv addr, int base, int offset);
|
|
|
|
void gen_move_low32(TCGv ret, TCGv_i64 arg);
|
|
|
|
void gen_move_high32(TCGv ret, TCGv_i64 arg);
|
|
|
|
void gen_load_gpr(TCGv t, int reg);
|
|
|
|
void gen_store_gpr(TCGv t, int reg);
|
|
|
|
|
|
|
|
void gen_op_addr_add(DisasContext *ctx, TCGv ret, TCGv arg0, TCGv arg1);
|
|
|
|
|
|
|
|
extern TCGv cpu_gpr[32], cpu_PC;
|
|
|
|
extern TCGv bcond;
|
|
|
|
|
|
|
|
#define LOG_DISAS(...) \
|
|
|
|
do { \
|
|
|
|
if (MIPS_DEBUG_DISAS) { \
|
|
|
|
qemu_log_mask(CPU_LOG_TB_IN_ASM, ## __VA_ARGS__); \
|
|
|
|
} \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
#define MIPS_INVAL(op) \
|
|
|
|
do { \
|
|
|
|
if (MIPS_DEBUG_DISAS) { \
|
|
|
|
qemu_log_mask(CPU_LOG_TB_IN_ASM, \
|
|
|
|
TARGET_FMT_lx ": %08x Invalid %s %03x %03x %03x\n", \
|
|
|
|
ctx->base.pc_next, ctx->opcode, op, \
|
|
|
|
ctx->opcode >> 26, ctx->opcode & 0x3F, \
|
|
|
|
((ctx->opcode >> 16) & 0x1F)); \
|
|
|
|
} \
|
|
|
|
} while (0)
|
|
|
|
|
2020-11-13 21:27:28 +03:00
|
|
|
#endif
|