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
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to