66448911ac89c254e89afc52e114402115a497e3David Höppner * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
66448911ac89c254e89afc52e114402115a497e3David Höppner * See the License for the specific language governing permissions
66448911ac89c254e89afc52e114402115a497e3David Höppner * and limitations under the License.
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 * CDDL HEADER END
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 * Display kernel statistics
66448911ac89c254e89afc52e114402115a497e3David Höppner * This is a reimplementation of the perl kstat command originally found
66448911ac89c254e89afc52e114402115a497e3David Höppner * Incompatibilities:
66448911ac89c254e89afc52e114402115a497e3David Höppner * - perl regular expressions replaced with extended REs bracketed by '/'
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öppnerchar *cmdname = "kstat"; /* Name of this command */
66448911ac89c254e89afc52e114402115a497e3David Höppnerint caught_cont = 0; /* Have caught a SIGCONT */
66448911ac89c254e89afc52e114402115a497e3David Höppner/* Helper flag - header was printed already? */
66448911ac89c254e89afc52e114402115a497e3David Höppner/* Saved command line options */
66448911ac89c254e89afc52e114402115a497e3David Höppner/* Return zero if a selector did match */
66448911ac89c254e89afc52e114402115a497e3David Höppner/* Sorted list of kstat instances */
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 * 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 list_create(&selector_list, sizeof (ks_selector_t),
66448911ac89c254e89afc52e114402115a497e3David Höppner * Parse named command line arguments.
66448911ac89c254e89afc52e114402115a497e3David Höppner while ((c = getopt(argc, argv, "h?CqjlpT:m:i:n:s:c:")) != EOF)
66448911ac89c254e89afc52e114402115a497e3David Höppner "-q and -lpj are mutually exclusive\n"));
66448911ac89c254e89afc52e114402115a497e3David Höppner * Consume the rest of the command line. Parsing the
66448911ac89c254e89afc52e114402115a497e3David Höppner * unnamed command line arguments.
66448911ac89c254e89afc52e114402115a497e3David Höppner if (n == 0) {
66448911ac89c254e89afc52e114402115a497e3David Höppner "Interval is too large\n"));
66448911ac89c254e89afc52e114402115a497e3David Höppner } else if (n == 1) {
66448911ac89c254e89afc52e114402115a497e3David Höppner "Count is too large\n"));
66448911ac89c254e89afc52e114402115a497e3David Höppner while ((q = (char *)strsep(argv, ":")) != NULL) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (*q != '\0') {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (n == 0) {
66448911ac89c254e89afc52e114402115a497e3David Höppner "Interval must be an "
66448911ac89c254e89afc52e114402115a497e3David Höppner "integer >= 1"));
66448911ac89c254e89afc52e114402115a497e3David Höppner } else if (n == 1) {
66448911ac89c254e89afc52e114402115a497e3David Höppner "Count must be an integer >= 1"));
66448911ac89c254e89afc52e114402115a497e3David Höppner if (n == 0) {
66448911ac89c254e89afc52e114402115a497e3David Höppner } else if (n == 1) {
66448911ac89c254e89afc52e114402115a497e3David Höppner * Check if we founded a named selector on the cmdline.
617413d1af18e7e9e5c76f416263615bbf1174a5Richard Lowe "[module[:instance[:name[:statistic]]]] and "
66448911ac89c254e89afc52e114402115a497e3David Höppner "-m -i -n -s are mutually exclusive"));
66448911ac89c254e89afc52e114402115a497e3David Höppner list_create(&instances_list, sizeof (ks_instance_t),
66448911ac89c254e89afc52e114402115a497e3David Höppner if (signal(SIGCONT, cont_handler) == SIG_ERR) {
66448911ac89c254e89afc52e114402115a497e3David Höppner "signal failed"));
66448911ac89c254e89afc52e114402115a497e3David Höppner ks_sleep_until(&start_n, period_n, infinite_cycles,
66448911ac89c254e89afc52e114402115a497e3David Höppner * Print usage.
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 * Sort compare function.
66448911ac89c254e89afc52e114402115a497e3David Höppnercompare_instances(ks_instance_t *l_arg, ks_instance_t *r_arg)
66448911ac89c254e89afc52e114402115a497e3David Höppner rval = strcasecmp(l_arg->ks_module, r_arg->ks_module);
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öppnerks_sleep_until(hrtime_t *wakeup, hrtime_t interval, int forever,
66448911ac89c254e89afc52e114402115a497e3David Höppner status = nanosleep(&pause_tv, (struct timespec *)NULL);
66448911ac89c254e89afc52e114402115a497e3David Höppner } while (status != 0);
66448911ac89c254e89afc52e114402115a497e3David Höppner * Inserts an instance in the per selector list.
66448911ac89c254e89afc52e114402115a497e3David Höppnernvpair_insert(ks_instance_t *ksi, char *name, ks_value_t *value,
66448911ac89c254e89afc52e114402115a497e3David Höppner instance = (ks_nvpair_t *)malloc(sizeof (ks_nvpair_t));
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 while (tmp != NULL && strcasecmp(instance->name, tmp->name) > 0)
66448911ac89c254e89afc52e114402115a497e3David Höppner list_insert_before(&ksi->ks_nvlist, tmp, instance);
66448911ac89c254e89afc52e114402115a497e3David Höppner * Allocates a new all-matching selector.
66448911ac89c254e89afc52e114402115a497e3David Höppner selector = (ks_selector_t *)malloc(sizeof (ks_selector_t));
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 register char *f, *t;
66448911ac89c254e89afc52e114402115a497e3David Höppner for (f = module, t = key; *f != '\0'; f++, t++) {
66448911ac89c254e89afc52e114402115a497e3David Höppner if (strncmp(ks_raw_lookup[n].name, key, strlen(key)) == 0)
66448911ac89c254e89afc52e114402115a497e3David Höppner * Match a string against a shell glob or extended regular expression.
66448911ac89c254e89afc52e114402115a497e3David Höppnerks_match(const char *str, ks_pattern_t *pattern)
66448911ac89c254e89afc52e114402115a497e3David Höppner if (pattern->pstr != NULL && gmatch(pattern->pstr, "/*/") != 0) {
66448911ac89c254e89afc52e114402115a497e3David Höppner /* All regex patterns are strdup'd copies */
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) regerror(regcode, NULL, errbuf, bufsz);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stderr, "kstat: %s\n", errbuf);
66448911ac89c254e89afc52e114402115a497e3David Höppner return (regexec(&pattern->preg, str, 0, NULL, 0) == 0);
66448911ac89c254e89afc52e114402115a497e3David Höppner * Iterate over all kernel statistics and save matches.
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 /* Don't bother storing raw stats we don't understand */
66448911ac89c254e89afc52e114402115a497e3David Höppner "Unknown kstat type %s:%d:%s - "
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.
9736aecd323ba323a24c159dc877b29795d68a0aBryan Cantrill if (ks_match(kp->ks_module, &selector->ks_module) &&
66448911ac89c254e89afc52e114402115a497e3David Höppner selector = list_next(&selector_list, selector);
66448911ac89c254e89afc52e114402115a497e3David Höppner * Allocate a new instance and fill in the values
66448911ac89c254e89afc52e114402115a497e3David Höppner * we know so far.
66448911ac89c254e89afc52e114402115a497e3David Höppner ksi = (ks_instance_t *)malloc(sizeof (ks_instance_t));
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 list_create(&ksi->ks_nvlist, sizeof (ks_nvpair_t),
66448911ac89c254e89afc52e114402115a497e3David Höppner /* Insert this instance into a sorted list */
66448911ac89c254e89afc52e114402115a497e3David Höppner while (tmp != NULL && compare_instances(ksi, tmp) > 0)
66448911ac89c254e89afc52e114402115a497e3David Höppner list_insert_before(&instances_list, tmp, ksi);
66448911ac89c254e89afc52e114402115a497e3David Höppner /* Read the actual statistics */
6a19b8666104dbf912da5a4fb193c9c2b29e21bbRobert Mustacchi SAVE_HRTIME_X(ksi, "snaptime", kp->ks_snaptime);
66448911ac89c254e89afc52e114402115a497e3David Höppner * Print the value of a name-value pair.
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "%s", nvpair->value.c);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "%d", nvpair->value.i32);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "%u", nvpair->value.ui32);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "%lld", nvpair->value.i64);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "%llu", nvpair->value.ui64);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "%s", KSTAT_NAMED_STR_PTR(nvpair));
66448911ac89c254e89afc52e114402115a497e3David Höppner * Print a single instance.
66448911ac89c254e89afc52e114402115a497e3David Höppnerks_instance_print(ks_instance_t *ksi, ks_nvpair_t *nvpair)
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, KS_DFMT, nvpair->name);
66448911ac89c254e89afc52e114402115a497e3David Höppner * Print a single instance in JSON format.
66448911ac89c254e89afc52e114402115a497e3David Höppnerks_instance_print_json(ks_instance_t *ksi, ks_nvpair_t *nvpair)
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "\t\"snaptime\": 0,\n");
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, "\t\"snaptime\": %.9f,\n",
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) fprintf(stdout, KS_JFMT, nvpair->name);
66448911ac89c254e89afc52e114402115a497e3David Höppner * Print all instances.
66448911ac89c254e89afc52e114402115a497e3David Höppner void (*ks_print_fn)(ks_instance_t *, ks_nvpair_t *);
66448911ac89c254e89afc52e114402115a497e3David Höppner /* Iterate over each selector */
66448911ac89c254e89afc52e114402115a497e3David Höppner /* Iterate over each instance */
66448911ac89c254e89afc52e114402115a497e3David Höppner for (ksi = list_head(&instances_list); ksi != NULL;
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(ks_number, &selector->ks_instance) &&
66448911ac89c254e89afc52e114402115a497e3David Höppner /* Finally iterate over each statistic */
66448911ac89c254e89afc52e114402115a497e3David Höppner nvpair = list_next(&ksi->ks_nvlist, nvpair)) {
66448911ac89c254e89afc52e114402115a497e3David Höppner } else if (!g_pflg) {
66448911ac89c254e89afc52e114402115a497e3David Höppner selector = list_next(&selector_list, selector);
66448911ac89c254e89afc52e114402115a497e3David Höppner /* Free the instances list */
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 struct var *var = (struct var *)(kp->ks_data);
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(kp->ks_data_size == sizeof (struct var));
66448911ac89c254e89afc52e114402115a497e3David Höppner struct ncstats *ncstats = (struct ncstats *)(kp->ks_data);
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(kp->ks_data_size == sizeof (struct ncstats));
66448911ac89c254e89afc52e114402115a497e3David Höppner sysinfo_t *sysinfo = (sysinfo_t *)(kp->ks_data);
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(kp->ks_data_size == sizeof (sysinfo_t));
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(kp->ks_data_size == sizeof (vminfo_t));
66448911ac89c254e89afc52e114402115a497e3David Höppner struct mntinfo_kstat *mntinfo = (struct mntinfo_kstat *)(kp->ks_data);
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(kp->ks_data_size == sizeof (struct mntinfo_kstat));
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öppnersave_sfmmu_global_stat(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(kp->ks_data_size == sizeof (struct sfmmu_global_stat));
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tsb_raise_exception);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tsb_sectsb_create);
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_get_free_throttle);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_tsb_resize_failures);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_INT32(ksi, sfmmug, sf_region_remap_demap);
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_sfmmu_tsbsize_stat(kstat_t *kp, ks_instance_t *ksi)
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 assert(kp->ks_data_size == sizeof (uchar_t) * SIMM_COUNT);
66448911ac89c254e89afc52e114402115a497e3David Höppner for (i = 0, simmstat = (uchar_t *)(kp->ks_data); i < SIMM_COUNT - 1;
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) asprintf(&simm_buf, "%s%d,", list, *simmstat);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) asprintf(&simm_buf, "%s%d", list, *simmstat);
66448911ac89c254e89afc52e114402115a497e3David Höppner * Helper function for save_temperature().
e633f2d79475b51f0a4d46972282225abf851733Richard Lowe (void) asprintf(&list_buf, "%s%hd,", list, *shortp);
e633f2d79475b51f0a4d46972282225abf851733Richard Lowe (void) asprintf(&list_buf, "%s%hd", list, *shortp);
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_temperature(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppner struct temp_stats *temps = (struct temp_stats *)(kp->ks_data);
66448911ac89c254e89afc52e114402115a497e3David Höppner assert(kp->ks_data_size == sizeof (struct temp_stats));
66448911ac89c254e89afc52e114402115a497e3David Höppner buf = short_array_to_string(temps->l1, L1_SZ);
66448911ac89c254e89afc52e114402115a497e3David Höppner buf = short_array_to_string(temps->l2, L2_SZ);
66448911ac89c254e89afc52e114402115a497e3David Höppner buf = short_array_to_string(temps->l3, L3_SZ);
66448911ac89c254e89afc52e114402115a497e3David Höppner buf = short_array_to_string(temps->l4, L4_SZ);
66448911ac89c254e89afc52e114402115a497e3David Höppner buf = short_array_to_string(temps->l5, L5_SZ);
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_temp_over(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_ps_shadow(kstat_t *kp, ks_instance_t *ksi)
66448911ac89c254e89afc52e114402115a497e3David Höppnersave_fault_list(kstat_t *kp, ks_instance_t *ksi)
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 (void) snprintf(name, sizeof (name), "unit_%d", i);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) snprintf(name, sizeof (name), "type_%d", i);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) snprintf(name, sizeof (name), "fclass_%d", i);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) snprintf(name, sizeof (name), "create_time_%d", i);
66448911ac89c254e89afc52e114402115a497e3David Höppner (void) snprintf(name, sizeof (name), "msg_%d", i);
66448911ac89c254e89afc52e114402115a497e3David Höppner for (n = kp->ks_ndata, knp = KSTAT_NAMED_PTR(kp); n > 0; n--, knp++) {
66448911ac89c254e89afc52e114402115a497e3David Höppner (ks_value_t *)&knp->value, KSTAT_DATA_UINT32);
66448911ac89c254e89afc52e114402115a497e3David Höppner (ks_value_t *)&knp->value, KSTAT_DATA_UINT64);
66448911ac89c254e89afc52e114402115a497e3David Höppner SAVE_STRING_X(ksi, knp->name, KSTAT_NAMED_STR_PTR(knp));
66448911ac89c254e89afc52e114402115a497e3David Höppner char *intr_names[] = {"hard", "soft", "watchdog", "spurious",
66448911ac89c254e89afc52e114402115a497e3David Höppner "multiple_service"};
66448911ac89c254e89afc52e114402115a497e3David Höppner for (n = 0; n < KSTAT_NUM_INTRS; n++)