diff options
| author | Garrett D'Amore <garrett@damore.org> | 2022-07-03 19:05:50 -0700 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2022-07-11 18:59:59 -0400 |
| commit | 15f90b02bdacbf0ae47fa105944f15b6596f9748 (patch) | |
| tree | 998c2fb60e1c6a117e55985b8d94631e5cc95ea8 /usr/src/cmd/mdb | |
| parent | 174513368dec739adb93c76e5d47aed84797d1ad (diff) | |
| download | illumos-joyent-15f90b02bdacbf0ae47fa105944f15b6596f9748.tar.gz | |
14768 retire nca
Reviewed by: Peter Tribble <peter.tribble@gmail.com>
Reviewed by: Andy Fiddaman <andy@omnios.org>
Reviewed by: Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org>
Approved by: Robert Mustacchi <rm@fingolfin.org>
Diffstat (limited to 'usr/src/cmd/mdb')
| -rw-r--r-- | usr/src/cmd/mdb/Makefile.common | 2 | ||||
| -rw-r--r-- | usr/src/cmd/mdb/common/modules/nca/nca.c | 1237 | ||||
| -rw-r--r-- | usr/src/cmd/mdb/intel/amd64/nca/Makefile | 36 | ||||
| -rw-r--r-- | usr/src/cmd/mdb/sparc/v9/nca/Makefile | 36 |
4 files changed, 1 insertions, 1310 deletions
diff --git a/usr/src/cmd/mdb/Makefile.common b/usr/src/cmd/mdb/Makefile.common index 5616038726..77a103c554 100644 --- a/usr/src/cmd/mdb/Makefile.common +++ b/usr/src/cmd/mdb/Makefile.common @@ -23,6 +23,7 @@ # Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. # Copyright 2016 Joyent, Inc. # Copyright 2018 Nexenta Systems, Inc. +# Copyright 2022 Garrett D'Amore # # @@ -83,7 +84,6 @@ COMMON_MODULES_KVM = \ mm \ mpt_sas \ mr_sas \ - nca \ nsmb \ pmcs \ ptm \ diff --git a/usr/src/cmd/mdb/common/modules/nca/nca.c b/usr/src/cmd/mdb/common/modules/nca/nca.c deleted file mode 100644 index e10a42e0aa..0000000000 --- a/usr/src/cmd/mdb/common/modules/nca/nca.c +++ /dev/null @@ -1,1237 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -/* - * NCA mdb module. Provides a collection of dcmds and walkers that - * operate on core NCA data structures. Dependencies on NCA internals - * are described in $SRC/uts/common/inet/nca/nca.h. - */ - -#include <mdb/mdb_modapi.h> -#include <mdb/mdb_ks.h> - -#include <ctype.h> -#include <sys/types.h> -#include <sys/sunddi.h> -#include <sys/processor.h> -#include <netinet/in.h> -#include <netinet/ip6.h> /* must come before common.h */ -#include <inet/common.h> /* must come before led.h */ -#include <inet/led.h> /* must come before ip.h */ -#include <inet/ip.h> /* must come before tcp.h */ -#include <inet/tcp.h> /* must come before nca/nca.h */ -#include <inet/nca/nca.h> -#include <inet/nca/ncadoorhdr.h> - -#define NCA_WALK_PLRU (void *)1 -#define NCA_WALK_VLRU (void *)2 -#define NCA_ADDR_WIDTH 11 /* kernel addresses *shouldn't* be wider */ -#define YESNO(bool) ((bool) ? 'Y' : 'n') - -/* - * Structure for assigning a name to a region of memory. - */ -typedef struct { - const char *nm_name; /* name of region */ - int nm_len; /* length to region */ - uintptr_t nm_addr; /* starting address of region */ -} namedmem_t; - -/* - * Structure for giving a name to a constant. - */ -typedef struct { - const char *const_name; /* name of constant */ - int const_value; /* constant itself */ -} constname_t; - -/* - * Structure for mapping a bit to a name and a description. Instances - * of this datatype should always be arrays which decode bits in a - * number, and the index into the array should contain the description - * of a bit at position "index" in the number being decoded. The list - * must be terminated by an entry with a NULL `bit_name'. - */ -typedef struct { - const char *bit_name; /* name of bit */ - const char *bit_descr; /* description of bit's purpose */ -} bitname_t; - -/* - * Note: These should be defined in upside down order to their - * definitions in nca.h - * (Assumes that current ordering convention in nca.h will - * prevail for future additions) - */ -static const bitname_t node_refs[] = { - { "REF_UNUSED", "0x00000001" }, - { "REF_UNUSED", "0x00000002" }, - { "REF_UNUSED", "0x00000004" }, - { "REF_UNUSED", "0x00000008" }, - { "REF_UNUSED", "0x00000010" }, - { "REF_UNUSED", "0x00000020" }, - { "REF_UNUSED", "0x00000040" }, - { "REF_UNUSED", "0x00000080" }, - { "REF_UNUSED", "0x00000100" }, - { "REF_UNUSED", "0x00000200" }, - { "REF_UNUSED", "0x00000400" }, - { "REF_SEGMAP", "segmapped (PHYS|VIRT)" }, - { "REF_NCAFS", "NCAfs required" }, - { "REF_VNODE", "vnode hashed" }, - { "REF_ERROR", "errored" }, - { "REF_OWNED", "owned (won't be freed)" }, - { "REF_UPCALL", "upcall not completed yet" }, - { "REF_CTAG", "CTAG hashed" }, - { "REF_PREEMPT", "processing preempted" }, - { "REF_ONVLRU", "on virtual memory LRU list" }, - { "REF_ONPLRU", "on physical memory LRU list" }, - { "REF_MISS", "in miss processing" }, - { "REF_NOLRU", "not safe for LRU reclaim" }, - { "REF_RESP", "done parsing response header" }, - { "REF_FILE", "reachable through filename hash" }, - { "REF_SAFED", "not safe for use" }, - { "REF_DONE", "done with miss processing" }, - { "REF_KMEM", "content-backed via kmem_alloc()" }, - { "REF_CKSUM", "checksum mapping in-use" }, - { "REF_VIRT", "virtually mapped (data valid)" }, - { "REF_PHYS", "physically mapped (pp valid)" }, - { "REF_URI", "reachable through URI hash" }, - { NULL } -}; - -static const bitname_t advise_types[] = { - { "ADVISE", "" }, - { "ADVISE_REPLACE", "replace cached object with provided object" }, - { "ADVISE_FLUSH", "flush cached object" }, - { "ADVISE_TEMP", "return this object; keep cached object" }, - { NULL } -}; - -/* - * Print `len' bytes of buffer `buf'. Handle nonprintable characters - * specially. - */ -static void -printbuf(uint8_t *buf, size_t len) -{ - size_t i; - - /* - * TODO: display octal form of unprintable characters in dim mode - * once mdb pager bug is fixed. - */ - for (i = 0; i < len; i++) - mdb_printf(isgraph(buf[i]) ? "%c" : "\\%#o", buf[i]); - - mdb_printf("\n"); -} - -/* - * Convert HTTP method operation `method' to a name. - */ -static const char * -method2name(unsigned int method) -{ - unsigned int i; - static constname_t http_methods[] = { - { "NCA_UNKNOWN", NCA_UNKNOWN }, - { "NCA_OPTIONS", NCA_OPTIONS }, - { "NCA_GET", NCA_GET }, - { "NCA_HEAD", NCA_HEAD }, - { "NCA_POST", NCA_POST }, - { "NCA_PUT", NCA_PUT }, - { "NCA_DELETE", NCA_DELETE }, - { "NCA_TRACE", NCA_TRACE }, - { "NCA_RAW", NCA_RAW }, - { NULL } - }; - - for (i = 0; http_methods[i].const_name != NULL; i++) { - if (method == http_methods[i].const_value) - return (http_methods[i].const_name); - } - - return ("<unknown>"); -} - -/* - * Convert TCP state `state' to a name. - */ -static const char * -state2name(int state) -{ - unsigned int i; - static constname_t tcp_states[] = { - { "CLOSED", TCPS_CLOSED }, - { "IDLE", TCPS_IDLE }, - { "BOUND", TCPS_BOUND }, - { "LISTEN", TCPS_LISTEN }, - { "SYN_SENT", TCPS_SYN_SENT }, - { "SYN_RCVD", TCPS_SYN_RCVD }, - { "ESTABLISHED", TCPS_ESTABLISHED }, - { "CLOSE_WAIT", TCPS_CLOSE_WAIT }, - { "FIN_WAIT1", TCPS_FIN_WAIT_1 }, - { "FIN_WAIT2", TCPS_FIN_WAIT_2 }, - { "CLOSING", TCPS_CLOSING }, - { "LAST_ACK", TCPS_LAST_ACK }, - { "TIME_WAIT", TCPS_TIME_WAIT }, - { NULL } - }; - - for (i = 0; tcp_states[i].const_name != NULL; i++) { - if (state == tcp_states[i].const_value) - return (tcp_states[i].const_name); - } - - return ("<unknown>"); -} - -/* - * Convert an nca_io2_t direct_type into a name. - */ -static const char * -direct2name(unsigned int type) -{ - unsigned int i; - static const constname_t direct_types[] = { - { "DIRECT_NONE", NCA_IO_DIRECT_NONE }, - { "DIRECT_FILENAME", NCA_IO_DIRECT_FILENAME }, - { "DIRECT_SHMSEG", NCA_IO_DIRECT_SHMSEG }, - { "DIRECT_FILEDESC", NCA_IO_DIRECT_FILEDESC }, - { "DIRECT_CTAG", NCA_IO_DIRECT_CTAG }, - { "DIRECT_SPLICE", NCA_IO_DIRECT_SPLICE }, - { "DIRECT_TEE", NCA_IO_DIRECT_TEE }, - { "DIRECT_FILE_FD", NCA_IO_DIRECT_FILE_FD }, - { NULL, 0 } - }; - - for (i = 0; direct_types[i].const_name != NULL; i++) { - if (type == direct_types[i].const_value) - return (direct_types[i].const_name); - } - - return ("<unknown>"); -} - -/* - * Convert an nca_io2_t operation into a name. - */ -static const char * -op2name(nca_op_t op) -{ - unsigned int i; - static const constname_t op_types[] = { - { "http", http_op }, - { "error", error_op }, - { "error_retry", error_retry_op }, - { "resource", resource_op }, - { "timeout", timeout_op }, - { "door_attach", door_attach_op }, - - { "log", log_op }, - { "log_ok", log_ok_op }, - { "log_error", log_error_op }, - { "log_op_fiov", log_op_fiov }, - - { NULL, 0 } - }; - - for (i = 0; op_types[i].const_name != NULL; i++) { - if (op == op_types[i].const_value) - return (op_types[i].const_name); - } - - return ("<unknown>"); -} - -/* - * Convert from ticks to milliseconds. - */ -static uint64_t -tick2msec(uint64_t tick) -{ - static int tick_per_msec; - static int msec_per_tick; - static int once; - - if (once == 0) { - if (mdb_readvar(&tick_per_msec, "tick_per_msec") == -1) { - mdb_warn("cannot read symbol tick_per_msec"); - return (0); - } - if (mdb_readvar(&msec_per_tick, "msec_per_tick") == -1) { - mdb_warn("cannot read symbol msec_per_tick"); - return (0); - } - once++; - } - - return (tick_per_msec ? tick / tick_per_msec : tick * msec_per_tick); -} - -/* - * Print the core fields in an nca_io2_t. With the "-v" argument, - * provide more verbose output. With the "-p" argument, print payload - * information. - */ -static int -nca_io2(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - unsigned int i; - unsigned int payload_len; - uint64_t payload_output_max = 0; - unsigned int verbose = FALSE; - const int IO2_ADVDELT = NCA_ADDR_WIDTH + 1; - boolean_t arm; - nca_io2_t io2; - uint8_t *buf; - namedmem_t area[3]; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, TRUE, &verbose, - 'p', MDB_OPT_UINT64, &payload_output_max, NULL) != argc) - return (DCMD_USAGE); - - if (!DCMD_HDRSPEC(flags) && verbose) - mdb_printf("\n\n"); - - if (DCMD_HDRSPEC(flags) || verbose) { - mdb_printf("%<u>%-*s %2s %4s %8s %*s %8s %16s %-12s%</u>\n", - NCA_ADDR_WIDTH, "ADDR", "AV", "MFNP", "TID", - NCA_ADDR_WIDTH, "CONN", "CONN_TAG", "CACHE_TAG", - "OPERATION"); - } - - if (mdb_vread(&io2, sizeof (nca_io2_t), addr) == -1) { - mdb_warn("cannot read nca_io2_t at %p", addr); - return (DCMD_ERR); - } - - if (io2.version != NCA_HTTP_VERSION2) - mdb_warn("nca_io2_t at %p has incorrect version `%u'\n", addr, - io2.version); - - mdb_printf("%0*p %02x %c%c%c%c %08x %0*llx %08x %016llx %s\n", - NCA_ADDR_WIDTH, addr, io2.advisory, YESNO(io2.more), - YESNO(io2.first), YESNO(io2.nocache), YESNO(io2.preempt), - (uint32_t)io2.tid, NCA_ADDR_WIDTH, io2.cid, io2.tag, io2.ctag, - op2name(io2.op)); - - if (verbose) { - arm = B_TRUE; - for (i = 0; advise_types[i].bit_name != NULL; i++) { - if ((io2.advisory & (1 << i)) == 0) - continue; - - if (arm) { - mdb_printf("%*s|\n", IO2_ADVDELT, ""); - mdb_printf("%*s+--> ", IO2_ADVDELT, ""); - arm = B_FALSE; - } else - mdb_printf("%*s ", IO2_ADVDELT, ""); - - mdb_printf("%-15s %s\n", advise_types[i].bit_name, - advise_types[i].bit_descr); - } - } - - payload_len = io2.data_len + io2.direct_len + io2.trailer_len; - - if (payload_output_max == 0 || payload_len == 0) - return (DCMD_OK); - - mdb_inc_indent(4); - mdb_printf("\n%u byte payload consists of:\n", payload_len); - mdb_inc_indent(4); - - buf = mdb_alloc(payload_output_max, UM_SLEEP); - - area[0].nm_name = "data"; - area[0].nm_addr = addr + io2.data; - area[0].nm_len = io2.data_len; - - area[1].nm_name = direct2name(io2.direct_type); - area[1].nm_addr = addr + io2.direct; - area[1].nm_len = io2.direct_len; - - area[2].nm_name = "trailer"; - area[2].nm_addr = addr + io2.trailer; - area[2].nm_len = io2.trailer_len; - - for (i = 0; i < sizeof (area) / sizeof (area[0]); i++) { - if (area[i].nm_len <= 0) - continue; - - mdb_printf("%d byte %s area at %p (", area[i].nm_len, - area[i].nm_name, area[i].nm_addr); - - if (area[i].nm_len > payload_output_max) { - mdb_printf("first"); - area[i].nm_len = (int)payload_output_max; - } else - mdb_printf("all"); - - mdb_printf(" %u bytes follow):\n", area[i].nm_len); - if (mdb_vread(buf, area[i].nm_len, area[i].nm_addr) == -1) - mdb_warn("cannot read %s area at %p", area[i].nm_name, - area[i].nm_addr); - else { - mdb_inc_indent(4); - printbuf(buf, area[i].nm_len); - mdb_dec_indent(4); - } - } - mdb_dec_indent(4); - mdb_dec_indent(4); - - mdb_free(buf, payload_output_max); - - return (DCMD_OK); -} - -static void -nca_io2_help(void) -{ - mdb_printf("Print the core information for a given NCA nca_io2_t.\n"); - mdb_printf("Options:\n"); - mdb_printf("\t-p N\tshow up to N bytes of payload information from\n"); - mdb_printf("\t\teach payload area\n"); - mdb_printf("\t\t(reminder: default radix is %<b>hex%</b>)\n"); - mdb_printf("\t-v\tbe verbose (more descriptive)\n"); -} - -/* - * Print the core fields for one or all NCA timers. If no address is - * specified, all NCA timers are printed; otherwise the specified timer - * list is printed. With the "-e" argument, the "encapsulated" pointer - * for each te_t in a given tb_t is shown in parentheses. - */ -static int -nca_timer(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - unsigned int show_encap = FALSE; - void *tb_addr, *te_addr; - clock_t lbolt, first_exec = 0; - ti_t ti; - tb_t tb; - te_t te; - - if (!(flags & DCMD_ADDRSPEC)) { - if (mdb_walk_dcmd("nca_timer", "nca_timer", argc, argv) == -1) { - mdb_warn("cannot walk timer list"); - return (DCMD_ERR); - } - return (DCMD_OK); - } - - if (mdb_getopts(argc, argv, 'e', MDB_OPT_SETBITS, TRUE, &show_encap, - NULL) != argc) - return (DCMD_USAGE); - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("%<u>%-*s %-*s %-55s%</u>\n", NCA_ADDR_WIDTH, "TI", - NCA_ADDR_WIDTH, "SQUEUE", "FIRELIST +MSEC"); - } - - if (mdb_vread(&ti, sizeof (ti_t), addr) == -1) { - mdb_warn("cannot read ti_t at %p", addr); - return (DCMD_ERR); - } - - if ((lbolt = (clock_t)mdb_get_lbolt()) == -1) - return (DCMD_ERR); - - mdb_printf("%0*p %0*p", NCA_ADDR_WIDTH, addr, NCA_ADDR_WIDTH, ti.ep); - mdb_inc_indent(24); - for (tb_addr = ti.head; tb_addr != NULL; tb_addr = tb.next) { - if (mdb_vread(&tb, sizeof (tb_t), (uintptr_t)tb_addr) == -1) { - mdb_warn("cannot read tb_t at %p", tb_addr); - return (DCMD_ERR); - } - if (first_exec == 0) { - mdb_printf(" %ld", tick2msec(tb.exec - lbolt)); - first_exec = tb.exec; - } else - mdb_printf(" %+lld", tick2msec(tb.exec - first_exec)); - - if (!show_encap || tb.head == NULL) - continue; - - mdb_printf("("); - for (te_addr = tb.head; te_addr != NULL; te_addr = te.next) { - if (mdb_vread(&te, sizeof (te_t), (uintptr_t)te_addr) - == -1) { - mdb_warn("cannot read te_t at %p", te_addr); - return (DCMD_ERR); - } - mdb_printf("%0p%s", te.ep, te.next == NULL ? "" : " "); - } - mdb_printf(")"); - } - mdb_printf("\n"); - mdb_dec_indent(24); - - return (DCMD_OK); -} - -static void -nca_timer_help(void) -{ - mdb_printf("Print the core information for one or all NCA timer\n"); - mdb_printf("lists. If no timer list is given, then all timer lists\n"); - mdb_printf("are shown. For each timer list, the list of timers to\n"); - mdb_printf("fire on that list are shown, the first in absolute\n"); - mdb_printf("ticks and the rest in ticks relative to the first.\n\n"); - mdb_printf("Options:\n"); - mdb_printf("\t-e\tshow the encapsulating pointer for each event "); - mdb_printf("at each fire time\n"); -} - -/* - * Print the core fields in an NCA node_t. With the "-r" argument, - * provide additional information about the request; with "-v", - * provide more verbose output. - */ -static int -nca_node(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - unsigned int i, max; - unsigned int verbose = FALSE; - unsigned int request = FALSE; - const int NODE_REFDELT = NCA_ADDR_WIDTH + 4 + 2; - boolean_t arm; - node_t node; - char *buf; - namedmem_t hdr[4]; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, TRUE, &verbose, - 'r', MDB_OPT_SETBITS, TRUE, &request, 'p', NULL) != argc) - return (DCMD_USAGE); - - if (!DCMD_HDRSPEC(flags) && verbose) - mdb_printf("\n\n"); - - if (DCMD_HDRSPEC(flags) || verbose) { - mdb_printf("%<u>%-*s %4s %5s %8s %-*s %-*s %-*s %-*s%</u>\n", - NCA_ADDR_WIDTH, "ADDR", "REF", "STATE", "DATASIZE", - NCA_ADDR_WIDTH, "SQUEUE", NCA_ADDR_WIDTH, "REQUEST", - NCA_ADDR_WIDTH, "PLRUN", NCA_ADDR_WIDTH, "VLRUN"); - } - - if (mdb_vread(&node, sizeof (node_t), addr) == -1) { - mdb_warn("cannot read node_t at %p", addr); - return (DCMD_ERR); - } - - mdb_printf("%0*p %4d %05x %8d %0*p %0*p %0*p %0*p\n", - NCA_ADDR_WIDTH, addr, node.cnt, node.ref, - node.datasz, NCA_ADDR_WIDTH, node.sqp, NCA_ADDR_WIDTH, - node.req, NCA_ADDR_WIDTH, node.plrunn, NCA_ADDR_WIDTH, node.vlrunn); - - if (verbose) { - arm = B_TRUE; - for (i = 0; node_refs[i].bit_name != NULL; i++) { - if ((node.ref & (1 << i)) == 0) - continue; - - if (arm) { - mdb_printf("%*s|\n", NODE_REFDELT, ""); - mdb_printf("%*s+--> ", NODE_REFDELT, ""); - arm = B_FALSE; - } else - mdb_printf("%*s ", NODE_REFDELT, ""); - - mdb_printf("%-12s %s\n", node_refs[i].bit_name, - node_refs[i].bit_descr); - } - } - - if (!request || node.req == NULL) - return (DCMD_OK); - - mdb_inc_indent(4); - mdb_printf("\n%u byte HTTP/%u.%u %s request (%u bytes in header, " - "%u in content)\n", node.reqsz, node.version >> 16, - node.version & 0xff, method2name(node.method), node.reqhdrsz, - node.reqcontl); - - hdr[0].nm_name = "URI"; - hdr[0].nm_addr = (uintptr_t)node.path; - hdr[0].nm_len = node.pathsz; - - hdr[1].nm_name = "Accept"; - hdr[1].nm_addr = (uintptr_t)node.reqaccept; - hdr[1].nm_len = node.reqacceptsz; - - hdr[2].nm_name = "Accept-Language"; - hdr[2].nm_addr = (uintptr_t)node.reqacceptl; - hdr[2].nm_len = node.reqacceptlsz; - - hdr[3].nm_name = "Host"; - hdr[3].nm_addr = (uintptr_t)node.reqhost; - hdr[3].nm_len = node.reqhostsz; - - /* - * A little optimization. Allocate all of the necessary memory here, - * so we don't have to allocate on each loop iteration. - */ - - max = node.reqhdrsz; - for (i = 0; i < 4; i++) - max = MAX(max, hdr[i].nm_len); - max++; - - buf = mdb_alloc(max, UM_SLEEP); - - mdb_inc_indent(4); - for (i = 0; i < sizeof (hdr) / sizeof (hdr[0]); i++) { - if (hdr[i].nm_len <= 0) - continue; - - if (mdb_vread(buf, hdr[i].nm_len, hdr[i].nm_addr) == -1) { - mdb_warn("cannot read \"%s\" header field at %p", - hdr[i].nm_name, hdr[i].nm_addr); - continue; - } - buf[hdr[i].nm_len] = '\0'; - - mdb_printf("%s: ", hdr[i].nm_name); - mdb_inc_indent(4); - mdb_printf("%s\n", buf); - mdb_dec_indent(4); - } - - if (node.reqhdrsz > 0 && verbose) { - if (mdb_vread(buf, node.reqhdrsz, (uintptr_t)node.reqhdr) == -1) - mdb_warn("cannot read header at %p", node.reqhdr); - else { - mdb_printf("Raw header: "); - mdb_inc_indent(4); - printbuf((uint8_t *)buf, node.reqhdrsz); - mdb_dec_indent(4); - } - } - mdb_dec_indent(4); - mdb_dec_indent(4); - - mdb_free(buf, max); - - return (DCMD_OK); -} - -static void -nca_node_help(void) -{ - mdb_printf("Print the core information for a given NCA node_t.\n\n"); - mdb_printf("Options:\n"); - mdb_printf("\t-r\tdisplay HTTP request information\n"); - mdb_printf("\t-v\tbe verbose (more descriptive)\n"); -} - -/* - * Print the core fields in an NCA nca_conn_t. With the "-t" argument, skip - * all nca_conn_t's that are in the TIME_WAIT state. With the "-x" argument, - * show the xmit data. - */ -static int -nca_conn(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - unsigned int i; - nca_conn_t conn; - unsigned int show_timewait = TRUE; - unsigned int show_xmit = FALSE; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - if (mdb_getopts(argc, argv, 'x', MDB_OPT_SETBITS, TRUE, &show_xmit, - 't', MDB_OPT_CLRBITS, TRUE, &show_timewait, NULL) != argc) - return (DCMD_USAGE); - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("%<u>%-*s %3s %8s %15s %15s %-*s %-10s%</u>\n", - NCA_ADDR_WIDTH, "ADDR", "REF", "CREATE", "LOCAL_ADDR", - "REMOTE_ADDR", NCA_ADDR_WIDTH, "NODE", "STATE"); - } - - if (mdb_vread(&conn, sizeof (nca_conn_t), addr) == -1) { - mdb_warn("cannot read nca_conn_t at %p", addr); - return (DCMD_ERR); - } - - if (!show_timewait && conn.tcp_state == TCPS_TIME_WAIT) - return (DCMD_OK); - - mdb_printf("%0*p %3d %8lx %15I %15I %0*p %s\n", NCA_ADDR_WIDTH, addr, - conn.ref, conn.create, conn.laddr, conn.faddr, NCA_ADDR_WIDTH, - conn.req_np, state2name(conn.tcp_state)); - - if (show_xmit) { - mdb_inc_indent(4); - - for (i = 0; i < TCP_XMIT_MAX_IX; i++) { - mdb_printf("xmit[%d]\n", i); - mdb_printf("\tref pointer\t\t%p\n", conn.xmit[i].np); - mdb_printf("\tdata pointer\t\t%p\n", conn.xmit[i].dp); - mdb_printf("\tcksum array\t\t%p\n", conn.xmit[i].cp); - mdb_printf("\tremaining xmit data\t%d\n", - conn.xmit[i].sz); - mdb_printf("\tref to node_t\t\t%p\n", - conn.xmit[i].refed); - mdb_printf("\tremaining segment data\t%d\n", - conn.xmit[i].dsz); - mdb_printf("\tvirtual pointer\t\t%p\n", - conn.xmit[i].dvp); - } - - mdb_dec_indent(4); - } - - return (DCMD_OK); -} - -static void -nca_conn_help(void) -{ - mdb_printf("Print the core information for a given NCA " - "nca_conn_t.\n\n"); - mdb_printf("Options:\n"); - mdb_printf("\t-t\tskip connections in the TIME_WAIT state\n"); - mdb_printf("\t-x\tshow TCP XMIT information\n"); -} - -/* - * Print the core TCP-related fields in an NCA nca_conn_t. With the "-t" - * argument, skips all nca_conn_t's that are in the TIME_WAIT state. - */ -static int -nca_tcpconn(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) -{ - nca_conn_t conn; - unsigned int show_timewait = TRUE; - - if (!(flags & DCMD_ADDRSPEC)) - return (DCMD_USAGE); - - if (mdb_getopts(argc, argv, 't', MDB_OPT_CLRBITS, TRUE, &show_timewait, - NULL) != argc) - return (DCMD_USAGE); - - if (DCMD_HDRSPEC(flags)) { - mdb_printf("%<u>%-*s %21s %5s %8s %5s %8s %5s %-9s%</u>\n", - NCA_ADDR_WIDTH, "ADDR", "REMOTE_ADDR", "SWIND", "SUNASEQ", - "SNSEQ", "RACKSEQ", "RNSEQ", "STATE"); - } - - if (mdb_vread(&conn, sizeof (nca_conn_t), addr) == -1) { - mdb_warn("cannot read nca_conn_t at %p", addr); - return (DCMD_ERR); - } - - if (!show_timewait && conn.tcp_state == TCPS_TIME_WAIT) - return (DCMD_OK); - - mdb_nhconvert(&conn.conn_fport, &conn.conn_fport, sizeof (in_port_t)); - - mdb_printf("%0*p %15I:%05hu %5u %08x %+5d %08x %+5d %-9s\n", - NCA_ADDR_WIDTH, addr, conn.faddr, conn.conn_fport, conn.tcp_swnd, - conn.tcp_suna, conn.tcp_snxt - conn.tcp_suna, conn.tcp_rack, - conn.tcp_rnxt - conn.tcp_rack, state2name(conn.tcp_state)); - - return (DCMD_OK); -} - -static void -nca_tcpconn_help(void) -{ - mdb_printf("Print the core TCP-related information for a given "); - mdb_printf("NCA nca_conn_t.\n\n"); - mdb_printf("Options:\n"); - mdb_printf("\t-t\tskip connections in the TIME_WAIT state\n"); -} - -/* - * Initialize a walk for the NCA connection fanout table. Note that - * local walks are not supported since they're more trouble than - * they're worth. - */ -static int -nca_connf_walk_init(mdb_walk_state_t *wsp) -{ - int fanout_size; - - if (wsp->walk_addr != 0) { - mdb_warn("nca_connf_walk does not support local walks\n"); - return (WALK_DONE); - } - - if (mdb_readvar(&wsp->walk_addr, "nca_conn_fanout") == -1) { - mdb_warn("cannot read symbol nca_conn_fanout"); - return (WALK_ERR); - } - - if (mdb_readvar(&fanout_size, "nca_conn_fanout_size") == -1) { - mdb_warn("cannot read symbol nca_conn_fanout_size"); - return (WALK_ERR); - } - - wsp->walk_data = (void *)(uintptr_t)fanout_size; - - return (WALK_NEXT); -} - -/* - * Walk the NCA connection fanout table; `wsp->walk_data' is used to keep - * track of the number of indicies that are left to walk so we know when - * to stop. - */ -static int -nca_connf_walk_step(mdb_walk_state_t *wsp) -{ - connf_t connf; - nca_conn_t conn; - int status; - intptr_t i = (intptr_t)wsp->walk_data; - - if (i-- <= 0) - return (WALK_DONE); - - if (mdb_vread(&connf, sizeof (connf_t), wsp->walk_addr) == -1) { - mdb_warn("cannot read connf_t at %p", wsp->walk_addr); - return (WALK_ERR); - } - - /* - * No point in walking the fanout if there are no - * connections in it. - */ - if (connf.head != NULL) { - /* - * Point to the nca_conn_t instead of the connf_t so that output - * can be piped to ::nca_conn dcmd. - */ - if (mdb_vread(&conn, sizeof (nca_conn_t), - (uintptr_t)connf.head) == -1) { - mdb_warn("cannot read nca_conn_t at %p", connf.head); - return (WALK_ERR); - } - status = wsp->walk_callback((uintptr_t)connf.head, &conn, - wsp->walk_cbdata); - } else { - status = WALK_NEXT; - } - - wsp->walk_data = (void *)i; - wsp->walk_addr += sizeof (connf_t); - - return (status); -} - -/* - * Initialize a walk for the NCA node fanout tables. Note that local - * walks are not supported since they're more trouble than they're - * worth. - */ -static int -nca_nodef_walk_init(mdb_walk_state_t *wsp) -{ - char varname[256]; - uint32_t size; - - if (wsp->walk_addr != 0) { - mdb_warn("nca_nodef_walk does not support local walks\n"); - return (WALK_DONE); - } - - if (mdb_readvar(&wsp->walk_addr, wsp->walk_arg) == -1) { - mdb_warn("cannot read symbol %s", wsp->walk_arg); - return (WALK_ERR); - } - - mdb_snprintf(varname, sizeof (varname), "%s_sz", wsp->walk_arg); - - if (mdb_readvar(&size, varname) == -1) { - mdb_warn("cannot read symbol %s", varname); - return (WALK_ERR); - } - - wsp->walk_data = (void *)(uintptr_t)size; - - return (WALK_NEXT); -} - -/* - * Walk the NCA node fanout table; `wsp->walk_data' is used to keep - * track of the number of indicies that are left to walk so we know - * when to stop. - */ -static int -nca_nodef_walk_step(mdb_walk_state_t *wsp) -{ - nodef_t nodef; - node_t node; - int status; - intptr_t i = (intptr_t)wsp->walk_data; - - if (i-- <= 0) - return (WALK_DONE); - - if (mdb_vread(&nodef, sizeof (nodef_t), wsp->walk_addr) == -1) { - mdb_warn("cannot read nodef_t at %p", wsp->walk_addr); - return (WALK_ERR); - } - - status = wsp->walk_callback(wsp->walk_addr, &nodef, wsp->walk_cbdata); - - wsp->walk_data = (void *)i; - wsp->walk_addr += sizeof (nodef_t); - - if (nodef.head != NULL) { - /* - * Point to the node_t instead of the nodef_t so that output - * can be piped to ::nca_node dcmd. - */ - if (mdb_vread(&node, sizeof (node), - (uintptr_t)nodef.head) == -1) { - mdb_warn("cannot read node_t at %p", nodef.head); - return (WALK_ERR); - } - - status = wsp->walk_callback((uintptr_t)nodef.head, - &node, wsp->walk_cbdata); - } else { - status = WALK_NEXT; - } - - return (status); -} - -/* - * Initialize a walk for the NCA CPU table. Note that local walks - * are not supported since they're more trouble than they're worth. - */ -static int -nca_cpu_walk_init(mdb_walk_state_t *wsp) -{ - int ncpus; - - if (wsp->walk_addr != 0) { - mdb_warn("nca_cpu_walk does not support local walks\n"); - return (WALK_DONE); - } - - if (mdb_readvar(&wsp->walk_addr, "nca_gv") == -1) { - mdb_warn("cannot read symbol nca_gv"); - return (WALK_ERR); - } - - if (mdb_readvar(&ncpus, "ncpus") == -1) { - mdb_warn("cannot read symbol ncpus"); - return (WALK_ERR); - } - wsp->walk_data = (void *)(uintptr_t)ncpus; - - return (WALK_NEXT); -} - -/* - * Walk the NCA CPU table; `wsp->walk_data' is used to keep track of the - * number of CPUs that are left to walk so we know when to stop. - */ -static int -nca_cpu_walk_step(mdb_walk_state_t *wsp) -{ - nca_cpu_t cpu; - int status; - intptr_t curcpu = (intptr_t)wsp->walk_data; - - if (curcpu-- <= 0) - return (WALK_DONE); - - if (mdb_vread(&cpu, sizeof (nca_cpu_t), wsp->walk_addr) == -1) { - mdb_warn("cannot read nca_cpu_t at %p", wsp->walk_addr); - return (WALK_ERR); - } - - status = wsp->walk_callback(wsp->walk_addr, &cpu, wsp->walk_cbdata); - - wsp->walk_data = (void *)curcpu; - wsp->walk_addr += sizeof (nca_cpu_t); - - return (status); -} - -/* - * Initialize a walk for the NCA timer list. Note that local walks - * are not supported since this walk is layered on top of "nca_cpu" - * which doesn't support them (and they're not too useful here anyway). - */ -static int -nca_timer_walk_init(mdb_walk_state_t *wsp) -{ - if (wsp->walk_addr != 0) { - mdb_warn("nca_timer_walk does not support local walks\n"); - return (WALK_DONE); - } - - if (mdb_layered_walk("nca_cpu", wsp) == -1) { - mdb_warn("cannot walk nca_cpu"); - return (WALK_ERR); - } - - return (WALK_NEXT); -} - -/* - * Walk the NCA timer list; done as a layered walk on top of "nca_cpu". - */ -static int -nca_timer_walk_step(mdb_walk_state_t *wsp) -{ - const nca_cpu_t *nca_cpu = wsp->walk_layer; - ti_t ti; - - /* - * Just skip CPUs that don't have any timers running. - */ - if (nca_cpu->tcp_ti == NULL) - return (WALK_NEXT); - - if (mdb_vread(&ti, sizeof (ti_t), (uintptr_t)nca_cpu->tcp_ti) == -1) { - mdb_warn("cannot read ti_t at %p", nca_cpu->tcp_ti); - return (WALK_ERR); - } - - return (wsp->walk_callback((uintptr_t)nca_cpu->tcp_ti, &ti, - wsp->walk_cbdata)); -} - -/* - * Initialize a walk for NCA node LRUs; the type of LRU to walk should - * be specified through `wsp->walk_arg'. If no starting location for - * the walk is given, `wsp->walk_addr' is set to the head of the - * appropriate LRU. - */ -static int -nca_node_lru_walk_init(mdb_walk_state_t *wsp) -{ - GElf_Sym sym; - lru_t lru; - - if (wsp->walk_addr != 0) - return (WALK_NEXT); - - /* - * We do this instead of mdb_readvar() so that we catch changes - * in the size of the lru_t structure. - */ - if (mdb_lookup_by_name("nca_lru", &sym) == -1) { - mdb_warn("cannot lookup symbol nca_lru"); - return (WALK_ERR); - } - - if (sym.st_size != sizeof (lru)) { - mdb_warn("nca_lru object size mismatch\n"); - return (WALK_ERR); - } - - if (mdb_vread(&lru, sym.st_size, (uintptr_t)sym.st_value) == -1) { - mdb_warn("cannot read nca_lru at %p", sym.st_value); - return (WALK_ERR); - } - - if (wsp->walk_arg == NCA_WALK_PLRU) - wsp->walk_addr = (uintptr_t)lru.phead; - else - wsp->walk_addr = (uintptr_t)lru.vhead; - - return (WALK_NEXT); -} - -/* - * Walk the NCA node LRUs; the type of LRU to walk should be specified - * through `wsp->walk_arg'. - */ -static int -nca_node_lru_walk_step(mdb_walk_state_t *wsp) -{ - node_t node; - int status; - - if (wsp->walk_addr == 0) - return (WALK_DONE); - - if (mdb_vread(&node, sizeof (node_t), wsp->walk_addr) == -1) { - mdb_warn("cannot read node_t at %p", wsp->walk_addr); - return (WALK_ERR); - } - - status = wsp->walk_callback(wsp->walk_addr, &node, wsp->walk_cbdata); - - if (wsp->walk_arg == NCA_WALK_PLRU) - wsp->walk_addr = (uintptr_t)node.plrunn; - else - wsp->walk_addr = (uintptr_t)node.vlrunn; - - return (status); -} - -/* - * Walk the NCA node structures; follows node_t next pointers from a - * given offset, specified through `wsp->walk_arg'. - */ -static int -nca_node_walk_step(mdb_walk_state_t *wsp) -{ - node_t node; - int status; - - if (wsp->walk_addr == 0) { - mdb_warn("nca_node_walk does not support global walks\n"); - return (WALK_DONE); - } - - if (mdb_vread(&node, sizeof (node_t), wsp->walk_addr) == -1) { - mdb_warn("cannot read node_t at %p", wsp->walk_addr); - return (WALK_ERR); - } - - status = wsp->walk_callback(wsp->walk_addr, &node, wsp->walk_cbdata); - if (status != WALK_NEXT) - return (status); - - /* LINTED */ - wsp->walk_addr = *(uintptr_t *)((caddr_t)&node + - (uint_t)(uintptr_t)wsp->walk_arg); - - if (wsp->walk_addr == 0) - return (WALK_DONE); - - return (WALK_NEXT); -} - -/* - * Walk the NCA connection structures; follows nca_conn_t next pointers - * from a given offset, specified through `wsp->walk_arg'. - */ -static int -nca_conn_walk_step(mdb_walk_state_t *wsp) -{ - nca_conn_t conn; - int status; - - if (wsp->walk_addr == 0) { - mdb_warn("nca_conn_walk does not support global walks\n"); - return (WALK_DONE); - } - - if (mdb_vread(&conn, sizeof (nca_conn_t), wsp->walk_addr) == -1) { - mdb_warn("cannot read nca_conn_t at %p", wsp->walk_addr); - return (WALK_ERR); - } - - status = wsp->walk_callback(wsp->walk_addr, &conn, wsp->walk_cbdata); - if (status != WALK_NEXT) - return (status); - - /* LINTED */ - wsp->walk_addr = *(uintptr_t *)((caddr_t)&conn + - (uint_t)(uintptr_t)wsp->walk_arg); - - if (wsp->walk_addr == 0) - return (WALK_DONE); - - return (WALK_NEXT); -} - -static const mdb_dcmd_t dcmds[] = { - { "nca_conn", ":[-tx]", "print core NCA nca_conn_t info", nca_conn, - nca_conn_help }, - { "nca_tcpconn", ":[-t]", "print TCP NCA nca_conn_t info", - nca_tcpconn, nca_tcpconn_help }, - { "nca_io2", ":[-pv]", "print core NCA io2_t info", nca_io2, - nca_io2_help }, - { "nca_node", ":[-rv]", "print core NCA node_t info", nca_node, - nca_node_help }, - { "nca_timer", "?[-e]", "print core NCA timer info", nca_timer, - nca_timer_help }, - { NULL } -}; - -static const mdb_walker_t walkers[] = { - { "nca_conn_hash", "walk the NCA connection hash chain", 0, - nca_conn_walk_step, 0, (void *)OFFSETOF(nca_conn_t, hashnext) }, - { "nca_conn_bind", "walk the NCA connection bind chain", 0, - nca_conn_walk_step, 0, (void *)OFFSETOF(nca_conn_t, bindnext) }, - { "nca_conn_miss", "walk the NCA connection miss chain", 0, - nca_conn_walk_step, 0, (void *)OFFSETOF(nca_conn_t, nodenext) }, - { "nca_conn_tw", "walk the NCA connection TIME_WAIT chain", 0, - nca_conn_walk_step, 0, (void *)OFFSETOF(nca_conn_t, twnext) }, - - { "nca_node_file", "walk the NCA node file chain", 0, - nca_node_walk_step, 0, (void *)OFFSETOF(node_t, filenext) }, - { "nca_node_hash", "walk the NCA node hash chain", 0, - nca_node_walk_step, 0, (void *)OFFSETOF(node_t, hashnext) }, - { "nca_node_chunk", "walk the NCA node chunk chain", 0, - nca_node_walk_step, 0, (void *)OFFSETOF(node_t, next) }, - { "nca_node_ctag", "walk the NCA node ctag chain", 0, - nca_node_walk_step, 0, (void *)OFFSETOF(node_t, ctagnext) }, - - { "nca_node_plru", "walk the NCA node physical LRU chain", - nca_node_lru_walk_init, nca_node_lru_walk_step, 0, NCA_WALK_PLRU }, - { "nca_node_vlru", "walk the NCA node virtual LRU chain", - nca_node_lru_walk_init, nca_node_lru_walk_step, 0, NCA_WALK_VLRU }, - - { "nca_uri_hash", "walk the NCA URI node hash table", - nca_nodef_walk_init, nca_nodef_walk_step, 0, "ncaurihash" }, - { "nca_file_hash", "walk the NCA file node hash table", - nca_nodef_walk_init, nca_nodef_walk_step, 0, "ncafilehash" }, - { "nca_ctag_hash", "walk the NCA ctag node hash table", - nca_nodef_walk_init, nca_nodef_walk_step, 0, "ncactaghash" }, - { "nca_vnode_hash", "walk the NCA vnode node hash table", - nca_nodef_walk_init, nca_nodef_walk_step, 0, "ncavnodehash" }, - - { "nca_cpu", "walk the NCA CPU table", - nca_cpu_walk_init, nca_cpu_walk_step }, - { "nca_timer", "walk the NCA timer table", - nca_timer_walk_init, nca_timer_walk_step }, - { "nca_connf", "walk the NCA connection fanout", - nca_connf_walk_init, nca_connf_walk_step }, - - { NULL } -}; - -static const mdb_modinfo_t modinfo = { MDB_API_VERSION, dcmds, walkers }; - -const mdb_modinfo_t * -_mdb_init(void) -{ - return (&modinfo); -} diff --git a/usr/src/cmd/mdb/intel/amd64/nca/Makefile b/usr/src/cmd/mdb/intel/amd64/nca/Makefile deleted file mode 100644 index 4c7e428c18..0000000000 --- a/usr/src/cmd/mdb/intel/amd64/nca/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# Copyright 2004 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# -#ident "%Z%%M% %I% %E% SMI" - -MODULE = nca.so -MDBTGT = kvm - -MODSRCS = nca.c - -include ../../../../Makefile.cmd -include ../../../../Makefile.cmd.64 -include ../../Makefile.amd64 -include ../../../Makefile.module diff --git a/usr/src/cmd/mdb/sparc/v9/nca/Makefile b/usr/src/cmd/mdb/sparc/v9/nca/Makefile deleted file mode 100644 index 432e62605e..0000000000 --- a/usr/src/cmd/mdb/sparc/v9/nca/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# Copyright (c) 2000 by Sun Microsystems, Inc. -# All rights reserved. -# -#ident "%Z%%M% %I% %E% SMI" - -MODULE = nca.so -MDBTGT = kvm - -MODSRCS = nca.c - -include ../../../../Makefile.cmd -include ../../../../Makefile.cmd.64 -include ../../Makefile.sparcv9 -include ../../../Makefile.module |
