summaryrefslogtreecommitdiffstats
path: root/arch/arm/include
diff options
context:
space:
mode:
authorWang Nan2015-01-05 12:34:47 +0100
committerJon Medhurst2015-01-14 13:24:52 +0100
commitbfc9657d752c47d59dc0bab85ebdc19cf60100dd (patch)
tree8fc4941e1571dd9b0d7d91703ce4ff67580984c4 /arch/arm/include
parentARM: kprobes: check register usage for probed instruction. (diff)
downloadkernel-qcow2-linux-bfc9657d752c47d59dc0bab85ebdc19cf60100dd.tar.gz
kernel-qcow2-linux-bfc9657d752c47d59dc0bab85ebdc19cf60100dd.tar.xz
kernel-qcow2-linux-bfc9657d752c47d59dc0bab85ebdc19cf60100dd.zip
ARM: optprobes: execute instruction during restoring if possible.
This patch removes software emulation or simulation for most of probed instructions. If the instruction doesn't use PC relative addressing, it will be translated into following instructions in the restore code in code template: ldmia {r0 - r14} // restore all instruction except PC <instruction> // direct execute the probed instruction b next_insn // branch to next instruction. Signed-off-by: Wang Nan <wangnan0@huawei.com> Reviewed-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Signed-off-by: Jon Medhurst <tixy@linaro.org>
Diffstat (limited to 'arch/arm/include')
-rw-r--r--arch/arm/include/asm/kprobes.h3
-rw-r--r--arch/arm/include/asm/probes.h1
2 files changed, 4 insertions, 0 deletions
diff --git a/arch/arm/include/asm/kprobes.h b/arch/arm/include/asm/kprobes.h
index 50ff3bc7928e..3ea9be559726 100644
--- a/arch/arm/include/asm/kprobes.h
+++ b/arch/arm/include/asm/kprobes.h
@@ -57,6 +57,9 @@ extern __visible kprobe_opcode_t optprobe_template_call;
extern __visible kprobe_opcode_t optprobe_template_end;
extern __visible kprobe_opcode_t optprobe_template_sub_sp;
extern __visible kprobe_opcode_t optprobe_template_add_sp;
+extern __visible kprobe_opcode_t optprobe_template_restore_begin;
+extern __visible kprobe_opcode_t optprobe_template_restore_orig_insn;
+extern __visible kprobe_opcode_t optprobe_template_restore_end;
#define MAX_OPTIMIZED_LENGTH 4
#define MAX_OPTINSN_SIZE \
diff --git a/arch/arm/include/asm/probes.h b/arch/arm/include/asm/probes.h
index b668e60f759c..1e5b9bb92270 100644
--- a/arch/arm/include/asm/probes.h
+++ b/arch/arm/include/asm/probes.h
@@ -42,6 +42,7 @@ struct arch_probes_insn {
probes_insn_fn_t *insn_fn;
int stack_space;
unsigned long register_usage_flags;
+ bool kprobe_direct_exec;
};
#endif /* __ASSEMBLY__ */