aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnanth N Mavinakayanahalli <ananth@in.ibm.com>2006-10-02 05:17:31 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-10-02 10:57:16 -0400
commit412998cf6bce78b8dc5f68660e09bf3b4fcbb210 (patch)
tree109202550c743399c7b3a1b7c216aaa35e074d38
parent3a872d89baae821a0f6e2c1055d4b47650661137 (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.h15
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)