diff options
| author | Stephen J. Kiernan <stevek@FreeBSD.org> | 2026-04-30 05:19:09 +0000 |
|---|---|---|
| committer | Stephen J. Kiernan <stevek@FreeBSD.org> | 2026-04-30 05:20:12 +0000 |
| commit | b683fd0b3206b35214f7f87805246e5c74552942 (patch) | |
| tree | 4d43b991d774b4283e1e0182267ce3dd86600707 | |
| parent | e7f4269dbfad02119934c35d523cb33ff8c93493 (diff) | |
preload: add "show preload" DDB command
This is the DDB equivalent of the debug.dump_modinfo sysctl which
outputs pretty-printed bootloader metadata.
Move sbuf_db_printf_drain to subr_prf.c and expose it for general use.
Reviewed By: jmg
Differential Revision: https://reviews.freebsd.org/D53763
| -rw-r--r-- | sys/kern/subr_module.c | 20 | ||||
| -rw-r--r-- | sys/kern/subr_prf.c | 9 | ||||
| -rw-r--r-- | sys/kern/subr_witness.c | 6 | ||||
| -rw-r--r-- | sys/sys/sbuf.h | 3 |
4 files changed, 32 insertions, 6 deletions
diff --git a/sys/kern/subr_module.c b/sys/kern/subr_module.c index 92f22206f8cf..b2d723fef038 100644 --- a/sys/kern/subr_module.c +++ b/sys/kern/subr_module.c @@ -28,6 +28,9 @@ * SUCH DAMAGE. */ +#include <sys/cdefs.h> +#include "opt_ddb.h" + #include <sys/param.h> #include <sys/systm.h> #include <sys/linker.h> @@ -39,6 +42,10 @@ #include <vm/vm.h> #include <vm/vm_extern.h> +#ifdef DDB +#include <ddb/ddb.h> +#endif + /* * Preloaded module support */ @@ -607,3 +614,16 @@ SYSCTL_PROC(_debug, OID_AUTO, dump_modinfo, CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0, sysctl_preload_dump, "A", "pretty-print the bootloader metadata"); + +#ifdef DDB +DB_SHOW_COMMAND_FLAGS(preload, db_show_preload, DB_CMD_MEMSAFE) +{ + struct sbuf sb; + char buffer[128]; + + sbuf_new(&sb, buffer, sizeof(buffer), SBUF_FIXEDLEN); + sbuf_set_drain(&sb, sbuf_db_printf_drain, NULL); + preload_dump_internal(&sb); + sbuf_finish(&sb); +} +#endif diff --git a/sys/kern/subr_prf.c b/sys/kern/subr_prf.c index bbf81b7a4ffe..35b5ee8ccdc8 100644 --- a/sys/kern/subr_prf.c +++ b/sys/kern/subr_prf.c @@ -1358,3 +1358,12 @@ sbuf_printf_drain(void *arg, const char *data, int len) return (r); } + +#if defined(_KERNEL) && defined(DDB) +int +sbuf_db_printf_drain(void *arg __unused, const char *data, int len) +{ + + return (db_printf("%.*s", len, data)); +} +#endif diff --git a/sys/kern/subr_witness.c b/sys/kern/subr_witness.c index 85dc0c321797..3c192b2b0dce 100644 --- a/sys/kern/subr_witness.c +++ b/sys/kern/subr_witness.c @@ -3121,12 +3121,6 @@ sysctl_debug_witness_badstacks(SYSCTL_HANDLER_ARGS) } #ifdef DDB -static int -sbuf_db_printf_drain(void *arg __unused, const char *data, int len) -{ - return (db_printf("%.*s", len, data)); -} - DB_SHOW_COMMAND_FLAGS(badstacks, db_witness_badstacks, DB_CMD_MEMSAFE) { struct sbuf sb; diff --git a/sys/sys/sbuf.h b/sys/sys/sbuf.h index 60dcda53a461..e9959d7b2a13 100644 --- a/sys/sys/sbuf.h +++ b/sys/sys/sbuf.h @@ -114,6 +114,9 @@ struct uio; struct sbuf *sbuf_uionew(struct sbuf *, struct uio *, int *); int sbuf_bcopyin(struct sbuf *, const void *, size_t); int sbuf_copyin(struct sbuf *, const void *, size_t); +#ifdef DDB +int sbuf_db_printf_drain(void *arg, const char *data, int len); +#endif #endif __END_DECLS |
