don't hold locks in ddb (call ksyms_getval_unlocked()), pointed out by ad.

This commit is contained in:
christos 2008-10-24 13:55:42 +00:00
parent 8e41274d19
commit bc44c7d780
3 changed files with 12 additions and 13 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: db_sym.c,v 1.56 2007/02/22 06:41:01 thorpej Exp $ */
/* $NetBSD: db_sym.c,v 1.57 2008/10/24 13:55:42 christos Exp $ */
/*
* Mach Operating System
@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: db_sym.c,v 1.56 2007/02/22 06:41:01 thorpej Exp $");
__KERNEL_RCSID(0, "$NetBSD: db_sym.c,v 1.57 2008/10/24 13:55:42 christos Exp $");
#include "opt_ddbparam.h"
@ -111,12 +111,12 @@ db_value_of_name(const char *name, db_expr_t *valuep)
#endif
(void)strlcpy(symbol, name, sizeof(symbol));
db_symsplit(symbol, &mod, &sym);
if (ksyms_getval(mod, sym, &uval, KSYMS_EXTERN) == 0) {
if (ksyms_getval_unlocked(mod, sym, &uval, KSYMS_EXTERN) == 0) {
val = (long) uval;
*valuep = (db_expr_t)val;
return true;
}
if (ksyms_getval(mod, sym, &uval, KSYMS_ANY) == 0) {
if (ksyms_getval_unlocked(mod, sym, &uval, KSYMS_ANY) == 0) {
val = (long) uval;
*valuep = (db_expr_t)val;
return true;
@ -230,7 +230,7 @@ db_search_symbol(db_addr_t val, db_strategy_t strategy, db_expr_t *offp)
#endif
if (ksyms_getname(&mod, &sym, (vaddr_t)val, strategy) == 0) {
(void)ksyms_getval(mod, sym, &naddr, KSYMS_ANY);
(void)ksyms_getval_unlocked(mod, sym, &naddr, KSYMS_ANY);
diff = val - (db_addr_t)naddr;
ret = (db_sym_t)naddr;
} else
@ -338,7 +338,7 @@ db_symstr(char *buf, size_t buflen, db_expr_t off, db_strategy_t strategy)
#endif
if (ksyms_getname(&mod, &name, (vaddr_t)off,
strategy|KSYMS_CLOSEST) == 0) {
(void)ksyms_getval(mod, name, &val, KSYMS_ANY);
(void)ksyms_getval_unlocked(mod, name, &val, KSYMS_ANY);
if (((off - val) < db_maxoff) && val) {
snprintf(buf, buflen, "%s:%s", mod, name);
if (off - val) {
@ -409,7 +409,7 @@ db_printsym(db_expr_t off, db_strategy_t strategy,
#endif
if (ksyms_getname(&mod, &name, (vaddr_t)off,
strategy|KSYMS_CLOSEST) == 0) {
(void)ksyms_getval(mod, name, &uval, KSYMS_ANY);
(void)ksyms_getval_unlocked(mod, name, &uval, KSYMS_ANY);
val = (long) uval;
if (((off - val) < db_maxoff) && val) {
(*pr)("%s:%s", mod, name);

View File

@ -1,4 +1,4 @@
/* $NetBSD: kern_ksyms.c,v 1.40 2008/10/23 20:41:13 christos Exp $ */
/* $NetBSD: kern_ksyms.c,v 1.41 2008/10/24 13:55:42 christos Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@ -74,7 +74,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: kern_ksyms.c,v 1.40 2008/10/23 20:41:13 christos Exp $");
__KERNEL_RCSID(0, "$NetBSD: kern_ksyms.c,v 1.41 2008/10/24 13:55:42 christos Exp $");
#ifdef _KERNEL
#include "opt_ddb.h"
@ -113,8 +113,6 @@ static kmutex_t ksyms_lock;
void ksymsattach(int);
static void ksyms_hdr_init(void *);
static void ksyms_sizes_calc(void);
static int ksyms_getval_unlocked(const char *, const char *, unsigned long *,
int);
#ifdef KSYMS_DEBUG
#define FOLLOW_CALLS 1
@ -507,7 +505,7 @@ ksyms_init_explicit(void *ehdr, void *symstart, size_t symsize,
*
* Call with ksyms_lock, unless known that the symbol table can't change.
*/
static int
int
ksyms_getval_unlocked(const char *mod, const char *sym, unsigned long *val,
int type)
{

View File

@ -1,4 +1,4 @@
/* $NetBSD: ksyms.h,v 1.16 2008/10/23 20:41:13 christos Exp $ */
/* $NetBSD: ksyms.h,v 1.17 2008/10/24 13:55:42 christos Exp $ */
/*
* Copyright (c) 2001, 2003 Anders Magnusson (ragge@ludd.luth.se).
@ -102,6 +102,7 @@ struct ksyms_gsymbol {
*/
int ksyms_getname(const char **, const char **, vaddr_t, int);
int ksyms_getval(const char *, const char *, unsigned long *, int);
int ksyms_getval_unlocked(const char *, const char *, unsigned long *, int);
int ksyms_addsymtab(const char *, void *, vsize_t, char *, vsize_t);
int ksyms_delsymtab(const char *);
void ksyms_init(int, void *, void *);