1244
1254
#define GETSIZE(X) (x86ops[table][s->table_op].X!=SIZE_WD?x86ops[table][s->table_op].X:((s->opsize)?SIZE_WORD:SIZE_DWORD))
1247
static uint8_t *disasm_x86(uint8_t *command, unsigned int len, struct DISASMED *s) {
1257
static const uint8_t *disasm_x86(const uint8_t *command, unsigned int len, struct DISASMED *s) {
1248
1258
unsigned int reversed=0, i;
1250
1260
unsigned int table = 0;
1673
void disasmbuf(uint8_t *buff, unsigned int len, int fd) {
1674
uint8_t *next = buff;
1675
unsigned int counter=0;
1684
const uint8_t* cli_disasm_one(const uint8_t* buff, unsigned int len,
1685
struct DISASM_RESULT *w, int spam)
1676
1687
struct DISASMED s;
1688
memset(&w.extra[0], 0, sizeof(w.extra));
1690
while(len && counter++<200) {
1692
if(!(next = disasm_x86(next, len, &s))) {
1693
/* TODO: invd opcode or buff over */
1696
if(cli_debug_flag) {
1690
memset(&w->extra[0], 0, sizeof(w->extra));
1691
buff = disasm_x86(buff, len, &s);
1698
1696
spam_x86(&s, hr);
1699
1697
cli_dbgmsg("%s\n", hr);
1705
w.real_op = le16_to_host(s.real_op);
1706
w.opsize = s.opsize;
1707
w.adsize = s.adsize;
1708
w.segment = s.segment;
1710
for (i=0; i<3; i++) {
1711
w.arg[i][0] = s.args[i].access;
1712
w.arg[i][1] = s.args[i].size;
1699
w->real_op = le16_to_host(s.real_op);
1700
w->opsize = s.opsize;
1701
w->adsize = s.adsize;
1702
w->segment = s.segment;
1704
for (i=0; i<3; i++) {
1705
w->arg[i][0] = s.args[i].access;
1706
w->arg[i][1] = s.args[i].size;
1713
1707
switch(s.args[i].access) {
1714
1708
case ACCESS_MEM:
1715
w.arg[i][2]=s.args[i].arg.marg.r1;
1716
w.arg[i][3]=s.args[i].arg.marg.r2;
1717
w.arg[i][4]=s.args[i].arg.marg.scale;
1719
cli_writeint32(&w.arg[i][6], s.args[i].arg.marg.disp);
1709
w->arg[i][2]=s.args[i].arg.marg.r1;
1710
w->arg[i][3]=s.args[i].arg.marg.r2;
1711
w->arg[i][4]=s.args[i].arg.marg.scale;
1713
cli_writeint32(&w->arg[i][6], s.args[i].arg.marg.disp);
1721
1715
case ACCESS_REG:
1722
w.arg[i][1] = s.args[i].reg;
1716
w->arg[i][1] = s.args[i].reg;
1724
cli_writeint32(&w.arg[i][2], s.args[i].arg.q);
1725
cli_writeint32(&w.arg[i][6], s.args[i].arg.q>>32);
1718
cli_writeint32(&w->arg[i][2], s.args[i].arg.q);
1719
cli_writeint32(&w->arg[i][6], s.args[i].arg.q>>32);
1725
int disasmbuf(const uint8_t *buff, unsigned int len, int fd) {
1726
const uint8_t *next = buff;
1727
unsigned int counter=0;
1729
struct DISASM_RESULT w;
1730
memset(&w.extra[0], 0, sizeof(w.extra));
1732
while(len && counter++<200) {
1733
if(!(next = cli_disasm_one(next, len, &w, cli_debug_flag))) {
1734
/* TODO: invd opcode or buff over */
1728
1741
cli_writen(fd, &w, sizeof(w));