Commit 0c8b946e authored by Frederic Weisbecker's avatar Frederic Weisbecker Committed by Ingo Molnar

vsprintf: introduce %pf format specifier

A printf format specifier which would allow us to print a pure
function name has been suggested by Andrew Morton a couple of
months ago.

The current %pF is very convenient to print a function symbol,
but often we only want to print the name of the function, without
its asm offset.

That's what  %pf does in this patch.  The lowecase f has been chosen
for its intuitive meaning of a 'weak kind of %pF'.

The support for this new format would be welcome by the tracing code
where the need to print pure function names is often needed. This is
also true for other parts of the kernel:

$ git-grep -E "kallsyms_lookup\(.+?\)"
arch/blackfin/kernel/traps.c:   symname = kallsyms_lookup(address, &symsize, &offset, &modname, namebuf);
arch/powerpc/xmon/xmon.c:               name = kallsyms_lookup(pc, &size, &offset, NULL, tmpstr);
arch/sh/kernel/cpu/sh5/unwind.c:        sym = kallsyms_lookup(pc, NULL, &offset, NULL, namebuf);
arch/x86/kernel/ftrace.c:       kallsyms_lookup((unsigned long) syscall, NULL, NULL, NULL, str);
kernel/kprobes.c:               sym = kallsyms_lookup((unsigned long)p->addr, NULL,
kernel/lockdep.c:       return kallsyms_lookup((unsigned long)key, NULL, NULL, NULL, str);
kernel/trace/ftrace.c:  kallsyms_lookup(rec->ip, NULL, NULL, NULL, str);
kernel/trace/ftrace.c:  kallsyms_lookup(rec->ip, NULL, NULL, NULL, str);
kernel/trace/ftrace.c:  kallsyms_lookup((unsigned long)rec->ops->func, NULL, NULL, NULL, str);
kernel/trace/ftrace.c:  kallsyms_lookup(rec->ip, NULL, NULL, NULL, str);
kernel/trace/ftrace.c:  kallsyms_lookup(rec->ip, NULL, NULL, NULL, str);
kernel/trace/ftrace.c:  kallsyms_lookup(rec->ip, NULL, NULL, &modname, str);
kernel/trace/ftrace.c:  kallsyms_lookup(*ptr, NULL, NULL, NULL, str);
kernel/trace/trace_functions.c: kallsyms_lookup(ip, NULL, NULL, NULL, str);
kernel/trace/trace_output.c:    kallsyms_lookup(address, NULL, NULL, NULL, str);

Changes in v2:

- Add the explanation of the %pf role for vsnprintf() and bstr_printf()

- Change the comments by dropping the "asm offset" notion and only
  define the %pf against the actual function offset notion.
Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Acked-by: default avatarMike Frysinger <vapier@gentoo.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Zhaolei <zhaolei@cn.fujitsu.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
Cc: Li Zefan <lizf@cn.fujitsu.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <20090415154817.GC5989@nowhere>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent a4e94ef0
...@@ -575,12 +575,15 @@ static char *string(char *buf, char *end, char *s, struct printf_spec spec) ...@@ -575,12 +575,15 @@ static char *string(char *buf, char *end, char *s, struct printf_spec spec)
} }
static char *symbol_string(char *buf, char *end, void *ptr, static char *symbol_string(char *buf, char *end, void *ptr,
struct printf_spec spec) struct printf_spec spec, char ext)
{ {
unsigned long value = (unsigned long) ptr; unsigned long value = (unsigned long) ptr;
#ifdef CONFIG_KALLSYMS #ifdef CONFIG_KALLSYMS
char sym[KSYM_SYMBOL_LEN]; char sym[KSYM_SYMBOL_LEN];
if (ext != 'f')
sprint_symbol(sym, value); sprint_symbol(sym, value);
else
kallsyms_lookup(value, NULL, NULL, NULL, sym);
return string(buf, end, sym, spec); return string(buf, end, sym, spec);
#else #else
spec.field_width = 2*sizeof(void *); spec.field_width = 2*sizeof(void *);
...@@ -692,7 +695,8 @@ static char *ip4_addr_string(char *buf, char *end, u8 *addr, ...@@ -692,7 +695,8 @@ static char *ip4_addr_string(char *buf, char *end, u8 *addr,
* *
* Right now we handle: * Right now we handle:
* *
* - 'F' For symbolic function descriptor pointers * - 'F' For symbolic function descriptor pointers with offset
* - 'f' For simple symbolic function names without offset
* - 'S' For symbolic direct pointers * - 'S' For symbolic direct pointers
* - 'R' For a struct resource pointer, it prints the range of * - 'R' For a struct resource pointer, it prints the range of
* addresses (not the name nor the flags) * addresses (not the name nor the flags)
...@@ -715,10 +719,11 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr, ...@@ -715,10 +719,11 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr,
switch (*fmt) { switch (*fmt) {
case 'F': case 'F':
case 'f':
ptr = dereference_function_descriptor(ptr); ptr = dereference_function_descriptor(ptr);
/* Fallthrough */ /* Fallthrough */
case 'S': case 'S':
return symbol_string(buf, end, ptr, spec); return symbol_string(buf, end, ptr, spec, *fmt);
case 'R': case 'R':
return resource_string(buf, end, ptr, spec); return resource_string(buf, end, ptr, spec);
case 'm': case 'm':
...@@ -954,7 +959,8 @@ static int format_decode(const char *fmt, struct printf_spec *spec) ...@@ -954,7 +959,8 @@ static int format_decode(const char *fmt, struct printf_spec *spec)
* *
* This function follows C99 vsnprintf, but has some extensions: * This function follows C99 vsnprintf, but has some extensions:
* %pS output the name of a text symbol * %pS output the name of a text symbol
* %pF output the name of a function pointer * %pF output the name of a function pointer with its offset
* %pf output the name of a function pointer without its offset
* %pR output the address range in a struct resource * %pR output the address range in a struct resource
* *
* The return value is the number of characters which would * The return value is the number of characters which would
...@@ -1412,7 +1418,8 @@ EXPORT_SYMBOL_GPL(vbin_printf); ...@@ -1412,7 +1418,8 @@ EXPORT_SYMBOL_GPL(vbin_printf);
* *
* The format follows C99 vsnprintf, but has some extensions: * The format follows C99 vsnprintf, but has some extensions:
* %pS output the name of a text symbol * %pS output the name of a text symbol
* %pF output the name of a function pointer * %pF output the name of a function pointer with its offset
* %pf output the name of a function pointer without its offset
* %pR output the address range in a struct resource * %pR output the address range in a struct resource
* %n is ignored * %n is ignored
* *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment