1*7c478bd9Sstevel@tonic-gate /* 2*7c478bd9Sstevel@tonic-gate * CDDL HEADER START 3*7c478bd9Sstevel@tonic-gate * 4*7c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*7c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 6*7c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 7*7c478bd9Sstevel@tonic-gate * with the License. 8*7c478bd9Sstevel@tonic-gate * 9*7c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*7c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 11*7c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 12*7c478bd9Sstevel@tonic-gate * and limitations under the License. 13*7c478bd9Sstevel@tonic-gate * 14*7c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 15*7c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*7c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 17*7c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 18*7c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 19*7c478bd9Sstevel@tonic-gate * 20*7c478bd9Sstevel@tonic-gate * CDDL HEADER END 21*7c478bd9Sstevel@tonic-gate */ 22*7c478bd9Sstevel@tonic-gate /* 23*7c478bd9Sstevel@tonic-gate * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24*7c478bd9Sstevel@tonic-gate * Use is subject to license terms. 25*7c478bd9Sstevel@tonic-gate */ 26*7c478bd9Sstevel@tonic-gate 27*7c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 28*7c478bd9Sstevel@tonic-gate 29*7c478bd9Sstevel@tonic-gate #include <stdio.h> 30*7c478bd9Sstevel@tonic-gate #include <stdlib.h> 31*7c478bd9Sstevel@tonic-gate #include <string.h> 32*7c478bd9Sstevel@tonic-gate #include <fcntl.h> 33*7c478bd9Sstevel@tonic-gate #include <errno.h> 34*7c478bd9Sstevel@tonic-gate #include <unistd.h> 35*7c478bd9Sstevel@tonic-gate #include <signal.h> 36*7c478bd9Sstevel@tonic-gate #include <strings.h> 37*7c478bd9Sstevel@tonic-gate #include <limits.h> 38*7c478bd9Sstevel@tonic-gate #include <sys/mman.h> 39*7c478bd9Sstevel@tonic-gate #include <sys/pset.h> 40*7c478bd9Sstevel@tonic-gate #include <sys/varargs.h> 41*7c478bd9Sstevel@tonic-gate #include <sys/trapstat.h> 42*7c478bd9Sstevel@tonic-gate #include <sys/wait.h> 43*7c478bd9Sstevel@tonic-gate #include <stddef.h> 44*7c478bd9Sstevel@tonic-gate #include <termio.h> 45*7c478bd9Sstevel@tonic-gate 46*7c478bd9Sstevel@tonic-gate #define TSTAT_DEVICE "/dev/trapstat" 47*7c478bd9Sstevel@tonic-gate #define TSTAT_COMMAND "trapstat" 48*7c478bd9Sstevel@tonic-gate #define TSTAT_DELTA(data, old, member) g_absolute ? (data)->member : \ 49*7c478bd9Sstevel@tonic-gate (uint64_t)(0.5 + (g_interval / (double)((data)->tdata_snapts - \ 50*7c478bd9Sstevel@tonic-gate (old)->tdata_snapts)) * (double)((data)->member - (old)->member)) 51*7c478bd9Sstevel@tonic-gate 52*7c478bd9Sstevel@tonic-gate #define TSTAT_PRINT_MISSDATA(diff, time) \ 53*7c478bd9Sstevel@tonic-gate (void) printf(" %9lld %4.1f", (diff), (time)); 54*7c478bd9Sstevel@tonic-gate 55*7c478bd9Sstevel@tonic-gate #define TSTAT_PAGESIZE_MODIFIERS " kmgtp" 56*7c478bd9Sstevel@tonic-gate #define TSTAT_PAGESIZE_STRLEN 10 57*7c478bd9Sstevel@tonic-gate #define TSTAT_MAX_RATE 5000 58*7c478bd9Sstevel@tonic-gate #define TSTAT_COLUMN_OFFS 26 59*7c478bd9Sstevel@tonic-gate #define TSTAT_COLUMNS_PER_CPU 9 60*7c478bd9Sstevel@tonic-gate 61*7c478bd9Sstevel@tonic-gate static tstat_data_t *g_data[2]; 62*7c478bd9Sstevel@tonic-gate static tstat_data_t *g_ndata, *g_odata; 63*7c478bd9Sstevel@tonic-gate static processorid_t g_max_cpus; 64*7c478bd9Sstevel@tonic-gate static int8_t *g_selected; 65*7c478bd9Sstevel@tonic-gate static timer_t g_tid; 66*7c478bd9Sstevel@tonic-gate static int g_interval = NANOSEC; 67*7c478bd9Sstevel@tonic-gate static int g_peffect = 1; 68*7c478bd9Sstevel@tonic-gate static int g_absolute = 0; 69*7c478bd9Sstevel@tonic-gate static sigset_t g_oset; 70*7c478bd9Sstevel@tonic-gate 71*7c478bd9Sstevel@tonic-gate static psetid_t g_pset = PS_NONE; 72*7c478bd9Sstevel@tonic-gate static processorid_t *g_pset_cpus; 73*7c478bd9Sstevel@tonic-gate static uint_t g_pset_ncpus; 74*7c478bd9Sstevel@tonic-gate 75*7c478bd9Sstevel@tonic-gate static int g_cpus_per_line = (80 - TSTAT_COLUMN_OFFS) / TSTAT_COLUMNS_PER_CPU; 76*7c478bd9Sstevel@tonic-gate static int g_winch; 77*7c478bd9Sstevel@tonic-gate 78*7c478bd9Sstevel@tonic-gate static int g_pgsizes; 79*7c478bd9Sstevel@tonic-gate static size_t *g_pgsize; 80*7c478bd9Sstevel@tonic-gate static char **g_pgnames; 81*7c478bd9Sstevel@tonic-gate static size_t g_datasize; 82*7c478bd9Sstevel@tonic-gate 83*7c478bd9Sstevel@tonic-gate static int g_gen; 84*7c478bd9Sstevel@tonic-gate static int g_fd; 85*7c478bd9Sstevel@tonic-gate static uint8_t g_active[TSTAT_NENT]; 86*7c478bd9Sstevel@tonic-gate 87*7c478bd9Sstevel@tonic-gate static hrtime_t g_start; 88*7c478bd9Sstevel@tonic-gate 89*7c478bd9Sstevel@tonic-gate static int g_exec_errno; 90*7c478bd9Sstevel@tonic-gate static int g_child_exited; 91*7c478bd9Sstevel@tonic-gate static int g_child_status; 92*7c478bd9Sstevel@tonic-gate 93*7c478bd9Sstevel@tonic-gate static void (*g_process)(void *, uint64_t, double); 94*7c478bd9Sstevel@tonic-gate static void *g_arg; 95*7c478bd9Sstevel@tonic-gate 96*7c478bd9Sstevel@tonic-gate typedef struct tstat_sum { 97*7c478bd9Sstevel@tonic-gate uint64_t tsum_diff; 98*7c478bd9Sstevel@tonic-gate double tsum_time; 99*7c478bd9Sstevel@tonic-gate } tstat_sum_t; 100*7c478bd9Sstevel@tonic-gate 101*7c478bd9Sstevel@tonic-gate #define TSTAT_ENT_USED 0 102*7c478bd9Sstevel@tonic-gate #define TSTAT_ENT_RESERVED 1 103*7c478bd9Sstevel@tonic-gate #define TSTAT_ENT_UNUSED 2 104*7c478bd9Sstevel@tonic-gate #define TSTAT_ENT_CONTINUED 3 105*7c478bd9Sstevel@tonic-gate 106*7c478bd9Sstevel@tonic-gate typedef struct tstat_ent { 107*7c478bd9Sstevel@tonic-gate char *tent_name; 108*7c478bd9Sstevel@tonic-gate char *tent_descr; 109*7c478bd9Sstevel@tonic-gate int tent_type; 110*7c478bd9Sstevel@tonic-gate } tstat_ent_t; 111*7c478bd9Sstevel@tonic-gate 112*7c478bd9Sstevel@tonic-gate static tstat_ent_t g_traps[] = { 113*7c478bd9Sstevel@tonic-gate #ifndef sun4v 114*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 115*7c478bd9Sstevel@tonic-gate { "power-on", "power on reset" }, 116*7c478bd9Sstevel@tonic-gate { "watchdog", "watchdog reset" }, 117*7c478bd9Sstevel@tonic-gate { "xir", "externally initiated reset" }, 118*7c478bd9Sstevel@tonic-gate { "sir", "software initiated reset" }, 119*7c478bd9Sstevel@tonic-gate { "red", "RED state exception" }, 120*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 121*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 122*7c478bd9Sstevel@tonic-gate { "immu-xcp", "instruction access exception" }, 123*7c478bd9Sstevel@tonic-gate { "immu-miss", "instruction access MMU miss" }, 124*7c478bd9Sstevel@tonic-gate { "immu-err", "instruction access error" }, 125*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 126*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 127*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 128*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 129*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 130*7c478bd9Sstevel@tonic-gate { "ill-inst", "illegal instruction" }, 131*7c478bd9Sstevel@tonic-gate { "priv-inst", "privileged opcode" }, 132*7c478bd9Sstevel@tonic-gate { "unimp-ldd", "unimplemented LDD" }, 133*7c478bd9Sstevel@tonic-gate { "unimp-std", "unimplemented STD" }, 134*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 135*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 136*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 137*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 138*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 139*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 140*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 141*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 142*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 143*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 144*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 145*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 146*7c478bd9Sstevel@tonic-gate { "fp-disabled", "fp disabled" }, 147*7c478bd9Sstevel@tonic-gate { "fp-ieee754", "fp exception ieee754" }, 148*7c478bd9Sstevel@tonic-gate { "fp-xcp-other", "fp exception other" }, 149*7c478bd9Sstevel@tonic-gate { "tag-oflow", "tag overflow" }, 150*7c478bd9Sstevel@tonic-gate { "cleanwin", "clean window" }, 151*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 152*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 153*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 154*7c478bd9Sstevel@tonic-gate { "div-zero", "division by zero" }, 155*7c478bd9Sstevel@tonic-gate { "internal-err", "internal processor error" }, 156*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 157*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 158*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 159*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 160*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 161*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 162*7c478bd9Sstevel@tonic-gate { "dmmu-xcp", "data access exception" }, 163*7c478bd9Sstevel@tonic-gate { "dmmu-miss", "data access MMU miss" }, 164*7c478bd9Sstevel@tonic-gate { "dmmu-err", "data access error" }, 165*7c478bd9Sstevel@tonic-gate { "dmmu-prot", "data access protection" }, 166*7c478bd9Sstevel@tonic-gate { "unalign", "mem address not aligned" }, 167*7c478bd9Sstevel@tonic-gate { "lddf-unalign", "LDDF mem address not aligned" }, 168*7c478bd9Sstevel@tonic-gate { "stdf-unalign", "STDF mem address not aligned" }, 169*7c478bd9Sstevel@tonic-gate { "priv-act", "privileged action" }, 170*7c478bd9Sstevel@tonic-gate { "ldqf-unalign", "LDQF mem address not aligned" }, 171*7c478bd9Sstevel@tonic-gate { "stqf-unalign", "STQF mem address not aligned" }, 172*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 173*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 174*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 175*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 176*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 177*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 178*7c478bd9Sstevel@tonic-gate { "async-d-err", "async data error" }, 179*7c478bd9Sstevel@tonic-gate { "level-1", "interrupt level 1" }, 180*7c478bd9Sstevel@tonic-gate { "level-2", "interrupt level 2" }, 181*7c478bd9Sstevel@tonic-gate { "level-3", "interrupt level 3" }, 182*7c478bd9Sstevel@tonic-gate { "level-4", "interrupt level 4" }, 183*7c478bd9Sstevel@tonic-gate { "level-5", "interrupt level 5" }, 184*7c478bd9Sstevel@tonic-gate { "level-6", "interrupt level 6" }, 185*7c478bd9Sstevel@tonic-gate { "level-7", "interrupt level 7" }, 186*7c478bd9Sstevel@tonic-gate { "level-8", "interrupt level 8" }, 187*7c478bd9Sstevel@tonic-gate { "level-9", "interrupt level 9" }, 188*7c478bd9Sstevel@tonic-gate { "level-10", "interrupt level 10" }, 189*7c478bd9Sstevel@tonic-gate { "level-11", "interrupt level 11" }, 190*7c478bd9Sstevel@tonic-gate { "level-12", "interrupt level 12" }, 191*7c478bd9Sstevel@tonic-gate { "level-13", "interrupt level 13" }, 192*7c478bd9Sstevel@tonic-gate { "level-14", "interrupt level 14" }, 193*7c478bd9Sstevel@tonic-gate { "level-15", "interrupt level 15" }, 194*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 195*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 196*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 197*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 198*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 199*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 200*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 201*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 202*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 203*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 204*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 205*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 206*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 207*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 208*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 209*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 210*7c478bd9Sstevel@tonic-gate { "int-vec", "interrupt vector" }, 211*7c478bd9Sstevel@tonic-gate { "pa-watch", "PA watchpoint" }, 212*7c478bd9Sstevel@tonic-gate { "va-watch", "VA watchpoint" }, 213*7c478bd9Sstevel@tonic-gate { "ecc-err", "corrected ECC error" }, 214*7c478bd9Sstevel@tonic-gate { "itlb-miss", "instruction access MMU miss" }, 215*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 216*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 217*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 218*7c478bd9Sstevel@tonic-gate { "dtlb-miss", "data access MMU miss" }, 219*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 220*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 221*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 222*7c478bd9Sstevel@tonic-gate { "dtlb-prot", "data access protection" }, 223*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 224*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 225*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 226*7c478bd9Sstevel@tonic-gate { "fast-ecc", "fast ECC error" }, 227*7c478bd9Sstevel@tonic-gate { "dcache-parity", "D-cache parity error" }, 228*7c478bd9Sstevel@tonic-gate { "icache-parity", "I-cache parity error" }, 229*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 230*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 231*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 232*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 233*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 234*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 235*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 236*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 237*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 238*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 239*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 240*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 241*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 242*7c478bd9Sstevel@tonic-gate #else /* sun4v */ 243*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 244*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 245*7c478bd9Sstevel@tonic-gate { "watchdog", "watchdog reset" }, 246*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 247*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 248*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 249*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 250*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 251*7c478bd9Sstevel@tonic-gate { "immu-xcp", "instruction access exception" }, 252*7c478bd9Sstevel@tonic-gate { "immu-miss", "instruction access MMU miss" }, 253*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 254*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 255*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 256*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 257*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 258*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 259*7c478bd9Sstevel@tonic-gate { "ill-inst", "illegal instruction" }, 260*7c478bd9Sstevel@tonic-gate { "priv-inst", "privileged opcode" }, 261*7c478bd9Sstevel@tonic-gate { "unimp-ldd", "unimplemented LDD" }, 262*7c478bd9Sstevel@tonic-gate { "unimp-std", "unimplemented STD" }, 263*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 264*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 265*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 266*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 267*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 268*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 269*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 270*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 271*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 272*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 273*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 274*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 275*7c478bd9Sstevel@tonic-gate { "fp-disabled", "fp disabled" }, 276*7c478bd9Sstevel@tonic-gate { "fp-ieee754", "fp exception ieee754" }, 277*7c478bd9Sstevel@tonic-gate { "fp-xcp-other", "fp exception other" }, 278*7c478bd9Sstevel@tonic-gate { "tag-oflow", "tag overflow" }, 279*7c478bd9Sstevel@tonic-gate { "cleanwin", "clean window" }, 280*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 281*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 282*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 283*7c478bd9Sstevel@tonic-gate { "div-zero", "division by zero" }, 284*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 285*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 286*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 287*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 288*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 289*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 290*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 291*7c478bd9Sstevel@tonic-gate { "dmmu-xcp", "data access exception" }, 292*7c478bd9Sstevel@tonic-gate { "dmmu-miss", "data access MMU miss" }, 293*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 294*7c478bd9Sstevel@tonic-gate { "dmmu-prot", "data access protection" }, 295*7c478bd9Sstevel@tonic-gate { "unalign", "mem address not aligned" }, 296*7c478bd9Sstevel@tonic-gate { "lddf-unalign", "LDDF mem address not aligned" }, 297*7c478bd9Sstevel@tonic-gate { "stdf-unalign", "STDF mem address not aligned" }, 298*7c478bd9Sstevel@tonic-gate { "priv-act", "privileged action" }, 299*7c478bd9Sstevel@tonic-gate { "ldqf-unalign", "LDQF mem address not aligned" }, 300*7c478bd9Sstevel@tonic-gate { "stqf-unalign", "STQF mem address not aligned" }, 301*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 302*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 303*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 304*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 305*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 306*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 307*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 308*7c478bd9Sstevel@tonic-gate { "level-1", "interrupt level 1" }, 309*7c478bd9Sstevel@tonic-gate { "level-2", "interrupt level 2" }, 310*7c478bd9Sstevel@tonic-gate { "level-3", "interrupt level 3" }, 311*7c478bd9Sstevel@tonic-gate { "level-4", "interrupt level 4" }, 312*7c478bd9Sstevel@tonic-gate { "level-5", "interrupt level 5" }, 313*7c478bd9Sstevel@tonic-gate { "level-6", "interrupt level 6" }, 314*7c478bd9Sstevel@tonic-gate { "level-7", "interrupt level 7" }, 315*7c478bd9Sstevel@tonic-gate { "level-8", "interrupt level 8" }, 316*7c478bd9Sstevel@tonic-gate { "level-9", "interrupt level 9" }, 317*7c478bd9Sstevel@tonic-gate { "level-10", "interrupt level 10" }, 318*7c478bd9Sstevel@tonic-gate { "level-11", "interrupt level 11" }, 319*7c478bd9Sstevel@tonic-gate { "level-12", "interrupt level 12" }, 320*7c478bd9Sstevel@tonic-gate { "level-13", "interrupt level 13" }, 321*7c478bd9Sstevel@tonic-gate { "level-14", "interrupt level 14" }, 322*7c478bd9Sstevel@tonic-gate { "level-15", "interrupt level 15" }, 323*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 324*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 325*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 326*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 327*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 328*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 329*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 330*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 331*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 332*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 333*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 334*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 335*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 336*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 337*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 338*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 339*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 340*7c478bd9Sstevel@tonic-gate { "pa-watch", "PA watchpoint" }, 341*7c478bd9Sstevel@tonic-gate { "va-watch", "VA watchpoint" }, 342*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 343*7c478bd9Sstevel@tonic-gate { "itlb-miss", "instruction access MMU miss" }, 344*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 345*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 346*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 347*7c478bd9Sstevel@tonic-gate { "dtlb-miss", "data access MMU miss" }, 348*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 349*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 350*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 351*7c478bd9Sstevel@tonic-gate { "dtlb-prot", "data access protection" }, 352*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 353*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 354*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 355*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 356*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 357*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 358*7c478bd9Sstevel@tonic-gate { "ctl-xfer", "control transfer" }, 359*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 360*7c478bd9Sstevel@tonic-gate { "instr-brkpt", "instruction breakpoint" }, 361*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 362*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 363*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 364*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 365*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 366*7c478bd9Sstevel@tonic-gate { "hw-changed", "hardware changed" }, 367*7c478bd9Sstevel@tonic-gate { "cpu_mondo", "cpu mondo trap" }, 368*7c478bd9Sstevel@tonic-gate { "dev_mondo", "device mondo trap" }, 369*7c478bd9Sstevel@tonic-gate { "res-err", "resumable error" }, 370*7c478bd9Sstevel@tonic-gate { "nonres-err", "non-resumable error" }, 371*7c478bd9Sstevel@tonic-gate #endif /* sun4v */ 372*7c478bd9Sstevel@tonic-gate { "spill-0-normal", "spill 0 normal" }, 373*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 374*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 375*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 376*7c478bd9Sstevel@tonic-gate { "spill-user-32", "spill user window, 32-bit" }, 377*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 378*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 379*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 380*7c478bd9Sstevel@tonic-gate { "spill-user-64", "spill user window, 64-bit" }, 381*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 382*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 383*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 384*7c478bd9Sstevel@tonic-gate { "spill-user-32-cln", "spill, clean user window, 32-bit" }, 385*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 386*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 387*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 388*7c478bd9Sstevel@tonic-gate { "spill-user-64-cln", "spill, clean user window, 64-bit" }, 389*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 390*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 391*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 392*7c478bd9Sstevel@tonic-gate { "spill-kern-32", "spill kernel window, 32-bit" }, 393*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 394*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 395*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 396*7c478bd9Sstevel@tonic-gate { "spill-kern-64", "spill kernel window, 64-bit" }, 397*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 398*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 399*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 400*7c478bd9Sstevel@tonic-gate { "spill-mixed", "spill window, mixed 32-bit/64-bit" }, 401*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 402*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 403*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 404*7c478bd9Sstevel@tonic-gate { "spill-0-other", "spill 0 other" }, 405*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 406*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 407*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 408*7c478bd9Sstevel@tonic-gate { "spill-asuser-32", "spill user window as kernel, 32-bit" }, 409*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 410*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 411*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 412*7c478bd9Sstevel@tonic-gate { "spill-asuser-64", "spill user window as kernel, 64-bit" }, 413*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 414*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 415*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 416*7c478bd9Sstevel@tonic-gate { "spill-asuser-32-cln", "spill, clean user window as kernel, 32-bit" }, 417*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 418*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 419*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 420*7c478bd9Sstevel@tonic-gate { "spill-asuser-64-cln", "spill, clean user window as kernel, 64-bit" }, 421*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 422*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 423*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 424*7c478bd9Sstevel@tonic-gate { "spill-5-other", "spill 5 other" }, 425*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 426*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 427*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 428*7c478bd9Sstevel@tonic-gate { "spill-6-other", "spill 6 other" }, 429*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 430*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 431*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 432*7c478bd9Sstevel@tonic-gate { "spill-7-other", "spill 7 other" }, 433*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 434*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 435*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 436*7c478bd9Sstevel@tonic-gate { "fill-0-normal", "fill 0 normal" }, 437*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 438*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 439*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 440*7c478bd9Sstevel@tonic-gate { "fill-user-32", "fill user window, 32-bit" }, 441*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 442*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 443*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 444*7c478bd9Sstevel@tonic-gate { "fill-user-64", "fill user window, 64-bit" }, 445*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 446*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 447*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 448*7c478bd9Sstevel@tonic-gate { "fill-user-32-cln", "fill user window, 32-bit" }, 449*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 450*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 451*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 452*7c478bd9Sstevel@tonic-gate { "fill-user-64-cln", "fill user window, 64-bit" }, 453*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 454*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 455*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 456*7c478bd9Sstevel@tonic-gate { "fill-kern-32", "fill kernel window, 32-bit" }, 457*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 458*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 459*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 460*7c478bd9Sstevel@tonic-gate { "fill-kern-64", "fill kernel window, 64-bit" }, 461*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 462*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 463*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 464*7c478bd9Sstevel@tonic-gate { "fill-mixed", "fill window, mixed 32-bit/64-bit" }, 465*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 466*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 467*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 468*7c478bd9Sstevel@tonic-gate { "fill-0-other", "fill 0 other" }, 469*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 470*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 471*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 472*7c478bd9Sstevel@tonic-gate { "fill-asuser-32", "fill user window as kernel, 32-bit" }, 473*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 474*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 475*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 476*7c478bd9Sstevel@tonic-gate { "fill-asuser-64", "fill user window as kernel, 64-bit" }, 477*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 478*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 479*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 480*7c478bd9Sstevel@tonic-gate { "fill-asuser-32-cln", "fill user window as kernel, 32-bit" }, 481*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 482*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 483*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 484*7c478bd9Sstevel@tonic-gate { "fill-asuser-64-cln", "fill user window as kernel, 64-bit" }, 485*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 486*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 487*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 488*7c478bd9Sstevel@tonic-gate { "fill-5-other", "fill 5 other" }, 489*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 490*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 491*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 492*7c478bd9Sstevel@tonic-gate { "fill-6-other", "fill 6 other" }, 493*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 494*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 495*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 496*7c478bd9Sstevel@tonic-gate { "fill-7-other", "fill 7 other" }, 497*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 498*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 499*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_CONTINUED }, 500*7c478bd9Sstevel@tonic-gate { "syscall-4x", "old system call" }, 501*7c478bd9Sstevel@tonic-gate { "usr-brkpt", "user breakpoint" }, 502*7c478bd9Sstevel@tonic-gate { "usr-div-zero", "user divide by zero" }, 503*7c478bd9Sstevel@tonic-gate { "flush-wins", "flush windows" }, 504*7c478bd9Sstevel@tonic-gate { "clean-wins", "clean windows" }, 505*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 506*7c478bd9Sstevel@tonic-gate { "fix-align", "fix unaligned references" }, 507*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 508*7c478bd9Sstevel@tonic-gate { "syscall-32", "ILP32 system call" }, 509*7c478bd9Sstevel@tonic-gate { "set-t0-addr", "set trap0 address" }, 510*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 511*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 512*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 513*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 514*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 515*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 516*7c478bd9Sstevel@tonic-gate { "trap-inst-16", "trap instruction 16", }, 517*7c478bd9Sstevel@tonic-gate { "trap-inst-17", "trap instruction 17", }, 518*7c478bd9Sstevel@tonic-gate { "trap-inst-18", "trap instruction 18", }, 519*7c478bd9Sstevel@tonic-gate { "trap-inst-19", "trap instruction 19", }, 520*7c478bd9Sstevel@tonic-gate { "trap-inst-20", "trap instruction 20", }, 521*7c478bd9Sstevel@tonic-gate { "trap-inst-21", "trap instruction 21", }, 522*7c478bd9Sstevel@tonic-gate { "trap-inst-22", "trap instruction 22", }, 523*7c478bd9Sstevel@tonic-gate { "trap-inst-23", "trap instruction 23", }, 524*7c478bd9Sstevel@tonic-gate { "trap-inst-24", "trap instruction 24", }, 525*7c478bd9Sstevel@tonic-gate { "trap-inst-25", "trap instruction 25", }, 526*7c478bd9Sstevel@tonic-gate { "trap-inst-26", "trap instruction 26", }, 527*7c478bd9Sstevel@tonic-gate { "trap-inst-27", "trap instruction 27", }, 528*7c478bd9Sstevel@tonic-gate { "trap-inst-28", "trap instruction 28", }, 529*7c478bd9Sstevel@tonic-gate { "trap-inst-29", "trap instruction 29", }, 530*7c478bd9Sstevel@tonic-gate { "trap-inst-30", "trap instruction 30", }, 531*7c478bd9Sstevel@tonic-gate { "trap-inst-31", "trap instruction 31", }, 532*7c478bd9Sstevel@tonic-gate { "get-cc", "get condition codes" }, 533*7c478bd9Sstevel@tonic-gate { "set-cc", "set condition codes" }, 534*7c478bd9Sstevel@tonic-gate { "get-psr", "get psr" }, 535*7c478bd9Sstevel@tonic-gate { "set-psr", "set psr (some fields)" }, 536*7c478bd9Sstevel@tonic-gate { "getts", "get timestamp" }, 537*7c478bd9Sstevel@tonic-gate { "gethrvtime", "get lwp virtual time" }, 538*7c478bd9Sstevel@tonic-gate { "self-xcall", "self xcall" }, 539*7c478bd9Sstevel@tonic-gate { "gethrtime", "get hrestime" }, 540*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 541*7c478bd9Sstevel@tonic-gate { "getlgrp", "get lgrpid" }, 542*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 543*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 544*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 545*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 546*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 547*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 548*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 549*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 550*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 551*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 552*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 553*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 554*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 555*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 556*7c478bd9Sstevel@tonic-gate { "dtrace-pid", "DTrace pid provider" }, 557*7c478bd9Sstevel@tonic-gate { "dtrace-fasttrap", "DTrace fasttrap provider" }, 558*7c478bd9Sstevel@tonic-gate { "dtrace-return", "DTrace pid provider return" }, 559*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 560*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 561*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 562*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 563*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 564*7c478bd9Sstevel@tonic-gate { "syscall-64", "LP64 system call" }, 565*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 566*7c478bd9Sstevel@tonic-gate { "tt-freeze", "freeze traptrace" }, 567*7c478bd9Sstevel@tonic-gate { "tt-unfreeze", "unfreeze traptrace" }, 568*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 569*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 570*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 571*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 572*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 573*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 574*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 575*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 576*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 577*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 578*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 579*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 580*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 581*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 582*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 583*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 584*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 585*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 586*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 587*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 588*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 589*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 590*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 591*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 592*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 593*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 594*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 595*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 596*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 597*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 598*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 599*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 600*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 601*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 602*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 603*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 604*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 605*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 606*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 607*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 608*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 609*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 610*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 611*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 612*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 613*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 614*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 615*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 616*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 617*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 618*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 619*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 620*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 621*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 622*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 623*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_UNUSED }, 624*7c478bd9Sstevel@tonic-gate { "ptl1-panic", "test ptl1-panic" }, 625*7c478bd9Sstevel@tonic-gate { "kmdb-enter", "kmdb enter (L1-A)" }, 626*7c478bd9Sstevel@tonic-gate { "kmdb-brkpt", "kmdb breakpoint" }, 627*7c478bd9Sstevel@tonic-gate { "obp-brkpt", "obp breakpoint" }, 628*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 629*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 630*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 631*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 632*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 633*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 634*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 635*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 636*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 637*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 638*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 639*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 640*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 641*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 642*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 643*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 644*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 645*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 646*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 647*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 648*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 649*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 650*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 651*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 652*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 653*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 654*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 655*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 656*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 657*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 658*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 659*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 660*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 661*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 662*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 663*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 664*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 665*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 666*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 667*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 668*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 669*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 670*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 671*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 672*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 673*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 674*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 675*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 676*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 677*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 678*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 679*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 680*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 681*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 682*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 683*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 684*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 685*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 686*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 687*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 688*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 689*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 690*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 691*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 692*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 693*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 694*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 695*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 696*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 697*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 698*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 699*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 700*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 701*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 702*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 703*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 704*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 705*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 706*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 707*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 708*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 709*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 710*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 711*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 712*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 713*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 714*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 715*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 716*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 717*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 718*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 719*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 720*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 721*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 722*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 723*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 724*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 725*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 726*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 727*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 728*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 729*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 730*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 731*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 732*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 733*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 734*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 735*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 736*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 737*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 738*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 739*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 740*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 741*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 742*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 743*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 744*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 745*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 746*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 747*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 748*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 749*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 750*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 751*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 752*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 753*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 754*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED }, 755*7c478bd9Sstevel@tonic-gate { NULL, NULL, TSTAT_ENT_RESERVED } 756*7c478bd9Sstevel@tonic-gate }; 757*7c478bd9Sstevel@tonic-gate 758*7c478bd9Sstevel@tonic-gate static void 759*7c478bd9Sstevel@tonic-gate usage(void) 760*7c478bd9Sstevel@tonic-gate { 761*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 762*7c478bd9Sstevel@tonic-gate "\nusage: trapstat [ -t | -T | -e entrylist ]\n" 763*7c478bd9Sstevel@tonic-gate " [ -C psrset | -c cpulist ]\n" 764*7c478bd9Sstevel@tonic-gate " [ -P ] [ -a ] [ -r rate ] [[ interval [ count ] ] | " 765*7c478bd9Sstevel@tonic-gate "command [ args ] ]\n\n" 766*7c478bd9Sstevel@tonic-gate "Trap selection options:\n\n" 767*7c478bd9Sstevel@tonic-gate " -t TLB statistics\n" 768*7c478bd9Sstevel@tonic-gate " -T TLB statistics, with pagesize information\n" 769*7c478bd9Sstevel@tonic-gate " -e entrylist Enable statistics only for entries specified " 770*7c478bd9Sstevel@tonic-gate "by entrylist\n\n" 771*7c478bd9Sstevel@tonic-gate "CPU selection options:\n\n" 772*7c478bd9Sstevel@tonic-gate " -c cpulist Enable statistics only for specified CPU list\n" 773*7c478bd9Sstevel@tonic-gate " -C psrset Enable statistics only for specified processor " 774*7c478bd9Sstevel@tonic-gate "set\n\n" 775*7c478bd9Sstevel@tonic-gate "Other options:\n\n" 776*7c478bd9Sstevel@tonic-gate " -a Display trap values as accumulating values " 777*7c478bd9Sstevel@tonic-gate "instead of rates\n" 778*7c478bd9Sstevel@tonic-gate " -l List trap table entries and exit\n" 779*7c478bd9Sstevel@tonic-gate " -P Display output in parsable format\n" 780*7c478bd9Sstevel@tonic-gate " -r hz Set sampling rate to be hz samples " 781*7c478bd9Sstevel@tonic-gate "per second\n\n"); 782*7c478bd9Sstevel@tonic-gate 783*7c478bd9Sstevel@tonic-gate exit(EXIT_FAILURE); 784*7c478bd9Sstevel@tonic-gate } 785*7c478bd9Sstevel@tonic-gate 786*7c478bd9Sstevel@tonic-gate static void 787*7c478bd9Sstevel@tonic-gate fatal(char *fmt, ...) 788*7c478bd9Sstevel@tonic-gate { 789*7c478bd9Sstevel@tonic-gate va_list ap; 790*7c478bd9Sstevel@tonic-gate int error = errno; 791*7c478bd9Sstevel@tonic-gate 792*7c478bd9Sstevel@tonic-gate va_start(ap, fmt); 793*7c478bd9Sstevel@tonic-gate 794*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, TSTAT_COMMAND ": "); 795*7c478bd9Sstevel@tonic-gate (void) vfprintf(stderr, fmt, ap); 796*7c478bd9Sstevel@tonic-gate 797*7c478bd9Sstevel@tonic-gate if (fmt[strlen(fmt) - 1] != '\n') 798*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, ": %s\n", strerror(error)); 799*7c478bd9Sstevel@tonic-gate 800*7c478bd9Sstevel@tonic-gate exit(EXIT_FAILURE); 801*7c478bd9Sstevel@tonic-gate } 802*7c478bd9Sstevel@tonic-gate 803*7c478bd9Sstevel@tonic-gate static void 804*7c478bd9Sstevel@tonic-gate set_width(void) 805*7c478bd9Sstevel@tonic-gate { 806*7c478bd9Sstevel@tonic-gate struct winsize win; 807*7c478bd9Sstevel@tonic-gate 808*7c478bd9Sstevel@tonic-gate if (!isatty(fileno(stdout))) 809*7c478bd9Sstevel@tonic-gate return; 810*7c478bd9Sstevel@tonic-gate 811*7c478bd9Sstevel@tonic-gate if (ioctl(fileno(stdout), TIOCGWINSZ, &win) == -1) 812*7c478bd9Sstevel@tonic-gate return; 813*7c478bd9Sstevel@tonic-gate 814*7c478bd9Sstevel@tonic-gate if (win.ws_col == 0) { 815*7c478bd9Sstevel@tonic-gate /* 816*7c478bd9Sstevel@tonic-gate * If TIOCGWINSZ returned 0 for the columns, just return -- 817*7c478bd9Sstevel@tonic-gate * thereby using the default value of g_cpus_per_line. (This 818*7c478bd9Sstevel@tonic-gate * happens, e.g., when running over a tip line.) 819*7c478bd9Sstevel@tonic-gate */ 820*7c478bd9Sstevel@tonic-gate return; 821*7c478bd9Sstevel@tonic-gate } 822*7c478bd9Sstevel@tonic-gate 823*7c478bd9Sstevel@tonic-gate g_cpus_per_line = (win.ws_col - TSTAT_COLUMN_OFFS) / 824*7c478bd9Sstevel@tonic-gate TSTAT_COLUMNS_PER_CPU; 825*7c478bd9Sstevel@tonic-gate 826*7c478bd9Sstevel@tonic-gate if (g_cpus_per_line < 1) 827*7c478bd9Sstevel@tonic-gate g_cpus_per_line = 1; 828*7c478bd9Sstevel@tonic-gate } 829*7c478bd9Sstevel@tonic-gate 830*7c478bd9Sstevel@tonic-gate static void 831*7c478bd9Sstevel@tonic-gate intr(int signo) 832*7c478bd9Sstevel@tonic-gate { 833*7c478bd9Sstevel@tonic-gate int error = errno; 834*7c478bd9Sstevel@tonic-gate 835*7c478bd9Sstevel@tonic-gate switch (signo) { 836*7c478bd9Sstevel@tonic-gate case SIGWINCH: 837*7c478bd9Sstevel@tonic-gate g_winch = 1; 838*7c478bd9Sstevel@tonic-gate set_width(); 839*7c478bd9Sstevel@tonic-gate break; 840*7c478bd9Sstevel@tonic-gate 841*7c478bd9Sstevel@tonic-gate case SIGCHLD: 842*7c478bd9Sstevel@tonic-gate g_child_exited = 1; 843*7c478bd9Sstevel@tonic-gate 844*7c478bd9Sstevel@tonic-gate while (wait(&g_child_status) == -1 && errno == EINTR) 845*7c478bd9Sstevel@tonic-gate continue; 846*7c478bd9Sstevel@tonic-gate break; 847*7c478bd9Sstevel@tonic-gate 848*7c478bd9Sstevel@tonic-gate default: 849*7c478bd9Sstevel@tonic-gate break; 850*7c478bd9Sstevel@tonic-gate } 851*7c478bd9Sstevel@tonic-gate 852*7c478bd9Sstevel@tonic-gate errno = error; 853*7c478bd9Sstevel@tonic-gate } 854*7c478bd9Sstevel@tonic-gate 855*7c478bd9Sstevel@tonic-gate static void 856*7c478bd9Sstevel@tonic-gate setup(void) 857*7c478bd9Sstevel@tonic-gate { 858*7c478bd9Sstevel@tonic-gate struct sigaction act; 859*7c478bd9Sstevel@tonic-gate struct sigevent ev; 860*7c478bd9Sstevel@tonic-gate sigset_t set; 861*7c478bd9Sstevel@tonic-gate int i; 862*7c478bd9Sstevel@tonic-gate 863*7c478bd9Sstevel@tonic-gate for (i = 0; i < TSTAT_NENT; i++) { 864*7c478bd9Sstevel@tonic-gate if (g_traps[i].tent_type == TSTAT_ENT_RESERVED) 865*7c478bd9Sstevel@tonic-gate g_traps[i].tent_name = "reserved"; 866*7c478bd9Sstevel@tonic-gate 867*7c478bd9Sstevel@tonic-gate if (g_traps[i].tent_type == TSTAT_ENT_UNUSED) 868*7c478bd9Sstevel@tonic-gate g_traps[i].tent_name = "unused"; 869*7c478bd9Sstevel@tonic-gate } 870*7c478bd9Sstevel@tonic-gate 871*7c478bd9Sstevel@tonic-gate g_max_cpus = (processorid_t)sysconf(_SC_CPUID_MAX) + 1; 872*7c478bd9Sstevel@tonic-gate 873*7c478bd9Sstevel@tonic-gate if ((g_selected = malloc(sizeof (int8_t) * g_max_cpus)) == NULL) 874*7c478bd9Sstevel@tonic-gate fatal("could not allocate g_selected"); 875*7c478bd9Sstevel@tonic-gate 876*7c478bd9Sstevel@tonic-gate bzero(g_selected, sizeof (int8_t) * g_max_cpus); 877*7c478bd9Sstevel@tonic-gate 878*7c478bd9Sstevel@tonic-gate g_pset_cpus = malloc(sizeof (processorid_t) * g_max_cpus); 879*7c478bd9Sstevel@tonic-gate if (g_pset_cpus == NULL) 880*7c478bd9Sstevel@tonic-gate fatal("could not allocate g_pset_cpus"); 881*7c478bd9Sstevel@tonic-gate 882*7c478bd9Sstevel@tonic-gate bzero(g_pset_cpus, sizeof (processorid_t) * g_max_cpus); 883*7c478bd9Sstevel@tonic-gate 884*7c478bd9Sstevel@tonic-gate if ((g_pgsizes = getpagesizes(NULL, 0)) == -1) 885*7c478bd9Sstevel@tonic-gate fatal("getpagesizes()"); 886*7c478bd9Sstevel@tonic-gate 887*7c478bd9Sstevel@tonic-gate if ((g_pgsize = malloc(sizeof (size_t) * g_pgsizes)) == NULL) 888*7c478bd9Sstevel@tonic-gate fatal("could not allocate g_pgsize array"); 889*7c478bd9Sstevel@tonic-gate 890*7c478bd9Sstevel@tonic-gate if (getpagesizes(g_pgsize, g_pgsizes) == -1) 891*7c478bd9Sstevel@tonic-gate fatal("getpagesizes(%d)", g_pgsizes); 892*7c478bd9Sstevel@tonic-gate 893*7c478bd9Sstevel@tonic-gate if ((g_pgnames = malloc(sizeof (char *) * g_pgsizes)) == NULL) 894*7c478bd9Sstevel@tonic-gate fatal("could not allocate g_pgnames"); 895*7c478bd9Sstevel@tonic-gate 896*7c478bd9Sstevel@tonic-gate for (i = 0; i < g_pgsizes; i++) { 897*7c478bd9Sstevel@tonic-gate size_t j, mul; 898*7c478bd9Sstevel@tonic-gate size_t sz = g_pgsize[i]; 899*7c478bd9Sstevel@tonic-gate 900*7c478bd9Sstevel@tonic-gate if ((g_pgnames[i] = malloc(TSTAT_PAGESIZE_STRLEN)) == NULL) 901*7c478bd9Sstevel@tonic-gate fatal("could not allocate g_pgnames[%d]", i); 902*7c478bd9Sstevel@tonic-gate 903*7c478bd9Sstevel@tonic-gate for (j = 0, mul = 10; (1 << mul) <= sz; j++, mul += 10) 904*7c478bd9Sstevel@tonic-gate continue; 905*7c478bd9Sstevel@tonic-gate 906*7c478bd9Sstevel@tonic-gate (void) snprintf(g_pgnames[i], TSTAT_PAGESIZE_STRLEN, 907*7c478bd9Sstevel@tonic-gate "%d%c", sz >> (mul - 10), " kmgtpe"[j]); 908*7c478bd9Sstevel@tonic-gate } 909*7c478bd9Sstevel@tonic-gate 910*7c478bd9Sstevel@tonic-gate g_datasize = 911*7c478bd9Sstevel@tonic-gate sizeof (tstat_data_t) + (g_pgsizes - 1) * sizeof (tstat_pgszdata_t); 912*7c478bd9Sstevel@tonic-gate 913*7c478bd9Sstevel@tonic-gate if ((g_data[0] = malloc(g_datasize * g_max_cpus)) == NULL) 914*7c478bd9Sstevel@tonic-gate fatal("could not allocate data buffer 0"); 915*7c478bd9Sstevel@tonic-gate 916*7c478bd9Sstevel@tonic-gate if ((g_data[1] = malloc(g_datasize * g_max_cpus)) == NULL) 917*7c478bd9Sstevel@tonic-gate fatal("could not allocate data buffer 1"); 918*7c478bd9Sstevel@tonic-gate 919*7c478bd9Sstevel@tonic-gate (void) sigemptyset(&act.sa_mask); 920*7c478bd9Sstevel@tonic-gate act.sa_flags = 0; 921*7c478bd9Sstevel@tonic-gate act.sa_handler = intr; 922*7c478bd9Sstevel@tonic-gate (void) sigaction(SIGUSR1, &act, NULL); 923*7c478bd9Sstevel@tonic-gate (void) sigaction(SIGCHLD, &act, NULL); 924*7c478bd9Sstevel@tonic-gate 925*7c478bd9Sstevel@tonic-gate (void) sigaddset(&act.sa_mask, SIGCHLD); 926*7c478bd9Sstevel@tonic-gate (void) sigaddset(&act.sa_mask, SIGUSR1); 927*7c478bd9Sstevel@tonic-gate (void) sigaction(SIGWINCH, &act, NULL); 928*7c478bd9Sstevel@tonic-gate set_width(); 929*7c478bd9Sstevel@tonic-gate 930*7c478bd9Sstevel@tonic-gate (void) sigemptyset(&set); 931*7c478bd9Sstevel@tonic-gate (void) sigaddset(&set, SIGCHLD); 932*7c478bd9Sstevel@tonic-gate (void) sigaddset(&set, SIGUSR1); 933*7c478bd9Sstevel@tonic-gate (void) sigaddset(&set, SIGWINCH); 934*7c478bd9Sstevel@tonic-gate (void) sigprocmask(SIG_BLOCK, &set, &g_oset); 935*7c478bd9Sstevel@tonic-gate 936*7c478bd9Sstevel@tonic-gate ev.sigev_notify = SIGEV_SIGNAL; 937*7c478bd9Sstevel@tonic-gate ev.sigev_signo = SIGUSR1; 938*7c478bd9Sstevel@tonic-gate 939*7c478bd9Sstevel@tonic-gate if (timer_create(CLOCK_HIGHRES, &ev, &g_tid) == -1) 940*7c478bd9Sstevel@tonic-gate fatal("cannot create CLOCK_HIGHRES timer"); 941*7c478bd9Sstevel@tonic-gate } 942*7c478bd9Sstevel@tonic-gate 943*7c478bd9Sstevel@tonic-gate static void 944*7c478bd9Sstevel@tonic-gate set_interval(hrtime_t nsec) 945*7c478bd9Sstevel@tonic-gate { 946*7c478bd9Sstevel@tonic-gate struct itimerspec ts; 947*7c478bd9Sstevel@tonic-gate 948*7c478bd9Sstevel@tonic-gate /* 949*7c478bd9Sstevel@tonic-gate * If the interval is less than one second, we'll report the 950*7c478bd9Sstevel@tonic-gate * numbers in terms of rate-per-interval. If the interval is 951*7c478bd9Sstevel@tonic-gate * greater than one second, we'll report numbers in terms of 952*7c478bd9Sstevel@tonic-gate * rate-per-second. 953*7c478bd9Sstevel@tonic-gate */ 954*7c478bd9Sstevel@tonic-gate g_interval = nsec < NANOSEC ? nsec : NANOSEC; 955*7c478bd9Sstevel@tonic-gate 956*7c478bd9Sstevel@tonic-gate ts.it_value.tv_sec = nsec / NANOSEC; 957*7c478bd9Sstevel@tonic-gate ts.it_value.tv_nsec = nsec % NANOSEC; 958*7c478bd9Sstevel@tonic-gate ts.it_interval.tv_sec = nsec / NANOSEC; 959*7c478bd9Sstevel@tonic-gate ts.it_interval.tv_nsec = nsec % NANOSEC; 960*7c478bd9Sstevel@tonic-gate 961*7c478bd9Sstevel@tonic-gate if (timer_settime(g_tid, TIMER_RELTIME, &ts, NULL) == -1) 962*7c478bd9Sstevel@tonic-gate fatal("cannot set time on CLOCK_HIGHRES timer"); 963*7c478bd9Sstevel@tonic-gate } 964*7c478bd9Sstevel@tonic-gate 965*7c478bd9Sstevel@tonic-gate static void 966*7c478bd9Sstevel@tonic-gate print_entries(FILE *stream, int parsable) 967*7c478bd9Sstevel@tonic-gate { 968*7c478bd9Sstevel@tonic-gate int entno; 969*7c478bd9Sstevel@tonic-gate 970*7c478bd9Sstevel@tonic-gate if (!parsable) { 971*7c478bd9Sstevel@tonic-gate (void) fprintf(stream, " %3s %3s | %-20s | %s\n", "hex", 972*7c478bd9Sstevel@tonic-gate "dec", "entry name", "description"); 973*7c478bd9Sstevel@tonic-gate 974*7c478bd9Sstevel@tonic-gate (void) fprintf(stream, "----------+----------------------" 975*7c478bd9Sstevel@tonic-gate "+-----------------------\n"); 976*7c478bd9Sstevel@tonic-gate } 977*7c478bd9Sstevel@tonic-gate 978*7c478bd9Sstevel@tonic-gate for (entno = 0; entno < TSTAT_NENT; entno++) { 979*7c478bd9Sstevel@tonic-gate if (g_traps[entno].tent_type != TSTAT_ENT_USED) 980*7c478bd9Sstevel@tonic-gate continue; 981*7c478bd9Sstevel@tonic-gate 982*7c478bd9Sstevel@tonic-gate (void) fprintf(stream, "0x%03x %3d %s%-20s %s%s\n", 983*7c478bd9Sstevel@tonic-gate entno, entno, 984*7c478bd9Sstevel@tonic-gate parsable ? "" : "| ", g_traps[entno].tent_name, 985*7c478bd9Sstevel@tonic-gate parsable ? "" : "| ", g_traps[entno].tent_descr); 986*7c478bd9Sstevel@tonic-gate } 987*7c478bd9Sstevel@tonic-gate } 988*7c478bd9Sstevel@tonic-gate 989*7c478bd9Sstevel@tonic-gate static void 990*7c478bd9Sstevel@tonic-gate select_entry(char *entry) 991*7c478bd9Sstevel@tonic-gate { 992*7c478bd9Sstevel@tonic-gate ulong_t entno; 993*7c478bd9Sstevel@tonic-gate char *end; 994*7c478bd9Sstevel@tonic-gate 995*7c478bd9Sstevel@tonic-gate /* 996*7c478bd9Sstevel@tonic-gate * The entry may be specified as a number (e.g., "0x68", "104") or 997*7c478bd9Sstevel@tonic-gate * as a name ("dtlb-miss"). 998*7c478bd9Sstevel@tonic-gate */ 999*7c478bd9Sstevel@tonic-gate entno = strtoul(entry, &end, 0); 1000*7c478bd9Sstevel@tonic-gate 1001*7c478bd9Sstevel@tonic-gate if (*end == '\0') { 1002*7c478bd9Sstevel@tonic-gate if (entno >= TSTAT_NENT) 1003*7c478bd9Sstevel@tonic-gate goto bad_entry; 1004*7c478bd9Sstevel@tonic-gate } else { 1005*7c478bd9Sstevel@tonic-gate for (entno = 0; entno < TSTAT_NENT; entno++) { 1006*7c478bd9Sstevel@tonic-gate if (g_traps[entno].tent_type != TSTAT_ENT_USED) 1007*7c478bd9Sstevel@tonic-gate continue; 1008*7c478bd9Sstevel@tonic-gate 1009*7c478bd9Sstevel@tonic-gate if (strcmp(entry, g_traps[entno].tent_name) == 0) 1010*7c478bd9Sstevel@tonic-gate break; 1011*7c478bd9Sstevel@tonic-gate } 1012*7c478bd9Sstevel@tonic-gate 1013*7c478bd9Sstevel@tonic-gate if (entno == TSTAT_NENT) 1014*7c478bd9Sstevel@tonic-gate goto bad_entry; 1015*7c478bd9Sstevel@tonic-gate } 1016*7c478bd9Sstevel@tonic-gate 1017*7c478bd9Sstevel@tonic-gate if (ioctl(g_fd, TSTATIOC_ENTRY, entno) == -1) 1018*7c478bd9Sstevel@tonic-gate fatal("TSTATIOC_ENTRY failed for entry 0x%x", entno); 1019*7c478bd9Sstevel@tonic-gate 1020*7c478bd9Sstevel@tonic-gate g_active[entno] = 1; 1021*7c478bd9Sstevel@tonic-gate return; 1022*7c478bd9Sstevel@tonic-gate 1023*7c478bd9Sstevel@tonic-gate bad_entry: 1024*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, TSTAT_COMMAND ": invalid entry '%s'", entry); 1025*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "; valid entries:\n\n"); 1026*7c478bd9Sstevel@tonic-gate print_entries(stderr, 0); 1027*7c478bd9Sstevel@tonic-gate exit(EXIT_FAILURE); 1028*7c478bd9Sstevel@tonic-gate } 1029*7c478bd9Sstevel@tonic-gate 1030*7c478bd9Sstevel@tonic-gate static void 1031*7c478bd9Sstevel@tonic-gate select_cpu(processorid_t cpu) 1032*7c478bd9Sstevel@tonic-gate { 1033*7c478bd9Sstevel@tonic-gate if (g_pset != PS_NONE) 1034*7c478bd9Sstevel@tonic-gate fatal("cannot specify both a processor set and a processor\n"); 1035*7c478bd9Sstevel@tonic-gate 1036*7c478bd9Sstevel@tonic-gate if (cpu < 0 || cpu >= g_max_cpus) 1037*7c478bd9Sstevel@tonic-gate fatal("cpu %d out of range\n", cpu); 1038*7c478bd9Sstevel@tonic-gate 1039*7c478bd9Sstevel@tonic-gate if (p_online(cpu, P_STATUS) == -1) { 1040*7c478bd9Sstevel@tonic-gate if (errno != EINVAL) 1041*7c478bd9Sstevel@tonic-gate fatal("could not get status for cpu %d", cpu); 1042*7c478bd9Sstevel@tonic-gate fatal("cpu %d not present\n", cpu); 1043*7c478bd9Sstevel@tonic-gate } 1044*7c478bd9Sstevel@tonic-gate 1045*7c478bd9Sstevel@tonic-gate g_selected[cpu] = 1; 1046*7c478bd9Sstevel@tonic-gate } 1047*7c478bd9Sstevel@tonic-gate 1048*7c478bd9Sstevel@tonic-gate static void 1049*7c478bd9Sstevel@tonic-gate select_cpus(processorid_t low, processorid_t high) 1050*7c478bd9Sstevel@tonic-gate { 1051*7c478bd9Sstevel@tonic-gate if (g_pset != PS_NONE) 1052*7c478bd9Sstevel@tonic-gate fatal("cannot specify both a processor set and processors\n"); 1053*7c478bd9Sstevel@tonic-gate 1054*7c478bd9Sstevel@tonic-gate if (low < 0 || low >= g_max_cpus) 1055*7c478bd9Sstevel@tonic-gate fatal("invalid cpu '%d'\n", low); 1056*7c478bd9Sstevel@tonic-gate 1057*7c478bd9Sstevel@tonic-gate if (high < 0 || high >= g_max_cpus) 1058*7c478bd9Sstevel@tonic-gate fatal("invalid cpu '%d'\n", high); 1059*7c478bd9Sstevel@tonic-gate 1060*7c478bd9Sstevel@tonic-gate if (low >= high) 1061*7c478bd9Sstevel@tonic-gate fatal("invalid range '%d' to '%d'\n", low, high); 1062*7c478bd9Sstevel@tonic-gate 1063*7c478bd9Sstevel@tonic-gate do { 1064*7c478bd9Sstevel@tonic-gate if (p_online(low, P_STATUS) != -1) 1065*7c478bd9Sstevel@tonic-gate g_selected[low] = 1; 1066*7c478bd9Sstevel@tonic-gate } while (++low <= high); 1067*7c478bd9Sstevel@tonic-gate } 1068*7c478bd9Sstevel@tonic-gate 1069*7c478bd9Sstevel@tonic-gate static void 1070*7c478bd9Sstevel@tonic-gate select_pset(psetid_t pset) 1071*7c478bd9Sstevel@tonic-gate { 1072*7c478bd9Sstevel@tonic-gate processorid_t i; 1073*7c478bd9Sstevel@tonic-gate 1074*7c478bd9Sstevel@tonic-gate if (pset < 0) 1075*7c478bd9Sstevel@tonic-gate fatal("processor set %d is out of range\n", pset); 1076*7c478bd9Sstevel@tonic-gate 1077*7c478bd9Sstevel@tonic-gate /* 1078*7c478bd9Sstevel@tonic-gate * Only one processor set can be specified. 1079*7c478bd9Sstevel@tonic-gate */ 1080*7c478bd9Sstevel@tonic-gate if (g_pset != PS_NONE) 1081*7c478bd9Sstevel@tonic-gate fatal("at most one processor set may be specified\n"); 1082*7c478bd9Sstevel@tonic-gate 1083*7c478bd9Sstevel@tonic-gate /* 1084*7c478bd9Sstevel@tonic-gate * One cannot select processors _and_ a processor set. 1085*7c478bd9Sstevel@tonic-gate */ 1086*7c478bd9Sstevel@tonic-gate for (i = 0; i < g_max_cpus; i++) 1087*7c478bd9Sstevel@tonic-gate if (g_selected[i]) 1088*7c478bd9Sstevel@tonic-gate break; 1089*7c478bd9Sstevel@tonic-gate 1090*7c478bd9Sstevel@tonic-gate if (i != g_max_cpus) 1091*7c478bd9Sstevel@tonic-gate fatal("cannot specify both a processor and a processor set\n"); 1092*7c478bd9Sstevel@tonic-gate 1093*7c478bd9Sstevel@tonic-gate g_pset = pset; 1094*7c478bd9Sstevel@tonic-gate g_pset_ncpus = g_max_cpus; 1095*7c478bd9Sstevel@tonic-gate 1096*7c478bd9Sstevel@tonic-gate if (pset_info(g_pset, NULL, &g_pset_ncpus, g_pset_cpus) == -1) 1097*7c478bd9Sstevel@tonic-gate fatal("invalid processor set: %d\n", g_pset); 1098*7c478bd9Sstevel@tonic-gate 1099*7c478bd9Sstevel@tonic-gate if (g_pset_ncpus == 0) 1100*7c478bd9Sstevel@tonic-gate fatal("processor set %d empty\n", g_pset); 1101*7c478bd9Sstevel@tonic-gate 1102*7c478bd9Sstevel@tonic-gate if (ioctl(g_fd, TSTATIOC_NOCPU) == -1) 1103*7c478bd9Sstevel@tonic-gate fatal("TSTATIOC_NOCPU failed"); 1104*7c478bd9Sstevel@tonic-gate 1105*7c478bd9Sstevel@tonic-gate for (i = 0; i < g_pset_ncpus; i++) 1106*7c478bd9Sstevel@tonic-gate g_selected[g_pset_cpus[i]] = 1; 1107*7c478bd9Sstevel@tonic-gate } 1108*7c478bd9Sstevel@tonic-gate 1109*7c478bd9Sstevel@tonic-gate static void 1110*7c478bd9Sstevel@tonic-gate check_pset(void) 1111*7c478bd9Sstevel@tonic-gate { 1112*7c478bd9Sstevel@tonic-gate uint_t ncpus = g_max_cpus; 1113*7c478bd9Sstevel@tonic-gate processorid_t i; 1114*7c478bd9Sstevel@tonic-gate 1115*7c478bd9Sstevel@tonic-gate if (g_pset == PS_NONE) 1116*7c478bd9Sstevel@tonic-gate return; 1117*7c478bd9Sstevel@tonic-gate 1118*7c478bd9Sstevel@tonic-gate if (pset_info(g_pset, NULL, &ncpus, g_pset_cpus) == -1) { 1119*7c478bd9Sstevel@tonic-gate if (errno == EINVAL) 1120*7c478bd9Sstevel@tonic-gate fatal("processor set %d destroyed\n", g_pset); 1121*7c478bd9Sstevel@tonic-gate 1122*7c478bd9Sstevel@tonic-gate fatal("couldn't get info for processor set %d", g_pset); 1123*7c478bd9Sstevel@tonic-gate } 1124*7c478bd9Sstevel@tonic-gate 1125*7c478bd9Sstevel@tonic-gate if (ncpus == 0) 1126*7c478bd9Sstevel@tonic-gate fatal("processor set %d empty\n", g_pset); 1127*7c478bd9Sstevel@tonic-gate 1128*7c478bd9Sstevel@tonic-gate if (ncpus == g_pset_ncpus) { 1129*7c478bd9Sstevel@tonic-gate for (i = 0; i < g_pset_ncpus; i++) { 1130*7c478bd9Sstevel@tonic-gate if (!g_selected[g_pset_cpus[i]]) 1131*7c478bd9Sstevel@tonic-gate break; 1132*7c478bd9Sstevel@tonic-gate } 1133*7c478bd9Sstevel@tonic-gate 1134*7c478bd9Sstevel@tonic-gate /* 1135*7c478bd9Sstevel@tonic-gate * If the number of CPUs hasn't changed, and every CPU 1136*7c478bd9Sstevel@tonic-gate * in the processor set is also selected, we know that the 1137*7c478bd9Sstevel@tonic-gate * processor set itself hasn't changed. 1138*7c478bd9Sstevel@tonic-gate */ 1139*7c478bd9Sstevel@tonic-gate if (i == g_pset_ncpus) 1140*7c478bd9Sstevel@tonic-gate return; 1141*7c478bd9Sstevel@tonic-gate } 1142*7c478bd9Sstevel@tonic-gate 1143*7c478bd9Sstevel@tonic-gate /* 1144*7c478bd9Sstevel@tonic-gate * If we're here, we have a new processor set. First, we need 1145*7c478bd9Sstevel@tonic-gate * to zero out the selection array. 1146*7c478bd9Sstevel@tonic-gate */ 1147*7c478bd9Sstevel@tonic-gate bzero(g_selected, sizeof (int8_t) * g_max_cpus); 1148*7c478bd9Sstevel@tonic-gate 1149*7c478bd9Sstevel@tonic-gate g_pset_ncpus = ncpus; 1150*7c478bd9Sstevel@tonic-gate 1151*7c478bd9Sstevel@tonic-gate if (ioctl(g_fd, TSTATIOC_STOP) == -1) 1152*7c478bd9Sstevel@tonic-gate fatal("TSTATIOC_STOP failed"); 1153*7c478bd9Sstevel@tonic-gate 1154*7c478bd9Sstevel@tonic-gate if (ioctl(g_fd, TSTATIOC_NOCPU) == -1) 1155*7c478bd9Sstevel@tonic-gate fatal("TSATIOC_NOCPU failed"); 1156*7c478bd9Sstevel@tonic-gate 1157*7c478bd9Sstevel@tonic-gate for (i = 0; i < g_pset_ncpus; i++) { 1158*7c478bd9Sstevel@tonic-gate g_selected[g_pset_cpus[i]] = 1; 1159*7c478bd9Sstevel@tonic-gate if (ioctl(g_fd, TSTATIOC_CPU, g_pset_cpus[i]) == -1) 1160*7c478bd9Sstevel@tonic-gate fatal("TSTATIOC_CPU failed for cpu %d", i); 1161*7c478bd9Sstevel@tonic-gate } 1162*7c478bd9Sstevel@tonic-gate 1163*7c478bd9Sstevel@tonic-gate /* 1164*7c478bd9Sstevel@tonic-gate * Now that we have selected the CPUs, we're going to reenable 1165*7c478bd9Sstevel@tonic-gate * trapstat, and reread the data for the current generation. 1166*7c478bd9Sstevel@tonic-gate */ 1167*7c478bd9Sstevel@tonic-gate if (ioctl(g_fd, TSTATIOC_GO) == -1) 1168*7c478bd9Sstevel@tonic-gate fatal("TSTATIOC_GO failed"); 1169*7c478bd9Sstevel@tonic-gate 1170*7c478bd9Sstevel@tonic-gate if (ioctl(g_fd, TSTATIOC_READ, g_data[g_gen]) == -1) 1171*7c478bd9Sstevel@tonic-gate fatal("TSTATIOC_READ failed"); 1172*7c478bd9Sstevel@tonic-gate } 1173*7c478bd9Sstevel@tonic-gate 1174*7c478bd9Sstevel@tonic-gate static void 1175*7c478bd9Sstevel@tonic-gate missdata(tstat_missdata_t *miss, tstat_missdata_t *omiss) 1176*7c478bd9Sstevel@tonic-gate { 1177*7c478bd9Sstevel@tonic-gate hrtime_t ts = g_ndata->tdata_snapts - g_odata->tdata_snapts; 1178*7c478bd9Sstevel@tonic-gate hrtime_t tick = g_ndata->tdata_snaptick - g_odata->tdata_snaptick; 1179*7c478bd9Sstevel@tonic-gate uint64_t raw = miss->tmiss_count - omiss->tmiss_count; 1180*7c478bd9Sstevel@tonic-gate uint64_t diff = g_absolute ? miss->tmiss_count : 1181*7c478bd9Sstevel@tonic-gate (uint64_t)(0.5 + g_interval / 1182*7c478bd9Sstevel@tonic-gate (double)ts * (double)(miss->tmiss_count - omiss->tmiss_count)); 1183*7c478bd9Sstevel@tonic-gate hrtime_t peffect = raw * g_ndata->tdata_peffect * g_peffect, time; 1184*7c478bd9Sstevel@tonic-gate double p; 1185*7c478bd9Sstevel@tonic-gate 1186*7c478bd9Sstevel@tonic-gate /* 1187*7c478bd9Sstevel@tonic-gate * Now we need to account for the trapstat probe effect. Take 1188*7c478bd9Sstevel@tonic-gate * the amount of time spent in the handler, and add the 1189*7c478bd9Sstevel@tonic-gate * amount of time known to be due to the trapstat probe effect. 1190*7c478bd9Sstevel@tonic-gate */ 1191*7c478bd9Sstevel@tonic-gate time = miss->tmiss_time - omiss->tmiss_time + peffect; 1192*7c478bd9Sstevel@tonic-gate 1193*7c478bd9Sstevel@tonic-gate if (time >= tick) { 1194*7c478bd9Sstevel@tonic-gate /* 1195*7c478bd9Sstevel@tonic-gate * This really shouldn't happen unless our calculation of 1196*7c478bd9Sstevel@tonic-gate * the probe effect was vastly incorrect. In any case, 1197*7c478bd9Sstevel@tonic-gate * print 99.9 for the time instead of printing negative 1198*7c478bd9Sstevel@tonic-gate * values... 1199*7c478bd9Sstevel@tonic-gate */ 1200*7c478bd9Sstevel@tonic-gate time = tick / 1000 * 999; 1201*7c478bd9Sstevel@tonic-gate } 1202*7c478bd9Sstevel@tonic-gate 1203*7c478bd9Sstevel@tonic-gate p = (double)time / (double)tick * (double)100.0; 1204*7c478bd9Sstevel@tonic-gate 1205*7c478bd9Sstevel@tonic-gate (*g_process)(g_arg, diff, p); 1206*7c478bd9Sstevel@tonic-gate } 1207*7c478bd9Sstevel@tonic-gate 1208*7c478bd9Sstevel@tonic-gate static void 1209*7c478bd9Sstevel@tonic-gate tlbdata(tstat_tlbdata_t *tlb, tstat_tlbdata_t *otlb) 1210*7c478bd9Sstevel@tonic-gate { 1211*7c478bd9Sstevel@tonic-gate missdata(&tlb->ttlb_tlb, &otlb->ttlb_tlb); 1212*7c478bd9Sstevel@tonic-gate missdata(&tlb->ttlb_tsb, &otlb->ttlb_tsb); 1213*7c478bd9Sstevel@tonic-gate } 1214*7c478bd9Sstevel@tonic-gate 1215*7c478bd9Sstevel@tonic-gate static void 1216*7c478bd9Sstevel@tonic-gate print_missdata(double *ttl, uint64_t diff, double p) 1217*7c478bd9Sstevel@tonic-gate { 1218*7c478bd9Sstevel@tonic-gate TSTAT_PRINT_MISSDATA(diff, p); 1219*7c478bd9Sstevel@tonic-gate 1220*7c478bd9Sstevel@tonic-gate if (ttl != NULL) 1221*7c478bd9Sstevel@tonic-gate *ttl += p; 1222*7c478bd9Sstevel@tonic-gate } 1223*7c478bd9Sstevel@tonic-gate 1224*7c478bd9Sstevel@tonic-gate static void 1225*7c478bd9Sstevel@tonic-gate print_modepgsz(char *prefix, tstat_modedata_t *data, tstat_modedata_t *odata) 1226*7c478bd9Sstevel@tonic-gate { 1227*7c478bd9Sstevel@tonic-gate int ps; 1228*7c478bd9Sstevel@tonic-gate size_t incr = sizeof (tstat_pgszdata_t); 1229*7c478bd9Sstevel@tonic-gate 1230*7c478bd9Sstevel@tonic-gate for (ps = 0; ps < g_pgsizes; ps++) { 1231*7c478bd9Sstevel@tonic-gate double ttl = 0.0; 1232*7c478bd9Sstevel@tonic-gate 1233*7c478bd9Sstevel@tonic-gate g_process = (void(*)(void *, uint64_t, double))print_missdata; 1234*7c478bd9Sstevel@tonic-gate g_arg = &ttl; 1235*7c478bd9Sstevel@tonic-gate 1236*7c478bd9Sstevel@tonic-gate (void) printf("%s %4s|", prefix, g_pgnames[ps]); 1237*7c478bd9Sstevel@tonic-gate tlbdata(&data->tmode_itlb, &odata->tmode_itlb); 1238*7c478bd9Sstevel@tonic-gate (void) printf(" |"); 1239*7c478bd9Sstevel@tonic-gate tlbdata(&data->tmode_dtlb, &odata->tmode_dtlb); 1240*7c478bd9Sstevel@tonic-gate 1241*7c478bd9Sstevel@tonic-gate (void) printf(" |%4.1f\n", ttl); 1242*7c478bd9Sstevel@tonic-gate 1243*7c478bd9Sstevel@tonic-gate data = (tstat_modedata_t *)((uintptr_t)data + incr); 1244*7c478bd9Sstevel@tonic-gate odata = (tstat_modedata_t *)((uintptr_t)odata + incr); 1245*7c478bd9Sstevel@tonic-gate } 1246*7c478bd9Sstevel@tonic-gate } 1247*7c478bd9Sstevel@tonic-gate 1248*7c478bd9Sstevel@tonic-gate static void 1249*7c478bd9Sstevel@tonic-gate parsable_modepgsz(char *prefix, tstat_modedata_t *data, tstat_modedata_t *odata) 1250*7c478bd9Sstevel@tonic-gate { 1251*7c478bd9Sstevel@tonic-gate int ps; 1252*7c478bd9Sstevel@tonic-gate size_t incr = sizeof (tstat_pgszdata_t); 1253*7c478bd9Sstevel@tonic-gate 1254*7c478bd9Sstevel@tonic-gate g_process = (void(*)(void *, uint64_t, double))print_missdata; 1255*7c478bd9Sstevel@tonic-gate g_arg = NULL; 1256*7c478bd9Sstevel@tonic-gate 1257*7c478bd9Sstevel@tonic-gate for (ps = 0; ps < g_pgsizes; ps++) { 1258*7c478bd9Sstevel@tonic-gate (void) printf("%s %7d", prefix, g_pgsize[ps]); 1259*7c478bd9Sstevel@tonic-gate tlbdata(&data->tmode_itlb, &odata->tmode_itlb); 1260*7c478bd9Sstevel@tonic-gate tlbdata(&data->tmode_dtlb, &odata->tmode_dtlb); 1261*7c478bd9Sstevel@tonic-gate (void) printf("\n"); 1262*7c478bd9Sstevel@tonic-gate 1263*7c478bd9Sstevel@tonic-gate data = (tstat_modedata_t *)((uintptr_t)data + incr); 1264*7c478bd9Sstevel@tonic-gate odata = (tstat_modedata_t *)((uintptr_t)odata + incr); 1265*7c478bd9Sstevel@tonic-gate } 1266*7c478bd9Sstevel@tonic-gate } 1267*7c478bd9Sstevel@tonic-gate 1268*7c478bd9Sstevel@tonic-gate static void 1269*7c478bd9Sstevel@tonic-gate sum_missdata(void *sump, uint64_t diff, double p) 1270*7c478bd9Sstevel@tonic-gate { 1271*7c478bd9Sstevel@tonic-gate tstat_sum_t *sum = *((tstat_sum_t **)sump); 1272*7c478bd9Sstevel@tonic-gate 1273*7c478bd9Sstevel@tonic-gate sum->tsum_diff += diff; 1274*7c478bd9Sstevel@tonic-gate sum->tsum_time += p; 1275*7c478bd9Sstevel@tonic-gate 1276*7c478bd9Sstevel@tonic-gate (*(tstat_sum_t **)sump)++; 1277*7c478bd9Sstevel@tonic-gate } 1278*7c478bd9Sstevel@tonic-gate 1279*7c478bd9Sstevel@tonic-gate static void 1280*7c478bd9Sstevel@tonic-gate sum_modedata(tstat_modedata_t *data, tstat_modedata_t *odata, tstat_sum_t *sum) 1281*7c478bd9Sstevel@tonic-gate { 1282*7c478bd9Sstevel@tonic-gate int ps, incr = sizeof (tstat_pgszdata_t); 1283*7c478bd9Sstevel@tonic-gate tstat_sum_t *sump; 1284*7c478bd9Sstevel@tonic-gate 1285*7c478bd9Sstevel@tonic-gate for (ps = 0; ps < g_pgsizes; ps++) { 1286*7c478bd9Sstevel@tonic-gate sump = sum; 1287*7c478bd9Sstevel@tonic-gate 1288*7c478bd9Sstevel@tonic-gate g_process = sum_missdata; 1289*7c478bd9Sstevel@tonic-gate g_arg = &sump; 1290*7c478bd9Sstevel@tonic-gate 1291*7c478bd9Sstevel@tonic-gate tlbdata(&data->tmode_itlb, &odata->tmode_itlb); 1292*7c478bd9Sstevel@tonic-gate tlbdata(&data->tmode_dtlb, &odata->tmode_dtlb); 1293*7c478bd9Sstevel@tonic-gate 1294*7c478bd9Sstevel@tonic-gate data = (tstat_modedata_t *)((uintptr_t)data + incr); 1295*7c478bd9Sstevel@tonic-gate odata = (tstat_modedata_t *)((uintptr_t)odata + incr); 1296*7c478bd9Sstevel@tonic-gate } 1297*7c478bd9Sstevel@tonic-gate } 1298*7c478bd9Sstevel@tonic-gate 1299*7c478bd9Sstevel@tonic-gate static void 1300*7c478bd9Sstevel@tonic-gate print_sum(tstat_sum_t *sum, int divisor) 1301*7c478bd9Sstevel@tonic-gate { 1302*7c478bd9Sstevel@tonic-gate int i; 1303*7c478bd9Sstevel@tonic-gate double ttl = 0.0; 1304*7c478bd9Sstevel@tonic-gate 1305*7c478bd9Sstevel@tonic-gate for (i = 0; i < 4; i++) { 1306*7c478bd9Sstevel@tonic-gate if (i == 2) 1307*7c478bd9Sstevel@tonic-gate (void) printf(" |"); 1308*7c478bd9Sstevel@tonic-gate 1309*7c478bd9Sstevel@tonic-gate sum[i].tsum_time /= divisor; 1310*7c478bd9Sstevel@tonic-gate 1311*7c478bd9Sstevel@tonic-gate TSTAT_PRINT_MISSDATA(sum[i].tsum_diff, sum[i].tsum_time); 1312*7c478bd9Sstevel@tonic-gate ttl += sum[i].tsum_time; 1313*7c478bd9Sstevel@tonic-gate } 1314*7c478bd9Sstevel@tonic-gate 1315*7c478bd9Sstevel@tonic-gate (void) printf(" |%4.1f\n", ttl); 1316*7c478bd9Sstevel@tonic-gate } 1317*7c478bd9Sstevel@tonic-gate 1318*7c478bd9Sstevel@tonic-gate static void 1319*7c478bd9Sstevel@tonic-gate print_tlbpgsz(tstat_data_t *data, tstat_data_t *odata) 1320*7c478bd9Sstevel@tonic-gate { 1321*7c478bd9Sstevel@tonic-gate int i, cpu, ncpus = 0; 1322*7c478bd9Sstevel@tonic-gate char pre[12]; 1323*7c478bd9Sstevel@tonic-gate tstat_sum_t sum[4]; 1324*7c478bd9Sstevel@tonic-gate 1325*7c478bd9Sstevel@tonic-gate (void) printf("cpu m size| %9s %4s %9s %4s | %9s %4s %9s %4s |%4s\n" 1326*7c478bd9Sstevel@tonic-gate "----------+-------------------------------+-----------------------" 1327*7c478bd9Sstevel@tonic-gate "--------+----\n", "itlb-miss", "%tim", "itsb-miss", "%tim", 1328*7c478bd9Sstevel@tonic-gate "dtlb-miss", "%tim", "dtsb-miss", "%tim", "%tim"); 1329*7c478bd9Sstevel@tonic-gate 1330*7c478bd9Sstevel@tonic-gate bzero(sum, sizeof (sum)); 1331*7c478bd9Sstevel@tonic-gate 1332*7c478bd9Sstevel@tonic-gate for (i = 0; i < g_max_cpus; i++) { 1333*7c478bd9Sstevel@tonic-gate tstat_pgszdata_t *pgsz = data->tdata_pgsz; 1334*7c478bd9Sstevel@tonic-gate tstat_pgszdata_t *opgsz = odata->tdata_pgsz; 1335*7c478bd9Sstevel@tonic-gate 1336*7c478bd9Sstevel@tonic-gate if ((cpu = data->tdata_cpuid) == -1) 1337*7c478bd9Sstevel@tonic-gate break; 1338*7c478bd9Sstevel@tonic-gate 1339*7c478bd9Sstevel@tonic-gate if (i != 0) 1340*7c478bd9Sstevel@tonic-gate (void) printf("----------+-----------------------------" 1341*7c478bd9Sstevel@tonic-gate "--+-------------------------------+----\n"); 1342*7c478bd9Sstevel@tonic-gate 1343*7c478bd9Sstevel@tonic-gate g_ndata = data; 1344*7c478bd9Sstevel@tonic-gate g_odata = odata; 1345*7c478bd9Sstevel@tonic-gate 1346*7c478bd9Sstevel@tonic-gate (void) sprintf(pre, "%3d u", cpu); 1347*7c478bd9Sstevel@tonic-gate print_modepgsz(pre, &pgsz->tpgsz_user, &opgsz->tpgsz_user); 1348*7c478bd9Sstevel@tonic-gate sum_modedata(&pgsz->tpgsz_user, &opgsz->tpgsz_user, sum); 1349*7c478bd9Sstevel@tonic-gate 1350*7c478bd9Sstevel@tonic-gate (void) printf("- - - - - + - - - - - - - - - - - - - -" 1351*7c478bd9Sstevel@tonic-gate " - + - - - - - - - - - - - - - - - + - -\n"); 1352*7c478bd9Sstevel@tonic-gate 1353*7c478bd9Sstevel@tonic-gate (void) sprintf(pre, "%3d k", cpu); 1354*7c478bd9Sstevel@tonic-gate print_modepgsz(pre, &pgsz->tpgsz_kernel, &opgsz->tpgsz_kernel); 1355*7c478bd9Sstevel@tonic-gate sum_modedata(&pgsz->tpgsz_kernel, &opgsz->tpgsz_kernel, sum); 1356*7c478bd9Sstevel@tonic-gate 1357*7c478bd9Sstevel@tonic-gate data = (tstat_data_t *)((uintptr_t)data + g_datasize); 1358*7c478bd9Sstevel@tonic-gate odata = (tstat_data_t *)((uintptr_t)odata + g_datasize); 1359*7c478bd9Sstevel@tonic-gate ncpus++; 1360*7c478bd9Sstevel@tonic-gate } 1361*7c478bd9Sstevel@tonic-gate 1362*7c478bd9Sstevel@tonic-gate (void) printf("==========+===============================+=========" 1363*7c478bd9Sstevel@tonic-gate "======================+====\n"); 1364*7c478bd9Sstevel@tonic-gate (void) printf(" ttl |"); 1365*7c478bd9Sstevel@tonic-gate print_sum(sum, ncpus); 1366*7c478bd9Sstevel@tonic-gate (void) printf("\n"); 1367*7c478bd9Sstevel@tonic-gate } 1368*7c478bd9Sstevel@tonic-gate 1369*7c478bd9Sstevel@tonic-gate static void 1370*7c478bd9Sstevel@tonic-gate parsable_tlbpgsz(tstat_data_t *data, tstat_data_t *odata) 1371*7c478bd9Sstevel@tonic-gate { 1372*7c478bd9Sstevel@tonic-gate int i, cpu; 1373*7c478bd9Sstevel@tonic-gate char pre[30]; 1374*7c478bd9Sstevel@tonic-gate 1375*7c478bd9Sstevel@tonic-gate for (i = 0; i < g_max_cpus; i++) { 1376*7c478bd9Sstevel@tonic-gate tstat_pgszdata_t *pgsz = data->tdata_pgsz; 1377*7c478bd9Sstevel@tonic-gate tstat_pgszdata_t *opgsz = odata->tdata_pgsz; 1378*7c478bd9Sstevel@tonic-gate 1379*7c478bd9Sstevel@tonic-gate if ((cpu = data->tdata_cpuid) == -1) 1380*7c478bd9Sstevel@tonic-gate break; 1381*7c478bd9Sstevel@tonic-gate 1382*7c478bd9Sstevel@tonic-gate g_ndata = data; 1383*7c478bd9Sstevel@tonic-gate g_odata = odata; 1384*7c478bd9Sstevel@tonic-gate 1385*7c478bd9Sstevel@tonic-gate (void) sprintf(pre, "%lld %3d u", 1386*7c478bd9Sstevel@tonic-gate data->tdata_snapts - g_start, cpu); 1387*7c478bd9Sstevel@tonic-gate parsable_modepgsz(pre, &pgsz->tpgsz_user, &opgsz->tpgsz_user); 1388*7c478bd9Sstevel@tonic-gate 1389*7c478bd9Sstevel@tonic-gate pre[strlen(pre) - 1] = 'k'; 1390*7c478bd9Sstevel@tonic-gate parsable_modepgsz(pre, &pgsz->tpgsz_kernel, 1391*7c478bd9Sstevel@tonic-gate &opgsz->tpgsz_kernel); 1392*7c478bd9Sstevel@tonic-gate 1393*7c478bd9Sstevel@tonic-gate data = (tstat_data_t *)((uintptr_t)data + g_datasize); 1394*7c478bd9Sstevel@tonic-gate odata = (tstat_data_t *)((uintptr_t)odata + g_datasize); 1395*7c478bd9Sstevel@tonic-gate } 1396*7c478bd9Sstevel@tonic-gate } 1397*7c478bd9Sstevel@tonic-gate 1398*7c478bd9Sstevel@tonic-gate static void 1399*7c478bd9Sstevel@tonic-gate print_modedata(tstat_modedata_t *data, tstat_modedata_t *odata, int parsable) 1400*7c478bd9Sstevel@tonic-gate { 1401*7c478bd9Sstevel@tonic-gate int ps, i; 1402*7c478bd9Sstevel@tonic-gate size_t incr = sizeof (tstat_pgszdata_t); 1403*7c478bd9Sstevel@tonic-gate tstat_sum_t sum[4], *sump = sum; 1404*7c478bd9Sstevel@tonic-gate double ttl = 0.0; 1405*7c478bd9Sstevel@tonic-gate 1406*7c478bd9Sstevel@tonic-gate bzero(sum, sizeof (sum)); 1407*7c478bd9Sstevel@tonic-gate g_process = sum_missdata; 1408*7c478bd9Sstevel@tonic-gate g_arg = &sump; 1409*7c478bd9Sstevel@tonic-gate 1410*7c478bd9Sstevel@tonic-gate for (ps = 0; ps < g_pgsizes; ps++) { 1411*7c478bd9Sstevel@tonic-gate tlbdata(&data->tmode_itlb, &odata->tmode_itlb); 1412*7c478bd9Sstevel@tonic-gate tlbdata(&data->tmode_dtlb, &odata->tmode_dtlb); 1413*7c478bd9Sstevel@tonic-gate 1414*7c478bd9Sstevel@tonic-gate data = (tstat_modedata_t *)((uintptr_t)data + incr); 1415*7c478bd9Sstevel@tonic-gate odata = (tstat_modedata_t *)((uintptr_t)odata + incr); 1416*7c478bd9Sstevel@tonic-gate sump = sum; 1417*7c478bd9Sstevel@tonic-gate } 1418*7c478bd9Sstevel@tonic-gate 1419*7c478bd9Sstevel@tonic-gate for (i = 0; i < 4; i++) { 1420*7c478bd9Sstevel@tonic-gate if (i == 2 && !parsable) 1421*7c478bd9Sstevel@tonic-gate (void) printf(" |"); 1422*7c478bd9Sstevel@tonic-gate 1423*7c478bd9Sstevel@tonic-gate TSTAT_PRINT_MISSDATA(sum[i].tsum_diff, sum[i].tsum_time); 1424*7c478bd9Sstevel@tonic-gate ttl += sum[i].tsum_time; 1425*7c478bd9Sstevel@tonic-gate } 1426*7c478bd9Sstevel@tonic-gate 1427*7c478bd9Sstevel@tonic-gate if (parsable) { 1428*7c478bd9Sstevel@tonic-gate (void) printf("\n"); 1429*7c478bd9Sstevel@tonic-gate return; 1430*7c478bd9Sstevel@tonic-gate } 1431*7c478bd9Sstevel@tonic-gate 1432*7c478bd9Sstevel@tonic-gate (void) printf(" |%4.1f\n", ttl); 1433*7c478bd9Sstevel@tonic-gate } 1434*7c478bd9Sstevel@tonic-gate 1435*7c478bd9Sstevel@tonic-gate static void 1436*7c478bd9Sstevel@tonic-gate print_tlb(tstat_data_t *data, tstat_data_t *odata) 1437*7c478bd9Sstevel@tonic-gate { 1438*7c478bd9Sstevel@tonic-gate int i, cpu, ncpus = 0; 1439*7c478bd9Sstevel@tonic-gate tstat_sum_t sum[4]; 1440*7c478bd9Sstevel@tonic-gate 1441*7c478bd9Sstevel@tonic-gate (void) printf("cpu m| %9s %4s %9s %4s | %9s %4s %9s %4s |%4s\n" 1442*7c478bd9Sstevel@tonic-gate "-----+-------------------------------+-----------------------" 1443*7c478bd9Sstevel@tonic-gate "--------+----\n", "itlb-miss", "%tim", "itsb-miss", "%tim", 1444*7c478bd9Sstevel@tonic-gate "dtlb-miss", "%tim", "dtsb-miss", "%tim", "%tim"); 1445*7c478bd9Sstevel@tonic-gate 1446*7c478bd9Sstevel@tonic-gate bzero(sum, sizeof (sum)); 1447*7c478bd9Sstevel@tonic-gate 1448*7c478bd9Sstevel@tonic-gate for (i = 0; i < g_max_cpus; i++) { 1449*7c478bd9Sstevel@tonic-gate tstat_pgszdata_t *pgsz = data->tdata_pgsz; 1450*7c478bd9Sstevel@tonic-gate tstat_pgszdata_t *opgsz = odata->tdata_pgsz; 1451*7c478bd9Sstevel@tonic-gate 1452*7c478bd9Sstevel@tonic-gate if ((cpu = data->tdata_cpuid) == -1) 1453*7c478bd9Sstevel@tonic-gate break; 1454*7c478bd9Sstevel@tonic-gate 1455*7c478bd9Sstevel@tonic-gate if (i != 0) 1456*7c478bd9Sstevel@tonic-gate (void) printf("-----+-------------------------------+-" 1457*7c478bd9Sstevel@tonic-gate "------------------------------+----\n"); 1458*7c478bd9Sstevel@tonic-gate 1459*7c478bd9Sstevel@tonic-gate g_ndata = data; 1460*7c478bd9Sstevel@tonic-gate g_odata = odata; 1461*7c478bd9Sstevel@tonic-gate 1462*7c478bd9Sstevel@tonic-gate (void) printf("%3d u|", cpu); 1463*7c478bd9Sstevel@tonic-gate print_modedata(&pgsz->tpgsz_user, &opgsz->tpgsz_user, 0); 1464*7c478bd9Sstevel@tonic-gate sum_modedata(&pgsz->tpgsz_user, &opgsz->tpgsz_user, sum); 1465*7c478bd9Sstevel@tonic-gate 1466*7c478bd9Sstevel@tonic-gate (void) printf("%3d k|", cpu); 1467*7c478bd9Sstevel@tonic-gate print_modedata(&pgsz->tpgsz_kernel, &opgsz->tpgsz_kernel, 0); 1468*7c478bd9Sstevel@tonic-gate sum_modedata(&pgsz->tpgsz_kernel, &opgsz->tpgsz_kernel, sum); 1469*7c478bd9Sstevel@tonic-gate 1470*7c478bd9Sstevel@tonic-gate data = (tstat_data_t *)((uintptr_t)data + g_datasize); 1471*7c478bd9Sstevel@tonic-gate odata = (tstat_data_t *)((uintptr_t)odata + g_datasize); 1472*7c478bd9Sstevel@tonic-gate ncpus++; 1473*7c478bd9Sstevel@tonic-gate } 1474*7c478bd9Sstevel@tonic-gate 1475*7c478bd9Sstevel@tonic-gate (void) printf("=====+===============================+=========" 1476*7c478bd9Sstevel@tonic-gate "======================+====\n"); 1477*7c478bd9Sstevel@tonic-gate 1478*7c478bd9Sstevel@tonic-gate (void) printf(" ttl |"); 1479*7c478bd9Sstevel@tonic-gate print_sum(sum, ncpus); 1480*7c478bd9Sstevel@tonic-gate (void) printf("\n"); 1481*7c478bd9Sstevel@tonic-gate } 1482*7c478bd9Sstevel@tonic-gate 1483*7c478bd9Sstevel@tonic-gate static void 1484*7c478bd9Sstevel@tonic-gate parsable_tlb(tstat_data_t *data, tstat_data_t *odata) 1485*7c478bd9Sstevel@tonic-gate { 1486*7c478bd9Sstevel@tonic-gate int i, cpu; 1487*7c478bd9Sstevel@tonic-gate 1488*7c478bd9Sstevel@tonic-gate for (i = 0; i < g_max_cpus; i++) { 1489*7c478bd9Sstevel@tonic-gate tstat_pgszdata_t *pgsz = data->tdata_pgsz; 1490*7c478bd9Sstevel@tonic-gate tstat_pgszdata_t *opgsz = odata->tdata_pgsz; 1491*7c478bd9Sstevel@tonic-gate 1492*7c478bd9Sstevel@tonic-gate if ((cpu = data->tdata_cpuid) == -1) 1493*7c478bd9Sstevel@tonic-gate break; 1494*7c478bd9Sstevel@tonic-gate 1495*7c478bd9Sstevel@tonic-gate g_ndata = data; 1496*7c478bd9Sstevel@tonic-gate g_odata = odata; 1497*7c478bd9Sstevel@tonic-gate 1498*7c478bd9Sstevel@tonic-gate (void) printf("%lld %3d u ", data->tdata_snapts - g_start, cpu); 1499*7c478bd9Sstevel@tonic-gate print_modedata(&pgsz->tpgsz_user, &opgsz->tpgsz_user, 1); 1500*7c478bd9Sstevel@tonic-gate (void) printf("%lld %3d k ", data->tdata_snapts - g_start, cpu); 1501*7c478bd9Sstevel@tonic-gate print_modedata(&pgsz->tpgsz_kernel, &opgsz->tpgsz_kernel, 1); 1502*7c478bd9Sstevel@tonic-gate 1503*7c478bd9Sstevel@tonic-gate data = (tstat_data_t *)((uintptr_t)data + g_datasize); 1504*7c478bd9Sstevel@tonic-gate odata = (tstat_data_t *)((uintptr_t)odata + g_datasize); 1505*7c478bd9Sstevel@tonic-gate } 1506*7c478bd9Sstevel@tonic-gate } 1507*7c478bd9Sstevel@tonic-gate 1508*7c478bd9Sstevel@tonic-gate static void 1509*7c478bd9Sstevel@tonic-gate print_stats(tstat_data_t *data, tstat_data_t *odata) 1510*7c478bd9Sstevel@tonic-gate { 1511*7c478bd9Sstevel@tonic-gate int i, j, k, done; 1512*7c478bd9Sstevel@tonic-gate processorid_t id; 1513*7c478bd9Sstevel@tonic-gate tstat_data_t *base = data; 1514*7c478bd9Sstevel@tonic-gate 1515*7c478bd9Sstevel@tonic-gate /* 1516*7c478bd9Sstevel@tonic-gate * First, blast through all of the data updating our array 1517*7c478bd9Sstevel@tonic-gate * of active traps. We keep an array of active traps to prevent 1518*7c478bd9Sstevel@tonic-gate * printing lines for traps that are never seen -- while still printing 1519*7c478bd9Sstevel@tonic-gate * lines for traps that have been seen only once on some CPU. 1520*7c478bd9Sstevel@tonic-gate */ 1521*7c478bd9Sstevel@tonic-gate for (i = 0; i < g_max_cpus; i++) { 1522*7c478bd9Sstevel@tonic-gate if (data[i].tdata_cpuid == -1) 1523*7c478bd9Sstevel@tonic-gate break; 1524*7c478bd9Sstevel@tonic-gate 1525*7c478bd9Sstevel@tonic-gate for (j = 0; j < TSTAT_NENT; j++) { 1526*7c478bd9Sstevel@tonic-gate if (!data[i].tdata_traps[j] || g_active[j]) 1527*7c478bd9Sstevel@tonic-gate continue; 1528*7c478bd9Sstevel@tonic-gate 1529*7c478bd9Sstevel@tonic-gate g_active[j] = 1; 1530*7c478bd9Sstevel@tonic-gate } 1531*7c478bd9Sstevel@tonic-gate } 1532*7c478bd9Sstevel@tonic-gate 1533*7c478bd9Sstevel@tonic-gate data = base; 1534*7c478bd9Sstevel@tonic-gate 1535*7c478bd9Sstevel@tonic-gate for (done = 0; !done; data += g_cpus_per_line) { 1536*7c478bd9Sstevel@tonic-gate for (i = 0; i < g_cpus_per_line; i++) { 1537*7c478bd9Sstevel@tonic-gate if (&data[i] - base >= g_max_cpus) 1538*7c478bd9Sstevel@tonic-gate break; 1539*7c478bd9Sstevel@tonic-gate 1540*7c478bd9Sstevel@tonic-gate if ((id = data[i].tdata_cpuid) == -1) 1541*7c478bd9Sstevel@tonic-gate break; 1542*7c478bd9Sstevel@tonic-gate 1543*7c478bd9Sstevel@tonic-gate if (i == 0) 1544*7c478bd9Sstevel@tonic-gate (void) printf("vct name |"); 1545*7c478bd9Sstevel@tonic-gate 1546*7c478bd9Sstevel@tonic-gate (void) printf(" %scpu%d", id >= 100 ? "" : 1547*7c478bd9Sstevel@tonic-gate id >= 10 ? " " : " ", id); 1548*7c478bd9Sstevel@tonic-gate } 1549*7c478bd9Sstevel@tonic-gate 1550*7c478bd9Sstevel@tonic-gate if (i == 0) 1551*7c478bd9Sstevel@tonic-gate break; 1552*7c478bd9Sstevel@tonic-gate 1553*7c478bd9Sstevel@tonic-gate if (i != g_cpus_per_line) 1554*7c478bd9Sstevel@tonic-gate done = 1; 1555*7c478bd9Sstevel@tonic-gate 1556*7c478bd9Sstevel@tonic-gate (void) printf("\n------------------------+"); 1557*7c478bd9Sstevel@tonic-gate 1558*7c478bd9Sstevel@tonic-gate for (j = 0; j < i; j++) 1559*7c478bd9Sstevel@tonic-gate (void) printf("---------"); 1560*7c478bd9Sstevel@tonic-gate (void) printf("\n"); 1561*7c478bd9Sstevel@tonic-gate 1562*7c478bd9Sstevel@tonic-gate for (j = 0; j < TSTAT_NENT; j++) { 1563*7c478bd9Sstevel@tonic-gate if (!g_active[j]) 1564*7c478bd9Sstevel@tonic-gate continue; 1565*7c478bd9Sstevel@tonic-gate 1566*7c478bd9Sstevel@tonic-gate (void) printf("%3x %-20s|", j, g_traps[j].tent_name); 1567*7c478bd9Sstevel@tonic-gate for (k = 0; k < i; k++) { 1568*7c478bd9Sstevel@tonic-gate (void) printf(" %8lld", TSTAT_DELTA(&data[k], 1569*7c478bd9Sstevel@tonic-gate &odata[data - base + k], tdata_traps[j])); 1570*7c478bd9Sstevel@tonic-gate } 1571*7c478bd9Sstevel@tonic-gate (void) printf("\n"); 1572*7c478bd9Sstevel@tonic-gate } 1573*7c478bd9Sstevel@tonic-gate (void) printf("\n"); 1574*7c478bd9Sstevel@tonic-gate } 1575*7c478bd9Sstevel@tonic-gate } 1576*7c478bd9Sstevel@tonic-gate 1577*7c478bd9Sstevel@tonic-gate static void 1578*7c478bd9Sstevel@tonic-gate parsable_stats(tstat_data_t *data, tstat_data_t *odata) 1579*7c478bd9Sstevel@tonic-gate { 1580*7c478bd9Sstevel@tonic-gate tstat_data_t *base; 1581*7c478bd9Sstevel@tonic-gate int i; 1582*7c478bd9Sstevel@tonic-gate 1583*7c478bd9Sstevel@tonic-gate for (base = data; data - base < g_max_cpus; data++, odata++) { 1584*7c478bd9Sstevel@tonic-gate if (data->tdata_cpuid == -1) 1585*7c478bd9Sstevel@tonic-gate break; 1586*7c478bd9Sstevel@tonic-gate 1587*7c478bd9Sstevel@tonic-gate for (i = 0; i < TSTAT_NENT; i++) { 1588*7c478bd9Sstevel@tonic-gate if (!data->tdata_traps[i] && !g_active[i]) 1589*7c478bd9Sstevel@tonic-gate continue; 1590*7c478bd9Sstevel@tonic-gate 1591*7c478bd9Sstevel@tonic-gate (void) printf("%lld %d %x %s ", 1592*7c478bd9Sstevel@tonic-gate data->tdata_snapts - g_start, data->tdata_cpuid, i, 1593*7c478bd9Sstevel@tonic-gate g_traps[i].tent_name); 1594*7c478bd9Sstevel@tonic-gate 1595*7c478bd9Sstevel@tonic-gate (void) printf("%lld\n", TSTAT_DELTA(data, odata, 1596*7c478bd9Sstevel@tonic-gate tdata_traps[i])); 1597*7c478bd9Sstevel@tonic-gate } 1598*7c478bd9Sstevel@tonic-gate } 1599*7c478bd9Sstevel@tonic-gate } 1600*7c478bd9Sstevel@tonic-gate 1601*7c478bd9Sstevel@tonic-gate static void 1602*7c478bd9Sstevel@tonic-gate check_data(tstat_data_t *data, tstat_data_t *odata) 1603*7c478bd9Sstevel@tonic-gate { 1604*7c478bd9Sstevel@tonic-gate tstat_data_t *ndata; 1605*7c478bd9Sstevel@tonic-gate int i; 1606*7c478bd9Sstevel@tonic-gate 1607*7c478bd9Sstevel@tonic-gate if (data->tdata_cpuid == -1) { 1608*7c478bd9Sstevel@tonic-gate /* 1609*7c478bd9Sstevel@tonic-gate * The last CPU we were watching must have been DR'd out 1610*7c478bd9Sstevel@tonic-gate * of the system. Print a vaguely useful message and exit. 1611*7c478bd9Sstevel@tonic-gate */ 1612*7c478bd9Sstevel@tonic-gate fatal("all initially selected CPUs have been unconfigured\n"); 1613*7c478bd9Sstevel@tonic-gate } 1614*7c478bd9Sstevel@tonic-gate 1615*7c478bd9Sstevel@tonic-gate /* 1616*7c478bd9Sstevel@tonic-gate * If a CPU is DR'd out of the system, we'll stop receiving data 1617*7c478bd9Sstevel@tonic-gate * for it. CPUs are never added, however (that is, if a CPU is 1618*7c478bd9Sstevel@tonic-gate * DR'd into the system, we won't automatically start receiving 1619*7c478bd9Sstevel@tonic-gate * data for it). We check for this by making sure that all of 1620*7c478bd9Sstevel@tonic-gate * the CPUs present in the old data are present in the new data. 1621*7c478bd9Sstevel@tonic-gate * If we find one missing in the new data, we correct the old data 1622*7c478bd9Sstevel@tonic-gate * by removing the old CPU. This assures that delta are printed 1623*7c478bd9Sstevel@tonic-gate * correctly. 1624*7c478bd9Sstevel@tonic-gate */ 1625*7c478bd9Sstevel@tonic-gate for (i = 0; i < g_max_cpus; i++) { 1626*7c478bd9Sstevel@tonic-gate if (odata->tdata_cpuid == -1) 1627*7c478bd9Sstevel@tonic-gate return; 1628*7c478bd9Sstevel@tonic-gate 1629*7c478bd9Sstevel@tonic-gate if (data->tdata_cpuid != odata->tdata_cpuid) 1630*7c478bd9Sstevel@tonic-gate break; 1631*7c478bd9Sstevel@tonic-gate 1632*7c478bd9Sstevel@tonic-gate data = (tstat_data_t *)((uintptr_t)data + g_datasize); 1633*7c478bd9Sstevel@tonic-gate odata = (tstat_data_t *)((uintptr_t)odata + g_datasize); 1634*7c478bd9Sstevel@tonic-gate } 1635*7c478bd9Sstevel@tonic-gate 1636*7c478bd9Sstevel@tonic-gate if (i == g_max_cpus) 1637*7c478bd9Sstevel@tonic-gate return; 1638*7c478bd9Sstevel@tonic-gate 1639*7c478bd9Sstevel@tonic-gate /* 1640*7c478bd9Sstevel@tonic-gate * If we're here, we know that the odata is a CPU which has been 1641*7c478bd9Sstevel@tonic-gate * DR'd out. We'll now smoosh it out of the old data. 1642*7c478bd9Sstevel@tonic-gate */ 1643*7c478bd9Sstevel@tonic-gate for (odata->tdata_cpuid = -1; i < g_max_cpus - 1; i++) { 1644*7c478bd9Sstevel@tonic-gate ndata = (tstat_data_t *)((uintptr_t)odata + g_datasize); 1645*7c478bd9Sstevel@tonic-gate bcopy(ndata, odata, g_datasize); 1646*7c478bd9Sstevel@tonic-gate ndata->tdata_cpuid = -1; 1647*7c478bd9Sstevel@tonic-gate } 1648*7c478bd9Sstevel@tonic-gate 1649*7c478bd9Sstevel@tonic-gate /* 1650*7c478bd9Sstevel@tonic-gate * There may be other CPUs DR'd out; tail-call recurse. 1651*7c478bd9Sstevel@tonic-gate */ 1652*7c478bd9Sstevel@tonic-gate check_data(data, odata); 1653*7c478bd9Sstevel@tonic-gate } 1654*7c478bd9Sstevel@tonic-gate 1655*7c478bd9Sstevel@tonic-gate int 1656*7c478bd9Sstevel@tonic-gate main(int argc, char **argv) 1657*7c478bd9Sstevel@tonic-gate { 1658*7c478bd9Sstevel@tonic-gate processorid_t id; 1659*7c478bd9Sstevel@tonic-gate char c, *end; 1660*7c478bd9Sstevel@tonic-gate ulong_t indefinite; 1661*7c478bd9Sstevel@tonic-gate long count = 0, rate = 0; 1662*7c478bd9Sstevel@tonic-gate int list = 0, parsable = 0; 1663*7c478bd9Sstevel@tonic-gate void (*print)(tstat_data_t *, tstat_data_t *); 1664*7c478bd9Sstevel@tonic-gate sigset_t set; 1665*7c478bd9Sstevel@tonic-gate 1666*7c478bd9Sstevel@tonic-gate struct { 1667*7c478bd9Sstevel@tonic-gate char opt; 1668*7c478bd9Sstevel@tonic-gate void (*print)(tstat_data_t *, tstat_data_t *); 1669*7c478bd9Sstevel@tonic-gate void (*parsable)(tstat_data_t *, tstat_data_t *); 1670*7c478bd9Sstevel@tonic-gate int repeat; 1671*7c478bd9Sstevel@tonic-gate } tab[] = { 1672*7c478bd9Sstevel@tonic-gate { '\0', print_stats, parsable_stats, 0 }, 1673*7c478bd9Sstevel@tonic-gate { 'e', print_stats, parsable_stats, 1 }, 1674*7c478bd9Sstevel@tonic-gate { 't', print_tlb, parsable_tlb, 0 }, 1675*7c478bd9Sstevel@tonic-gate { 'T', print_tlbpgsz, parsable_tlbpgsz, 0 }, 1676*7c478bd9Sstevel@tonic-gate { -1, NULL, NULL, 0 } 1677*7c478bd9Sstevel@tonic-gate }, *tabent = NULL, *iter; 1678*7c478bd9Sstevel@tonic-gate 1679*7c478bd9Sstevel@tonic-gate uintptr_t offs = (uintptr_t)&tab->print - (uintptr_t)tab; 1680*7c478bd9Sstevel@tonic-gate 1681*7c478bd9Sstevel@tonic-gate /* 1682*7c478bd9Sstevel@tonic-gate * If argv[0] is non-NULL, set argv[0] to keep any getopt(3C) output 1683*7c478bd9Sstevel@tonic-gate * consistent with other error output. 1684*7c478bd9Sstevel@tonic-gate */ 1685*7c478bd9Sstevel@tonic-gate if (argv[0] != NULL) 1686*7c478bd9Sstevel@tonic-gate argv[0] = TSTAT_COMMAND; 1687*7c478bd9Sstevel@tonic-gate 1688*7c478bd9Sstevel@tonic-gate if ((g_fd = open(TSTAT_DEVICE, O_RDWR)) == -1) 1689*7c478bd9Sstevel@tonic-gate fatal("couldn't open " TSTAT_DEVICE); 1690*7c478bd9Sstevel@tonic-gate 1691*7c478bd9Sstevel@tonic-gate setup(); 1692*7c478bd9Sstevel@tonic-gate 1693*7c478bd9Sstevel@tonic-gate while ((c = getopt(argc, argv, "alnNtTc:C:r:e:P")) != EOF) { 1694*7c478bd9Sstevel@tonic-gate /* 1695*7c478bd9Sstevel@tonic-gate * First, check to see if this option changes our printing 1696*7c478bd9Sstevel@tonic-gate * function. 1697*7c478bd9Sstevel@tonic-gate */ 1698*7c478bd9Sstevel@tonic-gate for (iter = tab; iter->opt >= 0; iter++) { 1699*7c478bd9Sstevel@tonic-gate if (c != iter->opt) 1700*7c478bd9Sstevel@tonic-gate continue; 1701*7c478bd9Sstevel@tonic-gate 1702*7c478bd9Sstevel@tonic-gate if (tabent != NULL) { 1703*7c478bd9Sstevel@tonic-gate if (tabent == iter) { 1704*7c478bd9Sstevel@tonic-gate if (tabent->repeat) { 1705*7c478bd9Sstevel@tonic-gate /* 1706*7c478bd9Sstevel@tonic-gate * This option is allowed to 1707*7c478bd9Sstevel@tonic-gate * have repeats; break out. 1708*7c478bd9Sstevel@tonic-gate */ 1709*7c478bd9Sstevel@tonic-gate break; 1710*7c478bd9Sstevel@tonic-gate } 1711*7c478bd9Sstevel@tonic-gate 1712*7c478bd9Sstevel@tonic-gate fatal("expected -%c at most once\n", c); 1713*7c478bd9Sstevel@tonic-gate } 1714*7c478bd9Sstevel@tonic-gate 1715*7c478bd9Sstevel@tonic-gate fatal("only one of -%c, -%c expected\n", 1716*7c478bd9Sstevel@tonic-gate tabent->opt, c); 1717*7c478bd9Sstevel@tonic-gate } 1718*7c478bd9Sstevel@tonic-gate 1719*7c478bd9Sstevel@tonic-gate tabent = iter; 1720*7c478bd9Sstevel@tonic-gate break; 1721*7c478bd9Sstevel@tonic-gate } 1722*7c478bd9Sstevel@tonic-gate 1723*7c478bd9Sstevel@tonic-gate switch (c) { 1724*7c478bd9Sstevel@tonic-gate case 'a': 1725*7c478bd9Sstevel@tonic-gate g_absolute = 1; 1726*7c478bd9Sstevel@tonic-gate break; 1727*7c478bd9Sstevel@tonic-gate 1728*7c478bd9Sstevel@tonic-gate case 'e': { 1729*7c478bd9Sstevel@tonic-gate char *s = strtok(optarg, ","); 1730*7c478bd9Sstevel@tonic-gate 1731*7c478bd9Sstevel@tonic-gate while (s != NULL) { 1732*7c478bd9Sstevel@tonic-gate select_entry(s); 1733*7c478bd9Sstevel@tonic-gate s = strtok(NULL, ","); 1734*7c478bd9Sstevel@tonic-gate } 1735*7c478bd9Sstevel@tonic-gate 1736*7c478bd9Sstevel@tonic-gate break; 1737*7c478bd9Sstevel@tonic-gate } 1738*7c478bd9Sstevel@tonic-gate 1739*7c478bd9Sstevel@tonic-gate case 'l': 1740*7c478bd9Sstevel@tonic-gate list = 1; 1741*7c478bd9Sstevel@tonic-gate break; 1742*7c478bd9Sstevel@tonic-gate 1743*7c478bd9Sstevel@tonic-gate case 'n': 1744*7c478bd9Sstevel@tonic-gate /* 1745*7c478bd9Sstevel@tonic-gate * This undocumented option prevents trapstat from 1746*7c478bd9Sstevel@tonic-gate * actually switching the %tba to point to the 1747*7c478bd9Sstevel@tonic-gate * interposing trap table. It's very useful when 1748*7c478bd9Sstevel@tonic-gate * debugging trapstat bugs: one can specify "-n" 1749*7c478bd9Sstevel@tonic-gate * and then examine the would-be interposing trap 1750*7c478bd9Sstevel@tonic-gate * table without running the risk of RED stating. 1751*7c478bd9Sstevel@tonic-gate */ 1752*7c478bd9Sstevel@tonic-gate if (ioctl(g_fd, TSTATIOC_NOGO) == -1) 1753*7c478bd9Sstevel@tonic-gate fatal("TSTATIOC_NOGO"); 1754*7c478bd9Sstevel@tonic-gate break; 1755*7c478bd9Sstevel@tonic-gate 1756*7c478bd9Sstevel@tonic-gate case 'N': 1757*7c478bd9Sstevel@tonic-gate /* 1758*7c478bd9Sstevel@tonic-gate * This undocumented option forces trapstat to ignore 1759*7c478bd9Sstevel@tonic-gate * its determined probe effect. This may be useful 1760*7c478bd9Sstevel@tonic-gate * if it is believed that the probe effect has been 1761*7c478bd9Sstevel@tonic-gate * grossly overestimated. 1762*7c478bd9Sstevel@tonic-gate */ 1763*7c478bd9Sstevel@tonic-gate g_peffect = 0; 1764*7c478bd9Sstevel@tonic-gate break; 1765*7c478bd9Sstevel@tonic-gate 1766*7c478bd9Sstevel@tonic-gate case 't': 1767*7c478bd9Sstevel@tonic-gate case 'T': 1768*7c478bd9Sstevel@tonic-gate /* 1769*7c478bd9Sstevel@tonic-gate * When running with TLB statistics, we want to 1770*7c478bd9Sstevel@tonic-gate * minimize probe effect by running with all other 1771*7c478bd9Sstevel@tonic-gate * entries explicitly disabled. 1772*7c478bd9Sstevel@tonic-gate */ 1773*7c478bd9Sstevel@tonic-gate if (ioctl(g_fd, TSTATIOC_NOENTRY) == -1) 1774*7c478bd9Sstevel@tonic-gate fatal("TSTATIOC_NOENTRY"); 1775*7c478bd9Sstevel@tonic-gate 1776*7c478bd9Sstevel@tonic-gate if (ioctl(g_fd, TSTATIOC_TLBDATA) == -1) 1777*7c478bd9Sstevel@tonic-gate fatal("TSTATIOC_TLBDATA"); 1778*7c478bd9Sstevel@tonic-gate break; 1779*7c478bd9Sstevel@tonic-gate 1780*7c478bd9Sstevel@tonic-gate case 'c': { 1781*7c478bd9Sstevel@tonic-gate /* 1782*7c478bd9Sstevel@tonic-gate * We allow CPUs to be specified as an optionally 1783*7c478bd9Sstevel@tonic-gate * comma separated list of either CPU IDs or ranges 1784*7c478bd9Sstevel@tonic-gate * of CPU IDs. 1785*7c478bd9Sstevel@tonic-gate */ 1786*7c478bd9Sstevel@tonic-gate char *s = strtok(optarg, ","); 1787*7c478bd9Sstevel@tonic-gate 1788*7c478bd9Sstevel@tonic-gate while (s != NULL) { 1789*7c478bd9Sstevel@tonic-gate id = strtoul(s, &end, 0); 1790*7c478bd9Sstevel@tonic-gate 1791*7c478bd9Sstevel@tonic-gate if (id == ULONG_MAX && errno == ERANGE) { 1792*7c478bd9Sstevel@tonic-gate *end = '\0'; 1793*7c478bd9Sstevel@tonic-gate fatal("invalid cpu '%s'\n", s); 1794*7c478bd9Sstevel@tonic-gate } 1795*7c478bd9Sstevel@tonic-gate 1796*7c478bd9Sstevel@tonic-gate if (*(s = end) != '\0') { 1797*7c478bd9Sstevel@tonic-gate processorid_t p; 1798*7c478bd9Sstevel@tonic-gate 1799*7c478bd9Sstevel@tonic-gate if (*s != '-') 1800*7c478bd9Sstevel@tonic-gate fatal("invalid cpu '%s'\n", s); 1801*7c478bd9Sstevel@tonic-gate p = strtoul(++s, &end, 0); 1802*7c478bd9Sstevel@tonic-gate 1803*7c478bd9Sstevel@tonic-gate if (*end != '\0' || 1804*7c478bd9Sstevel@tonic-gate (p == ULONG_MAX && errno == ERANGE)) 1805*7c478bd9Sstevel@tonic-gate fatal("invalid cpu '%s'\n", s); 1806*7c478bd9Sstevel@tonic-gate 1807*7c478bd9Sstevel@tonic-gate select_cpus(id, p); 1808*7c478bd9Sstevel@tonic-gate } else { 1809*7c478bd9Sstevel@tonic-gate select_cpu(id); 1810*7c478bd9Sstevel@tonic-gate } 1811*7c478bd9Sstevel@tonic-gate 1812*7c478bd9Sstevel@tonic-gate s = strtok(NULL, ","); 1813*7c478bd9Sstevel@tonic-gate } 1814*7c478bd9Sstevel@tonic-gate 1815*7c478bd9Sstevel@tonic-gate break; 1816*7c478bd9Sstevel@tonic-gate } 1817*7c478bd9Sstevel@tonic-gate 1818*7c478bd9Sstevel@tonic-gate case 'C': { 1819*7c478bd9Sstevel@tonic-gate psetid_t pset = strtoul(optarg, &end, 0); 1820*7c478bd9Sstevel@tonic-gate 1821*7c478bd9Sstevel@tonic-gate if (*end != '\0' || 1822*7c478bd9Sstevel@tonic-gate (pset == ULONG_MAX && errno == ERANGE)) 1823*7c478bd9Sstevel@tonic-gate fatal("invalid processor set '%s'\n", optarg); 1824*7c478bd9Sstevel@tonic-gate 1825*7c478bd9Sstevel@tonic-gate select_pset(pset); 1826*7c478bd9Sstevel@tonic-gate break; 1827*7c478bd9Sstevel@tonic-gate } 1828*7c478bd9Sstevel@tonic-gate 1829*7c478bd9Sstevel@tonic-gate case 'r': { 1830*7c478bd9Sstevel@tonic-gate rate = strtol(optarg, &end, 0); 1831*7c478bd9Sstevel@tonic-gate 1832*7c478bd9Sstevel@tonic-gate if (*end != '\0' || 1833*7c478bd9Sstevel@tonic-gate (rate == LONG_MAX && errno == ERANGE)) 1834*7c478bd9Sstevel@tonic-gate fatal("invalid rate '%s'\n", optarg); 1835*7c478bd9Sstevel@tonic-gate 1836*7c478bd9Sstevel@tonic-gate if (rate <= 0) 1837*7c478bd9Sstevel@tonic-gate fatal("rate must be greater than zero\n"); 1838*7c478bd9Sstevel@tonic-gate 1839*7c478bd9Sstevel@tonic-gate if (rate > TSTAT_MAX_RATE) 1840*7c478bd9Sstevel@tonic-gate fatal("rate may not exceed %d\n", 1841*7c478bd9Sstevel@tonic-gate TSTAT_MAX_RATE); 1842*7c478bd9Sstevel@tonic-gate 1843*7c478bd9Sstevel@tonic-gate set_interval(NANOSEC / rate); 1844*7c478bd9Sstevel@tonic-gate break; 1845*7c478bd9Sstevel@tonic-gate } 1846*7c478bd9Sstevel@tonic-gate 1847*7c478bd9Sstevel@tonic-gate case 'P': 1848*7c478bd9Sstevel@tonic-gate offs = (uintptr_t)&tab->parsable - (uintptr_t)tab; 1849*7c478bd9Sstevel@tonic-gate parsable = 1; 1850*7c478bd9Sstevel@tonic-gate break; 1851*7c478bd9Sstevel@tonic-gate 1852*7c478bd9Sstevel@tonic-gate default: 1853*7c478bd9Sstevel@tonic-gate usage(); 1854*7c478bd9Sstevel@tonic-gate } 1855*7c478bd9Sstevel@tonic-gate } 1856*7c478bd9Sstevel@tonic-gate 1857*7c478bd9Sstevel@tonic-gate if (list) { 1858*7c478bd9Sstevel@tonic-gate print_entries(stdout, parsable); 1859*7c478bd9Sstevel@tonic-gate exit(EXIT_SUCCESS); 1860*7c478bd9Sstevel@tonic-gate } 1861*7c478bd9Sstevel@tonic-gate 1862*7c478bd9Sstevel@tonic-gate if (optind != argc) { 1863*7c478bd9Sstevel@tonic-gate 1864*7c478bd9Sstevel@tonic-gate int interval = strtol(argv[optind], &end, 0); 1865*7c478bd9Sstevel@tonic-gate 1866*7c478bd9Sstevel@tonic-gate if (*end != '\0') { 1867*7c478bd9Sstevel@tonic-gate /* 1868*7c478bd9Sstevel@tonic-gate * That wasn't a valid number. It must be that we're 1869*7c478bd9Sstevel@tonic-gate * to execute this command. 1870*7c478bd9Sstevel@tonic-gate */ 1871*7c478bd9Sstevel@tonic-gate switch (vfork()) { 1872*7c478bd9Sstevel@tonic-gate case 0: 1873*7c478bd9Sstevel@tonic-gate (void) close(g_fd); 1874*7c478bd9Sstevel@tonic-gate (void) sigprocmask(SIG_SETMASK, &g_oset, NULL); 1875*7c478bd9Sstevel@tonic-gate (void) execvp(argv[optind], &argv[optind]); 1876*7c478bd9Sstevel@tonic-gate 1877*7c478bd9Sstevel@tonic-gate /* 1878*7c478bd9Sstevel@tonic-gate * No luck. Set errno. 1879*7c478bd9Sstevel@tonic-gate */ 1880*7c478bd9Sstevel@tonic-gate g_exec_errno = errno; 1881*7c478bd9Sstevel@tonic-gate _exit(EXIT_FAILURE); 1882*7c478bd9Sstevel@tonic-gate /*NOTREACHED*/ 1883*7c478bd9Sstevel@tonic-gate case -1: 1884*7c478bd9Sstevel@tonic-gate fatal("cannot fork"); 1885*7c478bd9Sstevel@tonic-gate /*NOTREACHED*/ 1886*7c478bd9Sstevel@tonic-gate default: 1887*7c478bd9Sstevel@tonic-gate break; 1888*7c478bd9Sstevel@tonic-gate } 1889*7c478bd9Sstevel@tonic-gate } else { 1890*7c478bd9Sstevel@tonic-gate if (interval <= 0) 1891*7c478bd9Sstevel@tonic-gate fatal("interval must be greater than zero.\n"); 1892*7c478bd9Sstevel@tonic-gate 1893*7c478bd9Sstevel@tonic-gate if (interval == LONG_MAX && errno == ERANGE) 1894*7c478bd9Sstevel@tonic-gate fatal("invalid interval '%s'\n", argv[optind]); 1895*7c478bd9Sstevel@tonic-gate 1896*7c478bd9Sstevel@tonic-gate set_interval(NANOSEC * (hrtime_t)interval); 1897*7c478bd9Sstevel@tonic-gate 1898*7c478bd9Sstevel@tonic-gate if (++optind != argc) { 1899*7c478bd9Sstevel@tonic-gate char *s = argv[optind]; 1900*7c478bd9Sstevel@tonic-gate 1901*7c478bd9Sstevel@tonic-gate count = strtol(s, &end, 0); 1902*7c478bd9Sstevel@tonic-gate 1903*7c478bd9Sstevel@tonic-gate if (*end != '\0' || count <= 0 || 1904*7c478bd9Sstevel@tonic-gate (count == LONG_MAX && errno == ERANGE)) 1905*7c478bd9Sstevel@tonic-gate fatal("invalid count '%s'\n", s); 1906*7c478bd9Sstevel@tonic-gate } 1907*7c478bd9Sstevel@tonic-gate } 1908*7c478bd9Sstevel@tonic-gate } else { 1909*7c478bd9Sstevel@tonic-gate if (!rate) 1910*7c478bd9Sstevel@tonic-gate set_interval(NANOSEC); 1911*7c478bd9Sstevel@tonic-gate } 1912*7c478bd9Sstevel@tonic-gate 1913*7c478bd9Sstevel@tonic-gate if (tabent == NULL) 1914*7c478bd9Sstevel@tonic-gate tabent = tab; 1915*7c478bd9Sstevel@tonic-gate 1916*7c478bd9Sstevel@tonic-gate print = *(void(**)(tstat_data_t *, tstat_data_t *)) 1917*7c478bd9Sstevel@tonic-gate ((uintptr_t)tabent + offs); 1918*7c478bd9Sstevel@tonic-gate 1919*7c478bd9Sstevel@tonic-gate for (id = 0; id < g_max_cpus; id++) { 1920*7c478bd9Sstevel@tonic-gate if (!g_selected[id]) 1921*7c478bd9Sstevel@tonic-gate continue; 1922*7c478bd9Sstevel@tonic-gate 1923*7c478bd9Sstevel@tonic-gate if (ioctl(g_fd, TSTATIOC_CPU, id) == -1) 1924*7c478bd9Sstevel@tonic-gate fatal("TSTATIOC_CPU failed for cpu %d", id); 1925*7c478bd9Sstevel@tonic-gate } 1926*7c478bd9Sstevel@tonic-gate 1927*7c478bd9Sstevel@tonic-gate g_start = gethrtime(); 1928*7c478bd9Sstevel@tonic-gate 1929*7c478bd9Sstevel@tonic-gate if (ioctl(g_fd, TSTATIOC_GO) == -1) 1930*7c478bd9Sstevel@tonic-gate fatal("TSTATIOC_GO failed"); 1931*7c478bd9Sstevel@tonic-gate 1932*7c478bd9Sstevel@tonic-gate if (ioctl(g_fd, TSTATIOC_READ, g_data[g_gen ^ 1]) == -1) 1933*7c478bd9Sstevel@tonic-gate fatal("initial TSTATIOC_READ failed"); 1934*7c478bd9Sstevel@tonic-gate 1935*7c478bd9Sstevel@tonic-gate (void) sigemptyset(&set); 1936*7c478bd9Sstevel@tonic-gate 1937*7c478bd9Sstevel@tonic-gate for (indefinite = (count == 0); indefinite || count; count--) { 1938*7c478bd9Sstevel@tonic-gate 1939*7c478bd9Sstevel@tonic-gate (void) sigsuspend(&set); 1940*7c478bd9Sstevel@tonic-gate 1941*7c478bd9Sstevel@tonic-gate if (g_winch) { 1942*7c478bd9Sstevel@tonic-gate g_winch = 0; 1943*7c478bd9Sstevel@tonic-gate continue; 1944*7c478bd9Sstevel@tonic-gate } 1945*7c478bd9Sstevel@tonic-gate 1946*7c478bd9Sstevel@tonic-gate if (g_child_exited && g_exec_errno != 0) { 1947*7c478bd9Sstevel@tonic-gate errno = g_exec_errno; 1948*7c478bd9Sstevel@tonic-gate fatal("could not execute %s", argv[optind]); 1949*7c478bd9Sstevel@tonic-gate } 1950*7c478bd9Sstevel@tonic-gate 1951*7c478bd9Sstevel@tonic-gate if (ioctl(g_fd, TSTATIOC_READ, g_data[g_gen]) == -1) 1952*7c478bd9Sstevel@tonic-gate fatal("TSTATIOC_READ failed"); 1953*7c478bd9Sstevel@tonic-gate 1954*7c478bd9Sstevel@tonic-gate /* 1955*7c478bd9Sstevel@tonic-gate * Before we blithely print the data, we need to 1956*7c478bd9Sstevel@tonic-gate * make sure that we haven't lost a CPU. 1957*7c478bd9Sstevel@tonic-gate */ 1958*7c478bd9Sstevel@tonic-gate check_data(g_data[g_gen], g_data[g_gen ^ 1]); 1959*7c478bd9Sstevel@tonic-gate (*print)(g_data[g_gen], g_data[g_gen ^ 1]); 1960*7c478bd9Sstevel@tonic-gate (void) fflush(stdout); 1961*7c478bd9Sstevel@tonic-gate 1962*7c478bd9Sstevel@tonic-gate if (g_child_exited) { 1963*7c478bd9Sstevel@tonic-gate if (WIFEXITED(g_child_status)) { 1964*7c478bd9Sstevel@tonic-gate if (WEXITSTATUS(g_child_status) == 0) 1965*7c478bd9Sstevel@tonic-gate break; 1966*7c478bd9Sstevel@tonic-gate 1967*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, TSTAT_COMMAND ": " 1968*7c478bd9Sstevel@tonic-gate "warning: %s exited with code %d\n", 1969*7c478bd9Sstevel@tonic-gate argv[optind], WEXITSTATUS(g_child_status)); 1970*7c478bd9Sstevel@tonic-gate } else { 1971*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, TSTAT_COMMAND ": " 1972*7c478bd9Sstevel@tonic-gate "warning: %s died on signal %d\n", 1973*7c478bd9Sstevel@tonic-gate argv[optind], WTERMSIG(g_child_status)); 1974*7c478bd9Sstevel@tonic-gate } 1975*7c478bd9Sstevel@tonic-gate break; 1976*7c478bd9Sstevel@tonic-gate } 1977*7c478bd9Sstevel@tonic-gate 1978*7c478bd9Sstevel@tonic-gate check_pset(); 1979*7c478bd9Sstevel@tonic-gate 1980*7c478bd9Sstevel@tonic-gate g_gen ^= 1; 1981*7c478bd9Sstevel@tonic-gate } 1982*7c478bd9Sstevel@tonic-gate 1983*7c478bd9Sstevel@tonic-gate return (0); 1984*7c478bd9Sstevel@tonic-gate } 1985