diff options
author | Ananth N Mavinakayanahalli <ananth@in.ibm.com> | 2006-10-02 05:17:31 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-02 10:57:16 -0400 |
commit | 412998cf6bce78b8dc5f68660e09bf3b4fcbb210 (patch) | |
tree | 109202550c743399c7b3a1b7c216aaa35e074d38 | |
parent | 3a872d89baae821a0f6e2c1055d4b47650661137 (diff) |
[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>
-rw-r--r-- | include/asm-powerpc/kprobes.h | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/include/asm-powerpc/kprobes.h b/include/asm-powerpc/kprobes.h index 1ef54be6abfa..2dafa376a63f 100644 --- a/include/asm-powerpc/kprobes.h +++ b/include/asm-powerpc/kprobes.h | |||
@@ -47,16 +47,23 @@ typedef unsigned int kprobe_opcode_t; | |||
47 | /* | 47 | /* |
48 | * 64bit powerpc uses function descriptors. | 48 | * 64bit powerpc uses function descriptors. |
49 | * Handle cases where: | 49 | * Handle cases where: |
50 | * - User passes a <.symbol> | 50 | * - User passes a <.symbol> or <module:.symbol> |
51 | * - User passes a <symbol> | 51 | * - User passes a <symbol> or <module:symbol> |
52 | * - User passes a non-existant symbol, kallsyms_lookup_name | 52 | * - User passes a non-existant symbol, kallsyms_lookup_name |
53 | * returns 0. Don't deref the NULL pointer in that case | 53 | * returns 0. Don't deref the NULL pointer in that case |
54 | */ | 54 | */ |
55 | #define kprobe_lookup_name(name, addr) \ | 55 | #define kprobe_lookup_name(name, addr) \ |
56 | { \ | 56 | { \ |
57 | addr = (kprobe_opcode_t *)kallsyms_lookup_name(name); \ | 57 | addr = (kprobe_opcode_t *)kallsyms_lookup_name(name); \ |
58 | if (!(name[0] == '.') && addr) \ | 58 | if (addr) { \ |
59 | addr = *(kprobe_opcode_t **)addr; \ | 59 | char *colon; \ |
60 | if ((colon = strchr(name, ':')) != NULL) { \ | ||
61 | colon++; \ | ||
62 | if (*colon != '\0' && *colon != '.') \ | ||
63 | addr = *(kprobe_opcode_t **)addr; \ | ||
64 | } else if (name[0] != '.') \ | ||
65 | addr = *(kprobe_opcode_t **)addr; \ | ||
66 | } \ | ||
60 | } | 67 | } |
61 | 68 | ||
62 | #define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)((func_descr_t *)pentry) | 69 | #define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)((func_descr_t *)pentry) |