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.