a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore/*
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * This file and its contents are supplied under the terms of the
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * Common Development and Distribution License ("CDDL"), version 1.0.
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * You may only use this file in accordance with the terms of version
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * 1.0 of the CDDL.
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore *
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * A full copy of the text of the CDDL should have accompanied this
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * source. A copy of the CDDL is also available via the Internet at
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * http://www.illumos.org/license/CDDL.
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore/*
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * Copyright (c) 2012 DEY Storage Systems, Inc. All rights reserved.
48ac0edb8d30534ebdebc9500c3ceb27b59257ddHans Rosenfeld * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore/*
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * This implements psrinfo(1M), a utility to report various information
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * about processors, cores, and threads (virtual cpus). This is mostly
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * intended for human consumption - this utility doesn't do much more than
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * simply process kstats for human readability.
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore *
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * All the relevant kstats are in the cpu_info kstat module.
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore#include <stdio.h>
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore#include <stdlib.h>
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore#include <unistd.h>
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore#include <string.h>
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore#include <kstat.h>
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore#include <libintl.h>
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore#include <locale.h>
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore#include <libgen.h>
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore#include <ctype.h>
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore#include <errno.h>
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore#define _(x) gettext(x)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore#if XGETTEXT
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore/* These CPU states are here for benefit of xgettext */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore_("on-line")
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore_("off-line")
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore_("faulted")
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore_("powered-off")
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore_("no-intr")
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore_("spare")
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore_("unknown")
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore#endif
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore/*
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * We deal with sorted linked lists, where the sort key is usually the
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * cpu id, core id, or chip id. We generalize this with simple node.
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestruct link {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore long l_id;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link *l_next;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore void *l_ptr;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore};
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore/*
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * A physical chip. A chip can contain multiple cores and virtual cpus.
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestruct pchip {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link p_link;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore int p_ncore;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore int p_nvcpu;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link *p_cores;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link *p_vcpus;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore int p_doit;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore};
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestruct core {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link c_link;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link c_link_pchip;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore int c_nvcpu;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore int c_doit;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct pchip *c_pchip;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link *c_vcpus;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore};
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestruct vcpu {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link v_link;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link v_link_core;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link v_link_pchip;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore int v_doit;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct pchip *v_pchip;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct core *v_core;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore char *v_state;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore long v_state_begin;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore char *v_cpu_type;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore char *v_fpu_type;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore long v_clock_mhz;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore long v_pchip_id; /* 1 per socket */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore char *v_impl;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore char *v_brand;
48ac0edb8d30534ebdebc9500c3ceb27b59257ddHans Rosenfeld char *v_socket;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore long v_core_id; /* n per chip_id */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore};
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestatic struct link *pchips = NULL;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestatic struct link *cores = NULL;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestatic struct link *vcpus = NULL;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestatic const char *cmdname;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestatic void
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amoreusage(char *msg)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore{
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (msg != NULL)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) fprintf(stderr, "%s: %s\n", cmdname, msg);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) fprintf(stderr, _("usage: \n" \
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore "\t%s [-v] [-p] [processor_id ...]\n" \
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore "\t%s -s [-p] processor_id\n"), cmdname, cmdname);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore exit(2);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore}
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore/* like perror, but includes the command name */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestatic void
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amoredie(const char *msg)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore{
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) fprintf(stderr, "%s: %s: %s\n", cmdname, msg, strerror(errno));
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore exit(2);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore}
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestatic char *
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amoremystrdup(const char *src)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore{
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore char *dst;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((dst = strdup(src)) == NULL)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore die(_("strdup() failed"));
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore return (dst);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore}
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestatic void *
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorezalloc(size_t size)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore{
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore void *ptr;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((ptr = calloc(1, size)) == NULL)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore die(_("calloc() failed"));
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore return (ptr);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore}
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore/*
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * Insert a new node on a list, at the insertion point given.
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestatic void
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amoreins_link(struct link **ins, struct link *item)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore{
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore item->l_next = *ins;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore *ins = item;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore}
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore/*
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * Find an id on a sorted list. If the requested id is not found,
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * then the insertpt will be set (if not null) to the location where
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * a new node should be inserted with ins_link (see above).
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestatic void *
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorefind_link(void *list, int id, struct link ***insertpt)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore{
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link **ins = list;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link *l;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore while ((l = *ins) != NULL) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (l->l_id == id)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore return (l->l_ptr);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (l->l_id > id)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore break;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore ins = &l->l_next;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (insertpt != NULL)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore *insertpt = ins;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore return (NULL);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore}
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore/*
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * Print the linked list of ids in parens, taking care to collapse
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * ranges, so instead of (0 1 2 3) it should print (0-3).
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestatic void
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amoreprint_links(struct link *l)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore{
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore int start = -1;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore int end = 0;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf(" (");
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore while (l != NULL) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (start < 0) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore start = l->l_id;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore end = l->l_id;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((l->l_next == NULL) ||
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (l->l_next->l_id > (l->l_id + 1))) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore /* end of the contiguous group */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (start == end) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf("%d", start);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore } else {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf("%d-%d", start, end);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (l->l_next)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf(" ");
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore start = -1;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore l = l->l_next;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf(")");
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore}
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestatic const char *
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amoretimestr(long t)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore{
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore static char buffer[256];
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) strftime(buffer, sizeof (buffer), _("%m/%d/%Y %T"),
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore localtime(&t));
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore return (buffer);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore}
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestatic void
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amoreprint_vp(int nspec)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore{
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct pchip *chip;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct core *core;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct vcpu *vcpu;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link *l1, *l2;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore int len;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore for (l1 = pchips; l1; l1 = l1->l_next) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore chip = l1->l_ptr;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((nspec != 0) && (chip->p_doit == 0))
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore continue;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vcpu = chip->p_vcpus->l_ptr;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore /*
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * Note that some of the way these strings are broken up are
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * to accommodate the legacy translations so that we won't
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * have to retranslate for this utility.
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((chip->p_ncore == 1) || (chip->p_ncore == chip->p_nvcpu)) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf(_("%s has %d virtual %s"),
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore _("The physical processor"),
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore chip->p_nvcpu,
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore chip->p_nvcpu > 1 ?
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore _("processors") :
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore _("processor"));
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore } else {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf(_("%s has %d %s and %d virtual %s"),
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore _("The physical processor"),
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore chip->p_ncore, _("cores"),
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore chip->p_nvcpu,
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore chip->p_nvcpu > 1 ?
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore _("processors") : _("processor"));
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore print_links(chip->p_vcpus);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) putchar('\n');
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((chip->p_ncore == 1) || (chip->p_ncore == chip->p_nvcpu)) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (strlen(vcpu->v_impl)) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf(" %s\n", vcpu->v_impl);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (((len = strlen(vcpu->v_brand)) != 0) &&
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (strncmp(vcpu->v_brand, vcpu->v_impl, len) != 0))
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf("\t%s", vcpu->v_brand);
48ac0edb8d30534ebdebc9500c3ceb27b59257ddHans Rosenfeld if (strcmp(vcpu->v_socket, "Unknown") != 0)
48ac0edb8d30534ebdebc9500c3ceb27b59257ddHans Rosenfeld (void) printf("\t[ %s: %s ]", _("Socket"),
48ac0edb8d30534ebdebc9500c3ceb27b59257ddHans Rosenfeld vcpu->v_socket);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) putchar('\n');
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore } else {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore for (l2 = chip->p_cores; l2; l2 = l2->l_next) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore core = l2->l_ptr;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf(_(" %s has %d virtual %s"),
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore _("The core"),
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore core->c_nvcpu,
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore chip->p_nvcpu > 1 ?
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore _("processors") : _("processor"));
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore print_links(core->c_vcpus);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) putchar('\n');
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (strlen(vcpu->v_impl)) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf(" %s\n", vcpu->v_impl);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (((len = strlen(vcpu->v_brand)) != 0) &&
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (strncmp(vcpu->v_brand, vcpu->v_impl, len) != 0))
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf(" %s\n", vcpu->v_brand);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore}
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestatic void
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amoreprint_ps(void)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore{
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore int online = 1;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct pchip *p;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct vcpu *v;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link *l;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore /*
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * Report "1" if all cpus colocated on the same chip are online.
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore for (l = pchips; l != NULL; l = l->l_next) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore p = l->l_ptr;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (p->p_doit)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore break;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (p == NULL)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore return; /* should never happen! */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore for (l = p->p_vcpus; l != NULL; l = l->l_next) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore v = l->l_ptr;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (strcmp(v->v_state, "on-line") != 0) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore online = 0;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore break;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf("%d\n", online);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore}
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestatic void
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amoreprint_s(void)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore{
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link *l;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore /*
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * Find the processor (there will be only one) that we selected,
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * and report whether or not it is online.
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore for (l = vcpus; l != NULL; l = l->l_next) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct vcpu *v = l->l_ptr;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (v->v_doit) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf("%d\n",
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore strcmp(v->v_state, "on-line") == 0 ? 1 : 0);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore return;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore}
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestatic void
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amoreprint_p(int nspec)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore{
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link *l1, *l2;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore int online = 0;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore /*
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * Print the number of physical packages with at least one processor
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * online.
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore for (l1 = pchips; l1 != NULL; l1 = l1->l_next) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct pchip *p = l1->l_ptr;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((nspec == 0) || (p->p_doit)) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore for (l2 = p->p_vcpus; l2 != NULL; l2 = l2->l_next) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct vcpu *v = l2->l_ptr;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (strcmp(v->v_state, "on-line") == 0) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore online++;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore break;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf("%d\n", online);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore}
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestatic void
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amoreprint_v(int nspec)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore{
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link *l;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore for (l = vcpus; l != NULL; l = l->l_next) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct vcpu *v = l->l_ptr;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((nspec != 0) && (!v->v_doit))
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore continue;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf(_("Status of virtual processor %d as of: "),
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore l->l_id);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf("%s\n", timestr(time(NULL)));
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf(_(" %s since %s.\n"),
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore _(v->v_state), timestr(v->v_state_begin));
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (v->v_clock_mhz) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf(
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore _(" The %s processor operates at %llu MHz,\n"),
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore v->v_cpu_type, (unsigned long long)v->v_clock_mhz);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore } else {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf(
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore _(" The %s processor operates at " \
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore "an unknown frequency,\n"), v->v_cpu_type);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore switch (*v->v_fpu_type) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore case '\0':
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf(
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore _("\tand has no floating point processor.\n"));
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore break;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore case 'a': case 'A':
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore case 'e': case 'E':
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore case 'i': case 'I':
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore case 'o': case 'O':
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore case 'u': case 'U':
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore case 'y': case 'Y':
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf(
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore _("\tand has an %s floating point processor.\n"),
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore v->v_fpu_type);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore break;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore default:
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf(
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore _("\tand has a %s floating point processor.\n"),
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore v->v_fpu_type);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore break;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore}
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorestatic void
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amoreprint_normal(int nspec)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore{
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link *l;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct vcpu *v;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore for (l = vcpus; l != NULL; l = l->l_next) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore v = l->l_ptr;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((nspec == 0) || (v->v_doit)) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) printf(_("%d\t%-8s since %s\n"),
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore l->l_id, _(v->v_state), timestr(v->v_state_begin));
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore}
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amoreint
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amoremain(int argc, char **argv)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore{
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore kstat_ctl_t *kc;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore kstat_t *ksp;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore kstat_named_t *knp;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct vcpu *vc;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct core *core;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct pchip *chip;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link **ins;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore char *s;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore int nspec;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore int optc;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore int opt_s = 0;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore int opt_p = 0;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore int opt_v = 0;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore int ex = 0;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore cmdname = basename(argv[0]);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) setlocale(LC_ALL, "");
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore#if !defined(TEXT_DOMAIN)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore#define TEXT_DOMAIN "SYS_TEST"
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore#endif
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) textdomain(TEXT_DOMAIN);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore /* collect the kstats */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((kc = kstat_open()) == NULL)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore die(_("kstat_open() failed"));
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((ksp = kstat_lookup(kc, "cpu_info", -1, NULL)) == NULL)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore die(_("kstat_lookup() failed"));
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore for (ksp = kc->kc_chain; ksp; ksp = ksp->ks_next) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (strcmp(ksp->ks_module, "cpu_info") != 0)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore continue;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (kstat_read(kc, ksp, NULL) == NULL)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore die(_("kstat_read() failed"));
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc = find_link(&vcpus, ksp->ks_instance, &ins);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (vc == NULL) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc = zalloc(sizeof (struct vcpu));
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_link.l_id = ksp->ks_instance;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_link_core.l_id = ksp->ks_instance;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_link_pchip.l_id = ksp->ks_instance;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_link.l_ptr = vc;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_link_core.l_ptr = vc;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_link_pchip.l_ptr = vc;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore ins_link(ins, &vc->v_link);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((knp = kstat_data_lookup(ksp, "state")) != NULL) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_state = mystrdup(knp->value.c);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore } else {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_state = "unknown";
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((knp = kstat_data_lookup(ksp, "cpu_type")) != NULL) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_cpu_type = mystrdup(knp->value.c);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((knp = kstat_data_lookup(ksp, "fpu_type")) != NULL) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_fpu_type = mystrdup(knp->value.c);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((knp = kstat_data_lookup(ksp, "state_begin")) != NULL) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_state_begin = knp->value.l;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((knp = kstat_data_lookup(ksp, "clock_MHz")) != NULL) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_clock_mhz = knp->value.l;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((knp = kstat_data_lookup(ksp, "brand")) == NULL) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_brand = _("(unknown)");
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore } else {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_brand = mystrdup(knp->value.str.addr.ptr);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
48ac0edb8d30534ebdebc9500c3ceb27b59257ddHans Rosenfeld if ((knp = kstat_data_lookup(ksp, "socket_type")) == NULL) {
48ac0edb8d30534ebdebc9500c3ceb27b59257ddHans Rosenfeld vc->v_socket = "Unknown";
48ac0edb8d30534ebdebc9500c3ceb27b59257ddHans Rosenfeld } else {
48ac0edb8d30534ebdebc9500c3ceb27b59257ddHans Rosenfeld vc->v_socket = mystrdup(knp->value.str.addr.ptr);
48ac0edb8d30534ebdebc9500c3ceb27b59257ddHans Rosenfeld }
48ac0edb8d30534ebdebc9500c3ceb27b59257ddHans Rosenfeld
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((knp = kstat_data_lookup(ksp, "implementation")) == NULL) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_impl = _("(unknown)");
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore } else {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_impl = mystrdup(knp->value.str.addr.ptr);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore /*
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * Legacy code removed the chipid and cpuid fields... we
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * do the same for compatibility. Note that the original
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * pattern is a bit strange, and we have to emulate this because
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * on SPARC we *do* emit these. The original pattern we are
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore * emulating is: $impl =~ s/(cpuid|chipid)\s*\w+\s+//;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((s = strstr(vc->v_impl, "chipid")) != NULL) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore char *x = s + strlen("chipid");
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore while (isspace(*x))
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore x++;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((!isalnum(*x)) && (*x != '_'))
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore goto nochipid;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore while (isalnum(*x) || (*x == '_'))
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore x++;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (!isspace(*x))
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore goto nochipid;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore while (isspace(*x))
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore x++;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) strcpy(s, x);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorenochipid:
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((s = strstr(vc->v_impl, "cpuid")) != NULL) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore char *x = s + strlen("cpuid");
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore while (isspace(*x))
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore x++;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((!isalnum(*x)) && (*x != '_'))
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore goto nocpuid;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore while (isalnum(*x) || (*x == '_'))
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore x++;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (!isspace(*x))
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore goto nocpuid;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore while (isspace(*x))
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore x++;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) strcpy(s, x);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amorenocpuid:
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((knp = kstat_data_lookup(ksp, "chip_id")) != NULL)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_pchip_id = knp->value.l;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore chip = find_link(&pchips, vc->v_pchip_id, &ins);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (chip == NULL) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore chip = zalloc(sizeof (struct pchip));
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore chip->p_link.l_id = vc->v_pchip_id;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore chip->p_link.l_ptr = chip;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore ins_link(ins, &chip->p_link);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_pchip = chip;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((knp = kstat_data_lookup(ksp, "core_id")) != NULL)
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_core_id = knp->value.l;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore core = find_link(&cores, vc->v_core_id, &ins);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (core == NULL) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore core = zalloc(sizeof (struct core));
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore core->c_link.l_id = vc->v_core_id;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore core->c_link.l_ptr = core;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore core->c_link_pchip.l_id = vc->v_core_id;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore core->c_link_pchip.l_ptr = core;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore core->c_pchip = chip;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore ins_link(ins, &core->c_link);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore chip->p_ncore++;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) find_link(&chip->p_cores, core->c_link.l_id,
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore &ins);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore ins_link(ins, &core->c_link_pchip);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore vc->v_core = core;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore /* now put other linkages in place */
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) find_link(&chip->p_vcpus, vc->v_link.l_id, &ins);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore ins_link(ins, &vc->v_link_pchip);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore chip->p_nvcpu++;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) find_link(&core->c_vcpus, vc->v_link.l_id, &ins);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore ins_link(ins, &vc->v_link_core);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore core->c_nvcpu++;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) kstat_close(kc);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore nspec = 0;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore while ((optc = getopt(argc, argv, "pvs")) != EOF) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore switch (optc) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore case 's':
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore opt_s = 1;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore break;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore case 'p':
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore opt_p = 1;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore break;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore case 'v':
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore opt_v = 1;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore break;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore default:
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore usage(NULL);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore while (optind < argc) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore long id;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore char *eptr;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore struct link *l;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore id = strtol(argv[optind], &eptr, 10);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore l = find_link(&vcpus, id, NULL);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if ((*eptr != '\0') || (l == NULL)) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore (void) fprintf(stderr,
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore _("%s: processor %s: Invalid argument\n"),
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore cmdname, argv[optind]);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore ex = 2;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore } else {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore ((struct vcpu *)l->l_ptr)->v_doit = 1;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore ((struct vcpu *)l->l_ptr)->v_pchip->p_doit = 1;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore ((struct vcpu *)l->l_ptr)->v_core->c_doit = 1;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore nspec++;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore optind++;
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (opt_s && opt_v) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore usage(_("options -s and -v are mutually exclusive"));
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (opt_s && nspec != 1) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore usage(_("must specify exactly one processor if -s used"));
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore if (opt_v && opt_p) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore print_vp(nspec);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore } else if (opt_s && opt_p) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore print_ps();
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore } else if (opt_p) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore print_p(nspec);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore } else if (opt_v) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore print_v(nspec);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore } else if (opt_s) {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore print_s();
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore } else {
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore print_normal(nspec);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore }
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore return (ex);
a3477ee4728af4a4c3c6869e248aa735d52cbefbGarrett D'Amore}