diff options
author | Steven Rostedt <srostedt@redhat.com> | 2009-09-16 20:03:06 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2009-09-17 15:53:14 -0400 |
commit | 91adcd2c4b104a8ce2973e6e84b01fd48735ffc6 (patch) | |
tree | 18a97957e7881ef3e4405be940c0ebfc61873b41 | |
parent | 45bd00d31de886f8425b4dd33204b911b0a466a9 (diff) |
vsprintf: add %ps that is the same as %pS but is like %pf
On PowerPC64 function pointers do not point directly at the functions,
but instead point to pointers to the functions. The output of %pF expects
to point to a pointer to the function, whereas %pS will show the function
itself.
mcount returns the direct pointer to the function and not the pointer to
the pointer. Thus %pS must be used to show this. The function tracer
requires printing of the functions without offsets and uses the %pf
instead.
%pF produces run_local_timers+0x4/0x1f
%pf produces just run_local_timers
For PowerPC64, we need to use the direct pointer, and we only have
%pS which will produce .run_local_timers+0x4/0x1f
This patch creates a %ps that matches the %pf as %pS matches %pF.
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Zhao Lei <zhaolei@cn.fujitsu.com>
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r-- | lib/vsprintf.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index cb8a112030bb..c8f3ed62cee1 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c | |||
@@ -581,7 +581,7 @@ static char *symbol_string(char *buf, char *end, void *ptr, | |||
581 | unsigned long value = (unsigned long) ptr; | 581 | unsigned long value = (unsigned long) ptr; |
582 | #ifdef CONFIG_KALLSYMS | 582 | #ifdef CONFIG_KALLSYMS |
583 | char sym[KSYM_SYMBOL_LEN]; | 583 | char sym[KSYM_SYMBOL_LEN]; |
584 | if (ext != 'f') | 584 | if (ext != 'f' && ext != 's') |
585 | sprint_symbol(sym, value); | 585 | sprint_symbol(sym, value); |
586 | else | 586 | else |
587 | kallsyms_lookup(value, NULL, NULL, NULL, sym); | 587 | kallsyms_lookup(value, NULL, NULL, NULL, sym); |
@@ -822,6 +822,7 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr, | |||
822 | case 'F': | 822 | case 'F': |
823 | case 'f': | 823 | case 'f': |
824 | ptr = dereference_function_descriptor(ptr); | 824 | ptr = dereference_function_descriptor(ptr); |
825 | case 's': | ||
825 | /* Fallthrough */ | 826 | /* Fallthrough */ |
826 | case 'S': | 827 | case 'S': |
827 | return symbol_string(buf, end, ptr, spec, *fmt); | 828 | return symbol_string(buf, end, ptr, spec, *fmt); |
@@ -1063,7 +1064,8 @@ qualifier: | |||
1063 | * @args: Arguments for the format string | 1064 | * @args: Arguments for the format string |
1064 | * | 1065 | * |
1065 | * This function follows C99 vsnprintf, but has some extensions: | 1066 | * This function follows C99 vsnprintf, but has some extensions: |
1066 | * %pS output the name of a text symbol | 1067 | * %pS output the name of a text symbol with offset |
1068 | * %ps output the name of a text symbol without offset | ||
1067 | * %pF output the name of a function pointer with its offset | 1069 | * %pF output the name of a function pointer with its offset |
1068 | * %pf output the name of a function pointer without its offset | 1070 | * %pf output the name of a function pointer without its offset |
1069 | * %pR output the address range in a struct resource | 1071 | * %pR output the address range in a struct resource |