Author: rstone
Date: Thu Nov 24 19:02:04 2011
New Revision: 227950
URL: http://svn.freebsd.org/changeset/base/227950

Log:
  MFC r227290 and r227291:
  
  r227290:
   Fix the DTrace pid return trap interrupt vector.  Previously we were using
   31, but that vector is reserved.
  
   Without this fix, running dtrace -p <pid> would either cause the target
   process to crash or the kernel to page fault
  
  r227291:
   Replace fasttrap_copyout() with uwrite().  FreeBSD copyout() is not able to
   write to the .text section of a process.

Modified:
  stable/8/sys/amd64/amd64/trap.c
  stable/8/sys/amd64/include/segments.h
  stable/8/sys/amd64/include/trap.h
  stable/8/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c
  stable/8/sys/i386/i386/trap.c
  stable/8/sys/i386/include/segments.h
  stable/8/sys/i386/include/trap.h
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)

Modified: stable/8/sys/amd64/amd64/trap.c
==============================================================================
--- stable/8/sys/amd64/amd64/trap.c     Thu Nov 24 18:57:31 2011        
(r227949)
+++ stable/8/sys/amd64/amd64/trap.c     Thu Nov 24 19:02:04 2011        
(r227950)
@@ -129,7 +129,7 @@ void dblfault_handler(struct trapframe *
 static int trap_pfault(struct trapframe *, int);
 static void trap_fatal(struct trapframe *, vm_offset_t);
 
-#define MAX_TRAP_MSG           30
+#define MAX_TRAP_MSG           33
 static char *trap_msg[] = {
        "",                                     /*  0 unused */
        "privileged instruction fault",         /*  1 T_PRIVINFLT */
@@ -162,6 +162,9 @@ static char *trap_msg[] = {
        "machine check trap",                   /* 28 T_MCHK */
        "SIMD floating-point exception",        /* 29 T_XMMFLT */
        "reserved (unknown) fault",             /* 30 T_RESERVED */
+       "",                                     /* 31 unused (reserved) */
+       "DTrace pid return trap",               /* 32 T_DTRACE_RET */
+       "DTrace fasttrap probe trap",           /* 33 T_DTRACE_PROBE */
 };
 
 #ifdef KDB
@@ -249,28 +252,26 @@ trap(struct trapframe *frame)
         * handled the trap and modified the trap frame so that this
         * function can return normally.
         */
-       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;
-               
+
                fill_frame_regs(frame, &regs);
                if (type == T_DTRACE_PROBE &&
                    dtrace_fasttrap_probe_ptr != NULL &&
                    dtrace_fasttrap_probe_ptr(&regs) == 0)
-                               goto out;
-               if (type == T_BPTFLT &&
+                       goto out;
+               else if (type == T_BPTFLT &&
                    dtrace_pid_probe_ptr != NULL &&
                    dtrace_pid_probe_ptr(&regs) == 0)
-                               goto out;
-               if (type == T_DTRACE_RET &&
+                       goto out;
+               else if (type == T_DTRACE_RET &&
                    dtrace_return_probe_ptr != NULL &&
                    dtrace_return_probe_ptr(&regs) == 0)
                        goto out;
-
        }
+       if (dtrace_trap_func != NULL && (*dtrace_trap_func)(frame, type))
+               goto out;
 #endif
 
        if ((frame->tf_rflags & PSL_I) == 0) {

Modified: stable/8/sys/amd64/include/segments.h
==============================================================================
--- stable/8/sys/amd64/include/segments.h       Thu Nov 24 18:57:31 2011        
(r227949)
+++ stable/8/sys/amd64/include/segments.h       Thu Nov 24 19:02:04 2011        
(r227950)
@@ -214,7 +214,7 @@ struct region_descriptor {
 #define        IDT_XF          19      /* #XF: SIMD Floating-Point Exception */
 #define        IDT_IO_INTS     NRSVIDT /* Base of IDT entries for I/O 
interrupts. */
 #define        IDT_SYSCALL     0x80    /* System Call Interrupt Vector */
-#define        IDT_DTRACE_RET  0x92    /* DTrace pid provider Interrupt Vector 
*/
+#define        IDT_DTRACE_RET  0x20    /* DTrace pid provider Interrupt Vector 
*/
 
 /*
  * Entries in the Global Descriptor Table (GDT)

Modified: stable/8/sys/amd64/include/trap.h
==============================================================================
--- stable/8/sys/amd64/include/trap.h   Thu Nov 24 18:57:31 2011        
(r227949)
+++ stable/8/sys/amd64/include/trap.h   Thu Nov 24 19:02:04 2011        
(r227950)
@@ -62,8 +62,8 @@
 #define        T_MCHK          28      /* machine check trap */
 #define        T_XMMFLT        29      /* SIMD floating-point exception */
 #define        T_RESERVED      30      /* reserved (unknown) */
-#define        T_DTRACE_RET    31      /* DTrace pid return */
-#define        T_DTRACE_PROBE  32      /* DTrace fasttrap probe */
+#define        T_DTRACE_RET    32      /* DTrace pid return */
+#define        T_DTRACE_PROBE  33      /* DTrace fasttrap probe */
 
 /* XXX most of the following codes aren't used, but could be. */
 

Modified: stable/8/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c
==============================================================================
--- stable/8/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c       
Thu Nov 24 18:57:31 2011        (r227949)
+++ stable/8/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c       
Thu Nov 24 19:02:04 2011        (r227950)
@@ -97,7 +97,7 @@ uwrite(proc_t *p, void *kaddr, size_t le
 
        return (proc_ops(UIO_WRITE, p, kaddr, uaddr, len));
 }
-#endif
+#endif /* sun */
 #ifdef __i386__
 #define        r_rax   r_eax
 #define        r_rbx   r_ebx
@@ -1380,6 +1380,7 @@ fasttrap_pid_probe(struct reg *rp)
        {
                int ret = 0;
                uintptr_t addr = 0;
+
 #ifdef __amd64
                if (p->p_model == DATAMODEL_NATIVE) {
                        addr = rp->r_rsp - sizeof (uintptr_t);
@@ -1558,7 +1559,7 @@ fasttrap_pid_probe(struct reg *rp)
                 *      ------------------------        -----
                 * a:   <original instruction>          <= 15
                 *      jmp     <pc + tp->ftt_size>         5
-                * b:   <original instrction>           <= 15
+                * b:   <original instruction>          <= 15
                 *      int     T_DTRACE_RET                2
                 *                                      -----
                 *                                      <= 37
@@ -1731,12 +1732,16 @@ fasttrap_pid_probe(struct reg *rp)
 
                ASSERT(i <= sizeof (scratch));
 
+
+#if defined(sun)
                if (fasttrap_copyout(scratch, (char *)addr, i)) {
+#else
+               if (uwrite(curproc, scratch, i, addr)) {
+#endif
                        fasttrap_sigtrap(p, curthread, pc);
                        new_pc = pc;
                        break;
                }
-
                if (tp->ftt_retids != NULL) {
                        curthread->t_dtrace_step = 1;
                        curthread->t_dtrace_ret = 1;

Modified: stable/8/sys/i386/i386/trap.c
==============================================================================
--- stable/8/sys/i386/i386/trap.c       Thu Nov 24 18:57:31 2011        
(r227949)
+++ stable/8/sys/i386/i386/trap.c       Thu Nov 24 19:02:04 2011        
(r227950)
@@ -140,7 +140,7 @@ void dblfault_handler(void);
 
 extern inthand_t IDTVEC(lcall_syscall);
 
-#define MAX_TRAP_MSG           30
+#define MAX_TRAP_MSG           33
 static char *trap_msg[] = {
        "",                                     /*  0 unused */
        "privileged instruction fault",         /*  1 T_PRIVINFLT */
@@ -173,6 +173,10 @@ static char *trap_msg[] = {
        "machine check trap",                   /* 28 T_MCHK */
        "SIMD floating-point exception",        /* 29 T_XMMFLT */
        "reserved (unknown) fault",             /* 30 T_RESERVED */
+       "",                                     /* 31 unused (reserved) */
+       "DTrace pid return trap",               /* 32 T_DTRACE_RET */
+       "DTrace fasttrap probe trap",           /* 33 T_DTRACE_PROBE */
+
 };
 
 #if defined(I586_CPU) && !defined(NO_F00F_HACK)
@@ -269,10 +273,6 @@ trap(struct trapframe *frame)
         * handled the trap and modified the trap frame so that this
         * function can return normally.
         */
-       if ((type == T_PROTFLT || type == T_PAGEFLT) &&
-           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;
@@ -291,6 +291,9 @@ trap(struct trapframe *frame)
                    dtrace_return_probe_ptr(&regs) == 0)
                        goto out;
        }
+       if ((type == T_PROTFLT || type == T_PAGEFLT) &&
+           dtrace_trap_func != NULL && (*dtrace_trap_func)(frame, type))
+               goto out;
 #endif
 
        if ((frame->tf_eflags & PSL_I) == 0) {

Modified: stable/8/sys/i386/include/segments.h
==============================================================================
--- stable/8/sys/i386/include/segments.h        Thu Nov 24 18:57:31 2011        
(r227949)
+++ stable/8/sys/i386/include/segments.h        Thu Nov 24 19:02:04 2011        
(r227950)
@@ -207,7 +207,7 @@ struct region_descriptor {
 #define        IDT_XF          19      /* #XF: SIMD Floating-Point Exception */
 #define        IDT_IO_INTS     NRSVIDT /* Base of IDT entries for I/O 
interrupts. */
 #define        IDT_SYSCALL     0x80    /* System Call Interrupt Vector */
-#define        IDT_DTRACE_RET  0x92    /* DTrace pid provider Interrupt Vector 
*/
+#define        IDT_DTRACE_RET  0x20    /* DTrace pid provider Interrupt Vector 
*/
 
 /*
  * Entries in the Global Descriptor Table (GDT)

Modified: stable/8/sys/i386/include/trap.h
==============================================================================
--- stable/8/sys/i386/include/trap.h    Thu Nov 24 18:57:31 2011        
(r227949)
+++ stable/8/sys/i386/include/trap.h    Thu Nov 24 19:02:04 2011        
(r227950)
@@ -62,8 +62,8 @@
 #define        T_MCHK          28      /* machine check trap */
 #define        T_XMMFLT        29      /* SIMD floating-point exception */
 #define        T_RESERVED      30      /* reserved (unknown) */
-#define        T_DTRACE_RET    31      /* DTrace pid return */
-#define        T_DTRACE_PROBE  32      /* DTrace fasttrap probe */
+#define        T_DTRACE_RET    32      /* DTrace pid return */
+#define        T_DTRACE_PROBE  33      /* DTrace fasttrap probe */
 
 /* XXX most of the following codes aren't used, but could be. */
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to