On Thu, Feb 10, 2011 at 10:06:29AM -0800, Rui Paulo wrote: > > On Feb 10, 2011, at 8:13 AM, Chagin Dmitry wrote: > > > On Wed, Aug 25, 2010 at 09:10:32AM +0000, Rui Paulo wrote: > >> Author: rpaulo > >> Date: Wed Aug 25 09:10:32 2010 > >> New Revision: 211804 > >> URL: http://svn.freebsd.org/changeset/base/211804 > >> > >> Log: > >> Call the necessary DTrace function pointers when we have different kinds > >> of traps. > >> > >> Sponsored by: The FreeBSD Foundation > >> > >> Modified: > >> head/sys/amd64/amd64/trap.c > >> head/sys/i386/i386/trap.c > >> > >> Modified: head/sys/amd64/amd64/trap.c > >> ============================================================================== > >> --- head/sys/amd64/amd64/trap.c Wed Aug 25 08:49:21 2010 > >> (r211803) > >> +++ head/sys/amd64/amd64/trap.c Wed Aug 25 09:10:32 2010 > >> (r211804) > >> @@ -109,6 +109,13 @@ dtrace_doubletrap_func_t dtrace_doubletr > >> * implementation opaque. > >> */ > >> systrace_probe_func_t systrace_probe_func; > >> + > >> +/* > >> + * These hooks are necessary for the pid, usdt and fasttrap providers. > >> + */ > >> +dtrace_fasttrap_probe_ptr_t dtrace_fasttrap_probe_ptr; > >> +dtrace_pid_probe_ptr_t dtrace_pid_probe_ptr; > >> +dtrace_return_probe_ptr_t dtrace_return_probe_ptr; > >> #endif > >> > >> extern void trap(struct trapframe *frame); > >> @@ -239,6 +246,55 @@ trap(struct trapframe *frame) > >> if (dtrace_trap_func != NULL) > >> if ((*dtrace_trap_func)(frame, type)) > >> goto out; > >> + if (type == T_DTRACE_PROBE || type == T_DTRACE_RET || > >> + type == T_BPTFLT) { > >> + struct reg regs; > >> + > >> + regs.r_r15 = frame->tf_r15; > >> + regs.r_r14 = frame->tf_r14; > >> + regs.r_r13 = frame->tf_r13; > >> + regs.r_r12 = frame->tf_r12; > >> + regs.r_r11 = frame->tf_r11; > >> + regs.r_r10 = frame->tf_r10; > >> + regs.r_r9 = frame->tf_r9; > >> + regs.r_r8 = frame->tf_r8; > >> + regs.r_rdi = frame->tf_rdi; > >> + regs.r_rsi = frame->tf_rsi; > >> + regs.r_rbp = frame->tf_rbp; > >> + regs.r_rbx = frame->tf_rbx; > >> + regs.r_rdx = frame->tf_rdx; > >> + regs.r_rcx = frame->tf_rcx; > >> + regs.r_rax = frame->tf_rax; > >> + regs.r_rip = frame->tf_rip; > >> + regs.r_cs = frame->tf_cs; > >> + regs.r_rflags = frame->tf_rflags; > >> + regs.r_rsp = frame->tf_rsp; > >> + regs.r_ss = frame->tf_ss; > >> + if (frame->tf_flags & TF_HASSEGS) { > >> + regs.r_ds = frame->tf_ds; > >> + regs.r_es = frame->tf_es; > >> + regs.r_fs = frame->tf_fs; > >> + regs.r_gs = frame->tf_gs; > >> + } else { > >> + regs.r_ds = 0; > >> + regs.r_es = 0; > >> + regs.r_fs = 0; > >> + regs.r_gs = 0; > > > > > > hi, maybe use fill_regs() would more appropriate here? > > No, fill_regs() takes a thread as an argument. I all I had was a frame. >
ah, can u test http://people.freebsd.org/~dchagin/fillregs.patch, please? thnx :) -- Have fun! chd
pgp77LTMN5v7U.pgp
Description: PGP signature