diff options
Diffstat (limited to 'include/asm-powerpc/kprobes.h')
-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) |