aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2023-07-05 23:00:47 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2023-07-05 23:02:01 +0000
commit884eaacd24bdb85c1571d31145278847bad6e55b (patch)
tree3f726d3f78c96aa2f7a1c05a6106b80d4fd8d1e9
parent3a9e3ed6b003cdf60f11c109bdeaa337b3f3466d (diff)
downloadsrc-884eaacd24bdb85c1571d31145278847bad6e55b.tar.gz
src-884eaacd24bdb85c1571d31145278847bad6e55b.zip
ddb: Rework macros to make it easier to add new command tables.
- Add new DB_DEFINE_TABLE and DB_DECLARE_TABLE macros to define new command tables. DB_DECLARE_TABLE is intended for use in headers similar to MALLOC_DECLARE and SYSCTL_DECL. DB_DEFINE_TABLE takes three arguments, the name of the parent table, the command name, and the name of the table itself, e.g. DB_DEFINE_TABLE(show, foo, show_foo) defines a new "show foo" table. - DB_TABLE_COMMAND, DB_TABLE_COMMAND_FLAGS, DB_TABLE_ALIAS, and DB_ALIAS_FLAGS allow new commands and aliases to be defined. These are similar to the existing DB_COMMAND, etc. except that they take an initial argument giving the name of the parent table, e.g.: DB_TABLE_COMMAND(show_foo, bar, db_show_foo_bar) defines a new "show foo bar" command. This provides a cleaner interface than the ad-hoc use of internal macros like _DB_SET that was required previously (e.g. in cxgbe(4)). This retires DB_FUNC macro as well as the internal _DB_FUNC macro. Reviewed by: melifaro, kib, markj Differential Revision: https://reviews.freebsd.org/D40819
-rw-r--r--share/man/man9/DB_COMMAND.939
-rw-r--r--share/man/man9/Makefile8
-rw-r--r--sys/ddb/ddb.h96
-rw-r--r--sys/dev/cxgbe/t4_main.c7
-rw-r--r--sys/net/route/route_ddb.c4
5 files changed, 108 insertions, 46 deletions
diff --git a/share/man/man9/DB_COMMAND.9 b/share/man/man9/DB_COMMAND.9
index 15c2adce3580..ebf15f8b73f3 100644
--- a/share/man/man9/DB_COMMAND.9
+++ b/share/man/man9/DB_COMMAND.9
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd June 24, 2022
+.Dd July 5, 2023
.Dt DB_COMMAND 9
.Os
.Sh NAME
@@ -34,11 +34,17 @@
.Nm DB_SHOW_COMMAND ,
.Nm DB_SHOW_COMMAND_FLAGS ,
.Nm DB_SHOW_ALL_COMMAND ,
+.Nm DB_TABLE_COMMAND ,
+.Nm DB_TABLE_COMMAND_FLAGS ,
.Nm DB_ALIAS ,
.Nm DB_ALIAS_FLAGS ,
.Nm DB_SHOW_ALIAS ,
.Nm DB_SHOW_ALIAS_FLAGS ,
-.Nm DB_SHOW_ALL_ALIAS
+.Nm DB_SHOW_ALL_ALIAS ,
+.Nm DB_TABLE_ALIAS ,
+.Nm DB_TABLE_ALIAS_FLAGS
+.Nm DB_DECLARE_TABLE ,
+.Nm DB_DEFINE_TABLE ,
.Nd Extends the ddb command set
.Sh SYNOPSIS
.In ddb/ddb.h
@@ -47,11 +53,17 @@
.Fn DB_SHOW_COMMAND "command_name" "command_function"
.Fn DB_SHOW_COMMAND_FLAGS "command_name" "command_function" "flags"
.Fn DB_SHOW_ALL_COMMAND "command_name" "command_function"
+.Fn DB_TABLE_COMMAND "table" "command_name" "command_function"
+.Fn DB_TABLE_COMMAND_FLAGS "table" "command_name" "command_function" "flags"
.Fn DB_ALIAS "alias_name" "command_function"
.Fn DB_ALIAS_FLAGS "alias_name" "command_function" "flags"
.Fn DB_SHOW_ALIAS "alias_name" "command_function"
.Fn DB_SHOW_ALIAS_FLAGS "alias_name" "command_function" "flags"
.Fn DB_SHOW_ALL_ALIAS "alias_name" "command_function"
+.Fn DB_TABLE_ALIAS "table" "alias_name" "command_function"
+.Fn DB_TABLE_ALIAS_FLAGS "table" "alias_name" "command_function" "flags"
+.Fn DB_DEFINE_TABLE "parent" "name" "table"
+.Fn DB_DECLARE_TABLE "table"
.Sh DESCRIPTION
The
.Fn DB_COMMAND
@@ -78,10 +90,18 @@ command and
command, respectively.
.Pp
The
+.Fn DB_TABLE_COMMAND
+macro is also similar to
+.Fn DB_COMMAND
+but adds the new command as a sub-command of the ddb command
+.Fa table .
+.Pp
+The
.Fn DB_ALIAS ,
.Fn DB_SHOW_ALIAS ,
+.Fn DB_SHOW_ALL_ALIAS ,
and
-.Fn DB_SHOW_ALL_ALIAS
+.Fn DB_TABLE_ALIAS
macros register the existing
.Fa command_function
under the alternative command name
@@ -117,6 +137,19 @@ For example, the
.Sy examine
command will display words in decimal form if it is passed the modifier "d".
.El
+.Pp
+The
+.Fn DB_DEFINE_TABLE
+macro adds a new command
+.Fa name
+as a sub-command of the existing command table
+.Fa parent .
+The new command defines a table named
+.Fa table
+which contains sub-commands.
+New commands and aliases can be added to this table by passing
+.Fa table
+as the first argument to one of the DB_TABLE_ macros.
.Sh EXAMPLES
In your module, the command is declared as:
.Bd -literal
diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile
index 2a320cf0fcba..45f9ec9b0515 100644
--- a/share/man/man9/Makefile
+++ b/share/man/man9/Makefile
@@ -983,7 +983,13 @@ MLINKS+=DB_COMMAND.9 DB_ALIAS.9 \
DB_COMMAND.9 DB_SHOW_ALL_ALIAS.9 \
DB_COMMAND.9 DB_SHOW_ALL_COMMAND.9 \
DB_COMMAND.9 DB_SHOW_COMMAND.9 \
- DB_COMMAND.9 DB_SHOW_COMMAND_FLAGS.9
+ DB_COMMAND.9 DB_SHOW_COMMAND_FLAGS.9 \
+ DB_COMMAND.9 DB_DECLARE_TABLE.9 \
+ DB_COMMAND.9 DB_DEFINE_TABLE.9 \
+ DB_COMMAND.9 DB_TABLE_COMMAND.9 \
+ DB_COMMAND.9 DB_TABLE_COMMAND_FLAGS.9 \
+ DB_COMMAND.9 DB_TABLE_ALIAS.9 \
+ DB_COMMAND.9 DB_TABLE_ALIAS_FLAGS.9
MLINKS+=DECLARE_MODULE.9 DECLARE_MODULE_TIED.9
MLINKS+=dev_clone.9 drain_dev_clone_events.9
MLINKS+=dev_refthread.9 devvn_refthread.9 \
diff --git a/sys/ddb/ddb.h b/sys/ddb/ddb.h
index 2fa4bfeb495c..591371e8a5c7 100644
--- a/sys/ddb/ddb.h
+++ b/sys/ddb/ddb.h
@@ -85,21 +85,32 @@ int DB_CALL(db_expr_t, db_expr_t *, int, db_expr_t[]);
*/
extern vm_offset_t ksymtab, kstrtab, ksymtab_size, ksymtab_relbase;
+/* Command tables contain a list of commands. */
+struct db_command;
+LIST_HEAD(db_command_table, db_command);
+
+#define _DB_TABLE_NAME(table) db_##table##_table
+
+#define DB_DEFINE_TABLE(parent, name, table) \
+ struct db_command_table _DB_TABLE_NAME(table) = \
+ LIST_HEAD_INITIALIZER(_DB_TABLE_NAME(table)); \
+ _DB_SET(parent, name, NULL, 0, &_DB_TABLE_NAME(table))
+
+#define DB_DECLARE_TABLE(table) \
+ extern struct db_command_table _DB_TABLE_NAME(table)
+
/*
- * There are three "command tables":
- * - One for simple commands; a list of these is displayed
+ * Builtin command tables:
+ * - cmd: Top-level command table; a list of these is displayed
* by typing 'help' at the debugger prompt.
- * - One for sub-commands of 'show'; to see this type 'show'
- * without any arguments.
- * - The last one for sub-commands of 'show all'; type 'show all'
- * without any argument to get a list.
+ * - show: Sub-commands of 'show'
+ * - show_all: Sub-commands of 'show all'
+ * - show_active: Sub-commands of 'show active'
*/
-struct db_command;
-LIST_HEAD(db_command_table, db_command);
-extern struct db_command_table db_cmd_table;
-extern struct db_command_table db_show_table;
-extern struct db_command_table db_show_all_table;
-extern struct db_command_table db_show_active_table;
+DB_DECLARE_TABLE(cmd);
+DB_DECLARE_TABLE(show);
+DB_DECLARE_TABLE(show_all);
+DB_DECLARE_TABLE(show_active);
/*
* Type signature for a function implementing a ddb command.
@@ -133,26 +144,36 @@ struct db_command {
* in modules in which case they will be available only when
* the module is loaded.
*/
-#define _DB_SET(_suffix, _name, _func, list, _flag, _more) \
-static struct db_command __CONCAT(_name,_suffix) = { \
+#define _DB_SET(_table, _name, _func, _flag, _more) \
+static struct db_command db_##_table##_##_name##_cmd = { \
.name = __STRING(_name), \
.fcn = _func, \
.flag = _flag, \
.more = _more \
}; \
-static void __CONCAT(__CONCAT(_name,_suffix),_add)(void *arg __unused) \
- { db_command_register(&list, &__CONCAT(_name,_suffix)); } \
-SYSINIT(__CONCAT(_name,_suffix), SI_SUB_KLD, SI_ORDER_ANY, \
- __CONCAT(__CONCAT(_name,_suffix),_add), NULL); \
-static void __CONCAT(__CONCAT(_name,_suffix),_del)(void *arg __unused) \
- { db_command_unregister(&list, &__CONCAT(_name,_suffix)); } \
-SYSUNINIT(__CONCAT(_name,_suffix), SI_SUB_KLD, SI_ORDER_ANY, \
- __CONCAT(__CONCAT(_name,_suffix),_del), NULL);
+ \
+static void \
+db##_table##_##_name##_add(void *arg __unused) \
+{ \
+ db_command_register(&_DB_TABLE_NAME(_table), \
+ &db_##_table##_##_name##_cmd); \
+} \
+SYSINIT(db_##_table##_##_name, SI_SUB_KLD, SI_ORDER_ANY, \
+ db##_table##_##_name##_add, NULL); \
+ \
+static void \
+db##_table##_##_name##_del(void *arg __unused) \
+{ \
+ db_command_unregister(&_DB_TABLE_NAME(_table), \
+ &db_##_table##_##_name##_cmd); \
+} \
+SYSUNINIT(db_##_table##_##_name, SI_SUB_KLD, SI_ORDER_ANY, \
+ db##_table##_##_name##_del, NULL)
/*
* Like _DB_SET but also create the function declaration which
* must be followed immediately by the body; e.g.
- * _DB_FUNC(_cmd, panic, db_panic, db_cmd_table, 0, NULL)
+ * DB_TABLE_COMMAND_FLAGS(_cmd, panic, db_panic, 0)
* {
* ...panic implementation...
* }
@@ -160,38 +181,41 @@ SYSUNINIT(__CONCAT(_name,_suffix), SI_SUB_KLD, SI_ORDER_ANY, \
* This macro is mostly used to define commands placed in one of
* the ddb command tables; see DB_COMMAND, etc. below.
*/
-#define _DB_FUNC(_suffix, _name, _func, list, _flag, _more) \
+#define DB_TABLE_COMMAND_FLAGS(_table, _name, _func, _flag) \
static db_cmdfcn_t _func; \
-_DB_SET(_suffix, _name, _func, list, _flag, _more); \
+_DB_SET(_table, _name, _func, _flag, NULL); \
static void \
_func(db_expr_t addr, bool have_addr, db_expr_t count, char *modif)
-/* common idom provided for backwards compatibility */
-#define DB_FUNC(_name, _func, list, _flag, _more) \
- _DB_FUNC(_cmd, _name, _func, list, _flag, _more)
+#define DB_TABLE_COMMAND(_table, _name, _func) \
+ DB_TABLE_COMMAND_FLAGS(_table, _name, _func, 0)
+
+/* Wrappers around _DB_SET used for aliases. */
+#define DB_TABLE_ALIAS_FLAGS(_table, _name, _func, _flag) \
+ _DB_SET(_table, _name, _func, _flag, NULL)
+#define DB_TABLE_ALIAS(_table, _name, _func) \
+ DB_TABLE_ALIAS_FLAGS(_table, _name, _func, 0)
#define DB_COMMAND_FLAGS(cmd_name, func_name, flags) \
- _DB_FUNC(_cmd, cmd_name, func_name, db_cmd_table, flags, NULL)
+ DB_TABLE_COMMAND_FLAGS(cmd, cmd_name, func_name, flags)
#define DB_COMMAND(cmd_name, func_name) \
DB_COMMAND_FLAGS(cmd_name, func_name, 0)
#define DB_ALIAS_FLAGS(alias_name, func_name, flags) \
- _DB_SET(_cmd, alias_name, func_name, db_cmd_table, flags, NULL)
+ DB_TABLE_ALIAS_FLAGS(cmd, alias_name, func_name, flags)
#define DB_ALIAS(alias_name, func_name) \
DB_ALIAS_FLAGS(alias_name, func_name, 0)
#define DB_SHOW_COMMAND_FLAGS(cmd_name, func_name, flags) \
- _DB_FUNC(_show, cmd_name, func_name, db_show_table, flags, NULL)
+ DB_TABLE_COMMAND_FLAGS(show, cmd_name, func_name, flags)
#define DB_SHOW_COMMAND(cmd_name, func_name) \
DB_SHOW_COMMAND_FLAGS(cmd_name, func_name, 0)
#define DB_SHOW_ALIAS_FLAGS(alias_name, func_name, flags) \
- _DB_SET(_show, alias_name, func_name, db_show_table, flags, NULL)
+ DB_TABLE_ALIAS_FLAGS(show, alias_name, func_name, flags)
#define DB_SHOW_ALIAS(alias_name, func_name) \
DB_SHOW_ALIAS_FLAGS(alias_name, func_name, 0)
#define DB_SHOW_ALL_COMMAND(cmd_name, func_name) \
- _DB_FUNC(_show_all, cmd_name, func_name, db_show_all_table, \
- DB_CMD_MEMSAFE, NULL)
+ DB_TABLE_COMMAND_FLAGS(show_all, cmd_name, func_name, DB_CMD_MEMSAFE)
#define DB_SHOW_ALL_ALIAS(alias_name, func_name) \
- _DB_SET(_show_all, alias_name, func_name, db_show_all_table, \
- DB_CMD_MEMSAFE, NULL)
+ DB_TABLE_ALIAS_FLAGS(show_all, alias_name, func_name, DB_CMD_MEMSAFE)
extern db_expr_t db_maxoff;
extern int db_indent;
diff --git a/sys/dev/cxgbe/t4_main.c b/sys/dev/cxgbe/t4_main.c
index 2fa49ddee10b..7ddd3b416995 100644
--- a/sys/dev/cxgbe/t4_main.c
+++ b/sys/dev/cxgbe/t4_main.c
@@ -12921,10 +12921,9 @@ t4_dump_devlog(struct adapter *sc)
} while (i != first && !db_pager_quit);
}
-static struct db_command_table db_t4_table = LIST_HEAD_INITIALIZER(db_t4_table);
-_DB_SET(_show, t4, NULL, db_show_table, 0, &db_t4_table);
+static DB_DEFINE_TABLE(show, t4, show_t4);
-DB_FUNC(devlog, db_show_devlog, db_t4_table, CS_OWN, NULL)
+DB_TABLE_COMMAND_FLAGS(show_t4, devlog, db_show_devlog, CS_OWN)
{
device_t dev;
int t;
@@ -12950,7 +12949,7 @@ DB_FUNC(devlog, db_show_devlog, db_t4_table, CS_OWN, NULL)
t4_dump_devlog(device_get_softc(dev));
}
-DB_FUNC(tcb, db_show_t4tcb, db_t4_table, CS_OWN, NULL)
+DB_TABLE_COMMAND_FLAGS(show_t4, tcb, db_show_t4tcb, CS_OWN)
{
device_t dev;
int radix, tid, t;
diff --git a/sys/net/route/route_ddb.c b/sys/net/route/route_ddb.c
index 92e7a6bef574..a8e70a1d65c3 100644
--- a/sys/net/route/route_ddb.c
+++ b/sys/net/route/route_ddb.c
@@ -166,7 +166,7 @@ rt_dumpentry_ddb(struct radix_node *rn, void *arg __unused)
return (0);
}
-DB_SHOW_COMMAND(routetable, db_show_routetable_cmd)
+DB_SHOW_COMMAND(routetable, db_show_routetable)
{
struct rib_head *rnh;
int error, i, lim;
@@ -204,7 +204,7 @@ DB_SHOW_COMMAND(routetable, db_show_routetable_cmd)
}
}
-DB_SHOW_COMMAND_FLAGS(route, db_show_route_cmd, CS_OWN)
+DB_SHOW_COMMAND_FLAGS(route, db_show_route, CS_OWN)
{
char abuf[INET6_ADDRSTRLEN], *buf, *end;
struct rib_head *rh;