aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/kprobes-decode.c
diff options
context:
space:
mode:
authorJon Medhurst <tixy@yxit.co.uk>2011-04-07 08:25:15 -0400
committerNicolas Pitre <nicolas.pitre@linaro.org>2011-04-28 23:40:55 -0400
commit51468ea91efad9c7e6dbae43cd8bdc423ec61709 (patch)
tree301e078b5aacee6250c3f89ea03cd5b98a9738d0 /arch/arm/kernel/kprobes-decode.c
parent896a74e19d0131413a96502429994bc8e6bbbe5a (diff)
ARM: kprobes: Reject probing MRS instructions which read SPSR
We need to reject probing of instructions which read SPSR because we can't handle this as the value in SPSR is lost when the exception handler for the probe breakpoint first runs. This patch also fixes the bitmask for MRS instructions decoding to include checking bits 5-7. Signed-off-by: Jon Medhurst <tixy@yxit.co.uk> Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Diffstat (limited to 'arch/arm/kernel/kprobes-decode.c')
-rw-r--r--arch/arm/kernel/kprobes-decode.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/arch/arm/kernel/kprobes-decode.c b/arch/arm/kernel/kprobes-decode.c
index baf053ea96eb..e5bc576ba3fb 100644
--- a/arch/arm/kernel/kprobes-decode.c
+++ b/arch/arm/kernel/kprobes-decode.c
@@ -1026,14 +1026,16 @@ space_cccc_000x(kprobe_opcode_t insn, struct arch_specific_insn *asi)
1026 /* cccc 0001 0xx0 xxxx xxxx xxxx xxxx xxx0 xxxx */ 1026 /* cccc 0001 0xx0 xxxx xxxx xxxx xxxx xxx0 xxxx */
1027 if ((insn & 0x0f900010) == 0x01000000) { 1027 if ((insn & 0x0f900010) == 0x01000000) {
1028 1028
1029 /* BXJ : cccc 0001 0010 xxxx xxxx xxxx 0010 xxxx */ 1029 /* BXJ : cccc 0001 0010 xxxx xxxx xxxx 0010 xxxx */
1030 /* MSR : cccc 0001 0x10 xxxx xxxx xxxx 0000 xxxx */ 1030 /* MSR : cccc 0001 0x10 xxxx xxxx xxxx 0000 xxxx */
1031 /* MRS spsr : cccc 0001 0100 xxxx xxxx xxxx 0000 xxxx */
1031 if ((insn & 0x0ff000f0) == 0x01200020 || 1032 if ((insn & 0x0ff000f0) == 0x01200020 ||
1032 (insn & 0x0fb000f0) == 0x01200000) 1033 (insn & 0x0fb000f0) == 0x01200000 ||
1034 (insn & 0x0ff000f0) == 0x01400000)
1033 return INSN_REJECTED; 1035 return INSN_REJECTED;
1034 1036
1035 /* MRS : cccc 0001 0x00 xxxx xxxx xxxx 0000 xxxx */ 1037 /* MRS cpsr : cccc 0001 0000 xxxx xxxx xxxx 0000 xxxx */
1036 if ((insn & 0x0fb00010) == 0x01000000) 1038 if ((insn & 0x0ff000f0) == 0x01000000)
1037 return prep_emulate_rd12(insn, asi); 1039 return prep_emulate_rd12(insn, asi);
1038 1040
1039 /* SMLALxy : cccc 0001 0100 xxxx xxxx xxxx 1xx0 xxxx */ 1041 /* SMLALxy : cccc 0001 0100 xxxx xxxx xxxx 1xx0 xxxx */