kprobes: Convert kprobe_lookup_name() to a function
The macro is now pretty long and ugly on powerpc. In the light of further changes needed here, convert it to a __weak variant to be over-ridden with a nicer looking function. Suggested-by: Masami Hiramatsu <mhiramat@kernel.org> Acked-by: Masami Hiramatsu <mhiramat@kernel.org> Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:

committed by
Michael Ellerman

parent
a460246c70
commit
49e0b4658f
@@ -61,59 +61,6 @@ extern kprobe_opcode_t optprobe_template_end[];
|
||||
#define MAX_OPTINSN_SIZE (optprobe_template_end - optprobe_template_entry)
|
||||
#define RELATIVEJUMP_SIZE sizeof(kprobe_opcode_t) /* 4 bytes */
|
||||
|
||||
#ifdef PPC64_ELF_ABI_v2
|
||||
/* PPC64 ABIv2 needs local entry point */
|
||||
#define kprobe_lookup_name(name, addr) \
|
||||
{ \
|
||||
addr = (kprobe_opcode_t *)kallsyms_lookup_name(name); \
|
||||
if (addr) \
|
||||
addr = (kprobe_opcode_t *)ppc_function_entry(addr); \
|
||||
}
|
||||
#elif defined(PPC64_ELF_ABI_v1)
|
||||
/*
|
||||
* 64bit powerpc ABIv1 uses function descriptors:
|
||||
* - Check for the dot variant of the symbol first.
|
||||
* - If that fails, try looking up the symbol provided.
|
||||
*
|
||||
* This ensures we always get to the actual symbol and not the descriptor.
|
||||
* Also handle <module:symbol> format.
|
||||
*/
|
||||
#define kprobe_lookup_name(name, addr) \
|
||||
{ \
|
||||
char dot_name[MODULE_NAME_LEN + 1 + KSYM_NAME_LEN]; \
|
||||
const char *modsym; \
|
||||
bool dot_appended = false; \
|
||||
if ((modsym = strchr(name, ':')) != NULL) { \
|
||||
modsym++; \
|
||||
if (*modsym != '\0' && *modsym != '.') { \
|
||||
/* Convert to <module:.symbol> */ \
|
||||
strncpy(dot_name, name, modsym - name); \
|
||||
dot_name[modsym - name] = '.'; \
|
||||
dot_name[modsym - name + 1] = '\0'; \
|
||||
strncat(dot_name, modsym, \
|
||||
sizeof(dot_name) - (modsym - name) - 2);\
|
||||
dot_appended = true; \
|
||||
} else { \
|
||||
dot_name[0] = '\0'; \
|
||||
strncat(dot_name, name, sizeof(dot_name) - 1); \
|
||||
} \
|
||||
} else if (name[0] != '.') { \
|
||||
dot_name[0] = '.'; \
|
||||
dot_name[1] = '\0'; \
|
||||
strncat(dot_name, name, KSYM_NAME_LEN - 2); \
|
||||
dot_appended = true; \
|
||||
} else { \
|
||||
dot_name[0] = '\0'; \
|
||||
strncat(dot_name, name, KSYM_NAME_LEN - 1); \
|
||||
} \
|
||||
addr = (kprobe_opcode_t *)kallsyms_lookup_name(dot_name); \
|
||||
if (!addr && dot_appended) { \
|
||||
/* Let's try the original non-dot symbol lookup */ \
|
||||
addr = (kprobe_opcode_t *)kallsyms_lookup_name(name); \
|
||||
} \
|
||||
}
|
||||
#endif
|
||||
|
||||
#define flush_insn_slot(p) do { } while (0)
|
||||
#define kretprobe_blacklist_size 0
|
||||
|
||||
|
Reference in New Issue
Block a user