static int dec10_prep_move_m(DisasContext *dc, int s_ext, int memsize, TCGv dst) { unsigned int rs; uint32_t imm; int is_imm; int insn_len = 0; rs = dc->src; is_imm = rs == 15 && !(dc->tb_flags & PFIX_FLAG); LOG_DIS("rs=%d rd=%d is_imm=%d mode=%d pfix=%d\n", rs, dc->dst, is_imm, dc->mode, dc->tb_flags & PFIX_FLAG); /* Load [$rs] onto T1. */ if (is_imm) { if (memsize != 4) { if (s_ext) { if (memsize == 1) imm = ldsb_code(dc->pc + 2); else imm = ldsw_code(dc->pc + 2); } else { if (memsize == 1) imm = ldub_code(dc->pc + 2); else imm = lduw_code(dc->pc + 2); } } else imm = ldl_code(dc->pc + 2); tcg_gen_movi_tl(dst, imm); if (dc->mode == CRISV10_MODE_AUTOINC) { insn_len += memsize; if (memsize == 1) insn_len++; tcg_gen_addi_tl(cpu_R[15], cpu_R[15], insn_len); } } else { TCGv addr; addr = tcg_temp_new(); cris_flush_cc_state(dc); crisv10_prepare_memaddr(dc, addr, memsize); gen_load(dc, dst, addr, memsize, 0); if (s_ext) t_gen_sext(dst, dst, memsize); else t_gen_zext(dst, dst, memsize); insn_len += crisv10_post_memaddr(dc, memsize); tcg_temp_free(addr); } if (dc->mode == CRISV10_MODE_INDIRECT && (dc->tb_flags & PFIX_FLAG)) { dc->dst = dc->src; } return insn_len; }
static void instruction_tracer_cpu_exec_callback(DECAF_Callback_Params* params) { int i; if (params->ce.env == NULL) { DECAF_printf("NULL\n"); return; } if (is_target_program(params->ce.env)) { /* if (params->ce.tb_size == 0) { */ /* DECAF_printf("\nnull is detected -> eip: 0x%x\n", params->ce.env->eip); */ /* fprintf(disas_logfile, "null member is detected\n"); */ /* return; */ /* } */ if (!params->ce.is_valid) { DECAF_printf("not valid\n\n"); fprintf(disas_logfile, "null member is detected\n\n"); return; } target_ulong d_pc = params->ce.tb_pc; target_ulong d_size = params->ce.tb_size; target_disas(disas_logfile, d_pc, d_size, 0); fprintf(disas_logfile, "=\n"); for (i = 0; i < d_size && i < MAX_CODE_BUF; i++) { code_buf[i] = ldub_code(d_pc + i); fprintf(disas_logfile, "%02x", code_buf[i]); } /* if (i => MAX_CODE_BUF) { */ /* DECAF_printf("code buffer overflown\n"); */ /* code_buf[MAX_CODE_BUF - 1] = '\0'; */ /* } else { */ /* code_buf[i] = '\0'; */ /* } */ //fwrite(code_buf, sizeof(unsigned char), i - 1, disas_logfile); fprintf(disas_logfile, "\n\n"); } }