1 # 2 # CDDL HEADER START 3 # 4 # The contents of this file are subject to the terms of the 5 # Common Development and Distribution License (the "License"). 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 # 23 # Copyright (c) 2012, Joyent, Inc. All rights reserved. 24 # 25 26 # 27 # First, make sure that we can successfully enable the io provider 28 # 29 if ! dtrace -P io -n BEGIN'{exit(0)}' > /dev/null 2>&1 ; then 30 echo failed to enable io provider with full privs 31 exit 1 32 fi 33 34 ppriv -s A=basic,dtrace_proc,dtrace_user $$ 35 36 # 37 # Now make sure that we cannot enable the io provider with reduced privs 38 # 39 if ! dtrace -x errtags -P io -n BEGIN'{exit(1)}' 2>&1 | \ 40 grep D_PDESC_ZERO > /dev/null 2>&1 ; then 41 echo successfully enabled the io provider with reduced privs 42 exit 1 43 fi 44 45 # 46 # Keeping our reduced privs, we want to assure that we can see every provider 47 # that we think we should be able to see -- and that we can see curpsinfo 48 # state but can't otherwise see arguments. 49 # 50 /usr/sbin/dtrace -wq -Cs /dev/stdin <<EOF 51 52 int seen[string]; 53 int err; 54 55 #define CANENABLE(provider) \ 56 provider::: \ 57 /err == 0 && progenyof(\$pid) && !seen["provider"]/ \ 58 { \ 59 trace(arg0); \ 60 printf("\nsuccessful trace of arg0 in %s:%s:%s:%s\n", \ 61 probeprov, probemod, probefunc, probename); \ 62 exit(++err); \ 63 } \ 64 \ 65 provider::: \ 66 /progenyof(\$pid)/ \ 67 { \ 68 seen["provider"]++; \ 69 } \ 70 \ 71 provider::: \ 72 /progenyof(\$pid)/ \ 73 { \ 74 errstr = "provider"; \ 75 this->ignore = stringof(curpsinfo->pr_psargs); \ 76 errstr = ""; \ 77 } \ 78 \ 79 END \ 80 /err == 0 && !seen["provider"]/ \ 81 { \ 82 printf("no probes from provider\n"); \ 83 exit(++err); \ 84 } \ 85 \ 86 END \ 87 /err == 0/ \ 88 { \ 89 printf("saw %d probes from provider\n", seen["provider"]); \ 90 } 91 92 CANENABLE(proc) 93 CANENABLE(sched) 94 CANENABLE(vminfo) 95 CANENABLE(sysinfo) 96 97 BEGIN 98 { 99 /* 100 * We'll kick off a system of a do-nothing command -- which should be 101 * enough to kick proc, sched, vminfo and sysinfo probes. 102 */ 103 system("echo > /dev/null"); 104 } 105 106 ERROR 107 /err == 0 && errstr != ""/ 108 { 109 printf("fatal error: couldn't read curpsinfo->pr_psargs in "); 110 printf("%s-provided probe\n", errstr); 111 exit(++err); 112 } 113 114 proc:::exit 115 /progenyof(\$pid)/ 116 { 117 exit(0); 118 } 119 120 tick-10ms 121 /i++ > 500/ 122 { 123 printf("exit probe did not seem to fire\n"); 124 exit(++err); 125 } 126 EOF