Module Name: src Committed By: christos Date: Mon Mar 9 01:47:51 UTC 2020
Modified Files: src/sys/kern: subr_lockdebug.c Log Message: comment out enough stuff to allow crash to print locks. To generate a diff of this commit: cvs rdiff -u -r1.74 -r1.75 src/sys/kern/subr_lockdebug.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/subr_lockdebug.c diff -u src/sys/kern/subr_lockdebug.c:1.74 src/sys/kern/subr_lockdebug.c:1.75 --- src/sys/kern/subr_lockdebug.c:1.74 Tue Jan 21 15:31:57 2020 +++ src/sys/kern/subr_lockdebug.c Sun Mar 8 21:47:50 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_lockdebug.c,v 1.74 2020/01/21 20:31:57 ad Exp $ */ +/* $NetBSD: subr_lockdebug.c,v 1.75 2020/03/09 01:47:50 christos Exp $ */ /*- * Copyright (c) 2006, 2007, 2008, 2020 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_lockdebug.c,v 1.74 2020/01/21 20:31:57 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_lockdebug.c,v 1.75 2020/03/09 01:47:50 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_ddb.h" @@ -97,13 +97,21 @@ typedef _TAILQ_HEAD(lockdebuglist, struc __cpu_simple_lock_t ld_mod_lk; lockdebuglist_t ld_free = TAILQ_HEAD_INITIALIZER(ld_free); +#ifdef _KERNEL lockdebuglist_t ld_all = TAILQ_HEAD_INITIALIZER(ld_all); +#else +extern lockdebuglist_t ld_all; +#define cpu_name(a) "?" +#define cpu_index(a) -1 +#define curlwp NULL +#endif /* _KERNEL */ int ld_nfree; int ld_freeptr; int ld_recurse; bool ld_nomore; lockdebug_t ld_prime[LD_BATCH]; +#ifdef _KERNEL static void lockdebug_abort1(const char *, size_t, lockdebug_t *, int, const char *, bool); static int lockdebug_more(int); @@ -744,6 +752,13 @@ lockdebug_mem_check(const char *func, si } splx(s); } +#endif /* _KERNEL */ + +#ifdef DDB +#include <machine/db_machdep.h> +#include <ddb/db_interface.h> +#include <ddb/db_access.h> +#endif /* * lockdebug_dump: @@ -755,6 +770,7 @@ lockdebug_dump(lwp_t *l, lockdebug_t *ld __printflike(1, 2)) { int sleeper = (ld->ld_flags & LD_SLEEPER); + lockops_t *lo = ld->ld_lockops; (*pr)( "lock address : %#018lx type : %18s\n" @@ -762,7 +778,12 @@ lockdebug_dump(lwp_t *l, lockdebug_t *ld (long)ld->ld_lock, (sleeper ? "sleep/adaptive" : "spin"), (long)ld->ld_initaddr); - if (ld->ld_lockops->lo_type == LOCKOPS_CV) { +#ifndef _KERNEL + lockops_t los; + lo = &los; + db_read_bytes((db_addr_t)ld->ld_lockops, sizeof(los), (char *)lo); +#endif + if (lo->lo_type == LOCKOPS_CV) { (*pr)(" interlock: %#018lx\n", (long)ld->ld_locked); } else { (*pr)("\n" @@ -781,14 +802,17 @@ lockdebug_dump(lwp_t *l, lockdebug_t *ld (long)ld->ld_unlocked); } - if (ld->ld_lockops->lo_dump != NULL) - (*ld->ld_lockops->lo_dump)(ld->ld_lock, pr); +#ifdef _KERNEL + if (lo->lo_dump != NULL) + (*lo->lo_dump)(ld->ld_lock, pr); if (sleeper) { turnstile_print(ld->ld_lock, pr); } +#endif } +#ifdef _KERNEL /* * lockdebug_abort1: * @@ -821,6 +845,7 @@ lockdebug_abort1(const char *func, size_ ld->ld_lockops->lo_name, func, line, msg); } +#endif /* _KERNEL */ #endif /* LOCKDEBUG */ /* @@ -829,17 +854,16 @@ lockdebug_abort1(const char *func, size_ * Handle the DDB 'show lock' command. */ #ifdef DDB -#include <machine/db_machdep.h> -#include <ddb/db_interface.h> - void lockdebug_lock_print(void *addr, void (*pr)(const char *, ...) __printflike(1, 2)) { #ifdef LOCKDEBUG - lockdebug_t *ld; + lockdebug_t *ld, lds; TAILQ_FOREACH(ld, &ld_all, ld_achain) { + db_read_bytes((db_addr_t)ld, sizeof(lds), __UNVOLATILE(&lds)); + ld = &lds; if (ld->ld_lock == NULL) continue; if (addr == NULL || ld->ld_lock == addr) { @@ -857,6 +881,7 @@ lockdebug_lock_print(void *addr, #endif /* LOCKDEBUG */ } +#ifdef _KERNEL #ifdef LOCKDEBUG static void lockdebug_show_one(lwp_t *l, lockdebug_t *ld, int i, @@ -864,8 +889,10 @@ lockdebug_show_one(lwp_t *l, lockdebug_t { const char *sym; +#ifdef _KERNEL ksyms_getname(NULL, &sym, (vaddr_t)ld->ld_initaddr, KSYMS_CLOSEST|KSYMS_PROC|KSYMS_ANY); +#endif (*pr)("* Lock %d (initialized at %s)\n", i++, sym); lockdebug_dump(l, ld, pr); } @@ -947,8 +974,10 @@ lockdebug_show_all_locks_cpu(void (*pr)( } } } +#endif /* _KERNEL */ #endif /* LOCKDEBUG */ +#ifdef _KERNEL void lockdebug_show_all_locks(void (*pr)(const char *, ...) __printflike(1, 2), const char *modif) @@ -1019,8 +1048,10 @@ lockdebug_show_lockstats(void (*pr)(cons (*pr)("Sorry, kernel not built with the LOCKDEBUG option.\n"); #endif /* LOCKDEBUG */ } +#endif /* _KERNEL */ #endif /* DDB */ +#ifdef _KERNEL /* * lockdebug_dismiss: * @@ -1076,3 +1107,4 @@ lockdebug_abort(const char *func, size_t panic("lock error: %s: %s,%zu: %s: lock %p cpu %d lwp %p", ops->lo_name, func, line, msg, lock, cpu_index(curcpu()), curlwp); } +#endif /* _KERNEL */