Lines 1-235
Link Here
|
1 |
--- bsd/kernel.cc.orig 2015-09-23 13:28:14 UTC |
|
|
2 |
+++ bsd/kernel.cc |
3 |
@@ -28,6 +28,7 @@ |
4 |
#include <string.h> |
5 |
#include <err.h> |
6 |
#include <errno.h> |
7 |
+#include <ifaddrs.h> |
8 |
#include <sysexits.h> |
9 |
#include <sys/types.h> |
10 |
#include <sys/queue.h> |
11 |
@@ -44,7 +45,6 @@ |
12 |
static const char ACPIDEV[] = "/dev/acpi"; |
13 |
static const char APMDEV[] = "/dev/apm"; |
14 |
static int maxcpus = 1; |
15 |
-#include <net/if_var.h> |
16 |
#include <sys/ioctl.h> |
17 |
#include <sys/resource.h> |
18 |
#include <dev/acpica/acpiio.h> |
19 |
@@ -114,56 +114,41 @@ static struct nlist nlst[] = |
20 |
// this later on. This keeps the indices within the nlist constant. |
21 |
#define DUMMY_SYM "dummy_sym" |
22 |
|
23 |
-#if defined(XOSVIEW_FREEBSD) |
24 |
-{ "_cnt" }, |
25 |
-#define VMMETER_SYM_INDEX 0 |
26 |
-#else |
27 |
-{ DUMMY_SYM }, |
28 |
-#define DUMMY_0 |
29 |
-#endif |
30 |
-#if !defined(XOSVIEW_OPENBSD) |
31 |
-{ "_ifnet" }, |
32 |
-#define IFNET_SYM_INDEX 1 |
33 |
-#else |
34 |
-{ DUMMY_SYM }, |
35 |
-#define DUMMY_1 |
36 |
-#endif |
37 |
- |
38 |
#if defined(XOSVIEW_OPENBSD) |
39 |
{ "_disklist" }, |
40 |
-#define DISKLIST_SYM_INDEX 2 |
41 |
+#define DISKLIST_SYM_INDEX 0 |
42 |
#else |
43 |
{ DUMMY_SYM }, |
44 |
-#define DUMMY_2 |
45 |
+#define DUMMY_0 |
46 |
#endif |
47 |
#if defined(XOSVIEW_NETBSD) |
48 |
{ "_allevents" }, |
49 |
-#define ALLEVENTS_SYM_INDEX 3 |
50 |
+#define ALLEVENTS_SYM_INDEX 1 |
51 |
{ "_bufmem" }, |
52 |
-#define BUFMEM_SYM_INDEX 4 |
53 |
+#define BUFMEM_SYM_INDEX 2 |
54 |
#else |
55 |
{ DUMMY_SYM }, |
56 |
-#define DUMMY_3 |
57 |
+#define DUMMY_1 |
58 |
{ DUMMY_SYM }, |
59 |
-#define DUMMY_4 |
60 |
+#define DUMMY_2 |
61 |
#endif |
62 |
#if defined(XOSVIEW_FREEBSD) |
63 |
{ "_intrnames" }, |
64 |
-#define INTRNAMES_SYM_INDEX 5 |
65 |
+#define INTRNAMES_SYM_INDEX 3 |
66 |
# if __FreeBSD_version >= 900040 |
67 |
{ "_sintrnames" }, |
68 |
# else |
69 |
{ "_eintrnames" }, |
70 |
# endif |
71 |
-#define EINTRNAMES_SYM_INDEX 6 |
72 |
+#define EINTRNAMES_SYM_INDEX 4 |
73 |
{ "_intrcnt" }, |
74 |
-#define INTRCNT_SYM_INDEX 7 |
75 |
+#define INTRCNT_SYM_INDEX 5 |
76 |
# if __FreeBSD_version >= 900040 |
77 |
{ "_sintrcnt" }, |
78 |
# else |
79 |
{ "_eintrcnt" }, |
80 |
# endif |
81 |
-#define EINTRCNT_SYM_INDEX 8 |
82 |
+#define EINTRCNT_SYM_INDEX 6 |
83 |
#endif |
84 |
{ NULL } |
85 |
}; |
86 |
@@ -338,7 +323,23 @@ BSDGetPageStats(uint64_t *meminfo, uint6 |
87 |
#else /* HAVE_UVM */ |
88 |
struct vmmeter vm; |
89 |
#if defined(XOSVIEW_FREEBSD) |
90 |
- safe_kvm_read_symbol(VMMETER_SYM_INDEX, &vm, sizeof(vm)); |
91 |
+ size_t size = sizeof(unsigned int); |
92 |
+ |
93 |
+#define GET_VM_STATS(name) \ |
94 |
+ sysctlbyname("vm.stats.vm." #name, &vm.name, &size, NULL, 0) |
95 |
+ GET_VM_STATS(v_active_count); |
96 |
+ GET_VM_STATS(v_inactive_count); |
97 |
+ GET_VM_STATS(v_wire_count); |
98 |
+#if __FreeBSD_version < 1200017 |
99 |
+ GET_VM_STATS(v_cache_count); |
100 |
+#endif |
101 |
+ GET_VM_STATS(v_free_count); |
102 |
+ GET_VM_STATS(v_page_size); |
103 |
+ GET_VM_STATS(v_vnodepgsin); |
104 |
+ GET_VM_STATS(v_vnodepgsout); |
105 |
+ GET_VM_STATS(v_swappgsin); |
106 |
+ GET_VM_STATS(v_swappgsout); |
107 |
+#undef GET_VM_STATS |
108 |
#else /* XOSVIEW_DFBSD */ |
109 |
struct vmstats vms; |
110 |
size_t size = sizeof(vms); |
111 |
@@ -353,7 +354,11 @@ BSDGetPageStats(uint64_t *meminfo, uint6 |
112 |
meminfo[0] = (uint64_t)vm.v_active_count * vm.v_page_size; |
113 |
meminfo[1] = (uint64_t)vm.v_inactive_count * vm.v_page_size; |
114 |
meminfo[2] = (uint64_t)vm.v_wire_count * vm.v_page_size; |
115 |
+#if __FreeBSD_version < 1200017 |
116 |
meminfo[3] = (uint64_t)vm.v_cache_count * vm.v_page_size; |
117 |
+#else |
118 |
+ meminfo[3] = 0; |
119 |
+#endif |
120 |
meminfo[4] = (uint64_t)vm.v_free_count * vm.v_page_size; |
121 |
#else /* XOSVIEW_DFBSD */ |
122 |
meminfo[0] = (uint64_t)vms.v_active_count * vms.v_page_size; |
123 |
@@ -468,99 +473,37 @@ BSDGetCPUTimes(uint64_t *timeArray, unsi |
124 |
int |
125 |
BSDNetInit() { |
126 |
OpenKDIfNeeded(); |
127 |
-#if defined(XOSVIEW_NETBSD) |
128 |
- return ValidSymbol(IFNET_SYM_INDEX); |
129 |
-#else |
130 |
return 1; |
131 |
-#endif |
132 |
} |
133 |
|
134 |
void |
135 |
BSDGetNetInOut(uint64_t *inbytes, uint64_t *outbytes, const char *netIface, bool ignored) { |
136 |
- char ifname[IFNAMSIZ]; |
137 |
+ struct ifaddrs *ifap, *ifa; |
138 |
*inbytes = 0; |
139 |
*outbytes = 0; |
140 |
-#if defined(XOSVIEW_OPENBSD) |
141 |
- size_t size; |
142 |
- char *buf, *next; |
143 |
- struct if_msghdr *ifm; |
144 |
- struct if_data ifd; |
145 |
- struct sockaddr_dl *sdl; |
146 |
|
147 |
- if ( sysctl(mib_ifl, 6, NULL, &size, NULL, 0) < 0 ) |
148 |
- err(EX_OSERR, "BSDGetNetInOut(): sysctl 1 failed"); |
149 |
- if ( (buf = (char *)malloc(size)) == NULL) |
150 |
- err(EX_OSERR, "BSDGetNetInOut(): malloc failed"); |
151 |
- if ( sysctl(mib_ifl, 6, buf, &size, NULL, 0) < 0 ) |
152 |
- err(EX_OSERR, "BSDGetNetInOut(): sysctl 2 failed"); |
153 |
+ if (getifaddrs(&ifap) != 0) |
154 |
+ return; |
155 |
|
156 |
- for (next = buf; next < buf + size; next += ifm->ifm_msglen) { |
157 |
+ for (ifa = ifap; ifa; ifa = ifa->ifa_next) { |
158 |
bool skipif = false; |
159 |
- ifm = (struct if_msghdr *)next; |
160 |
- if (ifm->ifm_type != RTM_IFINFO || ifm->ifm_addrs & RTAX_IFP == 0) |
161 |
- continue; |
162 |
- ifd = ifm->ifm_data; |
163 |
- sdl = (struct sockaddr_dl *)(ifm + 1); |
164 |
- if (sdl->sdl_family != AF_LINK) |
165 |
- continue; |
166 |
- if ( strncmp(netIface, "False", 5) != 0 ) { |
167 |
- memcpy(ifname, sdl->sdl_data, (sdl->sdl_nlen >= IFNAMSIZ ? IFNAMSIZ - 1 : sdl->sdl_nlen)); |
168 |
- if ( (!ignored && strncmp(sdl->sdl_data, netIface, sdl->sdl_nlen) != 0) || |
169 |
- ( ignored && strncmp(sdl->sdl_data, netIface, sdl->sdl_nlen) == 0) ) |
170 |
- skipif = true; |
171 |
- } |
172 |
- if (!skipif) { |
173 |
- *inbytes += ifd.ifi_ibytes; |
174 |
- *outbytes += ifd.ifi_obytes; |
175 |
- } |
176 |
- } |
177 |
- free(buf); |
178 |
-#else /* XOSVIEW_OPENBSD */ |
179 |
- struct ifnet *ifnetp; |
180 |
- struct ifnet ifnet; |
181 |
-#if defined (XOSVIEW_NETBSD) |
182 |
- struct ifnet_head ifnethd; |
183 |
-#else |
184 |
- struct ifnethead ifnethd; |
185 |
-#endif |
186 |
- safe_kvm_read(nlst[IFNET_SYM_INDEX].n_value, &ifnethd, sizeof(ifnethd)); |
187 |
- ifnetp = TAILQ_FIRST(&ifnethd); |
188 |
|
189 |
- while (ifnetp) { |
190 |
- bool skipif = false; |
191 |
- // Now, dereference the pointer to get the ifnet struct. |
192 |
- safe_kvm_read((unsigned long)ifnetp, &ifnet, sizeof(ifnet)); |
193 |
- strlcpy(ifname, ifnet.if_xname, sizeof(ifname)); |
194 |
-#if defined(XOSVIEW_NETBSD) |
195 |
- ifnetp = TAILQ_NEXT(&ifnet, if_list); |
196 |
-#else |
197 |
- ifnetp = TAILQ_NEXT(&ifnet, if_link); |
198 |
-#endif |
199 |
- if (!(ifnet.if_flags & IFF_UP)) |
200 |
+ if (ifa->ifa_addr->sa_family != AF_LINK) |
201 |
continue; |
202 |
+ |
203 |
if ( strncmp(netIface, "False", 5) != 0 ) { |
204 |
- if ( (!ignored && strncmp(ifname, netIface, 256) != 0) || |
205 |
- ( ignored && strncmp(ifname, netIface, 256) == 0) ) |
206 |
+ if ( (!ignored && strncmp(ifa->ifa_name, netIface, 256) != 0) || |
207 |
+ ( ignored && strncmp(ifa->ifa_name, netIface, 256) == 0) ) |
208 |
skipif = true; |
209 |
} |
210 |
+#define IFA_STAT(s) (((struct if_data *)ifa->ifa_data)->ifi_ ## s) |
211 |
if (!skipif) { |
212 |
-#if defined(XOSVIEW_DFBSD) && __DragonFly_version > 300304 |
213 |
- struct ifdata_pcpu *ifdatap = ifnet.if_data_pcpu; |
214 |
- struct ifdata_pcpu ifdata; |
215 |
- int ncpus = BSDCountCpus(); |
216 |
- for (int cpu = 0; cpu < ncpus; cpu++) { |
217 |
- safe_kvm_read((unsigned long)ifdatap + cpu * sizeof(ifdata), |
218 |
- &ifdata, sizeof(ifdata)); |
219 |
- *inbytes += ifdata.ifd_ibytes; |
220 |
- *outbytes += ifdata.ifd_obytes; |
221 |
- } |
222 |
-#else |
223 |
- *inbytes += ifnet.if_ibytes; |
224 |
- *outbytes += ifnet.if_obytes; |
225 |
-#endif |
226 |
+ *inbytes += IFA_STAT(ibytes); |
227 |
+ *outbytes += IFA_STAT(obytes); |
228 |
} |
229 |
+#undef IFA_STAT |
230 |
} |
231 |
-#endif /* XOSVIEW_OPENBSD */ |
232 |
+ freeifaddrs(ifap); |
233 |
} |
234 |
|
235 |
|
236 |
yes |
237 |
native |
238 |
text/plain |