Ejemplo n.º 1
0
/* 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);
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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);
}