From owner-svn-src-all@FreeBSD.ORG Tue Jun 3 01:24:53 2014 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 2B1F9AA5; Tue, 3 Jun 2014 01:24:53 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 0CEE429A5; Tue, 3 Jun 2014 01:24:53 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.8/8.14.8) with ESMTP id s531Oq67043231; Tue, 3 Jun 2014 01:24:52 GMT (envelope-from markj@svn.freebsd.org) Received: (from markj@localhost) by svn.freebsd.org (8.14.8/8.14.8/Submit) id s531OqdV043228; Tue, 3 Jun 2014 01:24:52 GMT (envelope-from markj@svn.freebsd.org) Message-Id: <201406030124.s531OqdV043228@svn.freebsd.org> From: Mark Johnston Date: Tue, 3 Jun 2014 01:24:52 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-vendor@freebsd.org Subject: svn commit: r266989 - vendor-sys/illumos/dist/uts/common/dtrace vendor-sys/illumos/dist/uts/common/sys vendor/illumos/dist/cmd/dtrace vendor/illumos/dist/cmd/dtrace/test/tst/common/pid vendor/illum... X-SVN-Group: vendor-sys MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 03 Jun 2014 01:24:53 -0000 Author: markj Date: Tue Jun 3 01:24:46 2014 New Revision: 266989 URL: http://svnweb.freebsd.org/changeset/base/266989 Log: 4474 DTrace Userland CTF Support 4475 DTrace userland Keyword 4476 DTrace tests should be better citizens 4479 pid provider types 4480 dof emulation is missing checks illumos/illumos-gate@a386cc11a86ecb60f5a48078d22c1500e2ad003e Modified: vendor-sys/illumos/dist/uts/common/dtrace/dtrace.c vendor-sys/illumos/dist/uts/common/sys/ctf_api.h vendor-sys/illumos/dist/uts/common/sys/dtrace.h Changes in other areas also in this revision: Added: vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/ vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/err.invalidpid.d (contents, props changed) vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/err.invalidpid2.d (contents, props changed) vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/err.invalidpid3.d (contents, props changed) vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/err.invalidtype.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/err.invalidtype2.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/err.user64mode.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/tst.aouttype.c (contents, props changed) vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/tst.aouttype.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/tst.chasestrings.c (contents, props changed) vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/tst.chasestrings.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/tst.chasestrings.ksh.out vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/tst.libtype.c (contents, props changed) vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/tst.libtype.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/tst.linkmap.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/tst.pidprint.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/tst.pidprinttarg.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/tst.printtype.c (contents, props changed) vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/tst.printtype.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/tst.printtype.ksh.out vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/tst.printtypetarg.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/tst.userlandkey.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/tst.userlandkey.ksh.out vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/tst.userstrings.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/uctf/tst.userstrings.ksh.out Modified: vendor/illumos/dist/cmd/dtrace/dtrace.c vendor/illumos/dist/cmd/dtrace/test/tst/common/pid/tst.provregex1.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/pid/tst.provregex2.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/pid/tst.provregex3.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/pid/tst.provregex4.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/printa/tst.largeusersym.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.corruptenv.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.dlclose1.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.dlclose2.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.dlclose3.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.eliminate.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.enabled.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.enabled2.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.entryreturn.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.fork.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.header.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.linkpriv.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.linkunpriv.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.multiple.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.multiprov.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.noprobes.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.noreap.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.noreapring.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.onlyenabled.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.reap.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.reeval.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.static.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.static2.ksh vendor/illumos/dist/cmd/dtrace/test/tst/common/usdt/tst.user.ksh vendor/illumos/dist/cmd/dtrace/test/tst/sparc/usdt/tst.tailcall.ksh vendor/illumos/dist/common/ctf/ctf_open.c vendor/illumos/dist/common/ctf/ctf_types.c vendor/illumos/dist/lib/libdtrace/common/dt_as.c vendor/illumos/dist/lib/libdtrace/common/dt_cc.c vendor/illumos/dist/lib/libdtrace/common/dt_decl.c vendor/illumos/dist/lib/libdtrace/common/dt_decl.h vendor/illumos/dist/lib/libdtrace/common/dt_dis.c vendor/illumos/dist/lib/libdtrace/common/dt_error.c vendor/illumos/dist/lib/libdtrace/common/dt_grammar.y vendor/illumos/dist/lib/libdtrace/common/dt_ident.c vendor/illumos/dist/lib/libdtrace/common/dt_impl.h vendor/illumos/dist/lib/libdtrace/common/dt_lex.l vendor/illumos/dist/lib/libdtrace/common/dt_module.c vendor/illumos/dist/lib/libdtrace/common/dt_module.h vendor/illumos/dist/lib/libdtrace/common/dt_open.c vendor/illumos/dist/lib/libdtrace/common/dt_parser.c vendor/illumos/dist/lib/libdtrace/common/dt_parser.h vendor/illumos/dist/lib/libdtrace/common/dt_pid.c vendor/illumos/dist/lib/libdtrace/common/dt_pid.h vendor/illumos/dist/lib/libdtrace/common/dt_print.c vendor/illumos/dist/lib/libdtrace/common/dt_printf.c vendor/illumos/dist/lib/libdtrace/common/dt_provider.c vendor/illumos/dist/lib/libdtrace/common/dt_xlator.c vendor/illumos/dist/lib/libdtrace/common/dtrace.h Modified: vendor-sys/illumos/dist/uts/common/dtrace/dtrace.c ============================================================================== --- vendor-sys/illumos/dist/uts/common/dtrace/dtrace.c Tue Jun 3 01:16:11 2014 (r266988) +++ vendor-sys/illumos/dist/uts/common/dtrace/dtrace.c Tue Jun 3 01:24:46 2014 (r266989) @@ -5719,32 +5719,46 @@ dtrace_dif_emulate(dtrace_difo_t *difo, regs[rd] = dtrace_load64(regs[r1]); break; case DIF_OP_ULDSB: + DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT); regs[rd] = (int8_t) dtrace_fuword8((void *)(uintptr_t)regs[r1]); + DTRACE_CPUFLAG_CLEAR(CPU_DTRACE_NOFAULT); break; case DIF_OP_ULDSH: + DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT); regs[rd] = (int16_t) dtrace_fuword16((void *)(uintptr_t)regs[r1]); + DTRACE_CPUFLAG_CLEAR(CPU_DTRACE_NOFAULT); break; case DIF_OP_ULDSW: + DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT); regs[rd] = (int32_t) dtrace_fuword32((void *)(uintptr_t)regs[r1]); + DTRACE_CPUFLAG_CLEAR(CPU_DTRACE_NOFAULT); break; case DIF_OP_ULDUB: + DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT); regs[rd] = dtrace_fuword8((void *)(uintptr_t)regs[r1]); + DTRACE_CPUFLAG_CLEAR(CPU_DTRACE_NOFAULT); break; case DIF_OP_ULDUH: + DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT); regs[rd] = dtrace_fuword16((void *)(uintptr_t)regs[r1]); + DTRACE_CPUFLAG_CLEAR(CPU_DTRACE_NOFAULT); break; case DIF_OP_ULDUW: + DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT); regs[rd] = dtrace_fuword32((void *)(uintptr_t)regs[r1]); + DTRACE_CPUFLAG_CLEAR(CPU_DTRACE_NOFAULT); break; case DIF_OP_ULDX: + DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT); regs[rd] = dtrace_fuword64((void *)(uintptr_t)regs[r1]); + DTRACE_CPUFLAG_CLEAR(CPU_DTRACE_NOFAULT); break; case DIF_OP_RET: rval = regs[rd]; @@ -6552,6 +6566,63 @@ out: mstate->dtms_scratch_ptr = old; } +static void +dtrace_store_by_ref(dtrace_difo_t *dp, caddr_t tomax, size_t size, + size_t *valoffsp, uint64_t *valp, uint64_t end, int intuple, int dtkind) +{ + volatile uint16_t *flags; + uint64_t val = *valp; + size_t valoffs = *valoffsp; + + flags = (volatile uint16_t *)&cpu_core[CPU->cpu_id].cpuc_dtrace_flags; + ASSERT(dtkind == DIF_TF_BYREF || dtkind == DIF_TF_BYUREF); + + /* + * If this is a string, we're going to only load until we find the zero + * byte -- after which we'll store zero bytes. + */ + if (dp->dtdo_rtype.dtdt_kind == DIF_TYPE_STRING) { + char c = '\0' + 1; + size_t s; + + for (s = 0; s < size; s++) { + if (c != '\0' && dtkind == DIF_TF_BYREF) { + c = dtrace_load8(val++); + } else if (c != '\0' && dtkind == DIF_TF_BYUREF) { + DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT); + c = dtrace_fuword8((void *)(uintptr_t)val++); + DTRACE_CPUFLAG_CLEAR(CPU_DTRACE_NOFAULT); + if (*flags & CPU_DTRACE_FAULT) + break; + } + + DTRACE_STORE(uint8_t, tomax, valoffs++, c); + + if (c == '\0' && intuple) + break; + } + } else { + uint8_t c; + while (valoffs < end) { + if (dtkind == DIF_TF_BYREF) { + c = dtrace_load8(val++); + } else if (dtkind == DIF_TF_BYUREF) { + DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT); + c = dtrace_fuword8((void *)(uintptr_t)val++); + DTRACE_CPUFLAG_CLEAR(CPU_DTRACE_NOFAULT); + if (*flags & CPU_DTRACE_FAULT) + break; + } + + DTRACE_STORE(uint8_t, tomax, + valoffs++, c); + } + } + + *valp = val; + *valoffsp = valoffs; +} + /* * If you're looking for the epicenter of DTrace, you just found it. This * is the function called by the provider to fire a probe -- from which all @@ -7043,7 +7114,8 @@ dtrace_probe(dtrace_id_t id, uintptr_t a ASSERT(0); } - if (dp->dtdo_rtype.dtdt_flags & DIF_TF_BYREF) { + if (dp->dtdo_rtype.dtdt_flags & DIF_TF_BYREF || + dp->dtdo_rtype.dtdt_flags & DIF_TF_BYUREF) { uintptr_t end = valoffs + size; if (tracememsize != 0 && @@ -7052,40 +7124,15 @@ dtrace_probe(dtrace_id_t id, uintptr_t a tracememsize = 0; } - if (!dtrace_vcanload((void *)(uintptr_t)val, + if (dp->dtdo_rtype.dtdt_flags & DIF_TF_BYREF && + !dtrace_vcanload((void *)(uintptr_t)val, &dp->dtdo_rtype, &mstate, vstate)) continue; - /* - * If this is a string, we're going to only - * load until we find the zero byte -- after - * which we'll store zero bytes. - */ - if (dp->dtdo_rtype.dtdt_kind == - DIF_TYPE_STRING) { - char c = '\0' + 1; - int intuple = act->dta_intuple; - size_t s; - - for (s = 0; s < size; s++) { - if (c != '\0') - c = dtrace_load8(val++); - - DTRACE_STORE(uint8_t, tomax, - valoffs++, c); - - if (c == '\0' && intuple) - break; - } - - continue; - } - - while (valoffs < end) { - DTRACE_STORE(uint8_t, tomax, valoffs++, - dtrace_load8(val++)); - } - + dtrace_store_by_ref(dp, tomax, size, &valoffs, + &val, end, act->dta_intuple, + dp->dtdo_rtype.dtdt_flags & DIF_TF_BYREF ? + DIF_TF_BYREF: DIF_TF_BYUREF); continue; } @@ -9203,7 +9250,7 @@ dtrace_difo_validate(dtrace_difo_t *dp, "expected 'ret' as last DIF instruction\n"); } - if (!(dp->dtdo_rtype.dtdt_flags & DIF_TF_BYREF)) { + if (!(dp->dtdo_rtype.dtdt_flags & (DIF_TF_BYREF | DIF_TF_BYUREF))) { /* * If we're not returning by reference, the size must be either * 0 or the size of one of the base types. Modified: vendor-sys/illumos/dist/uts/common/sys/ctf_api.h ============================================================================== --- vendor-sys/illumos/dist/uts/common/sys/ctf_api.h Tue Jun 3 01:16:11 2014 (r266988) +++ vendor-sys/illumos/dist/uts/common/sys/ctf_api.h Tue Jun 3 01:24:46 2014 (r266989) @@ -24,7 +24,7 @@ * Use is subject to license terms. */ /* - * Copyright (c) 2012, Joyent, Inc. All rights reserved. + * Copyright (c) 2013, Joyent, Inc. All rights reserved. */ /* @@ -151,6 +151,7 @@ extern ctf_file_t *ctf_bufopen(const ctf extern ctf_file_t *ctf_fdopen(int, int *); extern ctf_file_t *ctf_open(const char *, int *); extern ctf_file_t *ctf_create(int *); +extern ctf_file_t *ctf_dup(ctf_file_t *); extern void ctf_close(ctf_file_t *); extern ctf_file_t *ctf_parent_file(ctf_file_t *); @@ -176,6 +177,8 @@ extern ctf_id_t ctf_lookup_by_symbol(ctf extern ctf_id_t ctf_type_resolve(ctf_file_t *, ctf_id_t); extern ssize_t ctf_type_lname(ctf_file_t *, ctf_id_t, char *, size_t); extern char *ctf_type_name(ctf_file_t *, ctf_id_t, char *, size_t); +extern char *ctf_type_qname(ctf_file_t *, ctf_id_t, char *, size_t, + const char *); extern ssize_t ctf_type_size(ctf_file_t *, ctf_id_t); extern ssize_t ctf_type_align(ctf_file_t *, ctf_id_t); extern int ctf_type_kind(ctf_file_t *, ctf_id_t); Modified: vendor-sys/illumos/dist/uts/common/sys/dtrace.h ============================================================================== --- vendor-sys/illumos/dist/uts/common/sys/dtrace.h Tue Jun 3 01:16:11 2014 (r266988) +++ vendor-sys/illumos/dist/uts/common/sys/dtrace.h Tue Jun 3 01:24:46 2014 (r266989) @@ -25,8 +25,8 @@ */ /* - * Copyright (c) 2012, Joyent, Inc. All rights reserved. - * Copyright (c) 2012 by Delphix. All rights reserved. + * Copyright (c) 2013, Joyent, Inc. All rights reserved. + * Copyright (c) 2013 by Delphix. All rights reserved. */ #ifndef _SYS_DTRACE_H @@ -354,6 +354,7 @@ typedef struct dtrace_diftype { #define DIF_TYPE_STRING 1 /* type is a D string */ #define DIF_TF_BYREF 0x1 /* type is passed by reference */ +#define DIF_TF_BYUREF 0x2 /* user type is passed by reference */ /* * A DTrace Intermediate Format variable record is used to describe each of the