Пример #1
0
void	asm_instruction_debug(asm_instr *ins, FILE *out)
{
  int	i;

  fprintf(out, "ins=[%s] len=[%i] types=[%c|%c%c%c]\n",
	  asm_instr_get_memonic(ins, ins->proc), 
	  asm_instr_len(ins),
          (ins->type & ASM_TYPE_BRANCH) && !(ins->type & ASM_TYPE_CONDCONTROL) ? 'I' :
	  ins->type & ASM_TYPE_CALLPROC ? 'C' : 
          (ins->type & ASM_TYPE_BRANCH) && (ins->type & ASM_TYPE_CONDCONTROL) ? 'J' : 
	  ins->type & ASM_TYPE_RETPROC ? 'R' : ' ',
	  ins->type & ASM_TYPE_ARITH ? 'c' : ' ',
	  ins->type & ASM_TYPE_CONTROL ? 'f' : ' ',
	  ins->type & ASM_TYPE_ASSIGN ? 'a' : ' ');
  for (i = 0; i < 3; i++)
    {
      asm_operand_debug(ins, i, 0, out);
    }
}
Пример #2
0
/**
 * Display An instruction.
 * Runtime compatible
 * @param fd
 * @param index
 * @param vaddr
 * @param foffset
 * @param size
 * @param name
 * @param nindex
 * @param buff
 */
int		revm_instr_display(int fd, eresi_Addr vaddr, u_int foffset, u_int size,
                           char *name, u_int symoff, char *buff)
{
    char		*s;
    char		buf[256];
    u_int		idx_bytes;
    int		ret;
    asm_instr	ptr;
    char		base[16] = "0123456789ABCDEF";
    char		logbuf[BUFSIZ];
    char		c1[2];
    char		c2[2];
    u_int		strsz;
    int		err;

    PROFILER_IN(__FILE__, __FUNCTION__, __LINE__);
    if (!buff)
        PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__,
                     "Invalid argument", (-1));
    revm_proc_init();
    err = 0;

    /* Print the instr. itself : vaddr and relative symbol resolution */
    ret = asm_read_instr(&ptr, (u_char *) buff, size, world.curjob->proc);
    if (ret == -1)
        PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__,
                     "Failed to read instruction", ESTD_DISASM_FAILED);

    s = (!ret ? "(bad)" : asm_display_instr_att(&ptr, vaddr));

    /* Libasm test */
    if (fd == -1)
    {

        /* Are we in quiet mode ? */
        if (world.state.revm_quiet)
        {
            snprintf(buf, sizeof(buf), " %s %s + %s",
                     revm_coloraddress(XFMT, vaddr),
                     revm_colorstr(name),
                     revm_colornumber("%u", symoff));
            size = snprintf(logbuf, BUFSIZ, "%-40s %-30s ",
                            buf, revm_colorinstr(s));
        }
        else
        {
            size = snprintf(buf, sizeof(buf), " %s [%s %s] %s + %s",
                            revm_coloraddress(XFMT, vaddr),
                            revm_colorfieldstr("foff:"),
                            revm_colornumber("%u", foffset),
                            revm_colorstr(name),
                            revm_colornumber("%u", symoff));
            strsz = strlen(s);
            size = snprintf(logbuf, BUFSIZ, "%-*s %-*s ",
                            (size > 95 ? 125 :
                             size > 87 ? 100 :
                             size > 75 ? 108 :
                             size > 50 ? 88 : 55),
                            buf,
                            (strsz > 95 ? 125 :
                             strsz > 87 ? 100 :
                             strsz > 75 ? 108 :
                             strsz > 50 ? 88 : 55),
                            revm_colorinstr(s));
        }

        /* Print bytes in hexa for this instruction */
        ret = asm_instr_len(&ptr);
        if (!ret)
            ret++;

        if (!world.state.revm_quiet)
            for (idx_bytes = 0; idx_bytes < (u_int) ret; idx_bytes++)
            {
                c1[0] = base[(buff[idx_bytes] >> 4) & 0x0F];
                c2[0] = base[buff[idx_bytes] & 0x0F];
                c1[1] = c2[1] = 0x00;
                size += snprintf(logbuf + size, sizeof(logbuf) - size, "%s%s ",
                                 revm_colorfieldstr(c1),
                                 revm_colorfieldstr(c2));
            }

        if (!world.curjob->curcmd || !world.curjob->curcmd->use_regx[1] ||
                !regexec(&second->name, logbuf, 0, 0, 0))
        {
            snprintf(logbuf + size, sizeof(logbuf) - size, "\n");
            err = revm_output(logbuf);
        }
        revm_endline();
        if (err < 0)
            PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, err);
    }
    else