X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/316670eb35587141e969394ae8537d66b9211e80..4ba76501152d51ccb5647018f3192c6096367d48:/bsd/dev/i386/dtrace_isa.c diff --git a/bsd/dev/i386/dtrace_isa.c b/bsd/dev/i386/dtrace_isa.c index bdb177028..6785dc536 100644 --- a/bsd/dev/i386/dtrace_isa.c +++ b/bsd/dev/i386/dtrace_isa.c @@ -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 #include @@ -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); }