]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/dev/i386/dtrace_isa.c
xnu-6153.61.1.tar.gz
[apple/xnu.git] / bsd / dev / i386 / dtrace_isa.c
index bdb17702849f0272ea9ee6a40b175a84a2115b31..6785dc53650866ce0735d343c38c444a06af77b3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005-2006 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2005-2018 Apple Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
@@ -26,7 +26,6 @@
  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 
-#define MACH__POSIX_C_SOURCE_PRIVATE 1 /* pulls in suitable savearea from mach/ppc/thread_status.h */
 #include <kern/thread.h>
 #include <mach/thread_status.h>
 
@@ -158,10 +157,10 @@ dtrace_xcall(processorid_t cpu, dtrace_xcall_t f, void *arg)
        xcArg.arg = arg;
 
        if (cpu == DTRACE_CPUALL) {
-               mp_cpus_call (CPUMASK_ALL, SYNC, xcRemote, (void*)&xcArg);
+               mp_cpus_call (CPUMASK_ALL, ASYNC, xcRemote, (void*)&xcArg);
        }
        else {
-               mp_cpus_call (cpu_to_cpumask((cpu_t)cpu), SYNC, xcRemote, (void*)&xcArg);
+               mp_cpus_call (cpu_to_cpumask((cpu_t)cpu), ASYNC, xcRemote, (void*)&xcArg);
        }
 }
 
@@ -183,6 +182,11 @@ dtrace_getreg(struct regs *savearea, uint_t reg)
        boolean_t is64Bit = proc_is64bit(current_proc());
        x86_saved_state_t *regs = (x86_saved_state_t *)savearea;
 
+       if (regs == NULL) {
+               DTRACE_CPUFLAG_SET(CPU_DTRACE_ILLOP);
+               return (0);
+       }
+
        if (is64Bit) {
            if (reg <= SS) {
                reg = regmap[reg];
@@ -436,7 +440,7 @@ dtrace_getupcstack(uint64_t *pcstack, int pcstack_limit)
        if (regs == NULL)
                goto zero;
                
-       *pcstack++ = (uint64_t)proc_selfpid();
+       *pcstack++ = (uint64_t)dtrace_proc_selfpid();
        pcstack_limit--;
 
        if (pcstack_limit <= 0)
@@ -563,7 +567,7 @@ dtrace_getufpstack(uint64_t *pcstack, uint64_t *fpstack, int pcstack_limit)
        if (regs == NULL)
                goto zero;
                
-       *pcstack++ = (uint64_t)proc_selfpid();
+       *pcstack++ = (uint64_t)dtrace_proc_selfpid();
        pcstack_limit--;
 
        if (pcstack_limit <= 0)
@@ -679,11 +683,7 @@ dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, int aframes,
 
        while (depth < pcstack_limit) {
                nextfp = *(struct frame **)fp;
-#if defined(__x86_64__)
                pc = *(uintptr_t *)(((uintptr_t)fp) + RETURN_OFFSET64);
-#else
-               pc = *(uintptr_t *)(((uintptr_t)fp) + RETURN_OFFSET);
-#endif
 
                if (nextfp <= minfp || nextfp >= stacktop) {
                        if (on_intr) {
@@ -738,22 +738,20 @@ struct frame {
 };
 
 uint64_t
-dtrace_getarg(int arg, int aframes)
+dtrace_getarg(int arg, int aframes, dtrace_mstate_t *mstate, dtrace_vstate_t *vstate)
 {
-       uint64_t val;
+       uint64_t val = 0;
        struct frame *fp = (struct frame *)__builtin_frame_address(0);
        uintptr_t *stack;
        uintptr_t pc;
        int i;
 
 
-#if defined(__x86_64__)
     /*
      * A total of 6 arguments are passed via registers; any argument with
      * index of 5 or lower is therefore in a register.
      */
     int inreg = 5;
-#endif
 
        for (i = 1; i <= aframes; i++) {
                fp = fp->backchain;
@@ -762,18 +760,6 @@ dtrace_getarg(int arg, int aframes)
                if (dtrace_invop_callsite_pre != NULL
                        && pc  >  (uintptr_t)dtrace_invop_callsite_pre
                        && pc  <= (uintptr_t)dtrace_invop_callsite_post) {
-#if defined(__i386__)
-                       /*
-                        * If we pass through the invalid op handler, we will
-                        * use the pointer that it passed to the stack as the
-                        * second argument to dtrace_invop() as the pointer to
-                        * the frame we're hunting for.
-                        */
-
-                       stack = (uintptr_t *)&fp[1]; /* Find marshalled arguments */
-                       fp = (struct frame *)stack[1]; /* Grab *second* argument */
-                       stack = (uintptr_t *)&fp[1]; /* Find marshalled arguments */
-#elif defined(__x86_64__)
                        /*
                         * In the case of x86_64, we will use the pointer to the
                         * save area structure that was pushed when we took the
@@ -796,16 +782,13 @@ dtrace_getarg(int arg, int aframes)
                        x86_saved_state64_t *saved_state = saved_state64(tagged_regs);
 
                        if (arg <= inreg) {
-                               stack = (uintptr_t *)&saved_state->rdi;
+                               stack = (uintptr_t *)(void*)&saved_state->rdi;
                        } else {
                                fp = (struct frame *)(saved_state->isf.rsp);
                                stack = (uintptr_t *)&fp[1]; /* Find marshalled
                                                                arguments */
                                arg -= inreg + 1;
                        }
-#else
-#error Unknown arch
-#endif
                        goto load;
                }
        }
@@ -819,7 +802,6 @@ dtrace_getarg(int arg, int aframes)
         */
        arg++; /* Advance past probeID */
 
-#if defined(__x86_64__)
        if (arg <= inreg) {
                /*
                 * This shouldn't happen.  If the argument is passed in a
@@ -831,14 +813,14 @@ dtrace_getarg(int arg, int aframes)
        }
 
        arg -= (inreg + 1);
-#endif
        stack = (uintptr_t *)&fp[1]; /* Find marshalled arguments */
 
 load:
-       DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT);
-       /* dtrace_probe arguments arg0 ... arg4 are 64bits wide */
-       val = (uint64_t)(*(((uintptr_t *)stack) + arg));
-       DTRACE_CPUFLAG_CLEAR(CPU_DTRACE_NOFAULT);
+       if (dtrace_canload((uint64_t)(stack + arg), sizeof(uint64_t),
+               mstate, vstate)) {
+               /* dtrace_probe arguments arg0 ... arg4 are 64bits wide */
+               val = dtrace_load64((uint64_t)(stack + arg));
+       }
 
        return (val);
 }