Module Name: src
Committed By: chs
Date: Mon Feb 27 06:47:00 UTC 2017
Modified Files:
src/external/cddl/osnet/dev/dtrace/amd64: dtrace_asm.S dtrace_isa.c
dtrace_subr.c
src/external/cddl/osnet/dev/dtrace/arm: dtrace_subr.c
src/external/cddl/osnet/dev/dtrace/i386: dtrace_asm.S dtrace_isa.c
dtrace_subr.c
src/external/cddl/osnet/dev/fbt: fbt.c
src/external/cddl/osnet/dist/uts/common/sys: dtrace.h
src/sys/arch/arm/arm: undefined.c
src/sys/arch/i386/i386: i386_trap.S
Log Message:
apply changes equivalent to freebsd r256822, r267759 and r298171:
fix the dtrace "args" variable to return correct values.
simplify the invop handlers a bit by changing the second argument
from a pointer into the stack to a pointer to the trapframe.
To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 \
src/external/cddl/osnet/dev/dtrace/amd64/dtrace_asm.S
cvs rdiff -u -r1.5 -r1.6 \
src/external/cddl/osnet/dev/dtrace/amd64/dtrace_isa.c
cvs rdiff -u -r1.7 -r1.8 \
src/external/cddl/osnet/dev/dtrace/amd64/dtrace_subr.c
cvs rdiff -u -r1.2 -r1.3 src/external/cddl/osnet/dev/dtrace/arm/dtrace_subr.c
cvs rdiff -u -r1.5 -r1.6 src/external/cddl/osnet/dev/dtrace/i386/dtrace_asm.S
cvs rdiff -u -r1.4 -r1.5 src/external/cddl/osnet/dev/dtrace/i386/dtrace_isa.c
cvs rdiff -u -r1.7 -r1.8 \
src/external/cddl/osnet/dev/dtrace/i386/dtrace_subr.c
cvs rdiff -u -r1.21 -r1.22 src/external/cddl/osnet/dev/fbt/fbt.c
cvs rdiff -u -r1.14 -r1.15 \
src/external/cddl/osnet/dist/uts/common/sys/dtrace.h
cvs rdiff -u -r1.57 -r1.58 src/sys/arch/arm/arm/undefined.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/i386/i386/i386_trap.S
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/cddl/osnet/dev/dtrace/amd64/dtrace_asm.S
diff -u src/external/cddl/osnet/dev/dtrace/amd64/dtrace_asm.S:1.6 src/external/cddl/osnet/dev/dtrace/amd64/dtrace_asm.S:1.7
--- src/external/cddl/osnet/dev/dtrace/amd64/dtrace_asm.S:1.6 Thu Jun 23 04:35:35 2016
+++ src/external/cddl/osnet/dev/dtrace/amd64/dtrace_asm.S Mon Feb 27 06:46:59 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: dtrace_asm.S,v 1.6 2016/06/23 04:35:35 pgoyette Exp $ */
+/* $NetBSD: dtrace_asm.S,v 1.7 2017/02/27 06:46:59 chs Exp $ */
/*
* CDDL HEADER START
@@ -72,13 +72,10 @@
*/
movq TF_RIP(%rsp), %rdi
decq %rdi
- movq TF_RSP(%rsp), %rsi
- movq TF_RAX(%rsp), %rdx
- pushq (%rsi)
movq %rsp, %rsi
+ movq TF_RAX(%rsp), %rdx
call dtrace_invop
ALTENTRY(dtrace_invop_callsite)
- addq $8, %rsp
cmpl $DTRACE_INVOP_PUSHL_EBP, %eax
je bp_push
cmpl $DTRACE_INVOP_LEAVE, %eax
Index: src/external/cddl/osnet/dev/dtrace/amd64/dtrace_isa.c
diff -u src/external/cddl/osnet/dev/dtrace/amd64/dtrace_isa.c:1.5 src/external/cddl/osnet/dev/dtrace/amd64/dtrace_isa.c:1.6
--- src/external/cddl/osnet/dev/dtrace/amd64/dtrace_isa.c:1.5 Sat May 14 21:19:05 2016
+++ src/external/cddl/osnet/dev/dtrace/amd64/dtrace_isa.c Mon Feb 27 06:46:59 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: dtrace_isa.c,v 1.5 2016/05/14 21:19:05 chs Exp $ */
+/* $NetBSD: dtrace_isa.c,v 1.6 2017/02/27 06:46:59 chs Exp $ */
/*
* CDDL HEADER START
@@ -47,10 +47,9 @@ uintptr_t kernelbase = (uintptr_t)KERN_B
#define INKERNEL(va) ((intptr_t)(va) < 0)
-struct amd64_frame {
+struct amd64_frame {
struct amd64_frame *f_frame;
- uintptr_t f_retaddr;
- uintptr_t f_arg0;
+ uintptr_t f_retaddr;
};
typedef unsigned long vm_offset_t;
@@ -355,7 +354,8 @@ dtrace_getarg(int arg, int aframes)
for (i = 1; i <= aframes; i++) {
fp = fp->f_frame;
- if (fp->f_retaddr == (long)dtrace_invop_callsite) {
+ if (P2ROUNDUP(fp->f_retaddr, 16) ==
+ (long)dtrace_invop_callsite) {
/*
* In the case of amd64, we will use the pointer to the
* regs structure that was pushed when we took the
@@ -369,13 +369,36 @@ dtrace_getarg(int arg, int aframes)
* we're seeking is passed in registers, we can just
* load it directly.
*/
- struct reg *rp = (struct reg *)((uintptr_t)&fp[1] +
- sizeof (uintptr_t));
+ struct trapframe *tf = (struct trapframe *)&fp[1];
if (arg <= inreg) {
- stack = (uintptr_t *)&rp->regs[_REG_RDI];
+ switch (arg) {
+ case 0:
+ stack = (uintptr_t *)&tf->tf_rdi;
+ break;
+ case 1:
+ stack = (uintptr_t *)&tf->tf_rsi;
+ break;
+ case 2:
+ stack = (uintptr_t *)&tf->tf_rdx;
+ break;
+ case 3:
+ stack = (uintptr_t *)&tf->tf_rcx;
+ break;
+ case 4:
+ stack = (uintptr_t *)&tf->tf_r8;
+ break;
+ case 5:
+ stack = (uintptr_t *)&tf->tf_r9;
+ break;
+ default:
+ KASSERT(0);
+ stack = NULL;
+ break;
+ }
+ arg = 0;
} else {
- stack = (uintptr_t *)(rp->regs[_REG_RSP]);
+ stack = (uintptr_t *)(tf->tf_rsp);
arg -= inreg;
}
goto load;
Index: src/external/cddl/osnet/dev/dtrace/amd64/dtrace_subr.c
diff -u src/external/cddl/osnet/dev/dtrace/amd64/dtrace_subr.c:1.7 src/external/cddl/osnet/dev/dtrace/amd64/dtrace_subr.c:1.8
--- src/external/cddl/osnet/dev/dtrace/amd64/dtrace_subr.c:1.7 Sat Jun 16 17:31:47 2012
+++ src/external/cddl/osnet/dev/dtrace/amd64/dtrace_subr.c Mon Feb 27 06:46:59 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: dtrace_subr.c,v 1.7 2012/06/16 17:31:47 chs Exp $ */
+/* $NetBSD: dtrace_subr.c,v 1.8 2017/02/27 06:46:59 chs Exp $ */
/*
* CDDL HEADER START
@@ -51,32 +51,32 @@ extern uintptr_t kernelbase;
extern uintptr_t dtrace_in_probe_addr;
extern int dtrace_in_probe;
-int dtrace_invop(uintptr_t, uintptr_t *, uintptr_t);
+int dtrace_invop(uintptr_t, struct trapframe *, uintptr_t);
typedef struct dtrace_invop_hdlr {
- int (*dtih_func)(uintptr_t, uintptr_t *, uintptr_t);
+ int (*dtih_func)(uintptr_t, struct trapframe *, uintptr_t);
struct dtrace_invop_hdlr *dtih_next;
} dtrace_invop_hdlr_t;
dtrace_invop_hdlr_t *dtrace_invop_hdlr;
-void dtrace_gethrtime_init(void *);
+void dtrace_gethrtime_init(void *);
int
-dtrace_invop(uintptr_t addr, uintptr_t *stack, uintptr_t eax)
+dtrace_invop(uintptr_t addr, struct trapframe *frame, uintptr_t eax)
{
dtrace_invop_hdlr_t *hdlr;
int rval;
for (hdlr = dtrace_invop_hdlr; hdlr != NULL; hdlr = hdlr->dtih_next)
- if ((rval = hdlr->dtih_func(addr, stack, eax)) != 0)
+ if ((rval = hdlr->dtih_func(addr, frame, eax)) != 0)
return (rval);
return (0);
}
void
-dtrace_invop_add(int (*func)(uintptr_t, uintptr_t *, uintptr_t))
+dtrace_invop_add(int (*func)(uintptr_t, struct trapframe *, uintptr_t))
{
dtrace_invop_hdlr_t *hdlr;
@@ -87,7 +87,7 @@ dtrace_invop_add(int (*func)(uintptr_t,
}
void
-dtrace_invop_remove(int (*func)(uintptr_t, uintptr_t *, uintptr_t))
+dtrace_invop_remove(int (*func)(uintptr_t, struct trapframe *, uintptr_t))
{
dtrace_invop_hdlr_t *hdlr = dtrace_invop_hdlr, *prev = NULL;
Index: src/external/cddl/osnet/dev/dtrace/arm/dtrace_subr.c
diff -u src/external/cddl/osnet/dev/dtrace/arm/dtrace_subr.c:1.2 src/external/cddl/osnet/dev/dtrace/arm/dtrace_subr.c:1.3
--- src/external/cddl/osnet/dev/dtrace/arm/dtrace_subr.c:1.2 Mon Mar 10 03:04:57 2014
+++ src/external/cddl/osnet/dev/dtrace/arm/dtrace_subr.c Mon Feb 27 06:47:00 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: dtrace_subr.c,v 1.2 2014/03/10 03:04:57 ozaki-r Exp $ */
+/* $NetBSD: dtrace_subr.c,v 1.3 2017/02/27 06:47:00 chs Exp $ */
/*
* CDDL HEADER START
@@ -52,10 +52,10 @@ extern uintptr_t dtrace_in_probe_addr;
extern int dtrace_in_probe;
extern dtrace_id_t dtrace_probeid_error;
-int dtrace_invop(uintptr_t, uintptr_t *, uintptr_t);
+int dtrace_invop(uintptr_t, struct trapframe *, uintptr_t);
typedef struct dtrace_invop_hdlr {
- int (*dtih_func)(uintptr_t, uintptr_t *, uintptr_t);
+ int (*dtih_func)(uintptr_t, struct trapframe *, uintptr_t);
struct dtrace_invop_hdlr *dtih_next;
} dtrace_invop_hdlr_t;
@@ -64,20 +64,20 @@ dtrace_invop_hdlr_t *dtrace_invop_hdlr;
void dtrace_gethrtime_init(void *arg);
int
-dtrace_invop(uintptr_t addr, uintptr_t *stack, uintptr_t eax)
+dtrace_invop(uintptr_t addr, struct trapframe *frame, uintptr_t eax)
{
dtrace_invop_hdlr_t *hdlr;
int rval;
for (hdlr = dtrace_invop_hdlr; hdlr != NULL; hdlr = hdlr->dtih_next)
- if ((rval = hdlr->dtih_func(addr, stack, eax)) != 0)
+ if ((rval = hdlr->dtih_func(addr, frame, eax)) != 0)
return (rval);
return (0);
}
void
-dtrace_invop_add(int (*func)(uintptr_t, uintptr_t *, uintptr_t))
+dtrace_invop_add(int (*func)(uintptr_t, struct trapframe *, uintptr_t))
{
dtrace_invop_hdlr_t *hdlr;
@@ -88,7 +88,7 @@ dtrace_invop_add(int (*func)(uintptr_t,
}
void
-dtrace_invop_remove(int (*func)(uintptr_t, uintptr_t *, uintptr_t))
+dtrace_invop_remove(int (*func)(uintptr_t, struct trapframe *, uintptr_t))
{
dtrace_invop_hdlr_t *hdlr = dtrace_invop_hdlr, *prev = NULL;
Index: src/external/cddl/osnet/dev/dtrace/i386/dtrace_asm.S
diff -u src/external/cddl/osnet/dev/dtrace/i386/dtrace_asm.S:1.5 src/external/cddl/osnet/dev/dtrace/i386/dtrace_asm.S:1.6
--- src/external/cddl/osnet/dev/dtrace/i386/dtrace_asm.S:1.5 Thu Jun 23 04:35:35 2016
+++ src/external/cddl/osnet/dev/dtrace/i386/dtrace_asm.S Mon Feb 27 06:47:00 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: dtrace_asm.S,v 1.5 2016/06/23 04:35:35 pgoyette Exp $ */
+/* $NetBSD: dtrace_asm.S,v 1.6 2017/02/27 06:47:00 chs Exp $ */
/*
* CDDL HEADER START
@@ -30,17 +30,45 @@
#define _ASM
+#include "assym.h"
+
#include <sys/cpuvar_defs.h>
#include <sys/dtrace.h>
#include <machine/asm.h>
#include <machine/frameasm.h>
+#include <machine/trap.h>
+
+#define INTR_POP \
+ addl $16, %esp; \
+ popl %edi; \
+ popl %esi; \
+ popl %ebp; \
+ popl %ebx; \
+ popl %edx; \
+ popl %ecx; \
+ popl %eax; \
+ addl $8, %esp
ENTRY(dtrace_invop_start)
+
+ /* Store a trapframe for dtrace. */
+ pushl $0
+ pushl $T_PRIVINFLT
+ pushl %eax
+ pushl %ecx
+ pushl %edx
+ pushl %ebx
+ pushl %ebp
+ pushl %esi
+ pushl %edi
+ subl $16,%esp /* dummy for segment regs */
+ cld
+ /* Store the args to dtrace_invop(). */
pushl %eax /* push %eax -- may be return value */
pushl %esp /* push stack pointer */
- addl $48, (%esp) /* adjust to incoming args */
- pushl 40(%esp) /* push calling EIP */
+ addl $4, (%esp) /* skip first arg and segment regs */
+ pushl TF_EIP+8(%esp) /* push calling EIP */
/*
* Call dtrace_invop to let it check if the exception was
@@ -67,7 +95,7 @@ invop_push:
* We must emulate a "pushl %ebp". To do this, we pull the stack
* down 4 bytes, and then store the base pointer.
*/
- popal
+ INTR_POP
subl $4, %esp /* make room for %ebp */
pushl %eax /* push temp */
movl 8(%esp), %eax /* load calling EIP */
@@ -86,7 +114,7 @@ invop_pop:
* the above: we remove the %ebp from the stack, and squeeze up the
* saved state from the trap.
*/
- popal
+ INTR_POP
pushl %eax /* push temp */
movl 16(%esp), %ebp /* pop %ebp */
movl 12(%esp), %eax /* load calling EFLAGS */
@@ -106,7 +134,7 @@ invop_leave:
* requires two temporaries: one for the new base pointer, and one
* for the staging register.
*/
- popa
+ INTR_POP
pushl %eax /* push temp */
pushl %ebx /* push temp */
movl %ebp, %ebx /* set temp to old %ebp */
@@ -129,7 +157,7 @@ invop_nop:
* We must emulate a "nop". This is obviously not hard: we need only
* advance the %eip by one.
*/
- popa
+ INTR_POP
incl (%esp)
iret /* return from interrupt */
Index: src/external/cddl/osnet/dev/dtrace/i386/dtrace_isa.c
diff -u src/external/cddl/osnet/dev/dtrace/i386/dtrace_isa.c:1.4 src/external/cddl/osnet/dev/dtrace/i386/dtrace_isa.c:1.5
--- src/external/cddl/osnet/dev/dtrace/i386/dtrace_isa.c:1.4 Sat May 14 21:19:05 2016
+++ src/external/cddl/osnet/dev/dtrace/i386/dtrace_isa.c Mon Feb 27 06:47:00 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: dtrace_isa.c,v 1.4 2016/05/14 21:19:05 chs Exp $ */
+/* $NetBSD: dtrace_isa.c,v 1.5 2017/02/27 06:47:00 chs Exp $ */
/*
* CDDL HEADER START
@@ -45,7 +45,6 @@ uintptr_t kernelbase = (uintptr_t)KERNBA
struct i386_frame {
struct i386_frame *f_frame;
int f_retaddr;
- int f_arg0;
};
typedef unsigned long vm_offset_t;
@@ -405,24 +404,29 @@ zero:
uint64_t
dtrace_getarg(int arg, int aframes)
{
- uintptr_t val;
+ struct trapframe *frame;
struct i386_frame *fp = (struct i386_frame *)dtrace_getfp();
- uintptr_t *stack;
+ uintptr_t *stack, val;
int i;
for (i = 1; i <= aframes; i++) {
fp = fp->f_frame;
- if (fp->f_retaddr == (long)dtrace_invop_callsite) {
+ if (P2ROUNDUP(fp->f_retaddr, 16) ==
+ (long)dtrace_invop_callsite) {
/*
* 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 stack. When using this stack, we must step
- * beyond the EIP/RIP that was pushed when the trap was
- * taken -- hence the "+ 1" below.
+ * use the trap frame pointer that it pushed on the
+ * stack as the second argument to dtrace_invop() as
+ * the pointer to the stack.
*/
- stack = ((uintptr_t **)&fp[1])[1] + 1;
+ frame = (struct trapframe *)(((uintptr_t **)&fp[1])[1]);
+
+ /*
+ * Skip the three hardware-saved registers and the
+ * return address.
+ */
+ stack = (uintptr_t *)&frame->tf_esp + 1;
goto load;
}
}
Index: src/external/cddl/osnet/dev/dtrace/i386/dtrace_subr.c
diff -u src/external/cddl/osnet/dev/dtrace/i386/dtrace_subr.c:1.7 src/external/cddl/osnet/dev/dtrace/i386/dtrace_subr.c:1.8
--- src/external/cddl/osnet/dev/dtrace/i386/dtrace_subr.c:1.7 Sat Jun 16 17:31:47 2012
+++ src/external/cddl/osnet/dev/dtrace/i386/dtrace_subr.c Mon Feb 27 06:47:00 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: dtrace_subr.c,v 1.7 2012/06/16 17:31:47 chs Exp $ */
+/* $NetBSD: dtrace_subr.c,v 1.8 2017/02/27 06:47:00 chs Exp $ */
/*
* CDDL HEADER START
@@ -54,10 +54,10 @@ extern uintptr_t kernelbase;
extern uintptr_t dtrace_in_probe_addr;
extern int dtrace_in_probe;
-int dtrace_invop(uintptr_t, uintptr_t *, uintptr_t);
+int dtrace_invop(uintptr_t, struct trapframe *, uintptr_t);
typedef struct dtrace_invop_hdlr {
- int (*dtih_func)(uintptr_t, uintptr_t *, uintptr_t);
+ int (*dtih_func)(uintptr_t, struct trapframe *, uintptr_t);
struct dtrace_invop_hdlr *dtih_next;
} dtrace_invop_hdlr_t;
@@ -66,20 +66,20 @@ dtrace_invop_hdlr_t *dtrace_invop_hdlr;
void dtrace_gethrtime_init(void *arg);
int
-dtrace_invop(uintptr_t addr, uintptr_t *stack, uintptr_t eax)
+dtrace_invop(uintptr_t addr, struct trapframe *frame, uintptr_t eax)
{
dtrace_invop_hdlr_t *hdlr;
int rval;
for (hdlr = dtrace_invop_hdlr; hdlr != NULL; hdlr = hdlr->dtih_next)
- if ((rval = hdlr->dtih_func(addr, stack, eax)) != 0)
+ if ((rval = hdlr->dtih_func(addr, frame, eax)) != 0)
return (rval);
return (0);
}
void
-dtrace_invop_add(int (*func)(uintptr_t, uintptr_t *, uintptr_t))
+dtrace_invop_add(int (*func)(uintptr_t, struct trapframe *, uintptr_t))
{
dtrace_invop_hdlr_t *hdlr;
@@ -90,7 +90,7 @@ dtrace_invop_add(int (*func)(uintptr_t,
}
void
-dtrace_invop_remove(int (*func)(uintptr_t, uintptr_t *, uintptr_t))
+dtrace_invop_remove(int (*func)(uintptr_t, struct trapframe *, uintptr_t))
{
dtrace_invop_hdlr_t *hdlr = dtrace_invop_hdlr, *prev = NULL;
Index: src/external/cddl/osnet/dev/fbt/fbt.c
diff -u src/external/cddl/osnet/dev/fbt/fbt.c:1.21 src/external/cddl/osnet/dev/fbt/fbt.c:1.22
--- src/external/cddl/osnet/dev/fbt/fbt.c:1.21 Sat Jan 7 21:39:52 2017
+++ src/external/cddl/osnet/dev/fbt/fbt.c Mon Feb 27 06:47:00 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: fbt.c,v 1.21 2017/01/07 21:39:52 christos Exp $ */
+/* $NetBSD: fbt.c,v 1.22 2017/02/27 06:47:00 chs Exp $ */
/*
* CDDL HEADER START
@@ -456,17 +456,45 @@ fbt_doubletrap(void)
static int
-fbt_invop(uintptr_t addr, uintptr_t *stack, uintptr_t rval)
+fbt_invop(uintptr_t addr, struct trapframe *frame, uintptr_t rval)
{
- solaris_cpu_t *cpu = &solaris_cpu[cpu_number()];
- uintptr_t stack0, stack1, stack2, stack3, stack4;
- fbt_probe_t *fbt = fbt_probetab[FBT_ADDR2NDX(addr)];
+ solaris_cpu_t *cpu;
+ uintptr_t *stack;
+ uintptr_t arg0, arg1, arg2, arg3, arg4;
+ fbt_probe_t *fbt;
+
+#ifdef __amd64__
+ stack = (uintptr_t *)frame->tf_rsp;
+#endif
+#ifdef __i386__
+ /* Skip hardware-saved registers. */
+ stack = (uintptr_t *)&frame->tf_esp;
+#endif
+#ifdef __arm__
+ stack = (uintptr_t *)frame->tf_svc_sp;
+#endif
+ cpu = &solaris_cpu[cpu_number()];
+ fbt = fbt_probetab[FBT_ADDR2NDX(addr)];
for (; fbt != NULL; fbt = fbt->fbtp_hashnext) {
if ((uintptr_t)fbt->fbtp_patchpoint == addr) {
fbt->fbtp_invop_cnt++;
if (fbt->fbtp_roffset == 0) {
+#ifdef __amd64__
+ /* fbt->fbtp_rval == DTRACE_INVOP_PUSHQ_RBP */
+ DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT);
+ cpu->cpu_dtrace_caller = stack[0];
+ DTRACE_CPUFLAG_CLEAR(CPU_DTRACE_NOFAULT |
+ CPU_DTRACE_BADADDR);
+
+ arg0 = frame->tf_rdi;
+ arg1 = frame->tf_rsi;
+ arg2 = frame->tf_rdx;
+ arg3 = frame->tf_rcx;
+ arg4 = frame->tf_r8;
+#else
int i = 0;
+
/*
* When accessing the arguments on the stack,
* we must protect against accessing beyond
@@ -476,16 +504,17 @@ fbt_invop(uintptr_t addr, uintptr_t *sta
*/
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT);
cpu->cpu_dtrace_caller = stack[i++];
- stack0 = stack[i++];
- stack1 = stack[i++];
- stack2 = stack[i++];
- stack3 = stack[i++];
- stack4 = stack[i++];
+ arg0 = stack[i++];
+ arg1 = stack[i++];
+ arg2 = stack[i++];
+ arg3 = stack[i++];
+ arg4 = stack[i++];
DTRACE_CPUFLAG_CLEAR(CPU_DTRACE_NOFAULT |
CPU_DTRACE_BADADDR);
+#endif
- dtrace_probe(fbt->fbtp_id, stack0, stack1,
- stack2, stack3, stack4);
+ dtrace_probe(fbt->fbtp_id, arg0, arg1,
+ arg2, arg3, arg4);
cpu->cpu_dtrace_caller = 0;
} else {
@@ -493,7 +522,7 @@ fbt_invop(uintptr_t addr, uintptr_t *sta
/*
* On amd64, we instrument the ret, not the
* leave. We therefore need to set the caller
- * to assure that the top frame of a stack()
+ * to ensure that the top frame of a stack()
* action is correct.
*/
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT);
Index: src/external/cddl/osnet/dist/uts/common/sys/dtrace.h
diff -u src/external/cddl/osnet/dist/uts/common/sys/dtrace.h:1.14 src/external/cddl/osnet/dist/uts/common/sys/dtrace.h:1.15
--- src/external/cddl/osnet/dist/uts/common/sys/dtrace.h:1.14 Fri Oct 2 22:16:38 2015
+++ src/external/cddl/osnet/dist/uts/common/sys/dtrace.h Mon Feb 27 06:47:00 2017
@@ -2396,8 +2396,9 @@ extern int dtrace_instr_size(uchar_t *in
extern int dtrace_instr_size_isa(uchar_t *, model_t, int *);
extern void dtrace_invop_callsite(void);
#endif
-extern void dtrace_invop_add(int (*)(uintptr_t, uintptr_t *, uintptr_t));
-extern void dtrace_invop_remove(int (*)(uintptr_t, uintptr_t *, uintptr_t));
+extern void dtrace_invop_add(int (*)(uintptr_t, struct trapframe *, uintptr_t));
+extern void dtrace_invop_remove(int (*)(uintptr_t, struct trapframe *,
+ uintptr_t));
#ifdef __sparc
extern int dtrace_blksuword32(uintptr_t, uint32_t *, int);
@@ -2425,7 +2426,9 @@ extern void dtrace_helpers_destroy(proc_
#if defined(__i386) || defined(__amd64)
#define DTRACE_INVOP_PUSHL_EBP 1
+#define DTRACE_INVOP_PUSHQ_RBP DTRACE_INVOP_PUSHL_EBP
#define DTRACE_INVOP_POPL_EBP 2
+#define DTRACE_INVOP_POPQ_RBP DTRACE_INVOP_POPL_EBP
#define DTRACE_INVOP_LEAVE 3
#define DTRACE_INVOP_NOP 4
#define DTRACE_INVOP_RET 5
Index: src/sys/arch/arm/arm/undefined.c
diff -u src/sys/arch/arm/arm/undefined.c:1.57 src/sys/arch/arm/arm/undefined.c:1.58
--- src/sys/arch/arm/arm/undefined.c:1.57 Mon Feb 20 17:25:41 2017
+++ src/sys/arch/arm/arm/undefined.c Mon Feb 27 06:46:59 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: undefined.c,v 1.57 2017/02/20 17:25:41 skrll Exp $ */
+/* $NetBSD: undefined.c,v 1.58 2017/02/27 06:46:59 chs Exp $ */
/*
* Copyright (c) 2001 Ben Harris.
@@ -55,7 +55,7 @@
#include <sys/kgdb.h>
#endif
-__KERNEL_RCSID(0, "$NetBSD: undefined.c,v 1.57 2017/02/20 17:25:41 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: undefined.c,v 1.58 2017/02/27 06:46:59 chs Exp $");
#include <sys/kmem.h>
#include <sys/queue.h>
@@ -225,7 +225,7 @@ static struct undefined_handler gdb_uh_t
dtrace_doubletrap_func_t dtrace_doubletrap_func = NULL;
dtrace_trap_func_t dtrace_trap_func = NULL;
-int (* dtrace_invop_jump_addr)(uintptr_t, uintptr_t *, uintptr_t);
+int (* dtrace_invop_jump_addr)(uintptr_t, struct trapframe *, uintptr_t);
void (* dtrace_emulation_jump_addr)(int, struct trapframe *);
static int
@@ -248,7 +248,7 @@ dtrace_trapper(u_int addr, struct trapfr
}
back = *frame;
- op = dtrace_invop_jump_addr(addr, (uintptr_t *) frame->tf_svc_sp, frame->tf_r0);
+ op = dtrace_invop_jump_addr(addr, frame, frame->tf_r0);
*frame = back;
dtrace_emulation_jump_addr(op, frame);
Index: src/sys/arch/i386/i386/i386_trap.S
diff -u src/sys/arch/i386/i386/i386_trap.S:1.5 src/sys/arch/i386/i386/i386_trap.S:1.6
--- src/sys/arch/i386/i386/i386_trap.S:1.5 Wed Feb 12 23:24:09 2014
+++ src/sys/arch/i386/i386/i386_trap.S Mon Feb 27 06:46:59 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: i386_trap.S,v 1.5 2014/02/12 23:24:09 dsl Exp $ */
+/* $NetBSD: i386_trap.S,v 1.6 2017/02/27 06:46:59 chs Exp $ */
/*
* Copyright 2002 (c) Wasabi Systems, Inc.
@@ -66,7 +66,7 @@
#if 0
#include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: i386_trap.S,v 1.5 2014/02/12 23:24:09 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i386_trap.S,v 1.6 2017/02/27 06:46:59 chs Exp $");
#endif
/*
@@ -133,8 +133,7 @@ IDTVEC(trap06)
* This is a kernel instruction fault that might have been caused
* by a DTrace provider.
*/
- pushal /* Push all registers onto the stack. */
-
+
/*
* Set our jump address for the jump back in the event that
* the exception wasn't caused by DTrace at all.