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.

Reply via email to