X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/39236c6e673c41db228275375ab7fdb0f837b292..d9a64523371fa019c4575bb400cbbc3a50ac9903:/bsd/dev/i386/dtrace_isa.c diff --git a/bsd/dev/i386/dtrace_isa.c b/bsd/dev/i386/dtrace_isa.c index 05f366291..458fc15b3 100644 --- a/bsd/dev/i386/dtrace_isa.c +++ b/bsd/dev/i386/dtrace_isa.c @@ -158,10 +158,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 +183,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]; @@ -734,9 +739,9 @@ 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; @@ -778,7 +783,7 @@ 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 @@ -812,10 +817,11 @@ dtrace_getarg(int arg, int aframes) 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); }