/* ARGSUSED2 */ static int dtrace_dis_isize(uchar_t *instr, dis_isize_t which, model_t model, int *rmindex) { int sz; dis86_t x; uint_t mode = SIZE32; #if defined(sun) mode = (model == DATAMODEL_LP64) ? SIZE64 : SIZE32; #endif x.d86_data = (void **)&instr; x.d86_get_byte = dtrace_dis_get_byte; x.d86_check_func = NULL; if (dtrace_disx86(&x, mode) != 0) return (-1); if (which == DIS_ISIZE_INSTR) sz = x.d86_len; /* length of the instruction */ else sz = x.d86_memsize; /* length of memory operand */ if (rmindex != NULL) *rmindex = x.d86_rmindex; return (sz); }
static int dt_instr_size(uchar_t *instr, dtrace_hdl_t *dtp, pid_t pid, uint64_t addr, char dmodel) { dtrace_dis_t data; dis86_t x86dis; uint_t cpu_mode; data.instr = instr; data.dtp = dtp; data.pid = pid; data.addr = addr; x86dis.d86_data = &data; x86dis.d86_get_byte = dt_getbyte; x86dis.d86_check_func = NULL; cpu_mode = (dmodel == PR_MODEL_ILP32) ? SIZE32 : SIZE64; if (dtrace_disx86(&x86dis, cpu_mode) != 0) return (-1); /* * If the instruction was a single-byte breakpoint, there may be * another debugger attached to this process. The original instruction * can't be recovered so this must fail. */ if (x86dis.d86_len == 1 && instr[0] == FASTTRAP_INSTR) return (-1); return (x86dis.d86_len); }
static int dis_i386_disassemble(dis_handle_t *dhp, uint64_t addr, char *buf, size_t buflen) { dis_handle_i386_t *dhx = dhp->dh_arch_private; dhp->dh_addr = addr; /* DIS_NOIMMSYM might not be set until now, so update */ if (dhp->dh_flags & DIS_NOIMMSYM) dhx->dhx_dis.d86_flags |= DIS_F_NOIMMSYM; else dhx->dhx_dis.d86_flags &= ~DIS_F_NOIMMSYM; if (dtrace_disx86(&dhx->dhx_dis, dhx->dhx_mode) != 0) return (-1); if (buf != NULL) dtrace_disx86_str(&dhx->dhx_dis, dhx->dhx_mode, addr, buf, buflen); return (0); }