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...
Mark Johnston
markj at FreeBSD.org
Tue Jun 3 01:24:53 UTC 2014
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 at 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
More information about the svn-src-vendor
mailing list