Author: hrs
Date: Wed Sep  2 18:51:36 2015
New Revision: 287407
URL: https://svnweb.freebsd.org/changeset/base/287407

Log:
  Simplify kvm symbol resolution and error handling.  The symbol table
  nl_symbols will eventually be organized into several modules depending
  on MK_* variables.

Added:
  head/usr.bin/netstat/nlist_symbols   (contents, props changed)
Modified:
  head/usr.bin/netstat/Makefile
  head/usr.bin/netstat/main.c
  head/usr.bin/netstat/mroute.c
  head/usr.bin/netstat/netgraph.c
  head/usr.bin/netstat/netisr.c
  head/usr.bin/netstat/netstat.h
  head/usr.bin/netstat/route.c

Modified: head/usr.bin/netstat/Makefile
==============================================================================
--- head/usr.bin/netstat/Makefile       Wed Sep  2 18:42:35 2015        
(r287406)
+++ head/usr.bin/netstat/Makefile       Wed Sep  2 18:51:36 2015        
(r287407)
@@ -4,9 +4,32 @@
 .include <src.opts.mk>
 
 PROG=  netstat
-SRCS=  if.c inet.c main.c mbuf.c mroute.c netisr.c route.c \
+SRCS=  if.c inet.c main.c mbuf.c mroute.c netisr.c nl_symbols.c route.c \
        unix.c mroute6.c ipsec.c bpf.c pfkey.c sctp.c \
        flowtable.c
+DPSRCS=        nl_defs.h
+
+nl_symbols.c: nlist_symbols
+       awk '\
+           BEGIN { \
+               print "#include <sys/param.h>"; \
+               print "#include <nlist.h>"; \
+               print "struct nlist nl[] = {"; \
+           } \
+           !/^\#/ { printf("\t{ .n_name = \"%s\" },\n", $$2); } \
+           END { print "\t{ .n_name = NULL },\n};" } \
+           ' < ${.ALLSRC} > ${.TARGET} || rm -f ${.TARGET}
+nl_defs.h: nlist_symbols
+       awk '\
+           BEGIN { \
+               print "#include <nlist.h>"; \
+               print "extern struct nlist nl[];"; \
+               i = 0; \
+           } \
+           !/^\#/ { printf("\#define\tN%s\t%s\n", toupper($$2), i++); }' \
+           < ${.ALLSRC} > ${.TARGET} || rm -f ${.TARGET}
+CLEANFILES+=   nl_symbols.c nl_defs.h
+CFLAGS+=       -I${.OBJDIR}
 
 WARNS?=        3
 CFLAGS+=-fno-strict-aliasing

Modified: head/usr.bin/netstat/main.c
==============================================================================
--- head/usr.bin/netstat/main.c Wed Sep  2 18:42:35 2015        (r287406)
+++ head/usr.bin/netstat/main.c Wed Sep  2 18:51:36 2015        (r287407)
@@ -28,7 +28,7 @@
  */
 
 #ifndef lint
-char const copyright[] =
+static char const copyright[] =
 "@(#) Copyright (c) 1983, 1988, 1993\n\
        Regents of the University of California.  All rights reserved.\n";
 #endif /* not lint */
@@ -69,95 +69,10 @@ __FBSDID("$FreeBSD$");
 #include <string.h>
 #include <unistd.h>
 #include "netstat.h"
+#include "nl_defs.h"
 #include <libxo/xo.h>
 
