mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 01:49:36 +00:00
[PATCH] kprobes: handle symbol resolution when <module:.symbol> is specified
kallsyms_lookup_name() allows for <module:symbol> style specification for looking up symbol addresses. Handle the case where the user specifies <module:.symbol> on powerpc, given that 64-bit powerpc uses function descriptors. Signed-off-by: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com> Signed-off-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
3a872d89ba
commit
412998cf6b
1 changed files with 11 additions and 4 deletions
|
@ -47,16 +47,23 @@ typedef unsigned int kprobe_opcode_t;
|
|||
/*
|
||||
* 64bit powerpc uses function descriptors.
|
||||
* Handle cases where:
|
||||
* - User passes a <.symbol>
|
||||
* - User passes a <symbol>
|
||||
* - User passes a <.symbol> or <module:.symbol>
|
||||
* - User passes a <symbol> or <module:symbol>
|
||||
* - User passes a non-existant symbol, kallsyms_lookup_name
|
||||
* returns 0. Don't deref the NULL pointer in that case
|
||||
*/
|
||||
#define kprobe_lookup_name(name, addr) \
|
||||
{ \
|
||||
addr = (kprobe_opcode_t *)kallsyms_lookup_name(name); \
|
||||
if (!(name[0] == '.') && addr) \
|
||||
addr = *(kprobe_opcode_t **)addr; \
|
||||
if (addr) { \
|
||||
char *colon; \
|
||||
if ((colon = strchr(name, ':')) != NULL) { \
|
||||
colon++; \
|
||||
if (*colon != '\0' && *colon != '.') \
|
||||
addr = *(kprobe_opcode_t **)addr; \
|
||||
} else if (name[0] != '.') \
|
||||
addr = *(kprobe_opcode_t **)addr; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)((func_descr_t *)pentry)
|
||||
|
|
Loading…
Reference in a new issue