Loading target/tricore/translate.c +74 −44 Original line number Diff line number Diff line Loading @@ -8772,7 +8772,7 @@ static void decode_32Bit_opc(DisasContext *ctx) } } static void decode_opc(DisasContext *ctx, int *is_branch) static void decode_opc(DisasContext *ctx) { /* 16-Bit Instruction */ if ((ctx->opcode & 0x1) == 0) { Loading @@ -8785,57 +8785,87 @@ static void decode_opc(DisasContext *ctx, int *is_branch) } } void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns) static void tricore_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs) { DisasContext *ctx = container_of(dcbase, DisasContext, base); CPUTriCoreState *env = cs->env_ptr; DisasContext ctx; target_ulong pc_start; int num_insns = 0; pc_start = tb->pc; ctx.base.pc_next = pc_start; ctx.base.tb = tb; ctx.base.singlestep_enabled = cs->singlestep_enabled; ctx.base.is_jmp = DISAS_NEXT; ctx.mem_idx = cpu_mmu_index(env, false); ctx.hflags = (uint32_t)tb->flags; ctx.env = env; tcg_clear_temp_count(); gen_tb_start(tb); while (ctx.base.is_jmp == DISAS_NEXT) { tcg_gen_insn_start(ctx.base.pc_next); num_insns++; ctx.opcode = cpu_ldl_code(env, ctx.base.pc_next); decode_opc(&ctx, 0); if (num_insns >= max_insns || tcg_op_buf_full()) { gen_save_pc(ctx.pc_succ_insn); tcg_gen_exit_tb(NULL, 0); break; ctx->mem_idx = cpu_mmu_index(env, false); ctx->hflags = (uint32_t)ctx->base.tb->flags; } ctx.base.pc_next = ctx.pc_succ_insn; static void tricore_tr_tb_start(DisasContextBase *db, CPUState *cpu) { } gen_tb_end(tb, num_insns); tb->size = ctx.base.pc_next - pc_start; tb->icount = num_insns; static void tricore_tr_insn_start(DisasContextBase *dcbase, CPUState *cpu) { DisasContext *ctx = container_of(dcbase, DisasContext, base); tcg_gen_insn_start(ctx->base.pc_next); } if (tcg_check_temp_count()) { printf("LEAK at %08x\n", env->PC); static bool tricore_tr_breakpoint_check(DisasContextBase *dcbase, CPUState *cpu, const CPUBreakpoint *bp) { return false; } #ifdef DEBUG_DISAS if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM) && qemu_log_in_addr_range(pc_start)) { qemu_log_lock(); qemu_log("IN: %s\n", lookup_symbol(pc_start)); log_target_disas(cs, pc_start, ctx.base.pc_next - pc_start); qemu_log("\n"); qemu_log_unlock(); static void tricore_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu) { DisasContext *ctx = container_of(dcbase, DisasContext, base); CPUTriCoreState *env = cpu->env_ptr; ctx->opcode = cpu_ldl_code(env, ctx->base.pc_next); decode_opc(ctx); ctx->base.pc_next = ctx->pc_succ_insn; if (ctx->base.is_jmp == DISAS_NEXT) { target_ulong page_start; page_start = ctx->base.pc_first & TARGET_PAGE_MASK; if (ctx->base.pc_next - page_start >= TARGET_PAGE_SIZE) { ctx->base.is_jmp = DISAS_TOO_MANY; } #endif } } static void tricore_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu) { DisasContext *ctx = container_of(dcbase, DisasContext, base); switch (ctx->base.is_jmp) { case DISAS_TOO_MANY: gen_goto_tb(ctx, 0, ctx->base.pc_next); break; case DISAS_NORETURN: break; default: g_assert_not_reached(); } } static void tricore_tr_disas_log(const DisasContextBase *dcbase, CPUState *cpu) { qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first)); log_target_disas(cpu, dcbase->pc_first, dcbase->tb->size); } static const TranslatorOps tricore_tr_ops = { .init_disas_context = tricore_tr_init_disas_context, .tb_start = tricore_tr_tb_start, .insn_start = tricore_tr_insn_start, .breakpoint_check = tricore_tr_breakpoint_check, .translate_insn = tricore_tr_translate_insn, .tb_stop = tricore_tr_tb_stop, .disas_log = tricore_tr_disas_log, }; void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns) { DisasContext ctx; translator_loop(&tricore_tr_ops, &ctx.base, cs, tb, max_insns); } void Loading Loading
target/tricore/translate.c +74 −44 Original line number Diff line number Diff line Loading @@ -8772,7 +8772,7 @@ static void decode_32Bit_opc(DisasContext *ctx) } } static void decode_opc(DisasContext *ctx, int *is_branch) static void decode_opc(DisasContext *ctx) { /* 16-Bit Instruction */ if ((ctx->opcode & 0x1) == 0) { Loading @@ -8785,57 +8785,87 @@ static void decode_opc(DisasContext *ctx, int *is_branch) } } void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns) static void tricore_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs) { DisasContext *ctx = container_of(dcbase, DisasContext, base); CPUTriCoreState *env = cs->env_ptr; DisasContext ctx; target_ulong pc_start; int num_insns = 0; pc_start = tb->pc; ctx.base.pc_next = pc_start; ctx.base.tb = tb; ctx.base.singlestep_enabled = cs->singlestep_enabled; ctx.base.is_jmp = DISAS_NEXT; ctx.mem_idx = cpu_mmu_index(env, false); ctx.hflags = (uint32_t)tb->flags; ctx.env = env; tcg_clear_temp_count(); gen_tb_start(tb); while (ctx.base.is_jmp == DISAS_NEXT) { tcg_gen_insn_start(ctx.base.pc_next); num_insns++; ctx.opcode = cpu_ldl_code(env, ctx.base.pc_next); decode_opc(&ctx, 0); if (num_insns >= max_insns || tcg_op_buf_full()) { gen_save_pc(ctx.pc_succ_insn); tcg_gen_exit_tb(NULL, 0); break; ctx->mem_idx = cpu_mmu_index(env, false); ctx->hflags = (uint32_t)ctx->base.tb->flags; } ctx.base.pc_next = ctx.pc_succ_insn; static void tricore_tr_tb_start(DisasContextBase *db, CPUState *cpu) { } gen_tb_end(tb, num_insns); tb->size = ctx.base.pc_next - pc_start; tb->icount = num_insns; static void tricore_tr_insn_start(DisasContextBase *dcbase, CPUState *cpu) { DisasContext *ctx = container_of(dcbase, DisasContext, base); tcg_gen_insn_start(ctx->base.pc_next); } if (tcg_check_temp_count()) { printf("LEAK at %08x\n", env->PC); static bool tricore_tr_breakpoint_check(DisasContextBase *dcbase, CPUState *cpu, const CPUBreakpoint *bp) { return false; } #ifdef DEBUG_DISAS if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM) && qemu_log_in_addr_range(pc_start)) { qemu_log_lock(); qemu_log("IN: %s\n", lookup_symbol(pc_start)); log_target_disas(cs, pc_start, ctx.base.pc_next - pc_start); qemu_log("\n"); qemu_log_unlock(); static void tricore_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu) { DisasContext *ctx = container_of(dcbase, DisasContext, base); CPUTriCoreState *env = cpu->env_ptr; ctx->opcode = cpu_ldl_code(env, ctx->base.pc_next); decode_opc(ctx); ctx->base.pc_next = ctx->pc_succ_insn; if (ctx->base.is_jmp == DISAS_NEXT) { target_ulong page_start; page_start = ctx->base.pc_first & TARGET_PAGE_MASK; if (ctx->base.pc_next - page_start >= TARGET_PAGE_SIZE) { ctx->base.is_jmp = DISAS_TOO_MANY; } #endif } } static void tricore_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu) { DisasContext *ctx = container_of(dcbase, DisasContext, base); switch (ctx->base.is_jmp) { case DISAS_TOO_MANY: gen_goto_tb(ctx, 0, ctx->base.pc_next); break; case DISAS_NORETURN: break; default: g_assert_not_reached(); } } static void tricore_tr_disas_log(const DisasContextBase *dcbase, CPUState *cpu) { qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first)); log_target_disas(cpu, dcbase->pc_first, dcbase->tb->size); } static const TranslatorOps tricore_tr_ops = { .init_disas_context = tricore_tr_init_disas_context, .tb_start = tricore_tr_tb_start, .insn_start = tricore_tr_insn_start, .breakpoint_check = tricore_tr_breakpoint_check, .translate_insn = tricore_tr_translate_insn, .tb_stop = tricore_tr_tb_stop, .disas_log = tricore_tr_disas_log, }; void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns) { DisasContext ctx; translator_loop(&tricore_tr_ops, &ctx.base, cs, tb, max_insns); } void Loading