Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 54650
b: refs/heads/master
c: 9d65cb4
h: refs/heads/master
v: v3
  • Loading branch information
Alexey Dobriyan authored and Linus Torvalds committed May 8, 2007
1 parent 7deba9a commit 7313164
Show file tree
Hide file tree
Showing 8 changed files with 67 additions and 20 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ffb45122766db220d0bf3d01848d575fbbcb6430
refs/heads/master: 9d65cb4a1718a072898c7a57a3bc61b2dc4bcd4d
11 changes: 5 additions & 6 deletions trunk/fs/proc/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -278,16 +278,15 @@ static int proc_pid_auxv(struct task_struct *task, char *buffer)
*/
static int proc_pid_wchan(struct task_struct *task, char *buffer)
{
const char *sym_name;
unsigned long wchan;
char namebuf[KSYM_NAME_LEN+1];
char symname[KSYM_NAME_LEN+1];

wchan = get_wchan(task);

sym_name = kallsyms_lookup(wchan, NULL, NULL, NULL, namebuf);
if (sym_name)
return sprintf(buffer, "%s", sym_name);
return sprintf(buffer, "%lu", wchan);
if (lookup_symbol_name(wchan, symname) < 0)
return sprintf(buffer, "%lu", wchan);
else
return sprintf(buffer, "%s", symname);
}
#endif /* CONFIG_KALLSYMS */

Expand Down
7 changes: 7 additions & 0 deletions trunk/include/linux/kallsyms.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ extern int sprint_symbol(char *buffer, unsigned long address);
/* Look up a kernel symbol and print it to the kernel messages. */
extern void __print_symbol(const char *fmt, unsigned long address);

int lookup_symbol_name(unsigned long addr, char *symname);

#else /* !CONFIG_KALLSYMS */

static inline unsigned long kallsyms_lookup_name(const char *name)
Expand Down Expand Up @@ -58,6 +60,11 @@ static inline int sprint_symbol(char *buffer, unsigned long addr)
return 0;
}

static inline int lookup_symbol_name(unsigned long addr, char *symname)
{
return -ERANGE;
}

/* Stupid that this does nothing, but I didn't create this mess. */
#define __print_symbol(fmt, addr)
#endif /*CONFIG_KALLSYMS*/
Expand Down
6 changes: 6 additions & 0 deletions trunk/include/linux/module.h
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,7 @@ const char *module_address_lookup(unsigned long addr,
unsigned long *symbolsize,
unsigned long *offset,
char **modname);
int lookup_module_symbol_name(unsigned long addr, char *symname);

/* For extable.c to search modules' exception tables. */
const struct exception_table_entry *search_module_extables(unsigned long addr);
Expand Down Expand Up @@ -525,6 +526,11 @@ static inline const char *module_address_lookup(unsigned long addr,
return NULL;
}

static inline int lookup_module_symbol_name(unsigned long addr, char *symname)
{
return -ERANGE;
}

static inline int module_get_kallsym(unsigned int symnum, unsigned long *value,
char *type, char *name,
char *module_name, int *exported)
Expand Down
17 changes: 17 additions & 0 deletions trunk/kernel/kallsyms.c
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,23 @@ const char *kallsyms_lookup(unsigned long addr,
return NULL;
}

int lookup_symbol_name(unsigned long addr, char *symname)
{
symname[0] = '\0';
symname[KSYM_NAME_LEN] = '\0';

if (is_ksym_addr(addr)) {
unsigned long pos;

pos = get_symbol_pos(addr, NULL, NULL);
/* Grab name */
kallsyms_expand_symbol(get_symbol_offset(pos), symname);
return 0;
}
/* see if it's in a module */
return lookup_module_symbol_name(addr, symname);
}

/* Look up a kernel symbol and return it in a text buffer. */
int sprint_symbol(char *buffer, unsigned long address)
{
Expand Down
23 changes: 23 additions & 0 deletions trunk/kernel/module.c
Original file line number Diff line number Diff line change
Expand Up @@ -2126,6 +2126,29 @@ const char *module_address_lookup(unsigned long addr,
return NULL;
}

int lookup_module_symbol_name(unsigned long addr, char *symname)
{
struct module *mod;

mutex_lock(&module_mutex);
list_for_each_entry(mod, &modules, list) {
if (within(addr, mod->module_init, mod->init_size) ||
within(addr, mod->module_core, mod->core_size)) {
const char *sym;

sym = get_ksymbol(mod, addr, NULL, NULL);
if (!sym)
goto out;
strlcpy(symname, sym, KSYM_NAME_LEN + 1);
mutex_unlock(&module_mutex);
return 0;
}
}
out:
mutex_unlock(&module_mutex);
return -ERANGE;
}

int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
char *name, char *module_name, int *exported)
{
Expand Down
11 changes: 4 additions & 7 deletions trunk/kernel/time/timer_list.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,12 @@ DECLARE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases);

static void print_name_offset(struct seq_file *m, void *sym)
{
unsigned long addr = (unsigned long)sym;
char namebuf[KSYM_NAME_LEN+1];
const char *sym_name;
char symname[KSYM_NAME_LEN+1];

sym_name = kallsyms_lookup(addr, NULL, NULL, NULL, namebuf);
if (sym_name)
SEQ_printf(m, "%s", sym_name);
else
if (lookup_symbol_name((unsigned long)sym, symname) < 0)
SEQ_printf(m, "<%p>", sym);
else
SEQ_printf(m, "%s", symname);
}

static void
Expand Down
10 changes: 4 additions & 6 deletions trunk/kernel/time/timer_stats.c
Original file line number Diff line number Diff line change
Expand Up @@ -257,14 +257,12 @@ void timer_stats_update_stats(void *timer, pid_t pid, void *startf,

static void print_name_offset(struct seq_file *m, unsigned long addr)
{
char namebuf[KSYM_NAME_LEN+1];
const char *sym_name;
char symname[KSYM_NAME_LEN+1];

sym_name = kallsyms_lookup(addr, NULL, NULL, NULL, namebuf);
if (sym_name)
seq_printf(m, "%s", sym_name);
else
if (lookup_symbol_name(addr, symname) < 0)
seq_printf(m, "<%p>", (void *)addr);
else
seq_printf(m, "%s", symname);
}

static int tstats_show(struct seq_file *m, void *v)
Expand Down

0 comments on commit 7313164

Please sign in to comment.