Print this page
2917 DTrace in a zone should have limited provider access


   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 



  26 
  27 #include <sys/modctl.h>
  28 #include <sys/sunddi.h>
  29 #include <sys/dtrace.h>
  30 #include <sys/kobj.h>
  31 #include <sys/stat.h>
  32 #include <sys/conf.h>
  33 #include <vm/seg_kmem.h>
  34 #include <sys/stack.h>
  35 #include <sys/frame.h>
  36 #include <sys/dtrace_impl.h>
  37 #include <sys/cmn_err.h>
  38 #include <sys/sysmacros.h>
  39 #include <sys/privregs.h>
  40 #include <sys/sdt_impl.h>
  41 
  42 #define SDT_PATCHVAL    0xf0
  43 #define SDT_ADDR2NDX(addr)      ((((uintptr_t)(addr)) >> 4) & sdt_probetab_mask)
  44 #define SDT_PROBETAB_SIZE       0x1000          /* 4k entries -- 16K total */
  45 


 402 
 403         if (ddi_create_minor_node(devi, "sdt", S_IFCHR,
 404             0, DDI_PSEUDO, NULL) == DDI_FAILURE) {
 405                 cmn_err(CE_NOTE, "/dev/sdt couldn't create minor node");
 406                 ddi_remove_minor_node(devi, NULL);
 407                 return (DDI_FAILURE);
 408         }
 409 
 410         ddi_report_dev(devi);
 411         sdt_devi = devi;
 412 
 413         if (sdt_probetab_size == 0)
 414                 sdt_probetab_size = SDT_PROBETAB_SIZE;
 415 
 416         sdt_probetab_mask = sdt_probetab_size - 1;
 417         sdt_probetab =
 418             kmem_zalloc(sdt_probetab_size * sizeof (sdt_probe_t *), KM_SLEEP);
 419         dtrace_invop_add(sdt_invop);
 420 
 421         for (prov = sdt_providers; prov->sdtp_name != NULL; prov++) {











 422                 if (dtrace_register(prov->sdtp_name, prov->sdtp_attr,
 423                     DTRACE_PRIV_KERNEL, NULL,
 424                     &sdt_pops, prov, &prov->sdtp_id) != 0) {
 425                         cmn_err(CE_WARN, "failed to register sdt provider %s",
 426                             prov->sdtp_name);
 427                 }
 428         }
 429 
 430         return (DDI_SUCCESS);
 431 }
 432 
 433 /*ARGSUSED*/
 434 static int
 435 sdt_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
 436 {
 437         sdt_provider_t *prov;
 438 
 439         switch (cmd) {
 440         case DDI_DETACH:
 441                 break;
 442 
 443         case DDI_SUSPEND:
 444                 return (DDI_SUCCESS);




   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 /*
  27  * Copyright (c) 2012, Joyent, Inc. All rights reserved.
  28  */
  29 
  30 #include <sys/modctl.h>
  31 #include <sys/sunddi.h>
  32 #include <sys/dtrace.h>
  33 #include <sys/kobj.h>
  34 #include <sys/stat.h>
  35 #include <sys/conf.h>
  36 #include <vm/seg_kmem.h>
  37 #include <sys/stack.h>
  38 #include <sys/frame.h>
  39 #include <sys/dtrace_impl.h>
  40 #include <sys/cmn_err.h>
  41 #include <sys/sysmacros.h>
  42 #include <sys/privregs.h>
  43 #include <sys/sdt_impl.h>
  44 
  45 #define SDT_PATCHVAL    0xf0
  46 #define SDT_ADDR2NDX(addr)      ((((uintptr_t)(addr)) >> 4) & sdt_probetab_mask)
  47 #define SDT_PROBETAB_SIZE       0x1000          /* 4k entries -- 16K total */
  48 


 405 
 406         if (ddi_create_minor_node(devi, "sdt", S_IFCHR,
 407             0, DDI_PSEUDO, NULL) == DDI_FAILURE) {
 408                 cmn_err(CE_NOTE, "/dev/sdt couldn't create minor node");
 409                 ddi_remove_minor_node(devi, NULL);
 410                 return (DDI_FAILURE);
 411         }
 412 
 413         ddi_report_dev(devi);
 414         sdt_devi = devi;
 415 
 416         if (sdt_probetab_size == 0)
 417                 sdt_probetab_size = SDT_PROBETAB_SIZE;
 418 
 419         sdt_probetab_mask = sdt_probetab_size - 1;
 420         sdt_probetab =
 421             kmem_zalloc(sdt_probetab_size * sizeof (sdt_probe_t *), KM_SLEEP);
 422         dtrace_invop_add(sdt_invop);
 423 
 424         for (prov = sdt_providers; prov->sdtp_name != NULL; prov++) {
 425                 uint32_t priv;
 426 
 427                 if (prov->sdtp_priv == DTRACE_PRIV_NONE) {
 428                         priv = DTRACE_PRIV_KERNEL;
 429                         sdt_pops.dtps_mode = NULL;
 430                 } else {
 431                         priv = prov->sdtp_priv;
 432                         ASSERT(priv == DTRACE_PRIV_USER);
 433                         sdt_pops.dtps_mode = sdt_mode;
 434                 }
 435 
 436                 if (dtrace_register(prov->sdtp_name, prov->sdtp_attr,
 437                     priv, NULL, &sdt_pops, prov, &prov->sdtp_id) != 0) {

 438                         cmn_err(CE_WARN, "failed to register sdt provider %s",
 439                             prov->sdtp_name);
 440                 }
 441         }
 442 
 443         return (DDI_SUCCESS);
 444 }
 445 
 446 /*ARGSUSED*/
 447 static int
 448 sdt_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
 449 {
 450         sdt_provider_t *prov;
 451 
 452         switch (cmd) {
 453         case DDI_DETACH:
 454                 break;
 455 
 456         case DDI_SUSPEND:
 457                 return (DDI_SUCCESS);