ddb: Add support for disassembling 'crc32' on amd64
This commit is contained in:
parent
087ea4103c
commit
f677fed5a2
@ -145,6 +145,26 @@ static const struct inst db_inst_0f388x[] = {
|
|||||||
/*8f*/ { "", FALSE, NONE, 0, 0 },
|
/*8f*/ { "", FALSE, NONE, 0, 0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct inst db_inst_0f38fx[] = {
|
||||||
|
/*f0*/ { "crc32b",TRUE, NONE, op2(Eb, R), 0 },
|
||||||
|
/*f1*/ { "crc32", TRUE, LONG, op2(E, R), 0 },
|
||||||
|
/*f2*/ { "", FALSE, NONE, 0, 0 },
|
||||||
|
/*f3*/ { "", FALSE, NONE, 0, 0 },
|
||||||
|
/*f4*/ { "", FALSE, NONE, 0, 0 },
|
||||||
|
/*f5*/ { "", FALSE, NONE, 0, 0 },
|
||||||
|
/*f6*/ { "", FALSE, NONE, 0, 0 },
|
||||||
|
/*f7*/ { "", FALSE, NONE, 0, 0 },
|
||||||
|
|
||||||
|
/*f8*/ { "", FALSE, NONE, 0, 0 },
|
||||||
|
/*f9*/ { "", FALSE, NONE, 0, 0 },
|
||||||
|
/*fa*/ { "", FALSE, NONE, 0, 0 },
|
||||||
|
/*fb*/ { "", FALSE, NONE, 0, 0 },
|
||||||
|
/*fc*/ { "", FALSE, NONE, 0, 0 },
|
||||||
|
/*fd*/ { "", FALSE, NONE, 0, 0 },
|
||||||
|
/*fe*/ { "", FALSE, NONE, 0, 0 },
|
||||||
|
/*ff*/ { "", FALSE, NONE, 0, 0 },
|
||||||
|
};
|
||||||
|
|
||||||
static const struct inst * const db_inst_0f38[] = {
|
static const struct inst * const db_inst_0f38[] = {
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
@ -161,7 +181,7 @@ static const struct inst * const db_inst_0f38[] = {
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0
|
db_inst_0f38fx
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char * const db_Grp6[] = {
|
static const char * const db_Grp6[] = {
|
||||||
@ -1238,7 +1258,7 @@ db_disasm(db_addr_t loc, bool altfmt)
|
|||||||
boolean_t first;
|
boolean_t first;
|
||||||
int displ;
|
int displ;
|
||||||
int prefix;
|
int prefix;
|
||||||
int rep;
|
int rep, repne;
|
||||||
int imm;
|
int imm;
|
||||||
int imm2;
|
int imm2;
|
||||||
long imm64;
|
long imm64;
|
||||||
@ -1254,6 +1274,7 @@ db_disasm(db_addr_t loc, bool altfmt)
|
|||||||
* Get prefixes
|
* Get prefixes
|
||||||
*/
|
*/
|
||||||
rep = FALSE;
|
rep = FALSE;
|
||||||
|
repne = FALSE;
|
||||||
prefix = TRUE;
|
prefix = TRUE;
|
||||||
do {
|
do {
|
||||||
switch (inst) {
|
switch (inst) {
|
||||||
@ -1284,8 +1305,12 @@ db_disasm(db_addr_t loc, bool altfmt)
|
|||||||
case 0xf0:
|
case 0xf0:
|
||||||
db_printf("lock ");
|
db_printf("lock ");
|
||||||
break;
|
break;
|
||||||
|
/*
|
||||||
|
* XXX repne/repe are only actually valid for MOVS, CMPS,
|
||||||
|
* SCAS, LODS, STOS, INS, OUTS.
|
||||||
|
*/
|
||||||
case 0xf2:
|
case 0xf2:
|
||||||
db_printf("repne ");
|
repne = TRUE;
|
||||||
break;
|
break;
|
||||||
case 0xf3:
|
case 0xf3:
|
||||||
rep = TRUE;
|
rep = TRUE;
|
||||||
@ -1480,6 +1505,11 @@ db_disasm(db_addr_t loc, bool altfmt)
|
|||||||
rep = FALSE;
|
rep = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* N.B., likely highly incomplete. */
|
||||||
|
if (repne) {
|
||||||
|
if (ip == &db_inst_0f38fx[0] || ip == &db_inst_0f38fx[1])
|
||||||
|
repne = FALSE;
|
||||||
|
}
|
||||||
if (size == WORD) {
|
if (size == WORD) {
|
||||||
if (ip->i_extra == db_Grp9 && f_mod(rex, regmodrm) != 3 &&
|
if (ip->i_extra == db_Grp9 && f_mod(rex, regmodrm) != 3 &&
|
||||||
f_reg(rex, regmodrm) == 0x6) {
|
f_reg(rex, regmodrm) == 0x6) {
|
||||||
@ -1495,6 +1525,8 @@ db_disasm(db_addr_t loc, bool altfmt)
|
|||||||
|
|
||||||
if (rep == TRUE)
|
if (rep == TRUE)
|
||||||
db_printf("repe "); /* XXX repe VS rep */
|
db_printf("repe "); /* XXX repe VS rep */
|
||||||
|
if (repne == TRUE)
|
||||||
|
db_printf("repne ");
|
||||||
|
|
||||||
if (i_size == SDEP) {
|
if (i_size == SDEP) {
|
||||||
if (size == LONG)
|
if (size == LONG)
|
||||||
|
Loading…
Reference in New Issue
Block a user