aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/probes/uprobes
diff options
context:
space:
mode:
authorGravatar Fredrik Strupe <fredrik@strupe.net> 2021-04-05 21:52:05 +0100
committerGravatar Russell King <rmk+kernel@armlinux.org.uk> 2021-04-18 19:14:45 +0100
commitd2f7eca60b29006285d57c7035539e33300e89e5 (patch)
tree0f2f62725529cb8e7131f464df4f94e20366eeea /arch/arm/probes/uprobes
parentARM: footbridge: fix PCI interrupt mapping (diff)
downloadlinux-d2f7eca60b29006285d57c7035539e33300e89e5.tar.gz
linux-d2f7eca60b29006285d57c7035539e33300e89e5.tar.bz2
linux-d2f7eca60b29006285d57c7035539e33300e89e5.zip
ARM: 9071/1: uprobes: Don't hook on thumb instructions
Since uprobes is not supported for thumb, check that the thumb bit is not set when matching the uprobes instruction hooks. The Arm UDF instructions used for uprobes triggering (UPROBE_SWBP_ARM_INSN and UPROBE_SS_ARM_INSN) coincidentally share the same encoding as a pair of unallocated 32-bit thumb instructions (not UDF) when the condition code is 0b1111 (0xf). This in effect makes it possible to trigger the uprobes functionality from thumb, and at that using two unallocated instructions which are not permanently undefined. Signed-off-by: Fredrik Strupe <fredrik@strupe.net> Cc: stable@vger.kernel.org Fixes: c7edc9e326d5 ("ARM: add uprobes support") Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Diffstat (limited to 'arch/arm/probes/uprobes')
-rw-r--r--arch/arm/probes/uprobes/core.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/arm/probes/uprobes/core.c b/arch/arm/probes/uprobes/core.c
index c4b49b322e8a..f5f790c6e5f8 100644
--- a/arch/arm/probes/uprobes/core.c
+++ b/arch/arm/probes/uprobes/core.c
@@ -204,7 +204,7 @@ unsigned long uprobe_get_swbp_addr(struct pt_regs *regs)
static struct undef_hook uprobes_arm_break_hook = {
.instr_mask = 0x0fffffff,
.instr_val = (UPROBE_SWBP_ARM_INSN & 0x0fffffff),
- .cpsr_mask = MODE_MASK,
+ .cpsr_mask = (PSR_T_BIT | MODE_MASK),
.cpsr_val = USR_MODE,
.fn = uprobe_trap_handler,
};
@@ -212,7 +212,7 @@ static struct undef_hook uprobes_arm_break_hook = {
static struct undef_hook uprobes_arm_ss_hook = {
.instr_mask = 0x0fffffff,
.instr_val = (UPROBE_SS_ARM_INSN & 0x0fffffff),
- .cpsr_mask = MODE_MASK,
+ .cpsr_mask = (PSR_T_BIT | MODE_MASK),
.cpsr_val = USR_MODE,
.fn = uprobe_trap_handler,
};