-static struct nlist nl[] = {
-#define        N_RTSTAT        0
-       { .n_name = "_rtstat" },
-#define        N_RTREE         1
-       { .n_name = "_rt_tables"},
-#define        N_MRTSTAT       2
-       { .n_name = "_mrtstat" },
-#define        N_MFCHASHTBL    3
-       { .n_name = "_mfchashtbl" },
-#define        N_VIFTABLE      4
-       { .n_name = "_viftable" },
-#define        N_NGSOCKS       5
-       { .n_name = "_ngsocklist"},
-#define        N_IP6STAT       6
-       { .n_name = "_ip6stat" },
-#define        N_ICMP6STAT     7
-       { .n_name = "_icmp6stat" },
-#define        N_IPSECSTAT     8
-       { .n_name = "_ipsec4stat" },
-#define        N_IPSEC6STAT    9
-       { .n_name = "_ipsec6stat" },
-#define        N_PIM6STAT      10
-       { .n_name = "_pim6stat" },
-#define        N_MRT6STAT      11
-       { .n_name = "_mrt6stat" },
-#define        N_MF6CTABLE     12
-       { .n_name = "_mf6ctable" },
-#define        N_MIF6TABLE     13
-       { .n_name = "_mif6table" },
-#define        N_PFKEYSTAT     14
-       { .n_name = "_pfkeystat" },
-#define        N_RTTRASH       15
-       { .n_name = "_rttrash" },
-#define        N_CARPSTAT      16
-       { .n_name = "_carpstats" },
-#define        N_PFSYNCSTAT    17
-       { .n_name = "_pfsyncstats" },
-#define        N_AHSTAT        18
-       { .n_name = "_ahstat" },
-#define        N_ESPSTAT       19
-       { .n_name = "_espstat" },
-#define        N_IPCOMPSTAT    20
-       { .n_name = "_ipcompstat" },
-#define        N_TCPSTAT       21
-       { .n_name = "_tcpstat" },
-#define        N_UDPSTAT       22
-       { .n_name = "_udpstat" },
-#define        N_IPSTAT        23
-       { .n_name = "_ipstat" },
-#define        N_ICMPSTAT      24
-       { .n_name = "_icmpstat" },
-#define        N_IGMPSTAT      25
-       { .n_name = "_igmpstat" },
-#define        N_PIMSTAT       26
-       { .n_name = "_pimstat" },
-#define        N_TCBINFO       27
-       { .n_name = "_tcbinfo" },
-#define        N_UDBINFO       28
-       { .n_name = "_udbinfo" },
-#define        N_DIVCBINFO     29
-       { .n_name = "_divcbinfo" },
-#define        N_RIPCBINFO     30
-       { .n_name = "_ripcbinfo" },
-#define        N_UNP_COUNT     31
-       { .n_name = "_unp_count" },
-#define        N_UNP_GENCNT    32
-       { .n_name = "_unp_gencnt" },
-#define        N_UNP_DHEAD     33
-       { .n_name = "_unp_dhead" },
-#define        N_UNP_SHEAD     34
-       { .n_name = "_unp_shead" },
-#define        N_RIP6STAT      36
-       { .n_name = "_rip6stat" },
-#define        N_SCTPSTAT      36
-       { .n_name = "_sctpstat" },
-#define        N_MFCTABLESIZE  37
-       { .n_name = "_mfctablesize" },
-#define        N_ARPSTAT       38
-       { .n_name = "_arpstat" },
-#define        N_UNP_SPHEAD    39
-       { .n_name = "unp_sphead" },
-#define        N_SFSTAT        40
-       { .n_name = "_sfstat"},
-       { .n_name = NULL },
-};
-
-struct protox {
+static struct protox {
        int     pr_index;               /* index into nlist of cb head */
        int     pr_sindex;              /* index into nlist of stat block */
        u_char  pr_wanted;              /* 1 if wanted, 0 otherwise */
@@ -191,7 +106,7 @@ struct protox {
        { N_RIPCBINFO,  N_IGMPSTAT,     1,      protopr,
          igmp_stats,   NULL,           "igmp", 1,      IPPROTO_IGMP },
 #ifdef IPSEC
-       { -1,           N_IPSECSTAT,    1,      NULL,   /* keep as compat */
+       { -1,           N_IPSEC4STAT,   1,      NULL,   /* keep as compat */
          ipsec_stats,  NULL,           "ipsec", 0,     0},
        { -1,           N_AHSTAT,       1,      NULL,
          ah_stats,     NULL,           "ah",   0,      0},
@@ -202,10 +117,10 @@ struct protox {
 #endif
        { N_RIPCBINFO,  N_PIMSTAT,      1,      protopr,
          pim_stats,    NULL,           "pim",  1,      IPPROTO_PIM },
-       { -1,           N_CARPSTAT,     1,      NULL,
+       { -1,           N_CARPSTATS,    1,      NULL,
          carp_stats,   NULL,           "carp", 1,      0 },
 #ifdef PF
-       { -1,           N_PFSYNCSTAT,   1,      NULL,
+       { -1,           N_PFSYNCSTATS,  1,      NULL,
          pfsync_stats, NULL,           "pfsync", 1,    0 },
 #endif
        { -1,           N_ARPSTAT,      1,      NULL,
@@ -215,7 +130,7 @@ struct protox {
 };
 
 #ifdef INET6
-struct protox ip6protox[] = {
+static struct protox ip6protox[] = {
        { N_TCBINFO,    N_TCPSTAT,      1,      protopr,
          tcp_stats,    NULL,           "tcp",  1,      IPPROTO_TCP },
        { N_UDBINFO,    N_UDPSTAT,      1,      protopr,
@@ -244,7 +159,7 @@ struct protox ip6protox[] = {
 #endif /*INET6*/
 
 #ifdef IPSEC
-struct protox pfkeyprotox[] = {
+static struct protox pfkeyprotox[] = {
        { -1,           N_PFKEYSTAT,    1,      NULL,
          pfkey_stats,  NULL,           "pfkey", 0,     0 },
        { -1,           -1,             0,      NULL,
@@ -253,17 +168,17 @@ struct protox pfkeyprotox[] = {
 #endif
 
 #ifdef NETGRAPH
-struct protox netgraphprotox[] = {
-       { N_NGSOCKS,    -1,             1,      netgraphprotopr,
+static struct protox netgraphprotox[] = {
+       { N_NGSOCKLIST, -1,             1,      netgraphprotopr,
          NULL,         NULL,           "ctrl", 0,      0 },
-       { N_NGSOCKS,    -1,             1,      netgraphprotopr,
+       { N_NGSOCKLIST, -1,             1,      netgraphprotopr,
          NULL,         NULL,           "data", 0,      0 },
        { -1,           -1,             0,      NULL,
          NULL,         NULL,           NULL,   0,      0 }
 };
 #endif
 
-struct protox *protoprotox[] = {
+static struct protox *protoprotox[] = {
                                         protox,
 #ifdef INET6
                                         ip6protox,
@@ -278,12 +193,14 @@ static void usage(void);
 static struct protox *name2protox(const char *);
 static struct protox *knownname(const char *);
 
+static int kresolve_list(struct nlist *_nl);
+
 static kvm_t *kvmd;
 static char *nlistf = NULL, *memf = NULL;
 
 int    Aflag;          /* show addresses of protocol control block */
 int    aflag;          /* show all sockets (including servers) */
-int    Bflag;          /* show information about bpf consumers */
+static int     Bflag;          /* show information about bpf consumers */
 int    bflag;          /* show i/f total bytes in/out */
 int    dflag;          /* show i/f dropped packets */
 int    gflag;          /* show group (multicast) routing or stats */
@@ -295,7 +212,7 @@ int noutputs = 0;   /* how much outputs be
 int    numeric_addr;   /* show addresses numerically */
 int    numeric_port;   /* show ports numerically */
 static int pflag;      /* show given protocol */
-int    Qflag;          /* show netisr information */
+static int     Qflag;          /* show netisr information */
 int    rflag;          /* show routing tables (or routing stats) */
 int    Rflag;          /* show flow / RSS statistics */
 int    sflag;          /* show protocol statistics */
@@ -309,7 +226,7 @@ int interval;       /* repeat interval for i/f
 char   *interface;     /* desired i/f for stats, or NULL for all i/fs */
 int    unit;           /* unit number for above */
 
-int    af;             /* address family */
+static int     af;             /* address family */
 int    live;           /* true if we are examining a live system */
 
 int
@@ -526,9 +443,9 @@ main(int argc, char *argv[])
        if (Qflag) {
                if (!live) {
                        if (kread(0, NULL, 0) == 0)
-                               netisr_stats(kvmd);
+                               netisr_stats();
                } else
-                       netisr_stats(NULL);
+                       netisr_stats();
                xo_finish();
                exit(0);
        }
@@ -721,7 +638,7 @@ kvmd_init(void)
 /*
  * Resolve symbol list, return 0 on success.
  */
-int
+static int
 kresolve_list(struct nlist *_nl)
 {
 
@@ -743,6 +660,22 @@ kresolve_list(struct nlist *_nl)
 }
 
 /*
+ * Wrapper of kvm_dpcpu_setcpu().
+ */
+void
+kset_dpcpu(u_int cpuid)
+{
+
+       if ((kvmd == NULL) && (kvmd_init() != 0))
+               xo_errx(-1, "%s: kvm is not available", __func__);
+
+       if (kvm_dpcpu_setcpu(kvmd, cpuid) < 0)
+               xo_errx(-1, "%s: kvm_dpcpu_setcpu(%u): %s", __func__,
+                   cpuid, kvm_geterr(kvmd)); 
+       return;
+}
+
+/*
  * Read kernel memory, return 0 on success.
  */
 int

Modified: head/usr.bin/netstat/mroute.c
==============================================================================
--- head/usr.bin/netstat/mroute.c       Wed Sep  2 18:42:35 2015        
(r287406)
+++ head/usr.bin/netstat/mroute.c       Wed Sep  2 18:51:36 2015        
(r287407)
@@ -65,7 +65,6 @@ __FBSDID("$FreeBSD$");
 #undef _KERNEL
 
 #include <err.h>
-#include <nlist.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -73,21 +72,7 @@ __FBSDID("$FreeBSD$");
 #include <string.h>
 #include <libxo/xo.h>
 #include "netstat.h"
-
-/*
- * kvm(3) bindings for every needed symbol
- */
-static struct nlist mrl[] = {
-#define        N_MRTSTAT       0
-       { .n_name = "_mrtstat" },
-#define        N_MFCHASHTBL    1
-       { .n_name = "_mfchashtbl" },
-#define        N_VIFTABLE      2
-       { .n_name = "_viftable" },
-#define        N_MFCTABLESIZE  3
-       { .n_name = "_mfctablesize" },
-       { .n_name = NULL },
-};
+#include "nl_defs.h"
 
 static void    print_bw_meter(struct bw_meter *, int *);
 static void    print_mfc(struct mfc *, int, int *);
@@ -280,10 +265,9 @@ mroutepr()
                        return;
                }
        } else {
-               kresolve_list(mrl);
-               pmfchashtbl = mrl[N_MFCHASHTBL].n_value;
-               pmfctablesize = mrl[N_MFCTABLESIZE].n_value;
-               pviftbl = mrl[N_VIFTABLE].n_value;
+               pmfchashtbl = nl[N_MFCHASHTBL].n_value;
+               pmfctablesize = nl[N_MFCTABLESIZE].n_value;
+               pviftbl = nl[N_VIFTABLE].n_value;
 
                if (pmfchashtbl == 0 || pmfctablesize == 0 || pviftbl == 0) {
                        xo_warnx("No IPv4 MROUTING kernel support.");
@@ -418,8 +402,7 @@ mrt_stats()
        u_long mstaddr;
        size_t len = sizeof(mrtstat);
 
-       kresolve_list(mrl);
-       mstaddr = mrl[N_MRTSTAT].n_value;
+       mstaddr = nl[N_MRTSTAT].n_value;
 
        if (mstaddr == 0) {
                fprintf(stderr, "No IPv4 MROUTING kernel support.\n");

Modified: head/usr.bin/netstat/netgraph.c
==============================================================================
--- head/usr.bin/netstat/netgraph.c     Wed Sep  2 18:42:35 2015        
(r287406)
+++ head/usr.bin/netstat/netgraph.c     Wed Sep  2 18:51:36 2015        
(r287407)
@@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
 #include <netgraph/ng_socket.h>
 #include <netgraph/ng_socketvar.h>
 
-#include <nlist.h>
 #include <errno.h>
 #include <stdint.h>
 #include <stdio.h>

Modified: head/usr.bin/netstat/netisr.c
==============================================================================
--- head/usr.bin/netstat/netisr.c       Wed Sep  2 18:42:35 2015        
(r287406)
+++ head/usr.bin/netstat/netisr.c       Wed Sep  2 18:51:36 2015        
(r287407)
@@ -42,7 +42,6 @@ __FBSDID("$FreeBSD$");
 #include <net/netisr_internal.h>
 
 #include <err.h>
-#include <kvm.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -50,6 +49,7 @@ __FBSDID("$FreeBSD$");
 #include <string.h>
 #include <libxo/xo.h>
 #include "netstat.h"
+#include "nl_defs.h"
 
 /*
  * Print statistics for the kernel netisr subsystem.
@@ -102,41 +102,18 @@ netisr_dispatch_policy_to_string(u_int p
        snprintf(buf, buflen, "%s", str);
 }
 
-static void
-netisr_load_kvm_uint(kvm_t *kd, const char *name, u_int *p)
-{
-       struct nlist nl[] = {
-               { .n_name = name },
-               { .n_name = NULL },
-       };
-       int ret;
-
-       ret = kvm_nlist(kd, nl);
-       if (ret < 0)
-               xo_errx(-1, "%s: kvm_nlist(%s): %s", __func__, name,
-                   kvm_geterr(kd));
-       if (ret != 0)
-               xo_errx(-1, "%s: kvm_nlist(%s): unresolved symbol", __func__,
-                   name);
-       if (kvm_read(kd, nl[0].n_value, p, sizeof(*p)) != sizeof(*p))
-               xo_errx(-1, "%s: kvm_read(%s): %s", __func__, name,
-                   kvm_geterr(kd));
-}
-
 /*
  * Load a nul-terminated string from KVM up to 'limit', guarantee that the
  * string in local memory is nul-terminated.
  */
 static void
-netisr_load_kvm_string(kvm_t *kd, uintptr_t addr, char *dest, u_int limit)
+netisr_load_kvm_string(uintptr_t addr, char *dest, u_int limit)
 {
        u_int i;
 
        for (i = 0; i < limit; i++) {
-               if (kvm_read(kd, addr + i, &dest[i], sizeof(dest[i])) !=
-                   sizeof(dest[i]))
-                       xo_err(-1, "%s: kvm_read: %s", __func__,
-                           kvm_geterr(kd));
+               if (kread(addr + i, &dest[i], sizeof(dest[i])) != 0)
+                       xo_errx(-1, "%s: kread()", __func__);
                if (dest[i] == '\0')
                        break;
        }
@@ -168,18 +145,18 @@ netisr_protoispresent(u_int proto)
 }
 
 static void
-netisr_load_kvm_config(kvm_t *kd)
+netisr_load_kvm_config(void)
 {
        u_int tmp;
 
-       netisr_load_kvm_uint(kd, "_netisr_bindthreads", &bindthreads);
-       netisr_load_kvm_uint(kd, "_netisr_maxthreads", &maxthreads);
-       netisr_load_kvm_uint(kd, "_nws_count", &numthreads);
-
-       netisr_load_kvm_uint(kd, "_netisr_defaultqlimit", &defaultqlimit);
-       netisr_load_kvm_uint(kd, "_netisr_maxqlimit", &maxqlimit);
+       kread(nl[N_NETISR_BINDTHREADS].n_value, &bindthreads, sizeof(u_int));
+       kread(nl[N_NETISR_MAXTHREADS].n_value, &maxthreads, sizeof(u_int));
+       kread(nl[N_NWS_COUNT].n_value, &numthreads, sizeof(u_int));
+       kread(nl[N_NETISR_DEFAULTQLIMIT].n_value, &defaultqlimit,
+           sizeof(u_int));
+       kread(nl[N_NETISR_MAXQLIMIT].n_value, &maxqlimit, sizeof(u_int));
+       kread(nl[N_NETISR_DISPATCH_POLICY].n_value, &tmp, sizeof(u_int));
 
-       netisr_load_kvm_uint(kd, "_netisr_dispatch_policy", &tmp);
        netisr_dispatch_policy_to_string(tmp, dispatch_policy,
            sizeof(dispatch_policy));
 }
@@ -223,41 +200,26 @@ netisr_load_sysctl_config(void)
 }
 
 static void
-netisr_load_kvm_proto(kvm_t *kd)
+netisr_load_kvm_proto(void)
 {
-       struct nlist nl[] = {
-#define        NLIST_NETISR_PROTO      0
-               { .n_name = "_netisr_proto" },
-               { .n_name = NULL },
-       };
        struct netisr_proto *np_array, *npp;
        u_int i, protocount;
        struct sysctl_netisr_proto *snpp;
        size_t len;
-       int ret;
 
        /*
         * Kernel compile-time and user compile-time definitions of
         * NETISR_MAXPROT must match, as we use that to size work arrays.
         */
-       netisr_load_kvm_uint(kd, "_netisr_maxprot", &maxprot);
+       kread(nl[N_NETISR_MAXPROT].n_value, &maxprot, sizeof(u_int));
        if (maxprot != NETISR_MAXPROT)
                xo_errx(-1, "%s: NETISR_MAXPROT mismatch", __func__);
        len = maxprot * sizeof(*np_array);
        np_array = malloc(len);
        if (np_array == NULL)
                xo_err(-1, "%s: malloc", __func__);
-       ret = kvm_nlist(kd, nl);
-       if (ret < 0)
-               xo_errx(-1, "%s: kvm_nlist(_netisr_proto): %s", __func__,
-                   kvm_geterr(kd));
-       if (ret != 0)
-               xo_errx(-1, "%s: kvm_nlist(_netisr_proto): unresolved symbol",
-                   __func__);
-       if (kvm_read(kd, nl[NLIST_NETISR_PROTO].n_value, np_array, len) !=
-           (ssize_t)len)
-               xo_errx(-1, "%s: kvm_read(_netisr_proto): %s", __func__,
-                   kvm_geterr(kd));
+       if (kread(nl[N_NETISR_PROTO].n_value, np_array, len) != 0)
+               xo_errx(-1, "%s: kread(_netisr_proto)", __func__);
 
        /*
         * Size and allocate memory to hold only live protocols.
@@ -278,7 +240,7 @@ netisr_load_kvm_proto(kvm_t *kd)
                        continue;
                snpp = &proto_array[protocount];
                snpp->snp_version = sizeof(*snpp);
-               netisr_load_kvm_string(kd, (uintptr_t)npp->np_name,
+               netisr_load_kvm_string((uintptr_t)npp->np_name,
                    snpp->snp_name, sizeof(snpp->snp_name));
                snpp->snp_proto = i;
                snpp->snp_qlimit = npp->np_qlimit;
@@ -320,35 +282,21 @@ netisr_load_sysctl_proto(void)
 }
 
 static void
-netisr_load_kvm_workstream(kvm_t *kd)
+netisr_load_kvm_workstream(void)
 {
-       struct nlist nl[] = {
-#define        NLIST_NWS_ARRAY         0
-               { .n_name = "_nws_array" },
-               { .n_name = NULL },
-       };
        struct netisr_workstream nws;
        struct sysctl_netisr_workstream *snwsp;
        struct sysctl_netisr_work *snwp;
        struct netisr_work *nwp;
-       struct nlist nl_nws[2];
        u_int counter, cpuid, proto, wsid;
        size_t len;
-       int ret;
 
        len = numthreads * sizeof(*nws_array);
        nws_array = malloc(len);
        if (nws_array == NULL)
                xo_err(-1, "malloc");
-       ret = kvm_nlist(kd, nl);
-       if (ret < 0)
-               xo_errx(-1, "%s: kvm_nlist: %s", __func__, kvm_geterr(kd));
-       if (ret != 0)
-               xo_errx(-1, "%s: kvm_nlist: unresolved symbol", __func__);
-       if (kvm_read(kd, nl[NLIST_NWS_ARRAY].n_value, nws_array, len) !=
-           (ssize_t)len)
-               xo_errx(-1, "%s: kvm_read(_nws_array): %s", __func__,
-                   kvm_geterr(kd));
+       if (kread(nl[N_NWS_ARRAY].n_value, nws_array, len) != 0)
+               xo_errx(-1, "%s: kread(_nws_array)", __func__);
        workstream_array = calloc(numthreads, sizeof(*workstream_array));
        if (workstream_array == NULL)
                xo_err(-1, "calloc");
@@ -359,22 +307,9 @@ netisr_load_kvm_workstream(kvm_t *kd)
        counter = 0;
        for (wsid = 0; wsid < numthreads; wsid++) {
                cpuid = nws_array[wsid];
-               if (kvm_dpcpu_setcpu(kd, cpuid) < 0)
-                       xo_errx(-1, "%s: kvm_dpcpu_setcpu(%u): %s", __func__,
-                           cpuid, kvm_geterr(kd));
-               bzero(nl_nws, sizeof(nl_nws));
-               nl_nws[0].n_name = "_nws";
-               ret = kvm_nlist(kd, nl_nws);
-               if (ret < 0)
-                       xo_errx(-1, "%s: kvm_nlist looking up nws on CPU "
-                           "%u: %s", __func__, cpuid, kvm_geterr(kd));
-               if (ret != 0)
-                       xo_errx(-1, "%s: kvm_nlist(nws): unresolved symbol on "
-                           "CPU %u", __func__, cpuid);
-               if (kvm_read(kd, nl_nws[0].n_value, &nws, sizeof(nws)) !=
-                   sizeof(nws))
-                       xo_errx(-1, "%s: kvm_read(nw): %s", __func__,
-                           kvm_geterr(kd));
+               kset_dpcpu(cpuid);
+               if (kread(nl[N_NWS].n_value, &nws, sizeof(nws)) != 0)
+                       xo_errx(-1, "%s: kread(nw)", __func__);
                snwsp = &workstream_array[wsid];
                snwsp->snws_version = sizeof(*snwsp);
                snwsp->snws_wsid = cpuid;
@@ -507,11 +442,10 @@ netisr_print_workstream(struct sysctl_ne
 }
 
 void
-netisr_stats(void *kvmd)
+netisr_stats(void)
 {
        struct sysctl_netisr_workstream *snwsp;
        struct sysctl_netisr_proto *snpp;
-       kvm_t *kd = kvmd;
        u_int i;
 
        if (live) {
@@ -520,11 +454,9 @@ netisr_stats(void *kvmd)
                netisr_load_sysctl_workstream();
                netisr_load_sysctl_work();
        } else {
-               if (kd == NULL)
-                       xo_errx(-1, "netisr_stats: !live but !kd");
-               netisr_load_kvm_config(kd);
-               netisr_load_kvm_proto(kd);
-               netisr_load_kvm_workstream(kd);         /* Also does work. */
+               netisr_load_kvm_config();
+               netisr_load_kvm_proto();
+               netisr_load_kvm_workstream();           /* Also does work. */
        }
 
        xo_open_container("netisr");

Modified: head/usr.bin/netstat/netstat.h
==============================================================================
--- head/usr.bin/netstat/netstat.h      Wed Sep  2 18:42:35 2015        
(r287406)
+++ head/usr.bin/netstat/netstat.h      Wed Sep  2 18:51:36 2015        
(r287407)
@@ -63,11 +63,10 @@ extern int  unit;   /* unit number for abov
 
 extern int     live;   /* true if we are examining a live system */
 
-struct nlist;
 int    kread(u_long addr, void *buf, size_t size);
 uint64_t kread_counter(u_long addr);
 int    kread_counters(u_long addr, void *buf, size_t size);
-int    kresolve_list(struct nlist *);
+void   kset_dpcpu(u_int);
 const char *plural(uintmax_t);
 const char *plurales(uintmax_t);
 const char *pluralies(uintmax_t);
@@ -119,7 +118,7 @@ void        pfkey_stats(u_long, const char *, i
 
 void   mbpr(void *, u_long);
 
-void   netisr_stats(void *);
+void   netisr_stats(void);
 
 void   hostpr(u_long, u_long);
 void   impstats(u_long, u_long);

Added: head/usr.bin/netstat/nlist_symbols
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/usr.bin/netstat/nlist_symbols  Wed Sep  2 18:51:36 2015        
(r287407)
@@ -0,0 +1,54 @@
+# $FreeBSD$
+#
+# module_name  symbol_name
+all    _ahstat
+all    _arpstat
+all    _carpstats
+all    _divcbinfo
+all    _espstat
+all    _icmp6stat
+all    _icmpstat
+all    _igmpstat
+all    _ip6stat
+all    _ipcompstat
+all    _ipsec4stat
+all    _ipsec6stat
+all    _ipstat
+all    _mf6ctable
+all    _mfchashtbl
+all    _mfctablesize
+all    _mif6table
+all    _mrt6stat
+all    _mrtstat
+all    _netisr_bindthreads
+all    _netisr_defaultqlimit
+all    _netisr_dispatch_policy
+all    _netisr_maxprot
+all    _netisr_maxqlimit
+all    _netisr_maxthreads
+all    _netisr_proto
+all    _ngsocklist
+all    _nws
+all    _nws_array
+all    _nws_count
+all    _pfkeystat
+all    _pfsyncstats
+all    _pim6stat
+all    _pimstat
+all    _rip6stat
+all    _ripcbinfo
+all    _rtree
+all    _rtstat
+all    _rttrash
+all    _sctpstat
+all    _sfstat
+all    _tcbinfo
+all    _tcpstat
+all    _udbinfo
+all    _udpstat
+all    _unp_count
+all    _unp_dhead
+all    _unp_gencnt
+all    _unp_shead
+all    _unp_sphead
+all    _viftable

Modified: head/usr.bin/netstat/route.c
==============================================================================
--- head/usr.bin/netstat/route.c        Wed Sep  2 18:42:35 2015        
(r287406)
+++ head/usr.bin/netstat/route.c        Wed Sep  2 18:51:36 2015        
(r287407)
@@ -56,7 +56,6 @@ __FBSDID("$FreeBSD$");
 #include <ifaddrs.h>
 #include <libutil.h>
 #include <netdb.h>
-#include <nlist.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -67,6 +66,7 @@ __FBSDID("$FreeBSD$");
 #include <err.h>
 #include <libxo/xo.h>
 #include "netstat.h"
+#include "nl_defs.h"
 
 /*
  * Definitions for showing gateway flags.
@@ -96,17 +96,6 @@ static struct bits {
        { 0 , 0, NULL }
 };
 
-/*
- * kvm(3) bindings for every needed symbol
- */
-static struct nlist rl[] = {
-#define        N_RTSTAT        0
-       { .n_name = "_rtstat" },
-#define        N_RTTRASH       1
-       { .n_name = "_rttrash" },
-       { .n_name = NULL },
-};
-
 struct ifmap_entry {
        char ifname[IFNAMSIZ];
 };
@@ -745,13 +734,11 @@ rt_stats(void)
        u_long rtsaddr, rttaddr;
        int rttrash;
 
-       kresolve_list(rl);
-
-       if ((rtsaddr = rl[N_RTSTAT].n_value) == 0) {
+       if ((rtsaddr = nl[N_RTSTAT].n_value) == 0) {
                xo_emit("{W:rtstat: symbol not in namelist}\n");
                return;
        }
-       if ((rttaddr = rl[N_RTTRASH].n_value) == 0) {
+       if ((rttaddr = nl[N_RTTRASH].n_value) == 0) {
                xo_emit("{W:rttrash: symbol not in namelist}\n");
                return;
        }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to