Index: sys/arm/arm/machdep.c =================================================================== --- sys/arm/arm/machdep.c +++ sys/arm/arm/machdep.c @@ -550,14 +550,9 @@ int fill_regs(struct thread *td, struct reg *regs) { - struct trapframe *tf = td->td_frame; - bcopy(&tf->tf_r0, regs->r, sizeof(regs->r)); - regs->r_sp = tf->tf_usr_sp; - regs->r_lr = tf->tf_usr_lr; - regs->r_pc = tf->tf_pc; - regs->r_cpsr = tf->tf_spsr; - return (0); + return fill_frame_regs(td->td_frame, regs); } + int fill_fpregs(struct thread *td, struct fpreg *regs) { @@ -566,6 +561,17 @@ } int +fill_frame_regs(struct trapframe *tf, struct reg *regs) +{ + bcopy(&tf->tf_r0, regs->r, sizeof(regs->r)); + regs->r_sp = tf->tf_usr_sp; + regs->r_lr = tf->tf_usr_lr; + regs->r_pc = tf->tf_pc; + regs->r_cpsr = tf->tf_spsr; + return (0); +} + +int set_regs(struct thread *td, struct reg *regs) { struct trapframe *tf = td->td_frame; Index: sys/arm/arm/undefined.c =================================================================== --- sys/arm/arm/undefined.c +++ sys/arm/arm/undefined.c @@ -86,6 +86,10 @@ #include #endif +#ifdef KDTRACE_HOOKS +#include +#endif + #define ARM_COPROC_INSN(insn) (((insn) & (1 << 27)) != 0) #define ARM_VFP_INSN(insn) ((((insn) & 0xfe000000) == 0xf2000000) || \ (((insn) & 0xff100000) == 0xf4000000)) @@ -303,22 +307,39 @@ break; if (fault_code & FAULT_USER) { - /* TODO: No support for ptrace from Thumb-2 */ - if ((frame->tf_spsr & PSR_T) == 0 && - fault_instruction == PTRACE_BREAKPOINT) { - PROC_LOCK(td->td_proc); - _PHOLD(td->td_proc); - error = ptrace_clear_single_step(td); - _PRELE(td->td_proc); - PROC_UNLOCK(td->td_proc); - if (error != 0) { - ksiginfo_init_trap(&ksi); - ksi.ksi_signo = SIGILL; - ksi.ksi_code = ILL_ILLOPC; - ksi.ksi_addr = (u_int32_t *)(intptr_t) fault_pc; - trapsignal(td, &ksi); + /* TODO: No support for Thumb-2 */ + if ((frame->tf_spsr & PSR_T) == 0) { + if (fault_instruction == PTRACE_BREAKPOINT) { + PROC_LOCK(td->td_proc); + _PHOLD(td->td_proc); + error = ptrace_clear_single_step(td); + _PRELE(td->td_proc); + PROC_UNLOCK(td->td_proc); + if (error != 0) { + ksiginfo_init_trap(&ksi); + ksi.ksi_signo = SIGILL; + ksi.ksi_code = ILL_ILLOPC; + ksi.ksi_addr = (u_int32_t *)(intptr_t) fault_pc; + trapsignal(td, &ksi); + } + return; } - return; +#ifdef KDTRACE_HOOKS + else if (fault_instruction == FASTTRAP_BREAKPOINT) { + struct reg regs; + fill_frame_regs(frame, ®s); + if (dtrace_pid_probe_ptr != NULL && + dtrace_pid_probe_ptr(®s) == 0) + return; + } + else if (fault_instruction == FASTTRAPRET_BREAKPOINT) { + struct reg regs; + fill_frame_regs(frame, ®s); + if (dtrace_return_probe_ptr != NULL && + dtrace_return_probe_ptr(®s) == 0) + return; + } +#endif } } Index: sys/arm/include/reg.h =================================================================== --- sys/arm/include/reg.h +++ sys/arm/include/reg.h @@ -4,6 +4,7 @@ #define MACHINE_REG_H #include +#include struct reg { unsigned int r[13]; @@ -29,6 +30,7 @@ int set_fpregs(struct thread *, struct fpreg *); int fill_dbregs(struct thread *, struct dbreg *); int set_dbregs(struct thread *, struct dbreg *); +int fill_frame_regs(struct trapframe *, struct reg *); #endif #endif /* !MACHINE_REG_H */ Index: sys/arm/include/trap.h =================================================================== --- sys/arm/include/trap.h +++ sys/arm/include/trap.h @@ -8,4 +8,6 @@ #define PTRACE_BREAKPOINT 0xe7fffff0 #define KERNEL_BREAKPOINT 0xe7ffffff #define FBT_BREAKPOINT 0xe7f000f0 +#define FASTTRAP_BREAKPOINT 0xe7f000f1 +#define FASTTRAPRET_BREAKPOINT 0xe7f000f2 #endif /* _MACHINE_TRAP_H_ */ Index: sys/modules/dtrace/Makefile =================================================================== --- sys/modules/dtrace/Makefile +++ sys/modules/dtrace/Makefile @@ -18,13 +18,13 @@ .if ${MACHINE_CPUARCH} == "amd64" SUBDIR+= systrace_linux32 .endif -.if ${MACHINE_CPUARCH} == "powerpc" +.if ${MACHINE_CPUARCH} == "powerpc" || ${MACHINE_CPUARCH} == "arm" SUBDIR+= fbt fasttrap .endif .if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_ARCH} == "powerpc64" SUBDIR+= systrace_freebsd32 .endif -.if ${MACHINE_CPUARCH} == "aarch64" || ${MACHINE_CPUARCH} == "arm" +.if ${MACHINE_CPUARCH} == "aarch64" SUBDIR+= fbt .endif .include Index: sys/modules/dtrace/dtraceall/dtraceall.c =================================================================== --- sys/modules/dtrace/dtraceall/dtraceall.c +++ sys/modules/dtrace/dtraceall/dtraceall.c @@ -73,7 +73,7 @@ defined(__i386__) || defined(__powerpc__) MODULE_DEPEND(dtraceall, fbt, 1, 1, 1); #endif -#if defined(__amd64__) || defined(__i386__) +#if defined(__amd64__) || defined(__i386__) || defined(__arm__) MODULE_DEPEND(dtraceall, fasttrap, 1, 1, 1); #endif MODULE_DEPEND(dtraceall, sdt, 1, 1, 1); Index: sys/modules/dtrace/fasttrap/Makefile =================================================================== --- sys/modules/dtrace/fasttrap/Makefile +++ sys/modules/dtrace/fasttrap/Makefile @@ -15,9 +15,9 @@ .if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386" CFLAGS+= -I${SYSDIR}/cddl/contrib/opensolaris/uts/intel .PATH: ${SYSDIR}/cddl/contrib/opensolaris/uts/intel/dtrace -.elif ${MACHINE_CPUARCH} == "powerpc" -CFLAGS+= -I${SYSDIR}/cddl/contrib/opensolaris/uts/powerpc -.PATH: ${SYSDIR}/cddl/contrib/opensolaris/uts/powerpc/dtrace +.else +CFLAGS+= -I${SYSDIR}/cddl/contrib/opensolaris/uts/${MACHINE_CPUARCH} +.PATH: ${SYSDIR}/cddl/contrib/opensolaris/uts/${MACHINE_CPUARCH}/dtrace .endif .PATH: ${SYSDIR}/cddl/contrib/opensolaris/common/unicode