Beispiel #1
0
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;
}
Beispiel #2
0
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");
  }
}