diff options
Diffstat (limited to 'sys/cddl/dev/dtrace/aarch64/dtrace_subr.c')
-rw-r--r-- | sys/cddl/dev/dtrace/aarch64/dtrace_subr.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/sys/cddl/dev/dtrace/aarch64/dtrace_subr.c b/sys/cddl/dev/dtrace/aarch64/dtrace_subr.c index 74b3bf7ed7d1..b4dae1cba539 100644 --- a/sys/cddl/dev/dtrace/aarch64/dtrace_subr.c +++ b/sys/cddl/dev/dtrace/aarch64/dtrace_subr.c @@ -19,26 +19,22 @@ * * CDDL HEADER END * - * $FreeBSD$ - * */ /* * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - #include <sys/param.h> #include <sys/systm.h> -#include <sys/types.h> #include <sys/kernel.h> #include <sys/malloc.h> #include <sys/kmem.h> +#include <sys/proc.h> #include <sys/smp.h> #include <sys/dtrace_impl.h> #include <sys/dtrace_bsd.h> +#include <cddl/dev/dtrace/dtrace_cddl.h> #include <machine/armreg.h> #include <machine/clock.h> #include <machine/frame.h> @@ -65,17 +61,20 @@ dtrace_invop_hdlr_t *dtrace_invop_hdlr; int dtrace_invop(uintptr_t addr, struct trapframe *frame, uintptr_t eax) { + struct thread *td; dtrace_invop_hdlr_t *hdlr; int rval; + rval = 0; + td = curthread; + td->t_dtrace_trapframe = frame; for (hdlr = dtrace_invop_hdlr; hdlr != NULL; hdlr = hdlr->dtih_next) if ((rval = hdlr->dtih_func(addr, frame, eax)) != 0) - return (rval); - - return (0); + break; + td->t_dtrace_trapframe = NULL; + return (rval); } - void dtrace_invop_add(int (*func)(uintptr_t, struct trapframe *, uintptr_t)) { @@ -207,7 +206,7 @@ dtrace_trap(struct trapframe *frame, u_int type) case EXCP_DATA_ABORT: /* Flag a bad address. */ cpu_core[curcpu].cpuc_dtrace_flags |= CPU_DTRACE_BADADDR; - cpu_core[curcpu].cpuc_dtrace_illval = 0; + cpu_core[curcpu].cpuc_dtrace_illval = frame->tf_far; /* * Offset the instruction pointer to the instruction |