4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
23 * Copyright 2013 David Hoeppner. All rights reserved.
24 * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
31 * Structures needed by the kstat reader functions.
34 #include <sys/utsname.h>
35 #include <sys/sysinfo.h>
36 #include <sys/flock.h>
40 #include <nfs/nfs_clnt.h>
43 #include <vm/hat_sfmmu.h>
44 #include <sys/simmstat.h>
45 #include <sys/sysctrl.h>
49 #define KSTAT_DATA_HRTIME (KSTAT_DATA_STRING + 1)
51 typedef union ks_value
{
67 #define SAVE_HRTIME(I, S, N) \
71 nvpair_insert(I, #N, &v, KSTAT_DATA_UINT64); \
74 #define SAVE_INT32(I, S, N) \
78 nvpair_insert(I, #N, &v, KSTAT_DATA_INT32); \
81 #define SAVE_UINT32(I, S, N) \
85 nvpair_insert(I, #N, &v, KSTAT_DATA_UINT32); \
88 #define SAVE_INT64(I, S, N) \
92 nvpair_insert(I, #N, &v, KSTAT_DATA_INT64); \
95 #define SAVE_UINT64(I, S, N) \
99 nvpair_insert(I, #N, &v, KSTAT_DATA_UINT64); \
103 * We dont want const "strings" because we free
104 * the instances later.
106 #define SAVE_STRING(I, S, N) \
109 v.str.addr.ptr = safe_strdup(S->N); \
110 v.str.len = strlen(S->N); \
111 nvpair_insert(I, #N, &v, KSTAT_DATA_STRING); \
114 #define SAVE_HRTIME_X(I, N, V) \
118 nvpair_insert(I, N, &v, KSTAT_DATA_HRTIME); \
121 #define SAVE_INT32_X(I, N, V) \
125 nvpair_insert(I, N, &v, KSTAT_DATA_INT32); \
128 #define SAVE_UINT32_X(I, N, V) \
132 nvpair_insert(I, N, &v, KSTAT_DATA_UINT32); \
135 #define SAVE_UINT64_X(I, N, V) \
139 nvpair_insert(I, N, &v, KSTAT_DATA_UINT64); \
142 #define SAVE_STRING_X(I, N, V) \
145 v.str.addr.ptr = safe_strdup(V); \
146 v.str.len = (V) ? strlen(V) : 0; \
147 nvpair_insert(I, N, &v, KSTAT_DATA_STRING); \
150 #define SAVE_CHAR_X(I, N, V) \
153 (void) asprintf(&v.str.addr.ptr, "%c", V); \
155 nvpair_insert(I, N, &v, KSTAT_DATA_STRING); \
159 "module: %-30.30s instance: %-6d\n" \
160 "name: %-30.30s class: %-.30s\n"
162 #define KS_DFMT "\t%-30s "
163 #define KS_PFMT "%s:%d:%s:%s"
165 typedef struct ks_instance
{
167 char ks_name
[KSTAT_STRLEN
];
168 char ks_module
[KSTAT_STRLEN
];
169 char ks_class
[KSTAT_STRLEN
];
172 hrtime_t ks_snaptime
;
176 typedef struct ks_nvpair
{
178 char name
[KSTAT_STRLEN
];
183 typedef struct ks_pattern
{
188 typedef struct ks_selector
{
190 ks_pattern_t ks_module
;
191 ks_pattern_t ks_instance
;
192 ks_pattern_t ks_name
;
193 ks_pattern_t ks_statistic
;
196 static void usage(void);
197 static int compare_instances(ks_instance_t
*, ks_instance_t
*);
198 static void nvpair_insert(ks_instance_t
*, char *, ks_value_t
*, uchar_t
);
199 static boolean_t
ks_match(const char *, ks_pattern_t
*);
200 static ks_selector_t
*new_selector(void);
201 static void ks_instances_read(kstat_ctl_t
*);
202 static void ks_value_print(ks_nvpair_t
*);
203 static void ks_instances_print(void);
204 static char *ks_safe_strdup(char *);
205 static void ks_sleep_until(hrtime_t
*, hrtime_t
, int, int *);
207 /* Raw kstat readers */
208 static void save_cpu_stat(kstat_t
*, ks_instance_t
*);
209 static void save_var(kstat_t
*, ks_instance_t
*);
210 static void save_ncstats(kstat_t
*, ks_instance_t
*);
211 static void save_sysinfo(kstat_t
*, ks_instance_t
*);
212 static void save_vminfo(kstat_t
*, ks_instance_t
*);
213 static void save_nfs(kstat_t
*, ks_instance_t
*);
215 static void save_sfmmu_global_stat(kstat_t
*, ks_instance_t
*);
216 static void save_sfmmu_tsbsize_stat(kstat_t
*, ks_instance_t
*);
217 static void save_simmstat(kstat_t
*, ks_instance_t
*);
218 /* Helper function for save_temperature() */
219 static char *short_array_to_string(short *, int);
220 static void save_temperature(kstat_t
*, ks_instance_t
*);
221 static void save_temp_over(kstat_t
*, ks_instance_t
*);
222 static void save_ps_shadow(kstat_t
*, ks_instance_t
*);
223 static void save_fault_list(kstat_t
*, ks_instance_t
*);
226 /* Named kstat readers */
227 static void save_named(kstat_t
*, ks_instance_t
*);
228 static void save_intr(kstat_t
*, ks_instance_t
*);
229 static void save_io(kstat_t
*, ks_instance_t
*);
230 static void save_timer(kstat_t
*, ks_instance_t
*);
232 /* Typedef for raw kstat reader functions */
233 typedef void (*kstat_raw_reader_t
)(kstat_t
*, ks_instance_t
*);
236 kstat_raw_reader_t fn
;
238 } ks_raw_lookup
[] = {
239 /* Function name kstat name */
240 {save_cpu_stat
, "cpu_stat:cpu_stat"},
241 {save_var
, "unix:var"},
242 {save_ncstats
, "unix:ncstats"},
243 {save_sysinfo
, "unix:sysinfo"},
244 {save_vminfo
, "unix:vminfo"},
245 {save_nfs
, "nfs:mntinfo"},
247 {save_sfmmu_global_stat
, "unix:sfmmu_global_stat"},
248 {save_sfmmu_tsbsize_stat
, "unix:sfmmu_tsbsize_stat"},
249 {save_simmstat
, "unix:simm-status"},
250 {save_temperature
, "unix:temperature"},
251 {save_temp_over
, "unix:temperature override"},
252 {save_ps_shadow
, "unix:ps_shadow"},
253 {save_fault_list
, "unix:fault_list"},
258 static kstat_raw_reader_t
lookup_raw_kstat_fn(char *, char *);
260 #endif /* _STAT_KSTAT_H */