diff options
author | Bjoern A. Zeeb <bz@FreeBSD.org> | 2020-10-17 22:47:08 +0000 |
---|---|---|
committer | Bjoern A. Zeeb <bz@FreeBSD.org> | 2020-10-17 22:47:08 +0000 |
commit | f7a0bb0decb7ae16448a1f40f3e11b4aca8b8dc8 (patch) | |
tree | 7f565d06b451c3bfcfef1dd9d2b5c650232bb537 | |
parent | 4c4aa84848c05fac75e7e50693dbd8feb940e5df (diff) | |
download | src-f7a0bb0decb7ae16448a1f40f3e11b4aca8b8dc8.tar.gz src-f7a0bb0decb7ae16448a1f40f3e11b4aca8b8dc8.zip |
ddb: add show sysinit command
Add a show sysinit command to ddb (similar to show vnet_sysinit) which
proved to be helpful to debug some ordering issues on early-mid kernel
start panics.
Notes
Notes:
svn path=/head/; revision=366798
-rw-r--r-- | sys/kern/init_main.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c index 2f9919a7dca9..dab3ffe1d8c9 100644 --- a/sys/kern/init_main.c +++ b/sys/kern/init_main.c @@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$"); #include "opt_ddb.h" +#include "opt_kdb.h" #include "opt_init_path.h" #include "opt_verbose_sysinit.h" @@ -838,3 +839,51 @@ kick_init(const void *udata __unused) sched_add(td, SRQ_BORING); } SYSINIT(kickinit, SI_SUB_KTHREAD_INIT, SI_ORDER_MIDDLE, kick_init, NULL); + +/* + * DDB(4). + */ +#ifdef DDB +static void +db_show_print_syinit(struct sysinit *sip, bool ddb) +{ + const char *sname, *funcname; + c_db_sym_t sym; + db_expr_t offset; + +#define xprint(...) \ + if (ddb) \ + db_printf(__VA_ARGS__); \ + else \ + printf(__VA_ARGS__) + + if (sip == NULL) { + xprint("%s: no sysinit * given\n", __func__); + return; + } + + sym = db_search_symbol((vm_offset_t)sip, DB_STGY_ANY, &offset); + db_symbol_values(sym, &sname, NULL); + sym = db_search_symbol((vm_offset_t)sip->func, DB_STGY_PROC, &offset); + db_symbol_values(sym, &funcname, NULL); + xprint("%s(%p)\n", (sname != NULL) ? sname : "", sip); + xprint(" %#08x %#08x\n", sip->subsystem, sip->order); + xprint(" %p(%s)(%p)\n", + sip->func, (funcname != NULL) ? funcname : "", sip->udata); +#undef xprint +} + +DB_SHOW_COMMAND(sysinit, db_show_sysinit) +{ + struct sysinit **sipp; + + db_printf("SYSINIT vs Name(Ptr)\n"); + db_printf(" Subsystem Order\n"); + db_printf(" Function(Name)(Arg)\n"); + for (sipp = sysinit; sipp < sysinit_end; sipp++) { + db_show_print_syinit(*sipp, true); + if (db_pager_quit) + break; + } +} +#endif /* DDB */ |