|
@@ -58,15 +58,6 @@
|
|
|
#define KPROBE_TABLE_SIZE (1 << KPROBE_HASH_BITS)
|
|
#define KPROBE_TABLE_SIZE (1 << KPROBE_HASH_BITS)
|
|
|
|
|
|
|
|
|
|
|
|
|
-/*
|
|
|
|
|
- * Some oddball architectures like 64bit powerpc have function descriptors
|
|
|
|
|
- * so this must be overridable.
|
|
|
|
|
- */
|
|
|
|
|
-#ifndef kprobe_lookup_name
|
|
|
|
|
-#define kprobe_lookup_name(name, addr) \
|
|
|
|
|
- addr = ((kprobe_opcode_t *)(kallsyms_lookup_name(name)))
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
static int kprobes_initialized;
|
|
static int kprobes_initialized;
|
|
|
static struct hlist_head kprobe_table[KPROBE_TABLE_SIZE];
|
|
static struct hlist_head kprobe_table[KPROBE_TABLE_SIZE];
|
|
|
static struct hlist_head kretprobe_inst_table[KPROBE_TABLE_SIZE];
|
|
static struct hlist_head kretprobe_inst_table[KPROBE_TABLE_SIZE];
|
|
@@ -81,6 +72,11 @@ static struct {
|
|
|
raw_spinlock_t lock ____cacheline_aligned_in_smp;
|
|
raw_spinlock_t lock ____cacheline_aligned_in_smp;
|
|
|
} kretprobe_table_locks[KPROBE_TABLE_SIZE];
|
|
} kretprobe_table_locks[KPROBE_TABLE_SIZE];
|
|
|
|
|
|
|
|
|
|
+kprobe_opcode_t * __weak kprobe_lookup_name(const char *name)
|
|
|
|
|
+{
|
|
|
|
|
+ return ((kprobe_opcode_t *)(kallsyms_lookup_name(name)));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
static raw_spinlock_t *kretprobe_table_lock_ptr(unsigned long hash)
|
|
static raw_spinlock_t *kretprobe_table_lock_ptr(unsigned long hash)
|
|
|
{
|
|
{
|
|
|
return &(kretprobe_table_locks[hash].lock);
|
|
return &(kretprobe_table_locks[hash].lock);
|
|
@@ -1407,7 +1403,7 @@ static kprobe_opcode_t *kprobe_addr(struct kprobe *p)
|
|
|
goto invalid;
|
|
goto invalid;
|
|
|
|
|
|
|
|
if (p->symbol_name) {
|
|
if (p->symbol_name) {
|
|
|
- kprobe_lookup_name(p->symbol_name, addr);
|
|
|
|
|
|
|
+ addr = kprobe_lookup_name(p->symbol_name);
|
|
|
if (!addr)
|
|
if (!addr)
|
|
|
return ERR_PTR(-ENOENT);
|
|
return ERR_PTR(-ENOENT);
|
|
|
}
|
|
}
|
|
@@ -2199,8 +2195,8 @@ static int __init init_kprobes(void)
|
|
|
if (kretprobe_blacklist_size) {
|
|
if (kretprobe_blacklist_size) {
|
|
|
/* lookup the function address from its name */
|
|
/* lookup the function address from its name */
|
|
|
for (i = 0; kretprobe_blacklist[i].name != NULL; i++) {
|
|
for (i = 0; kretprobe_blacklist[i].name != NULL; i++) {
|
|
|
- kprobe_lookup_name(kretprobe_blacklist[i].name,
|
|
|
|
|
- kretprobe_blacklist[i].addr);
|
|
|
|
|
|
|
+ kretprobe_blacklist[i].addr =
|
|
|
|
|
+ kprobe_lookup_name(kretprobe_blacklist[i].name);
|
|
|
if (!kretprobe_blacklist[i].addr)
|
|
if (!kretprobe_blacklist[i].addr)
|
|
|
printk("kretprobe: lookup failed: %s\n",
|
|
printk("kretprobe: lookup failed: %s\n",
|
|
|
kretprobe_blacklist[i].name);
|
|
kretprobe_blacklist[i].name);
|