summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2010-08-06 09:44:01 +0000
committerkib <kib@FreeBSD.org>2010-08-06 09:44:01 +0000
commit7c864123d478726c349bfef28fe923968831d382 (patch)
tree210dc5be02da40736ac0f55b1707713e9648e1c9
parentba7ee96f4acc27c8c70a4af6c81be42c4856619f (diff)
downloadFreeBSD-src-7c864123d478726c349bfef28fe923968831d382.zip
FreeBSD-src-7c864123d478726c349bfef28fe923968831d382.tar.gz
Add "show cdev" ddb command.
In collaboration with: pho MFC after: 1 month
-rw-r--r--sys/kern/kern_conf.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c
index 9ef49af..12d1a8d 100644
--- a/sys/kern/kern_conf.c
+++ b/sys/kern/kern_conf.c
@@ -1229,3 +1229,71 @@ devdtr_init(void *dummy __unused)
}
SYSINIT(devdtr, SI_SUB_DEVFS, SI_ORDER_SECOND, devdtr_init, NULL);
+
+#include "opt_ddb.h"
+#ifdef DDB
+#include <sys/kernel.h>
+
+#include <ddb/ddb.h>
+
+DB_SHOW_COMMAND(cdev, db_show_cdev)
+{
+ struct cdev_priv *cdp;
+ struct cdev *dev;
+ u_int flags;
+ char buf[512];
+
+ if (!have_addr) {
+ TAILQ_FOREACH(cdp, &cdevp_list, cdp_list) {
+ dev = &cdp->cdp_c;
+ db_printf("%s %p\n", dev->si_name, dev);
+ if (db_pager_quit)
+ break;
+ }
+ return;
+ }
+
+ dev = (struct cdev *)addr;
+ cdp = cdev2priv(dev);
+ db_printf("dev %s ref %d use %ld thr %ld inuse %u fdpriv %p\n",
+ dev->si_name, dev->si_refcount, dev->si_usecount,
+ dev->si_threadcount, cdp->cdp_inuse, cdp->cdp_fdpriv.lh_first);
+ db_printf("devsw %p si_drv0 %d si_drv1 %p si_drv2 %p\n",
+ dev->si_devsw, dev->si_drv0, dev->si_drv1, dev->si_drv2);
+ flags = dev->si_flags;
+#define SI_FLAG(flag) do { \
+ if (flags & (flag)) { \
+ if (buf[0] != '\0') \
+ strlcat(buf, ", ", sizeof(buf)); \
+ strlcat(buf, (#flag) + 3, sizeof(buf)); \
+ flags &= ~(flag); \
+ } \
+} while (0)
+ buf[0] = '\0';
+ SI_FLAG(SI_ETERNAL);
+ SI_FLAG(SI_ALIAS);
+ SI_FLAG(SI_NAMED);
+ SI_FLAG(SI_CHEAPCLONE);
+ SI_FLAG(SI_CHILD);
+ SI_FLAG(SI_DEVOPEN);
+ SI_FLAG(SI_CONSOPEN);
+ SI_FLAG(SI_DUMPDEV);
+ SI_FLAG(SI_CANDELETE);
+ SI_FLAG(SI_CLONELIST);
+ db_printf("si_flags %s\n", buf);
+
+ flags = cdp->cdp_flags;
+#define CDP_FLAG(flag) do { \
+ if (flags & (flag)) { \
+ if (buf[0] != '\0') \
+ strlcat(buf, ", ", sizeof(buf)); \
+ strlcat(buf, (#flag) + 4, sizeof(buf)); \
+ flags &= ~(flag); \
+ } \
+} while (0)
+ buf[0] = '\0';
+ CDP_FLAG(CDP_ACTIVE);
+ CDP_FLAG(CDP_SCHED_DTR);
+ db_printf("cdp_flags %s\n", buf);
+}
+#endif
OpenPOWER on IntegriCloud