Merge branch 'devel-stable' into for-next
[linux.git] / arch / arm / kernel / kprobes-common.c
index f02c038059c37faa68dfcab2a633351ce7937dba..c311ed94ff1cbfbfca554345e2603c687021bd0e 100644 (file)
 #include "kprobes.h"
 
 
-static void __kprobes simulate_ldm1stm1(struct kprobe *p, struct pt_regs *regs)
+static void __kprobes simulate_ldm1stm1(probes_opcode_t insn,
+               struct arch_probes_insn *asi,
+               struct pt_regs *regs)
 {
-       kprobe_opcode_t insn = p->opcode;
        int rn = (insn >> 16) & 0xf;
        int lbit = insn & (1 << 20);
        int wbit = insn & (1 << 21);
@@ -58,24 +59,31 @@ static void __kprobes simulate_ldm1stm1(struct kprobe *p, struct pt_regs *regs)
        }
 }
 
-static void __kprobes simulate_stm1_pc(struct kprobe *p, struct pt_regs *regs)
+static void __kprobes simulate_stm1_pc(probes_opcode_t insn,
+       struct arch_probes_insn *asi,
+       struct pt_regs *regs)
 {
-       regs->ARM_pc = (long)p->addr + str_pc_offset;
-       simulate_ldm1stm1(p, regs);
-       regs->ARM_pc = (long)p->addr + 4;
+       unsigned long addr = regs->ARM_pc - 4;
+
+       regs->ARM_pc = (long)addr + str_pc_offset;
+       simulate_ldm1stm1(insn, asi, regs);
+       regs->ARM_pc = (long)addr + 4;
 }
 
-static void __kprobes simulate_ldm1_pc(struct kprobe *p, struct pt_regs *regs)
+static void __kprobes simulate_ldm1_pc(probes_opcode_t insn,
+       struct arch_probes_insn *asi,
+       struct pt_regs *regs)
 {
-       simulate_ldm1stm1(p, regs);
+       simulate_ldm1stm1(insn, asi, regs);
        load_write_pc(regs->ARM_pc, regs);
 }
 
 static void __kprobes
-emulate_generic_r0_12_noflags(struct kprobe *p, struct pt_regs *regs)
+emulate_generic_r0_12_noflags(probes_opcode_t insn,
+       struct arch_probes_insn *asi, struct pt_regs *regs)
 {
        register void *rregs asm("r1") = regs;
-       register void *rfn asm("lr") = p->ainsn.insn_fn;
+       register void *rfn asm("lr") = asi->insn_fn;
 
        __asm__ __volatile__ (
                "stmdb  sp!, {%[regs], r11}     \n\t"
@@ -99,22 +107,27 @@ emulate_generic_r0_12_noflags(struct kprobe *p, struct pt_regs *regs)
 }
 
 static void __kprobes
-emulate_generic_r2_14_noflags(struct kprobe *p, struct pt_regs *regs)
+emulate_generic_r2_14_noflags(probes_opcode_t insn,
+       struct arch_probes_insn *asi, struct pt_regs *regs)
 {
-       emulate_generic_r0_12_noflags(p, (struct pt_regs *)(regs->uregs+2));
+       emulate_generic_r0_12_noflags(insn, asi,
+               (struct pt_regs *)(regs->uregs+2));
 }
 
 static void __kprobes
-emulate_ldm_r3_15(struct kprobe *p, struct pt_regs *regs)
+emulate_ldm_r3_15(probes_opcode_t insn,
+       struct arch_probes_insn *asi, struct pt_regs *regs)
 {
-       emulate_generic_r0_12_noflags(p, (struct pt_regs *)(regs->uregs+3));
+       emulate_generic_r0_12_noflags(insn, asi,
+               (struct pt_regs *)(regs->uregs+3));
        load_write_pc(regs->ARM_pc, regs);
 }
 
-enum kprobe_insn __kprobes
-kprobe_decode_ldmstm(kprobe_opcode_t insn, struct arch_specific_insn *asi)
+enum probes_insn __kprobes
+kprobe_decode_ldmstm(probes_opcode_t insn, struct arch_probes_insn *asi,
+               const struct decode_header *h)
 {
-       kprobe_insn_handler_t *handler = 0;
+       probes_insn_handler_t *handler = 0;
        unsigned reglist = insn & 0xffff;
        int is_ldm = insn & 0x100000;
        int rn = (insn >> 16) & 0xf;