diff options
Diffstat (limited to 'usr.sbin/devinfo')
-rw-r--r-- | usr.sbin/devinfo/Makefile | 8 | ||||
-rw-r--r-- | usr.sbin/devinfo/Makefile.depend | 18 | ||||
-rw-r--r-- | usr.sbin/devinfo/devinfo.8 | 76 | ||||
-rw-r--r-- | usr.sbin/devinfo/devinfo.c | 237 |
4 files changed, 339 insertions, 0 deletions
diff --git a/usr.sbin/devinfo/Makefile b/usr.sbin/devinfo/Makefile new file mode 100644 index 0000000..681c819 --- /dev/null +++ b/usr.sbin/devinfo/Makefile @@ -0,0 +1,8 @@ +# $FreeBSD$ + +PROG= devinfo +MAN= devinfo.8 + +LIBADD= devinfo + +.include <bsd.prog.mk> diff --git a/usr.sbin/devinfo/Makefile.depend b/usr.sbin/devinfo/Makefile.depend new file mode 100644 index 0000000..a6afa47 --- /dev/null +++ b/usr.sbin/devinfo/Makefile.depend @@ -0,0 +1,18 @@ +# $FreeBSD$ +# Autogenerated - do NOT edit! + +DIRDEPS = \ + gnu/lib/csu \ + gnu/lib/libgcc \ + include \ + lib/${CSU_DIR} \ + lib/libc \ + lib/libcompiler_rt \ + lib/libdevinfo \ + + +.include <dirdeps.mk> + +.if ${DEP_RELDIR} == ${_DEP_RELDIR} +# local dependencies - needed for -jN in clean tree +.endif diff --git a/usr.sbin/devinfo/devinfo.8 b/usr.sbin/devinfo/devinfo.8 new file mode 100644 index 0000000..a1743ff --- /dev/null +++ b/usr.sbin/devinfo/devinfo.8 @@ -0,0 +1,76 @@ +.\" -*- nroff -*- +.\" +.\" Copyright (c) 2002 Hiten Pandya +.\" Copyright (c) 2002 Robert N. M. Watson +.\" +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR +.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +.\" IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, +.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd November 28, 2005 +.Dt DEVINFO 8 +.Os +.Sh NAME +.Nm devinfo +.Nd print information about system device configuration +.Sh SYNOPSIS +.Nm +.Op Fl rv +.Nm +.Fl u +.Sh DESCRIPTION +The +.Nm +utility, without any arguments, shows the hierarchy of devices available +in the system, starting from the +.Dq nexus +device. +.Pp +The following options are accepted. +.Bl -tag -width indent +.It Fl r +Causes hardware resource information (such as IRQ, I/O ports, I/O memory +addresses) to be also listed, under each device that has reserved those resources. +.It Fl u +Displays the same information as with +.Fl r +but sorts by resource type rather than by device, allowing to review the +set of system resources by usage and available resources. +I.e., it lists all +the IRQ consumers together. +.It Fl v +Display all devices in the driver tree, not just those that are attached or +busy. +Without this flag, only those devices that have attached are reported. +.El +.Sh SEE ALSO +.Xr systat 1 , +.Xr devinfo 3 , +.Xr iostat 8 , +.Xr pciconf 8 , +.Xr pnpinfo 8 , +.Xr vmstat 8 , +.Xr devclass 9 , +.Xr device 9 +.Sh AUTHORS +.An Mike Smith Aq Mt msmith@FreeBSD.org diff --git a/usr.sbin/devinfo/devinfo.c b/usr.sbin/devinfo/devinfo.c new file mode 100644 index 0000000..40f2b0b --- /dev/null +++ b/usr.sbin/devinfo/devinfo.c @@ -0,0 +1,237 @@ +/*- + * Copyright (c) 2000, 2001 Michael Smith + * Copyright (c) 2000 BSDi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Print information about system device configuration. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/types.h> +#include <err.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include "devinfo.h" + +static int rflag; +static int vflag; + +static void print_resource(struct devinfo_res *); +static int print_device_matching_resource(struct devinfo_res *, void *); +static int print_device_rman_resources(struct devinfo_rman *, void *); +static int print_device(struct devinfo_dev *, void *); +static int print_rman_resource(struct devinfo_res *, void *); +static int print_rman(struct devinfo_rman *, void *); + +struct indent_arg +{ + int indent; + void *arg; +}; + +/* + * Print a resource. + */ +void +print_resource(struct devinfo_res *res) +{ + struct devinfo_rman *rman; + int hexmode; + + rman = devinfo_handle_to_rman(res->dr_rman); + hexmode = (rman->dm_size > 1000) || (rman->dm_size == 0); + printf(hexmode ? "0x%lx" : "%lu", res->dr_start); + if (res->dr_size > 1) + printf(hexmode ? "-0x%lx" : "-%lu", + res->dr_start + res->dr_size - 1); +} + +/* + * Print resource information if this resource matches the + * given device. + * + * If the given indent is 0, return an indicator that a matching + * resource exists. + */ +int +print_device_matching_resource(struct devinfo_res *res, void *arg) +{ + struct indent_arg *ia = (struct indent_arg *)arg; + struct devinfo_dev *dev = (struct devinfo_dev *)ia->arg; + int i; + + if (devinfo_handle_to_device(res->dr_device) == dev) { + /* in 'detect' mode, found a match */ + if (ia->indent == 0) + return(1); + for (i = 0; i < ia->indent; i++) + printf(" "); + print_resource(res); + printf("\n"); + } + return(0); +} + +/* + * Print resource information for this device and resource manager. + */ +int +print_device_rman_resources(struct devinfo_rman *rman, void *arg) +{ + struct indent_arg *ia = (struct indent_arg *)arg; + int indent, i; + + indent = ia->indent; + + /* check whether there are any resources matching this device */ + ia->indent = 0; + if (devinfo_foreach_rman_resource(rman, + print_device_matching_resource, ia) != 0) { + + /* there are, print header */ + for (i = 0; i < indent; i++) + printf(" "); + printf("%s:\n", rman->dm_desc); + + /* print resources */ + ia->indent = indent + 4; + devinfo_foreach_rman_resource(rman, + print_device_matching_resource, ia); + } + ia->indent = indent; + return(0); +} + +/* + * Print information about a device. + */ +int +print_device(struct devinfo_dev *dev, void *arg) +{ + struct indent_arg ia; + int i, indent; + + if (vflag || (dev->dd_name[0] != 0 && dev->dd_state >= DS_ATTACHED)) { + indent = (int)(intptr_t)arg; + for (i = 0; i < indent; i++) + printf(" "); + printf("%s", dev->dd_name[0] ? dev->dd_name : "unknown"); + if (vflag && *dev->dd_pnpinfo) + printf(" pnpinfo %s", dev->dd_pnpinfo); + if (vflag && *dev->dd_location) + printf(" at %s", dev->dd_location); + if (!(dev->dd_flags & DF_ENABLED)) + printf(" (disabled)"); + else if (dev->dd_flags & DF_SUSPENDED) + printf(" (suspended)"); + printf("\n"); + if (rflag) { + ia.indent = indent + 4; + ia.arg = dev; + devinfo_foreach_rman(print_device_rman_resources, + (void *)&ia); + } + } + + return(devinfo_foreach_device_child(dev, print_device, + (void *)((char *)arg + 2))); +} + +/* + * Print information about a resource under a resource manager. + */ +int +print_rman_resource(struct devinfo_res *res, void *arg __unused) +{ + struct devinfo_dev *dev; + + printf(" "); + print_resource(res); + dev = devinfo_handle_to_device(res->dr_device); + if ((dev != NULL) && (dev->dd_name[0] != 0)) { + printf(" (%s)", dev->dd_name); + } else { + printf(" ----"); + } + printf("\n"); + return(0); +} + +/* + * Print information about a resource manager. + */ +int +print_rman(struct devinfo_rman *rman, void *arg __unused) +{ + printf("%s:\n", rman->dm_desc); + devinfo_foreach_rman_resource(rman, print_rman_resource, 0); + return(0); +} + +int +main(int argc, char *argv[]) +{ + struct devinfo_dev *root; + int c, uflag; + + uflag = 0; + while ((c = getopt(argc, argv, "ruv")) != -1) { + switch(c) { + case 'r': + rflag++; + break; + case 'u': + uflag++; + break; + case 'v': + vflag++; + break; + default: + fprintf(stderr, "%s\n%s\n", + "usage: devinfo [-rv]", + " devinfo -u"); + exit(1); + } + } + + if (devinfo_init()) + err(1, "devinfo_init"); + + if ((root = devinfo_handle_to_device(DEVINFO_ROOT_DEVICE)) == NULL) + errx(1, "can't find root device"); + + /* print resource usage? */ + if (uflag) { + devinfo_foreach_rman(print_rman, NULL); + } else { + /* print device hierarchy */ + devinfo_foreach_device_child(root, print_device, (void *)0); + } + return(0); +} |