Changeset View
Changeset View
Standalone View
Standalone View
head/sys/amd64/amd64/db_disasm.c
Show First 20 Lines • Show All 1,038 Lines • ▼ Show 20 Lines | db_read_address(loc, short_addr, rex, regmodrm, addrp) | ||||
rm = f_rm(rex, regmodrm); | rm = f_rm(rex, regmodrm); | ||||
if (mod == 3) { | if (mod == 3) { | ||||
addrp->is_reg = TRUE; | addrp->is_reg = TRUE; | ||||
addrp->disp = rm; | addrp->disp = rm; | ||||
return (loc); | return (loc); | ||||
} | } | ||||
addrp->is_reg = FALSE; | addrp->is_reg = FALSE; | ||||
addrp->index = 0; | addrp->index = NULL; | ||||
if (short_addr) | if (short_addr) | ||||
size = LONG; | size = LONG; | ||||
else | else | ||||
size = QUAD; | size = QUAD; | ||||
if ((rm & 0x7) == 4) { | if ((rm & 0x7) == 4) { | ||||
get_value_inc(sib, loc, 1, FALSE); | get_value_inc(sib, loc, 1, FALSE); | ||||
rm = sib_base(rex, sib); | rm = sib_base(rex, sib); | ||||
index = sib_index(rex, sib); | index = sib_index(rex, sib); | ||||
if (index != 4) | if (index != 4) | ||||
addrp->index = db_reg[1][size][index]; | addrp->index = db_reg[1][size][index]; | ||||
addrp->ss = sib_ss(rex, sib); | addrp->ss = sib_ss(rex, sib); | ||||
have_sib = 1; | have_sib = 1; | ||||
} else | } else | ||||
have_sib = 0; | have_sib = 0; | ||||
switch (mod) { | switch (mod) { | ||||
case 0: | case 0: | ||||
if (rm == 5) { | if (rm == 5) { | ||||
get_value_inc(addrp->disp, loc, 4, FALSE); | get_value_inc(addrp->disp, loc, 4, FALSE); | ||||
if (have_sib) | if (have_sib) | ||||
addrp->base = 0; | addrp->base = NULL; | ||||
else if (short_addr) | else if (short_addr) | ||||
addrp->base = "%eip"; | addrp->base = "%eip"; | ||||
else | else | ||||
addrp->base = "%rip"; | addrp->base = "%rip"; | ||||
} else { | } else { | ||||
addrp->disp = 0; | addrp->disp = 0; | ||||
addrp->base = db_reg[1][size][rm]; | addrp->base = db_reg[1][size][rm]; | ||||
} | } | ||||
Show All 25 Lines | if (addrp->is_reg) { | ||||
db_printf("%s", db_reg[rex != 0 ? 1 : 0][(size == LONG && (rex & REX_W)) ? QUAD : size][addrp->disp]); | db_printf("%s", db_reg[rex != 0 ? 1 : 0][(size == LONG && (rex & REX_W)) ? QUAD : size][addrp->disp]); | ||||
return; | return; | ||||
} | } | ||||
if (seg) { | if (seg) { | ||||
db_printf("%s:", seg); | db_printf("%s:", seg); | ||||
} | } | ||||
if (addrp->disp != 0 || (addrp->base == 0 && addrp->index == 0)) | if (addrp->disp != 0 || (addrp->base == NULL && addrp->index == NULL)) | ||||
db_printsym((db_addr_t)addrp->disp, DB_STGY_ANY); | db_printsym((db_addr_t)addrp->disp, DB_STGY_ANY); | ||||
if (addrp->base != 0 || addrp->index != 0) { | if (addrp->base != NULL || addrp->index != NULL) { | ||||
db_printf("("); | db_printf("("); | ||||
if (addrp->base) | if (addrp->base) | ||||
db_printf("%s", addrp->base); | db_printf("%s", addrp->base); | ||||
if (addrp->index) | if (addrp->index) | ||||
db_printf(",%s,%d", addrp->index, 1<<addrp->ss); | db_printf(",%s,%d", addrp->index, 1<<addrp->ss); | ||||
db_printf(")"); | db_printf(")"); | ||||
} | } | ||||
} | } | ||||
▲ Show 20 Lines • Show All 120 Lines • ▼ Show 20 Lines | db_disasm(db_addr_t loc, bool altfmt) | ||||
int imm2; | int imm2; | ||||
long imm64; | long imm64; | ||||
int len; | int len; | ||||
struct i_addr address; | struct i_addr address; | ||||
get_value_inc(inst, loc, 1, FALSE); | get_value_inc(inst, loc, 1, FALSE); | ||||
short_addr = FALSE; | short_addr = FALSE; | ||||
size = LONG; | size = LONG; | ||||
seg = 0; | seg = NULL; | ||||
/* | /* | ||||
* Get prefixes | * Get prefixes | ||||
*/ | */ | ||||
rep = FALSE; | rep = FALSE; | ||||
prefix = TRUE; | prefix = TRUE; | ||||
do { | do { | ||||
switch (inst) { | switch (inst) { | ||||
▲ Show 20 Lines • Show All 48 Lines • ▼ Show 20 Lines | if (inst >= 0xd8 && inst <= 0xdf) { | ||||
db_printf("\n"); | db_printf("\n"); | ||||
return (loc); | return (loc); | ||||
} | } | ||||
ip = &db_inst_table[inst]; | ip = &db_inst_table[inst]; | ||||
while (ip->i_size == ESC) { | while (ip->i_size == ESC) { | ||||
get_value_inc(inst, loc, 1, FALSE); | get_value_inc(inst, loc, 1, FALSE); | ||||
ip = ((const struct inst * const *)ip->i_extra)[inst>>4]; | ip = ((const struct inst * const *)ip->i_extra)[inst>>4]; | ||||
if (ip == 0) { | if (ip == NULL) { | ||||
ip = &db_bad_inst; | ip = &db_bad_inst; | ||||
} | } | ||||
else { | else { | ||||
ip = &ip[inst&0xf]; | ip = &ip[inst&0xf]; | ||||
} | } | ||||
} | } | ||||
if (ip->i_has_modrm) { | if (ip->i_has_modrm) { | ||||
▲ Show 20 Lines • Show All 403 Lines • Show Last 20 Lines |