5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
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.
12 *
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]
18 *
19 * CDDL HEADER END
20 */
21 /*
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.
25 */
26
27 #ifndef _STAT_KSTAT_H
28 #define _STAT_KSTAT_H
29
30 /*
31 * Structures needed by the kstat reader functions.
32 */
33 #include <sys/var.h>
34 #include <sys/utsname.h>
35 #include <sys/sysinfo.h>
36 #include <sys/flock.h>
37 #include <sys/dnlc.h>
38 #include <regex.h>
39 #include <nfs/nfs.h>
40 #include <nfs/nfs_clnt.h>
41
42 #ifdef __sparc
43 #include <vm/hat_sfmmu.h>
44 #include <sys/simmstat.h>
45 #include <sys/sysctrl.h>
46 #include <sys/fhc.h>
47 #endif
48
49 #define KSTAT_DATA_HRTIME (KSTAT_DATA_STRING + 1)
50
51 typedef union ks_value {
52 char c[16];
53 int32_t i32;
54 uint32_t ui32;
55 struct {
56 union {
57 char *ptr;
58 char __pad[8];
59 } addr;
60 uint32_t len;
61 } str;
62
63 int64_t i64;
64 uint64_t ui64;
65 } ks_value_t;
66
67 #define SAVE_HRTIME(I, S, N) \
68 { \
69 ks_value_t v; \
70 v.ui64 = S->N; \
71 nvpair_insert(I, #N, &v, KSTAT_DATA_UINT64); \
72 }
73
74 #define SAVE_INT32(I, S, N) \
75 { \
76 ks_value_t v; \
77 v.i32 = S->N; \
78 nvpair_insert(I, #N, &v, KSTAT_DATA_INT32); \
79 }
80
81 #define SAVE_UINT32(I, S, N) \
82 { \
83 ks_value_t v; \
84 v.ui32 = S->N; \
85 nvpair_insert(I, #N, &v, KSTAT_DATA_UINT32); \
86 }
87
88 #define SAVE_INT64(I, S, N) \
89 { \
90 ks_value_t v; \
91 v.i64 = S->N; \
98 v.ui64 = S->N; \
99 nvpair_insert(I, #N, &v, KSTAT_DATA_UINT64); \
100 }
101
102 /*
103 * We dont want const "strings" because we free
104 * the instances later.
105 */
106 #define SAVE_STRING(I, S, N) \
107 { \
108 ks_value_t v; \
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); \
112 }
113
114 #define SAVE_HRTIME_X(I, N, V) \
115 { \
116 ks_value_t v; \
117 v.ui64 = V; \
118 nvpair_insert(I, N, &v, KSTAT_DATA_HRTIME); \
119 }
120
121 #define SAVE_INT32_X(I, N, V) \
122 { \
123 ks_value_t v; \
124 v.i32 = V; \
125 nvpair_insert(I, N, &v, KSTAT_DATA_INT32); \
126 }
127
128 #define SAVE_UINT32_X(I, N, V) \
129 { \
130 ks_value_t v; \
131 v.ui32 = V; \
132 nvpair_insert(I, N, &v, KSTAT_DATA_UINT32); \
133 }
134
135 #define SAVE_UINT64_X(I, N, V) \
136 { \
137 ks_value_t v; \
138 v.ui64 = V; \
153 (void) asprintf(&v.str.addr.ptr, "%c", V); \
154 v.str.len = 1; \
155 nvpair_insert(I, N, &v, KSTAT_DATA_STRING); \
156 }
157
158 #define DFLT_FMT \
159 "module: %-30.30s instance: %-6d\n" \
160 "name: %-30.30s class: %-.30s\n"
161
162 #define JSON_FMT \
163 "{\n\t\"module\": \"%s\",\n" \
164 "\t\"instance\": %d,\n" \
165 "\t\"name\": \"%s\",\n" \
166 "\t\"class\": \"%s\",\n" \
167 "\t\"type\": %d,\n"
168
169 #define KS_DFMT "\t%-30s "
170 #define KS_JFMT "\t\t\"%s\": "
171 #define KS_PFMT "%s:%d:%s:%s"
172
173 typedef struct ks_instance {
174 list_node_t ks_next;
175 char ks_name[KSTAT_STRLEN];
176 char ks_module[KSTAT_STRLEN];
177 char ks_class[KSTAT_STRLEN];
178 int ks_instance;
179 uchar_t ks_type;
180 hrtime_t ks_snaptime;
181 list_t ks_nvlist;
182 } ks_instance_t;
183
184 typedef struct ks_nvpair {
185 list_node_t nv_next;
186 char name[KSTAT_STRLEN];
187 uchar_t data_type;
188 ks_value_t value;
189 } ks_nvpair_t;
190
191 typedef struct ks_pattern {
192 char *pstr;
|
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
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.
12 *
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]
18 *
19 * CDDL HEADER END
20 */
21 /*
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.
25 * Copyright 2016 Garrett D'Amore
26 */
27
28 #ifndef _STAT_KSTAT_H
29 #define _STAT_KSTAT_H
30
31 /*
32 * Structures needed by the kstat reader functions.
33 */
34 #include <sys/var.h>
35 #include <sys/utsname.h>
36 #include <sys/sysinfo.h>
37 #include <sys/flock.h>
38 #include <sys/dnlc.h>
39 #include <regex.h>
40 #include <nfs/nfs.h>
41 #include <nfs/nfs_clnt.h>
42
43 #ifdef __sparc
44 #include <vm/hat_sfmmu.h>
45 #include <sys/simmstat.h>
46 #include <sys/sysctrl.h>
47 #include <sys/fhc.h>
48 #endif
49
50 typedef union ks_value {
51 char c[16];
52 int32_t i32;
53 uint32_t ui32;
54 struct {
55 union {
56 char *ptr;
57 char __pad[8];
58 } addr;
59 uint32_t len;
60 } str;
61
62 int64_t i64;
63 uint64_t ui64;
64 hrtime_t t;
65 } ks_value_t;
66
67 #define SAVE_HRTIME(I, S, N) \
68 { \
69 ks_value_t v; \
70 v.ui64 = S->N; \
71 if (g_hrtime_fmt == KS_HRFMT_DEFAULT) { \
72 nvpair_insert(I, #N, &v, KSTAT_DATA_UINT64); \
73 } else { \
74 nvpair_insert(I, #N, &v, KSTAT_DATA_TIME); \
75 } \
76 }
77
78 #define SAVE_INT32(I, S, N) \
79 { \
80 ks_value_t v; \
81 v.i32 = S->N; \
82 nvpair_insert(I, #N, &v, KSTAT_DATA_INT32); \
83 }
84
85 #define SAVE_UINT32(I, S, N) \
86 { \
87 ks_value_t v; \
88 v.ui32 = S->N; \
89 nvpair_insert(I, #N, &v, KSTAT_DATA_UINT32); \
90 }
91
92 #define SAVE_INT64(I, S, N) \
93 { \
94 ks_value_t v; \
95 v.i64 = S->N; \
102 v.ui64 = S->N; \
103 nvpair_insert(I, #N, &v, KSTAT_DATA_UINT64); \
104 }
105
106 /*
107 * We dont want const "strings" because we free
108 * the instances later.
109 */
110 #define SAVE_STRING(I, S, N) \
111 { \
112 ks_value_t v; \
113 v.str.addr.ptr = safe_strdup(S->N); \
114 v.str.len = strlen(S->N); \
115 nvpair_insert(I, #N, &v, KSTAT_DATA_STRING); \
116 }
117
118 #define SAVE_HRTIME_X(I, N, V) \
119 { \
120 ks_value_t v; \
121 v.ui64 = V; \
122 nvpair_insert(I, N, &v, KSTAT_DATA_TIME); \
123 }
124
125 #define SAVE_INT32_X(I, N, V) \
126 { \
127 ks_value_t v; \
128 v.i32 = V; \
129 nvpair_insert(I, N, &v, KSTAT_DATA_INT32); \
130 }
131
132 #define SAVE_UINT32_X(I, N, V) \
133 { \
134 ks_value_t v; \
135 v.ui32 = V; \
136 nvpair_insert(I, N, &v, KSTAT_DATA_UINT32); \
137 }
138
139 #define SAVE_UINT64_X(I, N, V) \
140 { \
141 ks_value_t v; \
142 v.ui64 = V; \
157 (void) asprintf(&v.str.addr.ptr, "%c", V); \
158 v.str.len = 1; \
159 nvpair_insert(I, N, &v, KSTAT_DATA_STRING); \
160 }
161
162 #define DFLT_FMT \
163 "module: %-30.30s instance: %-6d\n" \
164 "name: %-30.30s class: %-.30s\n"
165
166 #define JSON_FMT \
167 "{\n\t\"module\": \"%s\",\n" \
168 "\t\"instance\": %d,\n" \
169 "\t\"name\": \"%s\",\n" \
170 "\t\"class\": \"%s\",\n" \
171 "\t\"type\": %d,\n"
172
173 #define KS_DFMT "\t%-30s "
174 #define KS_JFMT "\t\t\"%s\": "
175 #define KS_PFMT "%s:%d:%s:%s"
176
177 #define KS_HRFMT_DEFAULT 'o'
178 #define KS_HRFMT_BOOT 'b'
179 #define KS_HRFMT_UNIX 'u'
180 #define KS_HRFMT_DATE 'd'
181 #define KS_HRFMT_NANO 'n'
182 #define KS_HRFMT_ISO 'I'
183 #define KS_HRFMT_ZISO 'Z'
184
185 typedef struct ks_instance {
186 list_node_t ks_next;
187 char ks_name[KSTAT_STRLEN];
188 char ks_module[KSTAT_STRLEN];
189 char ks_class[KSTAT_STRLEN];
190 int ks_instance;
191 uchar_t ks_type;
192 hrtime_t ks_snaptime;
193 list_t ks_nvlist;
194 } ks_instance_t;
195
196 typedef struct ks_nvpair {
197 list_node_t nv_next;
198 char name[KSTAT_STRLEN];
199 uchar_t data_type;
200 ks_value_t value;
201 } ks_nvpair_t;
202
203 typedef struct ks_pattern {
204 char *pstr;
|