From ad50c0ac3b9d6008411b2dff1b0a022bc57d4004 Mon Sep 17 00:00:00 2001 From: Jon Medhurst Date: Thu, 16 Jun 2011 17:22:37 +0100 Subject: [PATCH] --- yaml --- r: 258335 b: refs/heads/master c: 3b26945597d5eff5d428a268c9d109338fce801e h: refs/heads/master i: 258333: e7679af550b651bb577bc9deec73db798179d1b9 258331: 6cd3d8eaad681df53b08e181ede139de19943aa0 258327: 7facc1b94a5b25361fa477a8cede777dcbcbac64 258319: f58cadbaa814c1795515237970cedb85b5cf046f 258303: 1cd06c0eda9ddf00f4dd263debe5d06b5e163c0c v: v3 --- [refs] | 2 +- trunk/arch/arm/kernel/kprobes.c | 10 ++++++++-- trunk/arch/arm/kernel/kprobes.h | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index f7e6fccdb2aa..dff29ed3a01f 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3cca6c243568d355c1ccecaaa71bf490f014d729 +refs/heads/master: 3b26945597d5eff5d428a268c9d109338fce801e diff --git a/trunk/arch/arm/kernel/kprobes.c b/trunk/arch/arm/kernel/kprobes.c index b6e9a1cc1c55..0003dfd3b854 100644 --- a/trunk/arch/arm/kernel/kprobes.c +++ b/trunk/arch/arm/kernel/kprobes.c @@ -138,7 +138,13 @@ void __kprobes arch_arm_kprobe(struct kprobe *p) void __kprobes arch_arm_kprobe(struct kprobe *p) { - *p->addr = KPROBE_ARM_BREAKPOINT_INSTRUCTION; + kprobe_opcode_t insn = p->opcode; + kprobe_opcode_t brkp = KPROBE_ARM_BREAKPOINT_INSTRUCTION; + if (insn >= 0xe0000000) + brkp |= 0xe0000000; /* Unconditional instruction */ + else + brkp |= insn & 0xf0000000; /* Copy condition from insn */ + *p->addr = brkp; flush_insns(p->addr, sizeof(p->addr[0])); } @@ -625,7 +631,7 @@ static struct undef_hook kprobes_thumb32_break_hook = { #else /* !CONFIG_THUMB2_KERNEL */ static struct undef_hook kprobes_arm_break_hook = { - .instr_mask = 0xffffffff, + .instr_mask = 0x0fffffff, .instr_val = KPROBE_ARM_BREAKPOINT_INSTRUCTION, .cpsr_mask = MODE_MASK, .cpsr_val = SVC_MODE, diff --git a/trunk/arch/arm/kernel/kprobes.h b/trunk/arch/arm/kernel/kprobes.h index 5e2485c4cacd..e3803c65c4be 100644 --- a/trunk/arch/arm/kernel/kprobes.h +++ b/trunk/arch/arm/kernel/kprobes.h @@ -21,7 +21,7 @@ * These undefined instructions must be unique and * reserved solely for kprobes' use. */ -#define KPROBE_ARM_BREAKPOINT_INSTRUCTION 0xe7f001f8 +#define KPROBE_ARM_BREAKPOINT_INSTRUCTION 0x07f001f8 #define KPROBE_THUMB16_BREAKPOINT_INSTRUCTION 0xde18 #define KPROBE_THUMB32_BREAKPOINT_INSTRUCTION 0xf7f0a018