}
EXPORT_SYMBOL_GPL(arch_check_insn_arm);
-int arch_prepare_kprobe(struct kprobe *p)
+int arch_prepare_kprobe(struct kprobe *p, struct hlist_head *page_list)
{
kprobe_opcode_t insns[KPROBES_TRAMP_LEN];
int uregs, pc_dep, ret = 0;
struct arch_specific_insn ainsn;
/* insn: must be on special executable page on i386. */
- p->ainsn.insn = get_insn_slot(NULL, &kprobe_insn_pages, 0);
+ p->ainsn.insn = get_insn_slot(NULL, page_list, 0);
if (!p->ainsn.insn)
return -ENOMEM;
// check instructions that can write result to SP andu uses PC
if (pc_dep && (ARM_INSN_REG_RD(ainsn.insn[0]) == 13)) {
- free_insn_slot(&kprobe_insn_pages, NULL, p->ainsn.insn);
+ free_insn_slot(page_list, NULL, p->ainsn.insn);
ret = -EFAULT;
} else {
if (uregs && pc_dep) {
memcpy(insns, pc_dep_insn_execbuf, sizeof(insns));
if (prep_pc_dep_insn_execbuf(insns, insn[0], uregs) != 0) {
DBPRINTF ("failed to prepare exec buffer for insn %lx!", insn[0]);
- free_insn_slot(&kprobe_insn_pages, NULL, p->ainsn.insn);
+ free_insn_slot(page_list, NULL, p->ainsn.insn);
return -EINVAL;
}
insns[6] = (kprobe_opcode_t)(p->addr + 2);
#endif
}
} else {
- free_insn_slot(&kprobe_insn_pages, NULL, p->ainsn.insn);
+ free_insn_slot(page_list, NULL, p->ainsn.insn);
printk("arch_prepare_kprobe: instruction 0x%lx not instrumentation, addr=0x%p\n", insn[0], p->addr);
}
int prep_pc_dep_insn_execbuf(kprobe_opcode_t *insns, kprobe_opcode_t insn, int uregs);
struct kretprobe;
-int arch_prepare_kprobe(struct kprobe *p);
+int arch_prepare_kprobe(struct kprobe *p, struct hlist_head *page_list);
void arch_prepare_kretprobe(struct kretprobe *rp, struct pt_regs *regs);
void arch_arm_kprobe(struct kprobe *p);
kprobe_opcode_t *get_insn_slot(struct task_struct *task, struct hlist_head *page_list, int atomic);
void free_insn_slot(struct hlist_head *page_list, struct task_struct *task, kprobe_opcode_t *slot);
-extern struct hlist_head kprobe_insn_pages;
-
#endif /* _SRC_INSNS_SLOTS_H */
#include <linux/mm.h>
#include <linux/pagemap.h>
-extern struct hlist_head kprobe_insn_pages;
+struct hlist_head kprobe_insn_pages;
DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL;
static DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
goto out;
}
- if ((ret = arch_prepare_kprobe(p)) != 0)
+ if ((ret = arch_prepare_kprobe(p, &kprobe_insn_pages)) != 0)
goto out;
DBPRINTF ("before out ret = 0x%x\n", ret);