66448911ac89c254e89afc52e114402115a497e3David Höppner/*
66448911ac89c254e89afc52e114402115a497e3David Höppner * CDDL HEADER START
66448911ac89c254e89afc52e114402115a497e3David Höppner *
66448911ac89c254e89afc52e114402115a497e3David Höppner * The contents of this file are subject to the terms of the
66448911ac89c254e89afc52e114402115a497e3David Höppner * Common Development and Distribution License (the "License").
66448911ac89c254e89afc52e114402115a497e3David Höppner * You may not use this file except in compliance with the License.
66448911ac89c254e89afc52e114402115a497e3David Höppner *
66448911ac89c254e89afc52e114402115a497e3David Höppner * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
66448911ac89c254e89afc52e114402115a497e3David Höppner * or http://www.opensolaris.org/os/licensing.
66448911ac89c254e89afc52e114402115a497e3David Höppner * See the License for the specific language governing permissions
66448911ac89c254e89afc52e114402115a497e3David Höppner * and limitations under the License.
66448911ac89c254e89afc52e114402115a497e3David Höppner *
66448911ac89c254e89afc52e114402115a497e3David Höppner * When distributing Covered Code, include this CDDL HEADER in each
66448911ac89c254e89afc52e114402115a497e3David Höppner * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
66448911ac89c254e89afc52e114402115a497e3David Höppner * If applicable, add the following below this CDDL HEADER, with the
66448911ac89c254e89afc52e114402115a497e3David Höppner * fields enclosed by brackets "[]" replaced with your own identifying
66448911ac89c254e89afc52e114402115a497e3David Höppner * information: Portions Copyright [yyyy] [name of copyright owner]
66448911ac89c254e89afc52e114402115a497e3David Höppner *
66448911ac89c254e89afc52e114402115a497e3David Höppner * CDDL HEADER END
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner/*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
66448911ac89c254e89afc52e114402115a497e3David Höppner * Copyright (c) 2013 David Hoeppner. All rights reserved.
66448911ac89c254e89afc52e114402115a497e3David Höppner * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
6a19b8666104dbf912da5a4fb193c9c2b29e21bbRobert Mustacchi * Copyright 2016 Joyent, Inc.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner/*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Display kernel statistics
66448911ac89c254e89afc52e114402115a497e3David Höppner *
66448911ac89c254e89afc52e114402115a497e3David Höppner * This is a reimplementation of the perl kstat command originally found
66448911ac89c254e89afc52e114402115a497e3David Höppner * under usr/src/cmd/kstat/kstat.pl
66448911ac89c254e89afc52e114402115a497e3David Höppner *
66448911ac89c254e89afc52e114402115a497e3David Höppner * Incompatibilities:
66448911ac89c254e89afc52e114402115a497e3David Höppner * - perl regular expressions replaced with extended REs bracketed by '/'
66448911ac89c254e89afc52e114402115a497e3David Höppner *
66448911ac89c254e89afc52e114402115a497e3David Höppner * Flags added:
66448911ac89c254e89afc52e114402115a497e3David Höppner * -C similar to the -p option but value is separated by a colon
66448911ac89c254e89afc52e114402115a497e3David Höppner * -h display help
66448911ac89c254e89afc52e114402115a497e3David Höppner * -j json format
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <assert.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <ctype.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <errno.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <kstat.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <langinfo.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <libgen.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <limits.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <locale.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <signal.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <stddef.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <stdio.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <stdlib.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <string.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <strings.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <time.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <unistd.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <sys/list.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <sys/time.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner#include <sys/types.h>
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner#include "kstat.h"
66448911ac89c254e89afc52e114402115a497e3David Höppner#include "statcommon.h"
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppnerchar *cmdname = "kstat"; /* Name of this command */
66448911ac89c254e89afc52e114402115a497e3David Höppnerint caught_cont = 0; /* Have caught a SIGCONT */
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic uint_t g_timestamp_fmt = NODATE;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner/* Helper flag - header was printed already? */
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic boolean_t g_headerflg;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner/* Saved command line options */
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic boolean_t g_cflg = B_FALSE;
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic boolean_t g_jflg = B_FALSE;
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic boolean_t g_lflg = B_FALSE;
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic boolean_t g_pflg = B_FALSE;
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic boolean_t g_qflg = B_FALSE;
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic ks_pattern_t g_ks_class = {"*", 0};
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner/* Return zero if a selector did match */
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic int g_matched = 1;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner/* Sorted list of kstat instances */
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic list_t instances_list;
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic list_t selector_list;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppnerint
66448911ac89c254e89afc52e114402115a497e3David Höppnermain(int argc, char **argv)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_selector_t *nselector;
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_selector_t *uselector;
66448911ac89c254e89afc52e114402115a497e3David Höppner kstat_ctl_t *kc;
66448911ac89c254e89afc52e114402115a497e3David Höppner hrtime_t start_n;
66448911ac89c254e89afc52e114402115a497e3David Höppner hrtime_t period_n;
66448911ac89c254e89afc52e114402115a497e3David Höppner boolean_t errflg = B_FALSE;
66448911ac89c254e89afc52e114402115a497e3David Höppner boolean_t nselflg = B_FALSE;
66448911ac89c254e89afc52e114402115a497e3David Höppner boolean_t uselflg = B_FALSE;
66448911ac89c254e89afc52e114402115a497e3David Höppner char *q;
66448911ac89c254e89afc52e114402115a497e3David Höppner int count = 1;
66448911ac89c254e89afc52e114402115a497e3David Höppner int infinite_cycles = 0;
66448911ac89c254e89afc52e114402115a497e3David Höppner int interval = 0;
66448911ac89c254e89afc52e114402115a497e3David Höppner int n = 0;
66448911ac89c254e89afc52e114402115a497e3David Höppner int c, m, tmp;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) setlocale(LC_ALL, "");
66448911ac89c254e89afc52e114402115a497e3David Höppner#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
66448911ac89c254e89afc52e114402115a497e3David Höppner#define TEXT_DOMAIN "SYS_TEST" /* Use this only if it wasn't */
66448911ac89c254e89afc52e114402115a497e3David Höppner#endif
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) textdomain(TEXT_DOMAIN);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner /*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Create the selector list and a dummy default selector to match
66448911ac89c254e89afc52e114402115a497e3David Höppner * everything. While we process the cmdline options we will add
66448911ac89c254e89afc52e114402115a497e3David Höppner * selectors to this list.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppner list_create(&selector_list, sizeof (ks_selector_t),
66448911ac89c254e89afc52e114402115a497e3David Höppner offsetof(ks_selector_t, ks_next));
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner nselector = new_selector();
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner /*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Parse named command line arguments.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppner while ((c = getopt(argc, argv, "h?CqjlpT:m:i:n:s:c:")) != EOF)
66448911ac89c254e89afc52e114402115a497e3David Höppner switch (c) {
66448911ac89c254e89afc52e114402115a497e3David Höppner case 'h':
66448911ac89c254e89afc52e114402115a497e3David Höppner case '?':
66448911ac89c254e89afc52e114402115a497e3David Höppner usage();
66448911ac89c254e89afc52e114402115a497e3David Höppner exit(0);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case 'C':
66448911ac89c254e89afc52e114402115a497e3David Höppner g_pflg = g_cflg = B_TRUE;
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case 'q':
66448911ac89c254e89afc52e114402115a497e3David Höppner g_qflg = B_TRUE;
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case 'j':
66448911ac89c254e89afc52e114402115a497e3David Höppner g_jflg = B_TRUE;
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case 'l':
66448911ac89c254e89afc52e114402115a497e3David Höppner g_pflg = g_lflg = B_TRUE;
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case 'p':
66448911ac89c254e89afc52e114402115a497e3David Höppner g_pflg = B_TRUE;
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case 'T':
66448911ac89c254e89afc52e114402115a497e3David Höppner switch (*optarg) {
66448911ac89c254e89afc52e114402115a497e3David Höppner case 'd':
66448911ac89c254e89afc52e114402115a497e3David Höppner g_timestamp_fmt = DDATE;
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case 'u':
66448911ac89c254e89afc52e114402115a497e3David Höppner g_timestamp_fmt = UDATE;
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner default:
66448911ac89c254e89afc52e114402115a497e3David Höppner errflg = B_TRUE;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case 'm':
66448911ac89c254e89afc52e114402115a497e3David Höppner nselflg = B_TRUE;
66448911ac89c254e89afc52e114402115a497e3David Höppner nselector->ks_module.pstr =
66448911ac89c254e89afc52e114402115a497e3David Höppner (char *)ks_safe_strdup(optarg);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case 'i':
66448911ac89c254e89afc52e114402115a497e3David Höppner nselflg = B_TRUE;
66448911ac89c254e89afc52e114402115a497e3David Höppner nselector->ks_instance.pstr =
66448911ac89c254e89afc52e114402115a497e3David Höppner (char *)ks_safe_strdup(optarg);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case 'n':
66448911ac89c254e89afc52e114402115a497e3David Höppner nselflg = B_TRUE;
66448911ac89c254e89afc52e114402115a497e3David Höppner nselector->ks_name.pstr =
66448911ac89c254e89afc52e114402115a497e3David Höppner (char *)ks_safe_strdup(optarg);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case 's':
66448911ac89c254e89afc52e114402115a497e3David Höppner nselflg = B_TRUE;
66448911ac89c254e89afc52e114402115a497e3David Höppner nselector->ks_statistic.pstr =
66448911ac89c254e89afc52e114402115a497e3David Höppner (char *)ks_safe_strdup(optarg);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case 'c':
66448911ac89c254e89afc52e114402115a497e3David Höppner g_ks_class.pstr =
66448911ac89c254e89afc52e114402115a497e3David Höppner (char *)ks_safe_strdup(optarg);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner default:
66448911ac89c254e89afc52e114402115a497e3David Höppner errflg = B_TRUE;
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (g_qflg && (g_jflg || g_pflg)) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stderr, gettext(
66448911ac89c254e89afc52e114402115a497e3David Höppner "-q and -lpj are mutually exclusive\n"));
66448911ac89c254e89afc52e114402115a497e3David Höppner errflg = B_TRUE;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (errflg) {
66448911ac89c254e89afc52e114402115a497e3David Höppner usage();
66448911ac89c254e89afc52e114402115a497e3David Höppner exit(2);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner argc -= optind;
66448911ac89c254e89afc52e114402115a497e3David Höppner argv += optind;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner /*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Consume the rest of the command line. Parsing the
66448911ac89c254e89afc52e114402115a497e3David Höppner * unnamed command line arguments.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppner while (argc--) {
66448911ac89c254e89afc52e114402115a497e3David Höppner errno = 0;
66448911ac89c254e89afc52e114402115a497e3David Höppner tmp = strtoul(*argv, &q, 10);
66448911ac89c254e89afc52e114402115a497e3David Höppner if (tmp == ULONG_MAX && errno == ERANGE) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (n == 0) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stderr, gettext(
66448911ac89c254e89afc52e114402115a497e3David Höppner "Interval is too large\n"));
66448911ac89c254e89afc52e114402115a497e3David Höppner } else if (n == 1) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stderr, gettext(
66448911ac89c254e89afc52e114402115a497e3David Höppner "Count is too large\n"));
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner usage();
66448911ac89c254e89afc52e114402115a497e3David Höppner exit(2);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (errno != 0 || *q != '\0') {
66448911ac89c254e89afc52e114402115a497e3David Höppner m = 0;
66448911ac89c254e89afc52e114402115a497e3David Höppner uselector = new_selector();
66448911ac89c254e89afc52e114402115a497e3David Höppner while ((q = (char *)strsep(argv, ":")) != NULL) {
66448911ac89c254e89afc52e114402115a497e3David Höppner m++;
66448911ac89c254e89afc52e114402115a497e3David Höppner if (m > 4) {
66448911ac89c254e89afc52e114402115a497e3David Höppner free(uselector);
66448911ac89c254e89afc52e114402115a497e3David Höppner usage();
66448911ac89c254e89afc52e114402115a497e3David Höppner exit(2);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (*q != '\0') {
66448911ac89c254e89afc52e114402115a497e3David Höppner switch (m) {
66448911ac89c254e89afc52e114402115a497e3David Höppner case 1:
66448911ac89c254e89afc52e114402115a497e3David Höppner uselector->ks_module.pstr =
66448911ac89c254e89afc52e114402115a497e3David Höppner (char *)ks_safe_strdup(q);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case 2:
66448911ac89c254e89afc52e114402115a497e3David Höppner uselector->ks_instance.pstr =
66448911ac89c254e89afc52e114402115a497e3David Höppner (char *)ks_safe_strdup(q);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case 3:
66448911ac89c254e89afc52e114402115a497e3David Höppner uselector->ks_name.pstr =
66448911ac89c254e89afc52e114402115a497e3David Höppner (char *)ks_safe_strdup(q);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case 4:
66448911ac89c254e89afc52e114402115a497e3David Höppner uselector->ks_statistic.pstr =
66448911ac89c254e89afc52e114402115a497e3David Höppner (char *)ks_safe_strdup(q);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner default:
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(B_FALSE);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner uselflg = B_TRUE;
66448911ac89c254e89afc52e114402115a497e3David Höppner list_insert_tail(&selector_list, uselector);
66448911ac89c254e89afc52e114402115a497e3David Höppner } else {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (tmp < 1) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (n == 0) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stderr, gettext(
66448911ac89c254e89afc52e114402115a497e3David Höppner "Interval must be an "
66448911ac89c254e89afc52e114402115a497e3David Höppner "integer >= 1"));
66448911ac89c254e89afc52e114402115a497e3David Höppner } else if (n == 1) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stderr, gettext(
66448911ac89c254e89afc52e114402115a497e3David Höppner "Count must be an integer >= 1"));
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner usage();
66448911ac89c254e89afc52e114402115a497e3David Höppner exit(2);
66448911ac89c254e89afc52e114402115a497e3David Höppner } else {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (n == 0) {
66448911ac89c254e89afc52e114402115a497e3David Höppner interval = tmp;
66448911ac89c254e89afc52e114402115a497e3David Höppner count = -1;
66448911ac89c254e89afc52e114402115a497e3David Höppner } else if (n == 1) {
66448911ac89c254e89afc52e114402115a497e3David Höppner count = tmp;
66448911ac89c254e89afc52e114402115a497e3David Höppner } else {
66448911ac89c254e89afc52e114402115a497e3David Höppner usage();
66448911ac89c254e89afc52e114402115a497e3David Höppner exit(2);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner n++;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner argv++;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner /*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Check if we founded a named selector on the cmdline.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppner if (uselflg) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (nselflg) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stderr, gettext(
617413d1af18e7e9e5c76f416263615bbf1174a5Richard Lowe "[module[:instance[:name[:statistic]]]] and "
66448911ac89c254e89afc52e114402115a497e3David Höppner "-m -i -n -s are mutually exclusive"));
66448911ac89c254e89afc52e114402115a497e3David Höppner usage();
66448911ac89c254e89afc52e114402115a497e3David Höppner exit(2);
66448911ac89c254e89afc52e114402115a497e3David Höppner } else {
66448911ac89c254e89afc52e114402115a497e3David Höppner free(nselector);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner } else {
66448911ac89c254e89afc52e114402115a497e3David Höppner list_insert_tail(&selector_list, nselector);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(!list_is_empty(&selector_list));
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner list_create(&instances_list, sizeof (ks_instance_t),
66448911ac89c254e89afc52e114402115a497e3David Höppner offsetof(ks_instance_t, ks_next));
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner while ((kc = kstat_open()) == NULL) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (errno == EAGAIN) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) poll(NULL, 0, 200);
66448911ac89c254e89afc52e114402115a497e3David Höppner } else {
66448911ac89c254e89afc52e114402115a497e3David Höppner perror("kstat_open");
66448911ac89c254e89afc52e114402115a497e3David Höppner exit(3);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (count > 1) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (signal(SIGCONT, cont_handler) == SIG_ERR) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stderr, gettext(
66448911ac89c254e89afc52e114402115a497e3David Höppner "signal failed"));
66448911ac89c254e89afc52e114402115a497e3David Höppner exit(3);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner period_n = (hrtime_t)interval * NANOSEC;
66448911ac89c254e89afc52e114402115a497e3David Höppner start_n = gethrtime();
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner while (count == -1 || count-- > 0) {
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_instances_read(kc);
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_instances_print();
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (interval && count) {
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_sleep_until(&start_n, period_n, infinite_cycles,
66448911ac89c254e89afc52e114402115a497e3David Höppner &caught_cont);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) kstat_chain_update(kc);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) putchar('\n');
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) kstat_close(kc);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner return (g_matched);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner/*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Print usage.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnerusage(void)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stderr, gettext(
66448911ac89c254e89afc52e114402115a497e3David Höppner "Usage:\n"
66448911ac89c254e89afc52e114402115a497e3David Höppner "kstat [ -Cjlpq ] [ -T d|u ] [ -c class ]\n"
66448911ac89c254e89afc52e114402115a497e3David Höppner " [ -m module ] [ -i instance ] [ -n name ] [ -s statistic ]\n"
66448911ac89c254e89afc52e114402115a497e3David Höppner " [ interval [ count ] ]\n"
66448911ac89c254e89afc52e114402115a497e3David Höppner "kstat [ -Cjlpq ] [ -T d|u ] [ -c class ]\n"
617413d1af18e7e9e5c76f416263615bbf1174a5Richard Lowe " [ module[:instance[:name[:statistic]]] ... ]\n"
66448911ac89c254e89afc52e114402115a497e3David Höppner " [ interval [ count ] ]\n"));
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner/*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Sort compare function.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic int
66448911ac89c254e89afc52e114402115a497e3David Höppnercompare_instances(ks_instance_t *l_arg, ks_instance_t *r_arg)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner int rval;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner rval = strcasecmp(l_arg->ks_module, r_arg->ks_module);
66448911ac89c254e89afc52e114402115a497e3David Höppner if (rval == 0) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (l_arg->ks_instance == r_arg->ks_instance) {
66448911ac89c254e89afc52e114402115a497e3David Höppner return (strcasecmp(l_arg->ks_name, r_arg->ks_name));
66448911ac89c254e89afc52e114402115a497e3David Höppner } else if (l_arg->ks_instance < r_arg->ks_instance) {
66448911ac89c254e89afc52e114402115a497e3David Höppner return (-1);
66448911ac89c254e89afc52e114402115a497e3David Höppner } else {
66448911ac89c254e89afc52e114402115a497e3David Höppner return (1);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner } else {
66448911ac89c254e89afc52e114402115a497e3David Höppner return (rval);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic char *
66448911ac89c254e89afc52e114402115a497e3David Höppnerks_safe_strdup(char *str)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner char *ret;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (str == NULL) {
66448911ac89c254e89afc52e114402115a497e3David Höppner return (NULL);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner while ((ret = strdup(str)) == NULL) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (errno == EAGAIN) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) poll(NULL, 0, 200);
66448911ac89c254e89afc52e114402115a497e3David Höppner } else {
66448911ac89c254e89afc52e114402115a497e3David Höppner perror("strdup");
66448911ac89c254e89afc52e114402115a497e3David Höppner exit(3);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner return (ret);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnerks_sleep_until(hrtime_t *wakeup, hrtime_t interval, int forever,
66448911ac89c254e89afc52e114402115a497e3David Höppner int *caught_cont)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner hrtime_t now, pause, pause_left;
66448911ac89c254e89afc52e114402115a497e3David Höppner struct timespec pause_tv;
66448911ac89c254e89afc52e114402115a497e3David Höppner int status;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner now = gethrtime();
66448911ac89c254e89afc52e114402115a497e3David Höppner pause = *wakeup + interval - now;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (pause <= 0 || pause < (interval / 4)) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (forever || *caught_cont) {
66448911ac89c254e89afc52e114402115a497e3David Höppner *wakeup = now + interval;
66448911ac89c254e89afc52e114402115a497e3David Höppner pause = interval;
66448911ac89c254e89afc52e114402115a497e3David Höppner } else {
66448911ac89c254e89afc52e114402115a497e3David Höppner pause = interval / 2;
66448911ac89c254e89afc52e114402115a497e3David Höppner *wakeup += interval;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner } else {
66448911ac89c254e89afc52e114402115a497e3David Höppner *wakeup += interval;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (pause < 1000) {
66448911ac89c254e89afc52e114402115a497e3David Höppner return;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner pause_left = pause;
66448911ac89c254e89afc52e114402115a497e3David Höppner do {
66448911ac89c254e89afc52e114402115a497e3David Höppner pause_tv.tv_sec = pause_left / NANOSEC;
66448911ac89c254e89afc52e114402115a497e3David Höppner pause_tv.tv_nsec = pause_left % NANOSEC;
66448911ac89c254e89afc52e114402115a497e3David Höppner status = nanosleep(&pause_tv, (struct timespec *)NULL);
66448911ac89c254e89afc52e114402115a497e3David Höppner if (status < 0) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (errno == EINTR) {
66448911ac89c254e89afc52e114402115a497e3David Höppner now = gethrtime();
66448911ac89c254e89afc52e114402115a497e3David Höppner pause_left = *wakeup - now;
66448911ac89c254e89afc52e114402115a497e3David Höppner if (pause_left < 1000) {
66448911ac89c254e89afc52e114402115a497e3David Höppner return;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner } else {
66448911ac89c254e89afc52e114402115a497e3David Höppner perror("nanosleep");
66448911ac89c254e89afc52e114402115a497e3David Höppner exit(3);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner } while (status != 0);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner/*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Inserts an instance in the per selector list.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnernvpair_insert(ks_instance_t *ksi, char *name, ks_value_t *value,
66448911ac89c254e89afc52e114402115a497e3David Höppner uchar_t data_type)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_nvpair_t *instance;
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_nvpair_t *tmp;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner instance = (ks_nvpair_t *)malloc(sizeof (ks_nvpair_t));
66448911ac89c254e89afc52e114402115a497e3David Höppner if (instance == NULL) {
66448911ac89c254e89afc52e114402115a497e3David Höppner perror("malloc");
66448911ac89c254e89afc52e114402115a497e3David Höppner exit(3);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) strlcpy(instance->name, name, KSTAT_STRLEN);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) memcpy(&instance->value, value, sizeof (ks_value_t));
66448911ac89c254e89afc52e114402115a497e3David Höppner instance->data_type = data_type;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner tmp = list_head(&ksi->ks_nvlist);
66448911ac89c254e89afc52e114402115a497e3David Höppner while (tmp != NULL && strcasecmp(instance->name, tmp->name) > 0)
66448911ac89c254e89afc52e114402115a497e3David Höppner tmp = list_next(&ksi->ks_nvlist, tmp);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner list_insert_before(&ksi->ks_nvlist, tmp, instance);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner/*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Allocates a new all-matching selector.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic ks_selector_t *
66448911ac89c254e89afc52e114402115a497e3David Höppnernew_selector(void)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_selector_t *selector;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner selector = (ks_selector_t *)malloc(sizeof (ks_selector_t));
66448911ac89c254e89afc52e114402115a497e3David Höppner if (selector == NULL) {
66448911ac89c254e89afc52e114402115a497e3David Höppner perror("malloc");
66448911ac89c254e89afc52e114402115a497e3David Höppner exit(3);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner list_link_init(&selector->ks_next);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner selector->ks_module.pstr = "*";
66448911ac89c254e89afc52e114402115a497e3David Höppner selector->ks_instance.pstr = "*";
66448911ac89c254e89afc52e114402115a497e3David Höppner selector->ks_name.pstr = "*";
66448911ac89c254e89afc52e114402115a497e3David Höppner selector->ks_statistic.pstr = "*";
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner return (selector);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner/*
66448911ac89c254e89afc52e114402115a497e3David Höppner * This function was taken from the perl kstat module code - please
66448911ac89c254e89afc52e114402115a497e3David Höppner * see for further comments there.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic kstat_raw_reader_t
66448911ac89c254e89afc52e114402115a497e3David Höppnerlookup_raw_kstat_fn(char *module, char *name)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner char key[KSTAT_STRLEN * 2];
66448911ac89c254e89afc52e114402115a497e3David Höppner register char *f, *t;
66448911ac89c254e89afc52e114402115a497e3David Höppner int n = 0;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner for (f = module, t = key; *f != '\0'; f++, t++) {
66448911ac89c254e89afc52e114402115a497e3David Höppner while (*f != '\0' && isdigit(*f))
66448911ac89c254e89afc52e114402115a497e3David Höppner f++;
66448911ac89c254e89afc52e114402115a497e3David Höppner *t = *f;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner *t++ = ':';
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner for (f = name; *f != '\0'; f++, t++) {
66448911ac89c254e89afc52e114402115a497e3David Höppner while (*f != '\0' && isdigit(*f))
66448911ac89c254e89afc52e114402115a497e3David Höppner f++;
66448911ac89c254e89afc52e114402115a497e3David Höppner *t = *f;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner *t = '\0';
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner while (ks_raw_lookup[n].fn != NULL) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (strncmp(ks_raw_lookup[n].name, key, strlen(key)) == 0)
66448911ac89c254e89afc52e114402115a497e3David Höppner return (ks_raw_lookup[n].fn);
66448911ac89c254e89afc52e114402115a497e3David Höppner n++;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner return (0);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner/*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Match a string against a shell glob or extended regular expression.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic boolean_t
66448911ac89c254e89afc52e114402115a497e3David Höppnerks_match(const char *str, ks_pattern_t *pattern)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner int regcode;
66448911ac89c254e89afc52e114402115a497e3David Höppner char *regstr;
66448911ac89c254e89afc52e114402115a497e3David Höppner char *errbuf;
66448911ac89c254e89afc52e114402115a497e3David Höppner size_t bufsz;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (pattern->pstr != NULL && gmatch(pattern->pstr, "/*/") != 0) {
66448911ac89c254e89afc52e114402115a497e3David Höppner /* All regex patterns are strdup'd copies */
66448911ac89c254e89afc52e114402115a497e3David Höppner regstr = pattern->pstr + 1;
66448911ac89c254e89afc52e114402115a497e3David Höppner *(strrchr(regstr, '/')) = '\0';
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner regcode = regcomp(&pattern->preg, regstr,
66448911ac89c254e89afc52e114402115a497e3David Höppner REG_EXTENDED | REG_NOSUB);
66448911ac89c254e89afc52e114402115a497e3David Höppner if (regcode != 0) {
66448911ac89c254e89afc52e114402115a497e3David Höppner bufsz = regerror(regcode, NULL, NULL, 0);
66448911ac89c254e89afc52e114402115a497e3David Höppner if (bufsz != 0) {
66448911ac89c254e89afc52e114402115a497e3David Höppner errbuf = malloc(bufsz);
66448911ac89c254e89afc52e114402115a497e3David Höppner if (errbuf == NULL) {
66448911ac89c254e89afc52e114402115a497e3David Höppner perror("malloc");
66448911ac89c254e89afc52e114402115a497e3David Höppner exit(3);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) regerror(regcode, NULL, errbuf, bufsz);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stderr, "kstat: %s\n", errbuf);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner usage();
66448911ac89c254e89afc52e114402115a497e3David Höppner exit(2);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner pattern->pstr = NULL;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (pattern->pstr == NULL) {
66448911ac89c254e89afc52e114402115a497e3David Höppner return (regexec(&pattern->preg, str, 0, NULL, 0) == 0);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner return ((gmatch(str, pattern->pstr) != 0));
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner/*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Iterate over all kernel statistics and save matches.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnerks_instances_read(kstat_ctl_t *kc)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner kstat_raw_reader_t save_raw = NULL;
66448911ac89c254e89afc52e114402115a497e3David Höppner kid_t id;
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_selector_t *selector;
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_instance_t *ksi;
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_instance_t *tmp;
66448911ac89c254e89afc52e114402115a497e3David Höppner kstat_t *kp;
66448911ac89c254e89afc52e114402115a497e3David Höppner boolean_t skip;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner for (kp = kc->kc_chain; kp != NULL; kp = kp->ks_next) {
66448911ac89c254e89afc52e114402115a497e3David Höppner /* Don't bother storing the kstat headers */
66448911ac89c254e89afc52e114402115a497e3David Höppner if (strncmp(kp->ks_name, "kstat_", 6) == 0) {
66448911ac89c254e89afc52e114402115a497e3David Höppner continue;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner /* Don't bother storing raw stats we don't understand */
66448911ac89c254e89afc52e114402115a497e3David Höppner if (kp->ks_type == KSTAT_TYPE_RAW) {
66448911ac89c254e89afc52e114402115a497e3David Höppner save_raw = lookup_raw_kstat_fn(kp->ks_module,
66448911ac89c254e89afc52e114402115a497e3David Höppner kp->ks_name);
66448911ac89c254e89afc52e114402115a497e3David Höppner if (save_raw == NULL) {
66448911ac89c254e89afc52e114402115a497e3David Höppner#ifdef REPORT_UNKNOWN
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stderr,
66448911ac89c254e89afc52e114402115a497e3David Höppner "Unknown kstat type %s:%d:%s - "
66448911ac89c254e89afc52e114402115a497e3David Höppner "%d of size %d\n", kp->ks_module,
66448911ac89c254e89afc52e114402115a497e3David Höppner kp->ks_instance, kp->ks_name,
66448911ac89c254e89afc52e114402115a497e3David Höppner kp->ks_ndata, kp->ks_data_size);
66448911ac89c254e89afc52e114402115a497e3David Höppner#endif
66448911ac89c254e89afc52e114402115a497e3David Höppner continue;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner /*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Iterate over the list of selectors and skip
66448911ac89c254e89afc52e114402115a497e3David Höppner * instances we dont want. We filter for statistics
66448911ac89c254e89afc52e114402115a497e3David Höppner * later, as we dont know them yet.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppner skip = B_TRUE;
66448911ac89c254e89afc52e114402115a497e3David Höppner selector = list_head(&selector_list);
66448911ac89c254e89afc52e114402115a497e3David Höppner while (selector != NULL) {
9736aecd323ba323a24c159dc877b29795d68a0aBryan Cantrill if (ks_match(kp->ks_module, &selector->ks_module) &&
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_match(kp->ks_name, &selector->ks_name)) {
66448911ac89c254e89afc52e114402115a497e3David Höppner skip = B_FALSE;
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner selector = list_next(&selector_list, selector);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (skip) {
66448911ac89c254e89afc52e114402115a497e3David Höppner continue;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner /*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Allocate a new instance and fill in the values
66448911ac89c254e89afc52e114402115a497e3David Höppner * we know so far.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppner ksi = (ks_instance_t *)malloc(sizeof (ks_instance_t));
66448911ac89c254e89afc52e114402115a497e3David Höppner if (ksi == NULL) {
66448911ac89c254e89afc52e114402115a497e3David Höppner perror("malloc");
66448911ac89c254e89afc52e114402115a497e3David Höppner exit(3);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner list_link_init(&ksi->ks_next);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) strlcpy(ksi->ks_module, kp->ks_module, KSTAT_STRLEN);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) strlcpy(ksi->ks_name, kp->ks_name, KSTAT_STRLEN);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) strlcpy(ksi->ks_class, kp->ks_class, KSTAT_STRLEN);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner ksi->ks_instance = kp->ks_instance;
66448911ac89c254e89afc52e114402115a497e3David Höppner ksi->ks_snaptime = kp->ks_snaptime;
66448911ac89c254e89afc52e114402115a497e3David Höppner ksi->ks_type = kp->ks_type;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner list_create(&ksi->ks_nvlist, sizeof (ks_nvpair_t),
66448911ac89c254e89afc52e114402115a497e3David Höppner offsetof(ks_nvpair_t, nv_next));
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_HRTIME_X(ksi, "crtime", kp->ks_crtime);
66448911ac89c254e89afc52e114402115a497e3David Höppner if (g_pflg) {
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_STRING_X(ksi, "class", kp->ks_class);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner /* Insert this instance into a sorted list */
66448911ac89c254e89afc52e114402115a497e3David Höppner tmp = list_head(&instances_list);
66448911ac89c254e89afc52e114402115a497e3David Höppner while (tmp != NULL && compare_instances(ksi, tmp) > 0)
66448911ac89c254e89afc52e114402115a497e3David Höppner tmp = list_next(&instances_list, tmp);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner list_insert_before(&instances_list, tmp, ksi);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner /* Read the actual statistics */
66448911ac89c254e89afc52e114402115a497e3David Höppner id = kstat_read(kc, kp, NULL);
66448911ac89c254e89afc52e114402115a497e3David Höppner if (id == -1) {
66448911ac89c254e89afc52e114402115a497e3David Höppner#ifdef REPORT_UNKNOWN
66448911ac89c254e89afc52e114402115a497e3David Höppner perror("kstat_read");
66448911ac89c254e89afc52e114402115a497e3David Höppner#endif
66448911ac89c254e89afc52e114402115a497e3David Höppner continue;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
6a19b8666104dbf912da5a4fb193c9c2b29e21bbRobert Mustacchi SAVE_HRTIME_X(ksi, "snaptime", kp->ks_snaptime);
6a19b8666104dbf912da5a4fb193c9c2b29e21bbRobert Mustacchi
66448911ac89c254e89afc52e114402115a497e3David Höppner switch (kp->ks_type) {
66448911ac89c254e89afc52e114402115a497e3David Höppner case KSTAT_TYPE_RAW:
66448911ac89c254e89afc52e114402115a497e3David Höppner save_raw(kp, ksi);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case KSTAT_TYPE_NAMED:
66448911ac89c254e89afc52e114402115a497e3David Höppner save_named(kp, ksi);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case KSTAT_TYPE_INTR:
66448911ac89c254e89afc52e114402115a497e3David Höppner save_intr(kp, ksi);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case KSTAT_TYPE_IO:
66448911ac89c254e89afc52e114402115a497e3David Höppner save_io(kp, ksi);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case KSTAT_TYPE_TIMER:
66448911ac89c254e89afc52e114402115a497e3David Höppner save_timer(kp, ksi);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner default:
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(B_FALSE); /* Invalid type */
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner/*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Print the value of a name-value pair.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnerks_value_print(ks_nvpair_t *nvpair)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner switch (nvpair->data_type) {
66448911ac89c254e89afc52e114402115a497e3David Höppner case KSTAT_DATA_CHAR:
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "%s", nvpair->value.c);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case KSTAT_DATA_INT32:
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "%d", nvpair->value.i32);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case KSTAT_DATA_UINT32:
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "%u", nvpair->value.ui32);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case KSTAT_DATA_INT64:
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "%lld", nvpair->value.i64);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case KSTAT_DATA_UINT64:
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "%llu", nvpair->value.ui64);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case KSTAT_DATA_STRING:
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "%s", KSTAT_NAMED_STR_PTR(nvpair));
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case KSTAT_DATA_HRTIME:
66448911ac89c254e89afc52e114402115a497e3David Höppner if (nvpair->value.ui64 == 0)
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "0");
66448911ac89c254e89afc52e114402115a497e3David Höppner else
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "%.9f",
66448911ac89c254e89afc52e114402115a497e3David Höppner nvpair->value.ui64 / 1000000000.0);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner default:
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(B_FALSE);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner/*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Print a single instance.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnerks_instance_print(ks_instance_t *ksi, ks_nvpair_t *nvpair)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner if (g_headerflg) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (!g_pflg) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, DFLT_FMT,
66448911ac89c254e89afc52e114402115a497e3David Höppner ksi->ks_module, ksi->ks_instance,
66448911ac89c254e89afc52e114402115a497e3David Höppner ksi->ks_name, ksi->ks_class);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner g_headerflg = B_FALSE;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (g_pflg) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, KS_PFMT,
66448911ac89c254e89afc52e114402115a497e3David Höppner ksi->ks_module, ksi->ks_instance,
66448911ac89c254e89afc52e114402115a497e3David Höppner ksi->ks_name, nvpair->name);
66448911ac89c254e89afc52e114402115a497e3David Höppner if (!g_lflg) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) putchar(g_cflg ? ':': '\t');
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_value_print(nvpair);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner } else {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, KS_DFMT, nvpair->name);
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_value_print(nvpair);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) putchar('\n');
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner/*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Print a single instance in JSON format.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnerks_instance_print_json(ks_instance_t *ksi, ks_nvpair_t *nvpair)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner if (g_headerflg) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, JSON_FMT,
66448911ac89c254e89afc52e114402115a497e3David Höppner ksi->ks_module, ksi->ks_instance,
66448911ac89c254e89afc52e114402115a497e3David Höppner ksi->ks_name, ksi->ks_class,
66448911ac89c254e89afc52e114402115a497e3David Höppner ksi->ks_type);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (ksi->ks_snaptime == 0)
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "\t\"snaptime\": 0,\n");
66448911ac89c254e89afc52e114402115a497e3David Höppner else
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "\t\"snaptime\": %.9f,\n",
66448911ac89c254e89afc52e114402115a497e3David Höppner ksi->ks_snaptime / 1000000000.0);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "\t\"data\": {\n");
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner g_headerflg = B_FALSE;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, KS_JFMT, nvpair->name);
66448911ac89c254e89afc52e114402115a497e3David Höppner if (nvpair->data_type == KSTAT_DATA_STRING) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) putchar('\"');
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_value_print(nvpair);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) putchar('\"');
66448911ac89c254e89afc52e114402115a497e3David Höppner } else {
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_value_print(nvpair);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner if (nvpair != list_tail(&ksi->ks_nvlist))
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) putchar(',');
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) putchar('\n');
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner/*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Print all instances.
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnerks_instances_print(void)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_selector_t *selector;
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_instance_t *ksi, *ktmp;
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_nvpair_t *nvpair, *ntmp;
66448911ac89c254e89afc52e114402115a497e3David Höppner void (*ks_print_fn)(ks_instance_t *, ks_nvpair_t *);
66448911ac89c254e89afc52e114402115a497e3David Höppner char *ks_number;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (g_timestamp_fmt != NODATE)
66448911ac89c254e89afc52e114402115a497e3David Höppner print_timestamp(g_timestamp_fmt);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (g_jflg) {
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_print_fn = &ks_instance_print_json;
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) putchar('[');
66448911ac89c254e89afc52e114402115a497e3David Höppner } else {
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_print_fn = &ks_instance_print;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner /* Iterate over each selector */
66448911ac89c254e89afc52e114402115a497e3David Höppner selector = list_head(&selector_list);
66448911ac89c254e89afc52e114402115a497e3David Höppner while (selector != NULL) {
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner /* Iterate over each instance */
66448911ac89c254e89afc52e114402115a497e3David Höppner for (ksi = list_head(&instances_list); ksi != NULL;
66448911ac89c254e89afc52e114402115a497e3David Höppner ksi = list_next(&instances_list, ksi)) {
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) asprintf(&ks_number, "%d", ksi->ks_instance);
66448911ac89c254e89afc52e114402115a497e3David Höppner if (!(ks_match(ksi->ks_module, &selector->ks_module) &&
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_match(ksi->ks_name, &selector->ks_name) &&
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_match(ks_number, &selector->ks_instance) &&
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_match(ksi->ks_class, &g_ks_class))) {
66448911ac89c254e89afc52e114402115a497e3David Höppner free(ks_number);
66448911ac89c254e89afc52e114402115a497e3David Höppner continue;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner free(ks_number);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner /* Finally iterate over each statistic */
66448911ac89c254e89afc52e114402115a497e3David Höppner g_headerflg = B_TRUE;
66448911ac89c254e89afc52e114402115a497e3David Höppner for (nvpair = list_head(&ksi->ks_nvlist);
66448911ac89c254e89afc52e114402115a497e3David Höppner nvpair != NULL;
66448911ac89c254e89afc52e114402115a497e3David Höppner nvpair = list_next(&ksi->ks_nvlist, nvpair)) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (!ks_match(nvpair->name,
66448911ac89c254e89afc52e114402115a497e3David Höppner &selector->ks_statistic))
66448911ac89c254e89afc52e114402115a497e3David Höppner continue;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner g_matched = 0;
66448911ac89c254e89afc52e114402115a497e3David Höppner if (!g_qflg)
66448911ac89c254e89afc52e114402115a497e3David Höppner (*ks_print_fn)(ksi, nvpair);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (!g_headerflg) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (g_jflg) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "\t}\n}");
66448911ac89c254e89afc52e114402115a497e3David Höppner if (ksi != list_tail(&instances_list))
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) putchar(',');
66448911ac89c254e89afc52e114402115a497e3David Höppner } else if (!g_pflg) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) putchar('\n');
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner selector = list_next(&selector_list, selector);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner if (g_jflg)
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "]\n");
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fflush(stdout);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner /* Free the instances list */
66448911ac89c254e89afc52e114402115a497e3David Höppner ksi = list_head(&instances_list);
66448911ac89c254e89afc52e114402115a497e3David Höppner while (ksi != NULL) {
66448911ac89c254e89afc52e114402115a497e3David Höppner nvpair = list_head(&ksi->ks_nvlist);
66448911ac89c254e89afc52e114402115a497e3David Höppner while (nvpair != NULL) {
66448911ac89c254e89afc52e114402115a497e3David Höppner ntmp = nvpair;
66448911ac89c254e89afc52e114402115a497e3David Höppner nvpair = list_next(&ksi->ks_nvlist, nvpair);
66448911ac89c254e89afc52e114402115a497e3David Höppner list_remove(&ksi->ks_nvlist, ntmp);
66448911ac89c254e89afc52e114402115a497e3David Höppner if (ntmp->data_type == KSTAT_DATA_STRING)
66448911ac89c254e89afc52e114402115a497e3David Höppner free(ntmp->value.str.addr.ptr);
66448911ac89c254e89afc52e114402115a497e3David Höppner free(ntmp);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner ktmp = ksi;
66448911ac89c254e89afc52e114402115a497e3David Höppner ksi = list_next(&instances_list, ksi);
66448911ac89c254e89afc52e114402115a497e3David Höppner list_remove(&instances_list, ktmp);
66448911ac89c254e89afc52e114402115a497e3David Höppner list_destroy(&ktmp->ks_nvlist);
66448911ac89c254e89afc52e114402115a497e3David Höppner free(ktmp);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_cpu_stat(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner cpu_stat_t *stat;
66448911ac89c254e89afc52e114402115a497e3David Höppner cpu_sysinfo_t *sysinfo;
66448911ac89c254e89afc52e114402115a497e3David Höppner cpu_syswait_t *syswait;
66448911ac89c254e89afc52e114402115a497e3David Höppner cpu_vminfo_t *vminfo;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner stat = (cpu_stat_t *)(kp->ks_data);
66448911ac89c254e89afc52e114402115a497e3David Höppner sysinfo = &stat->cpu_sysinfo;
66448911ac89c254e89afc52e114402115a497e3David Höppner syswait = &stat->cpu_syswait;
66448911ac89c254e89afc52e114402115a497e3David Höppner vminfo = &stat->cpu_vminfo;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32_X(ksi, "idle", sysinfo->cpu[CPU_IDLE]);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32_X(ksi, "user", sysinfo->cpu[CPU_USER]);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32_X(ksi, "kernel", sysinfo->cpu[CPU_KERNEL]);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32_X(ksi, "wait", sysinfo->cpu[CPU_WAIT]);
5918f984c877663f045498a174106df2e489ab55Richard Lowe SAVE_UINT32_X(ksi, "wait_io", sysinfo->wait[W_IO]);
5918f984c877663f045498a174106df2e489ab55Richard Lowe SAVE_UINT32_X(ksi, "wait_swap", sysinfo->wait[W_SWAP]);
5918f984c877663f045498a174106df2e489ab55Richard Lowe SAVE_UINT32_X(ksi, "wait_pio", sysinfo->wait[W_PIO]);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, bread);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, bwrite);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, lread);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, lwrite);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, phread);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, phwrite);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, pswitch);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, trap);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, intr);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, syscall);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, sysread);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, syswrite);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, sysfork);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, sysvfork);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, sysexec);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, readch);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, writech);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, rcvint);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, xmtint);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, mdmint);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, rawch);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, canch);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, outch);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, msg);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, sema);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, namei);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, ufsiget);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, ufsdirblk);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, ufsipage);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, ufsinopage);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, inodeovf);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, fileovf);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, procovf);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, intrthread);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, intrblk);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, idlethread);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, inv_swtch);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, nthreads);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, cpumigrate);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, xcalls);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, mutex_adenters);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, rw_rdfails);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, rw_wrfails);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, modload);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, modunload);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, bawrite);
66448911ac89c254e89afc52e114402115a497e3David Höppner#ifdef STATISTICS /* see header file */
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, rw_enters);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, win_uo_cnt);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, win_uu_cnt);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, win_so_cnt);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, win_su_cnt);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, win_suo_cnt);
66448911ac89c254e89afc52e114402115a497e3David Höppner#endif
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, syswait, iowait);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, syswait, swap);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, syswait, physio);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, pgrec);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, pgfrec);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, pgin);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, pgpgin);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, pgout);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, pgpgout);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, swapin);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, pgswapin);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, swapout);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, pgswapout);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, zfod);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, dfree);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, scan);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, rev);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, hat_fault);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, as_fault);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, maj_fault);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, cow_fault);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, prot_fault);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, softlock);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, kernel_asflt);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, pgrrun);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, execpgin);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, execpgout);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, execfree);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, anonpgin);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, anonpgout);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, anonfree);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, fspgin);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, fspgout);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, vminfo, fsfree);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_var(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner struct var *var = (struct var *)(kp->ks_data);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(kp->ks_data_size == sizeof (struct var));
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, var, v_buf);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, var, v_call);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, var, v_proc);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, var, v_maxupttl);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, var, v_nglobpris);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, var, v_maxsyspri);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, var, v_clist);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, var, v_maxup);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, var, v_hbuf);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, var, v_hmask);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, var, v_pbuf);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, var, v_sptmap);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, var, v_maxpmem);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, var, v_autoup);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, var, v_bufhwm);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_ncstats(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner struct ncstats *ncstats = (struct ncstats *)(kp->ks_data);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(kp->ks_data_size == sizeof (struct ncstats));
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, ncstats, hits);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, ncstats, misses);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, ncstats, enters);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, ncstats, dbl_enters);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, ncstats, long_enter);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, ncstats, long_look);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, ncstats, move_to_front);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, ncstats, purges);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_sysinfo(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner sysinfo_t *sysinfo = (sysinfo_t *)(kp->ks_data);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(kp->ks_data_size == sizeof (sysinfo_t));
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, updates);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, runque);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, runocc);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, swpque);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, swpocc);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, sysinfo, waiting);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_vminfo(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner vminfo_t *vminfo = (vminfo_t *)(kp->ks_data);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(kp->ks_data_size == sizeof (vminfo_t));
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT64(ksi, vminfo, freemem);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT64(ksi, vminfo, swap_resv);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT64(ksi, vminfo, swap_alloc);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT64(ksi, vminfo, swap_avail);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT64(ksi, vminfo, swap_free);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT64(ksi, vminfo, updates);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_nfs(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner struct mntinfo_kstat *mntinfo = (struct mntinfo_kstat *)(kp->ks_data);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(kp->ks_data_size == sizeof (struct mntinfo_kstat));
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_STRING(ksi, mntinfo, mik_proto);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, mntinfo, mik_vers);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, mntinfo, mik_flags);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, mntinfo, mik_secmod);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, mntinfo, mik_curread);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, mntinfo, mik_curwrite);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, mntinfo, mik_timeo);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, mntinfo, mik_retrans);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, mntinfo, mik_acregmin);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, mntinfo, mik_acregmax);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, mntinfo, mik_acdirmin);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, mntinfo, mik_acdirmax);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32_X(ksi, "lookup_srtt", mntinfo->mik_timers[0].srtt);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32_X(ksi, "lookup_deviate", mntinfo->mik_timers[0].deviate);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32_X(ksi, "lookup_rtxcur", mntinfo->mik_timers[0].rtxcur);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32_X(ksi, "read_srtt", mntinfo->mik_timers[1].srtt);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32_X(ksi, "read_deviate", mntinfo->mik_timers[1].deviate);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32_X(ksi, "read_rtxcur", mntinfo->mik_timers[1].rtxcur);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32_X(ksi, "write_srtt", mntinfo->mik_timers[2].srtt);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32_X(ksi, "write_deviate", mntinfo->mik_timers[2].deviate);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32_X(ksi, "write_rtxcur", mntinfo->mik_timers[2].rtxcur);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, mntinfo, mik_noresponse);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, mntinfo, mik_failover);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, mntinfo, mik_remap);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_STRING(ksi, mntinfo, mik_curserver);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner#ifdef __sparc
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_sfmmu_global_stat(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner struct sfmmu_global_stat *sfmmug =
66448911ac89c254e89afc52e114402115a497e3David Höppner (struct sfmmu_global_stat *)(kp->ks_data);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(kp->ks_data_size == sizeof (struct sfmmu_global_stat));
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tsb_exceptions);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tsb_raise_exception);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_pagefaults);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_uhash_searches);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_uhash_links);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_khash_searches);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_khash_links);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_swapout);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tsb_alloc);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tsb_allocfail);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tsb_sectsb_create);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_scd_1sttsb_alloc);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_scd_2ndtsb_alloc);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_scd_1sttsb_allocfail);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_scd_2ndtsb_allocfail);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tteload8k);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tteload64k);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tteload512k);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tteload4m);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tteload32m);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tteload256m);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tsb_load8k);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tsb_load4m);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_hblk_hit);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_hblk8_ncreate);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_hblk8_nalloc);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_hblk1_ncreate);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_hblk1_nalloc);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_hblk_slab_cnt);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_hblk_reserve_cnt);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_hblk_recurse_cnt);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_hblk_reserve_hit);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_get_free_success);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_get_free_throttle);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_get_free_fail);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_put_free_success);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_put_free_fail);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_pgcolor_conflict);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_uncache_conflict);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_unload_conflict);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_ism_uncache);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_ism_recache);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_recache);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_steal_count);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_pagesync);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_clrwrt);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_pagesync_invalid);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_kernel_xcalls);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_user_xcalls);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tsb_grow);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tsb_shrink);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tsb_resize_failures);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tsb_reloc);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_user_vtop);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_ctx_inv);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tlb_reprog_pgsz);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_region_remap_demap);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_create_scd);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_join_scd);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_leave_scd);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_destroy_scd);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner#endif
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner#ifdef __sparc
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_sfmmu_tsbsize_stat(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner struct sfmmu_tsbsize_stat *sfmmut;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(kp->ks_data_size == sizeof (struct sfmmu_tsbsize_stat));
66448911ac89c254e89afc52e114402115a497e3David Höppner sfmmut = (struct sfmmu_tsbsize_stat *)(kp->ks_data);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmut, sf_tsbsz_8k);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmut, sf_tsbsz_16k);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmut, sf_tsbsz_32k);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmut, sf_tsbsz_64k);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmut, sf_tsbsz_128k);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmut, sf_tsbsz_256k);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmut, sf_tsbsz_512k);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmut, sf_tsbsz_1m);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmut, sf_tsbsz_2m);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmut, sf_tsbsz_4m);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner#endif
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner#ifdef __sparc
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_simmstat(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner uchar_t *simmstat;
66448911ac89c254e89afc52e114402115a497e3David Höppner char *simm_buf;
66448911ac89c254e89afc52e114402115a497e3David Höppner char *list = NULL;
66448911ac89c254e89afc52e114402115a497e3David Höppner int i;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(kp->ks_data_size == sizeof (uchar_t) * SIMM_COUNT);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner for (i = 0, simmstat = (uchar_t *)(kp->ks_data); i < SIMM_COUNT - 1;
66448911ac89c254e89afc52e114402115a497e3David Höppner i++, simmstat++) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (list == NULL) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) asprintf(&simm_buf, "%d,", *simmstat);
66448911ac89c254e89afc52e114402115a497e3David Höppner } else {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) asprintf(&simm_buf, "%s%d,", list, *simmstat);
66448911ac89c254e89afc52e114402115a497e3David Höppner free(list);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner list = simm_buf;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) asprintf(&simm_buf, "%s%d", list, *simmstat);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_STRING_X(ksi, "status", simm_buf);
66448911ac89c254e89afc52e114402115a497e3David Höppner free(list);
66448911ac89c254e89afc52e114402115a497e3David Höppner free(simm_buf);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner#endif
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner#ifdef __sparc
66448911ac89c254e89afc52e114402115a497e3David Höppner/*
66448911ac89c254e89afc52e114402115a497e3David Höppner * Helper function for save_temperature().
66448911ac89c254e89afc52e114402115a497e3David Höppner */
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic char *
66448911ac89c254e89afc52e114402115a497e3David Höppnershort_array_to_string(short *shortp, int len)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner char *list = NULL;
66448911ac89c254e89afc52e114402115a497e3David Höppner char *list_buf;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner for (; len > 1; len--, shortp++) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (list == NULL) {
e633f2d79475b51f0a4d46972282225abf851733Richard Lowe (void) asprintf(&list_buf, "%hd,", *shortp);
66448911ac89c254e89afc52e114402115a497e3David Höppner } else {
e633f2d79475b51f0a4d46972282225abf851733Richard Lowe (void) asprintf(&list_buf, "%s%hd,", list, *shortp);
66448911ac89c254e89afc52e114402115a497e3David Höppner free(list);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner list = list_buf;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner
e633f2d79475b51f0a4d46972282225abf851733Richard Lowe (void) asprintf(&list_buf, "%s%hd", list, *shortp);
66448911ac89c254e89afc52e114402115a497e3David Höppner free(list);
66448911ac89c254e89afc52e114402115a497e3David Höppner return (list_buf);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_temperature(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner struct temp_stats *temps = (struct temp_stats *)(kp->ks_data);
66448911ac89c254e89afc52e114402115a497e3David Höppner char *buf;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(kp->ks_data_size == sizeof (struct temp_stats));
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, temps, index);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner buf = short_array_to_string(temps->l1, L1_SZ);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_STRING_X(ksi, "l1", buf);
66448911ac89c254e89afc52e114402115a497e3David Höppner free(buf);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner buf = short_array_to_string(temps->l2, L2_SZ);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_STRING_X(ksi, "l2", buf);
66448911ac89c254e89afc52e114402115a497e3David Höppner free(buf);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner buf = short_array_to_string(temps->l3, L3_SZ);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_STRING_X(ksi, "l3", buf);
66448911ac89c254e89afc52e114402115a497e3David Höppner free(buf);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner buf = short_array_to_string(temps->l4, L4_SZ);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_STRING_X(ksi, "l4", buf);
66448911ac89c254e89afc52e114402115a497e3David Höppner free(buf);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner buf = short_array_to_string(temps->l5, L5_SZ);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_STRING_X(ksi, "l5", buf);
66448911ac89c254e89afc52e114402115a497e3David Höppner free(buf);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, temps, max);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, temps, min);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, temps, state);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, temps, temp_cnt);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, temps, shutdown_cnt);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, temps, version);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, temps, trend);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, temps, override);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner#endif
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner#ifdef __sparc
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_temp_over(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner short *sh = (short *)(kp->ks_data);
66448911ac89c254e89afc52e114402115a497e3David Höppner char *value;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(kp->ks_data_size == sizeof (short));
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) asprintf(&value, "%hu", *sh);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_STRING_X(ksi, "override", value);
66448911ac89c254e89afc52e114402115a497e3David Höppner free(value);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner#endif
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner#ifdef __sparc
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_ps_shadow(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner uchar_t *uchar = (uchar_t *)(kp->ks_data);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(kp->ks_data_size == SYS_PS_COUNT);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_CHAR_X(ksi, "core_0", *uchar++);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_CHAR_X(ksi, "core_1", *uchar++);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_CHAR_X(ksi, "core_2", *uchar++);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_CHAR_X(ksi, "core_3", *uchar++);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_CHAR_X(ksi, "core_4", *uchar++);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_CHAR_X(ksi, "core_5", *uchar++);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_CHAR_X(ksi, "core_6", *uchar++);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_CHAR_X(ksi, "core_7", *uchar++);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_CHAR_X(ksi, "pps_0", *uchar++);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_CHAR_X(ksi, "clk_33", *uchar++);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_CHAR_X(ksi, "clk_50", *uchar++);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_CHAR_X(ksi, "v5_p", *uchar++);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_CHAR_X(ksi, "v12_p", *uchar++);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_CHAR_X(ksi, "v5_aux", *uchar++);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_CHAR_X(ksi, "v5_p_pch", *uchar++);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_CHAR_X(ksi, "v12_p_pch", *uchar++);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_CHAR_X(ksi, "v3_pch", *uchar++);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_CHAR_X(ksi, "v5_pch", *uchar++);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_CHAR_X(ksi, "p_fan", *uchar++);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner#endif
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner#ifdef __sparc
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_fault_list(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner struct ft_list *fault;
66448911ac89c254e89afc52e114402115a497e3David Höppner char name[KSTAT_STRLEN + 7];
66448911ac89c254e89afc52e114402115a497e3David Höppner int i;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner for (i = 1, fault = (struct ft_list *)(kp->ks_data);
66448911ac89c254e89afc52e114402115a497e3David Höppner i <= 999999 && i <= kp->ks_data_size / sizeof (struct ft_list);
66448911ac89c254e89afc52e114402115a497e3David Höppner i++, fault++) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) snprintf(name, sizeof (name), "unit_%d", i);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32_X(ksi, name, fault->unit);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) snprintf(name, sizeof (name), "type_%d", i);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32_X(ksi, name, fault->type);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) snprintf(name, sizeof (name), "fclass_%d", i);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32_X(ksi, name, fault->fclass);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) snprintf(name, sizeof (name), "create_time_%d", i);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_HRTIME_X(ksi, name, fault->create_time);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) snprintf(name, sizeof (name), "msg_%d", i);
e633f2d79475b51f0a4d46972282225abf851733Richard Lowe SAVE_STRING_X(ksi, name, fault->msg);
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner#endif
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_named(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner kstat_named_t *knp;
66448911ac89c254e89afc52e114402115a497e3David Höppner int n;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner for (n = kp->ks_ndata, knp = KSTAT_NAMED_PTR(kp); n > 0; n--, knp++) {
66448911ac89c254e89afc52e114402115a497e3David Höppner switch (knp->data_type) {
66448911ac89c254e89afc52e114402115a497e3David Höppner case KSTAT_DATA_CHAR:
66448911ac89c254e89afc52e114402115a497e3David Höppner nvpair_insert(ksi, knp->name,
66448911ac89c254e89afc52e114402115a497e3David Höppner (ks_value_t *)&knp->value, KSTAT_DATA_CHAR);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case KSTAT_DATA_INT32:
66448911ac89c254e89afc52e114402115a497e3David Höppner nvpair_insert(ksi, knp->name,
66448911ac89c254e89afc52e114402115a497e3David Höppner (ks_value_t *)&knp->value, KSTAT_DATA_INT32);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case KSTAT_DATA_UINT32:
66448911ac89c254e89afc52e114402115a497e3David Höppner nvpair_insert(ksi, knp->name,
66448911ac89c254e89afc52e114402115a497e3David Höppner (ks_value_t *)&knp->value, KSTAT_DATA_UINT32);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case KSTAT_DATA_INT64:
66448911ac89c254e89afc52e114402115a497e3David Höppner nvpair_insert(ksi, knp->name,
66448911ac89c254e89afc52e114402115a497e3David Höppner (ks_value_t *)&knp->value, KSTAT_DATA_INT64);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case KSTAT_DATA_UINT64:
66448911ac89c254e89afc52e114402115a497e3David Höppner nvpair_insert(ksi, knp->name,
66448911ac89c254e89afc52e114402115a497e3David Höppner (ks_value_t *)&knp->value, KSTAT_DATA_UINT64);
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner case KSTAT_DATA_STRING:
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_STRING_X(ksi, knp->name, KSTAT_NAMED_STR_PTR(knp));
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner default:
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(B_FALSE); /* Invalid data type */
66448911ac89c254e89afc52e114402115a497e3David Höppner break;
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner }
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_intr(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner kstat_intr_t *intr = KSTAT_INTR_PTR(kp);
66448911ac89c254e89afc52e114402115a497e3David Höppner char *intr_names[] = {"hard", "soft", "watchdog", "spurious",
66448911ac89c254e89afc52e114402115a497e3David Höppner "multiple_service"};
66448911ac89c254e89afc52e114402115a497e3David Höppner int n;
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner for (n = 0; n < KSTAT_NUM_INTRS; n++)
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32_X(ksi, intr_names[n], intr->intrs[n]);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_io(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner kstat_io_t *ksio = KSTAT_IO_PTR(kp);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT64(ksi, ksio, nread);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT64(ksi, ksio, nwritten);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, ksio, reads);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, ksio, writes);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_HRTIME(ksi, ksio, wtime);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_HRTIME(ksi, ksio, wlentime);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_HRTIME(ksi, ksio, wlastupdate);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_HRTIME(ksi, ksio, rtime);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_HRTIME(ksi, ksio, rlentime);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_HRTIME(ksi, ksio, rlastupdate);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, ksio, wcnt);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT32(ksi, ksio, rcnt);
66448911ac89c254e89afc52e114402115a497e3David Höppner}
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppnerstatic void
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_timer(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppner{
66448911ac89c254e89afc52e114402115a497e3David Höppner kstat_timer_t *ktimer = KSTAT_TIMER_PTR(kp);
66448911ac89c254e89afc52e114402115a497e3David Höppner
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_STRING(ksi, ktimer, name);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_UINT64(ksi, ktimer, num_events);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_HRTIME(ksi, ktimer, elapsed_time);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_HRTIME(ksi, ktimer, min_time);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_HRTIME(ksi, ktimer, max_time);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_HRTIME(ksi, ktimer, start_time);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_HRTIME(ksi, ktimer, stop_time);
66448911ac89c254e89afc52e114402115a497e3David Höppner}