Print this page
4474 DTrace Userland CTF Support
4475 DTrace userland Keyword
4476 DTrace tests should be better citizens
4479 pid provider types
4480 dof emulation missing checks
Reviewed by: Bryan Cantrill <bryan@joyent.com>

@@ -647,43 +647,58 @@
         const char *s;
         char *object;
         dt_printarg_t pa;
         ctf_id_t id;
         dt_module_t *dmp;
+        ctf_file_t *ctfp;
+        int libid;
 
         /*
          * Split the fully-qualified type ID (module`id).  This should
          * always be the format, but if for some reason we don't find the
          * expected value, return 0 to fall back to the generic trace()
-         * behavior.
+         * behavior. In the case of userland CTF modules this will actually be
+         * of the format (module`lib`id). This is due to the fact that those
+         * modules have multiple CTF containers which `lib` identifies.
          */
         for (s = typename; *s != '\0' && *s != '`'; s++)
                 ;
 
         if (*s != '`')
                 return (0);
 
         object = alloca(s - typename + 1);
         bcopy(typename, object, s - typename);
         object[s - typename] = '\0';
+        dmp = dt_module_lookup_by_name(dtp, object);
+        if (dmp == NULL)
+                return (0);
+
+        if (dmp->dm_pid != 0) {
+                libid = atoi(s + 1);
+                s = strchr(s + 1, '`');
+                if (s == NULL || libid > dmp->dm_nctflibs)
+                        return (0);
+                ctfp = dmp->dm_libctfp[libid];
+        } else {
+                ctfp = dt_module_getctf(dtp, dmp);
+        }
+
         id = atoi(s + 1);
 
         /*
          * Try to get the CTF kind for this id.  If something has gone horribly
          * wrong and we can't resolve the ID, bail out and let trace() do the
          * work.
          */
-        dmp = dt_module_lookup_by_name(dtp, object);
-        if (dmp == NULL || ctf_type_kind(dt_module_getctf(dtp, dmp),
-            id) == CTF_ERR) {
+        if (ctfp == NULL || ctf_type_kind(ctfp, id) == CTF_ERR)
                 return (0);
-        }
 
         /* setup the print structure and kick off the main print routine */
         pa.pa_dtp = dtp;
         pa.pa_addr = addr;
-        pa.pa_ctfp = dt_module_getctf(dtp, dmp);
+        pa.pa_ctfp = ctfp;
         pa.pa_nest = 0;
         pa.pa_depth = 0;
         pa.pa_file = fp;
         (void) ctf_type_visit(pa.pa_ctfp, id, dt_print_member, &pa);