From owner-svn-src-head@FreeBSD.ORG Sat Jul 19 02:27:33 2014 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id E3F03B4A; Sat, 19 Jul 2014 02:27:32 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id D105E298D; Sat, 19 Jul 2014 02:27:32 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.8/8.14.8) with ESMTP id s6J2RWUp042345; Sat, 19 Jul 2014 02:27:32 GMT (envelope-from markj@svn.freebsd.org) Received: (from markj@localhost) by svn.freebsd.org (8.14.8/8.14.8/Submit) id s6J2RWvL042340; Sat, 19 Jul 2014 02:27:32 GMT (envelope-from markj@svn.freebsd.org) Message-Id: <201407190227.s6J2RWvL042340@svn.freebsd.org> From: Mark Johnston Date: Sat, 19 Jul 2014 02:27:32 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r268869 - in head/sys: amd64/amd64 cddl/dev/dtrace/amd64 cddl/dev/fbt X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 19 Jul 2014 02:27:33 -0000 Author: markj Date: Sat Jul 19 02:27:31 2014 New Revision: 268869 URL: http://svnweb.freebsd.org/changeset/base/268869 Log: Use a C wrapper for trap() instead of checking and calling the DTrace trap hook in assembly. Suggested by: kib Reviewed by: kib (original version) X-MFC-With: r268600 Modified: head/sys/amd64/amd64/exception.S head/sys/amd64/amd64/trap.c head/sys/cddl/dev/dtrace/amd64/dtrace_subr.c head/sys/cddl/dev/fbt/fbt.c Modified: head/sys/amd64/amd64/exception.S ============================================================================== --- head/sys/amd64/amd64/exception.S Sat Jul 19 02:15:28 2014 (r268868) +++ head/sys/amd64/amd64/exception.S Sat Jul 19 02:27:31 2014 (r268869) @@ -228,24 +228,7 @@ alltraps_pushregs_no_rdi: .type calltrap,@function calltrap: movq %rsp,%rdi -#ifdef KDTRACE_HOOKS - /* - * Give DTrace a chance to vet this trap and skip the call to trap() if - * it turns out that it was caused by a DTrace probe. - */ - movq dtrace_trap_func,%rax - testq %rax,%rax - je skiphook - call *%rax - testq %rax,%rax - jne skiptrap - movq %rsp,%rdi -skiphook: -#endif - call trap -#ifdef KDTRACE_HOOKS -skiptrap: -#endif + call trap_check MEXITCOUNT jmp doreti /* Handle any pending ASTs */ Modified: head/sys/amd64/amd64/trap.c ============================================================================== --- head/sys/amd64/amd64/trap.c Sat Jul 19 02:15:28 2014 (r268868) +++ head/sys/amd64/amd64/trap.c Sat Jul 19 02:27:31 2014 (r268869) @@ -97,7 +97,8 @@ PMC_SOFT_DEFINE( , , page_fault, write); #include #endif -extern void trap(struct trapframe *frame); +extern void __noinline trap(struct trapframe *frame); +extern void trap_check(struct trapframe *frame); extern void syscall(struct trapframe *frame); void dblfault_handler(struct trapframe *frame); @@ -604,6 +605,19 @@ out: return; } +/* + * Ensure that we ignore any DTrace-induced faults. This function cannot + * be instrumented, so it cannot generate such faults itself. + */ +void +trap_check(struct trapframe *frame) +{ + + if (dtrace_trap_func != NULL && (*dtrace_trap_func)(frame)) + return; + trap(frame); +} + static int trap_pfault(frame, usermode) struct trapframe *frame; Modified: head/sys/cddl/dev/dtrace/amd64/dtrace_subr.c ============================================================================== --- head/sys/cddl/dev/dtrace/amd64/dtrace_subr.c Sat Jul 19 02:15:28 2014 (r268868) +++ head/sys/cddl/dev/dtrace/amd64/dtrace_subr.c Sat Jul 19 02:27:31 2014 (r268869) @@ -462,9 +462,7 @@ dtrace_gethrestime(void) return (current_time.tv_sec * 1000000000ULL + current_time.tv_nsec); } -/* - * Function to handle DTrace traps during probes. See amd64/amd64/exception.S. - */ +/* Function to handle DTrace traps during probes. See amd64/amd64/trap.c. */ int dtrace_trap(struct trapframe *frame) { Modified: head/sys/cddl/dev/fbt/fbt.c ============================================================================== --- head/sys/cddl/dev/fbt/fbt.c Sat Jul 19 02:15:28 2014 (r268868) +++ head/sys/cddl/dev/fbt/fbt.c Sat Jul 19 02:27:31 2014 (r268869) @@ -232,13 +232,18 @@ fbt_provide_module_function(linker_file_ int size; u_int8_t *instr, *limit; - if (strncmp(name, "dtrace_", 7) == 0 && - strncmp(name, "dtrace_safe_", 12) != 0) { + if ((strncmp(name, "dtrace_", 7) == 0 && + strncmp(name, "dtrace_safe_", 12) != 0) || + strcmp(name, "trap_check") == 0) { /* * Anything beginning with "dtrace_" may be called * from probe context unless it explicitly indicates * that it won't be called from probe context by * using the prefix "dtrace_safe_". + * + * Additionally, we avoid instrumenting trap_check() to avoid + * the possibility of generating a fault in probe context before + * DTrace's fault handler is called. */ return (0); }