Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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>

authored by

Ananth N Mavinakayanahalli and committed by
Linus Torvalds
412998cf 3a872d89

+11 -4
+11 -4
include/asm-powerpc/kprobes.h
··· 47 47 /* 48 48 * 64bit powerpc uses function descriptors. 49 49 * Handle cases where: 50 - * - User passes a <.symbol> 51 - * - User passes a <symbol> 50 + * - User passes a <.symbol> or <module:.symbol> 51 + * - User passes a <symbol> or <module:symbol> 52 52 * - User passes a non-existant symbol, kallsyms_lookup_name 53 53 * returns 0. Don't deref the NULL pointer in that case 54 54 */ 55 55 #define kprobe_lookup_name(name, addr) \ 56 56 { \ 57 57 addr = (kprobe_opcode_t *)kallsyms_lookup_name(name); \ 58 - if (!(name[0] == '.') && addr) \ 59 - addr = *(kprobe_opcode_t **)addr; \ 58 + if (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 69 #define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)((func_descr_t *)pentry)