mips: fix NEGU alias instruction. bug reported by Pancake

This commit is contained in:
Nguyen Anh Quynh 2013-12-11 21:37:24 +08:00
parent d051328a20
commit 66f6c2283e
5 changed files with 17 additions and 10 deletions

View File

@ -169,7 +169,9 @@ void Mips_printInst(MCInst *MI, SStream *O, void *info)
*tab = '\0';
// reflect the new insn name (alias) in the opcode
MCInst_setOpcode(MI, Mips_get_insn_id2(Mips_map_insn(mnem)));
unsigned id = Mips_map_insn(mnem);
MCInst_setOpcode(MI, Mips_get_insn_id2(id));
MCInst_setOpcodePub(MI, id);
free(mnem);
}

View File

@ -1383,6 +1383,7 @@ static insn_map insns[] = {
static insn_map alias_insns[] = {
{ -2, MIPS_INS_NOP, { 0 }, { 0 }, { 0 }, 0, 0 },
{ Mips_SUBu, MIPS_INS_NEGU, { 0 }, { 0 }, { MIPS_GRP_STDENC, 0 }, 0, 0 },
};
// given internal insn id, return public instruction info
@ -1395,16 +1396,16 @@ void Mips_get_insn_id(cs_insn *insn, unsigned int id)
if (alias_insns[i].id == id) {
insn->id = alias_insns[i].mapid;
memcpy(insn->regs_read, insns[i].regs_use, sizeof(insns[i].regs_use));
insn->regs_read_count = count_positive(insns[i].regs_use);
memcpy(insn->regs_read, alias_insns[i].regs_use, sizeof(alias_insns[i].regs_use));
insn->regs_read_count = count_positive(alias_insns[i].regs_use);
memcpy(insn->regs_write, insns[i].regs_mod, sizeof(insns[i].regs_mod));
insn->regs_write_count = count_positive(insns[i].regs_mod);
memcpy(insn->regs_write, alias_insns[i].regs_mod, sizeof(alias_insns[i].regs_mod));
insn->regs_write_count = count_positive(alias_insns[i].regs_mod);
memcpy(insn->groups, insns[i].groups, sizeof(insns[i].groups));
insn->groups_count = count_positive(insns[i].groups);
memcpy(insn->groups, alias_insns[i].groups, sizeof(alias_insns[i].groups));
insn->groups_count = count_positive(alias_insns[i].groups);
if (insns[i].branch || insns[i].indirect_branch) {
if (alias_insns[i].branch || alias_insns[i].indirect_branch) {
// this insn also belongs to JUMP group. add JUMP group
insn->groups[insn->groups_count] = MIPS_GRP_JUMP;
insn->groups_count++;
@ -1913,6 +1914,7 @@ static name_map alias_insn_names[] = {
{ MIPS_INS_BGEZAL, "bal" },
{ MIPS_INS_BC1T, "bc1t" },
{ MIPS_INS_BC1F, "bc1f" },
{ MIPS_INS_NEGU, "negu" },
};
char *Mips_insn_name(csh handle, unsigned int id)

View File

@ -630,7 +630,8 @@ public class Mips_const {
public static final int MIPS_INS_XOR = 453;
public static final int MIPS_INS_XORI = 454;
public static final int MIPS_INS_NOP = 455;
public static final int MIPS_INS_MAX = 456;
public static final int MIPS_INS_NEGU = 456;
public static final int MIPS_INS_MAX = 457;
// Group of MIPS instructions
public static final int MIPS_GRP_INVALID = 0;

View File

@ -627,7 +627,8 @@ MIPS_INS_WSBH = 452
MIPS_INS_XOR = 453
MIPS_INS_XORI = 454
MIPS_INS_NOP = 455
MIPS_INS_MAX = 456
MIPS_INS_NEGU = 456
MIPS_INS_MAX = 457
# Group of MIPS instructions
MIPS_GRP_INVALID = 0

View File

@ -685,6 +685,7 @@ typedef enum mips_insn {
// some alias instructions
MIPS_INS_NOP,
MIPS_INS_NEGU,
MIPS_INS_MAX,
} mips_insn;