Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752761AbbFREAk (ORCPT ); Thu, 18 Jun 2015 00:00:40 -0400 Received: from mx1.redhat.com ([209.132.183.28]:32878 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752500AbbFREAE (ORCPT ); Thu, 18 Jun 2015 00:00:04 -0400 From: Pratyush Anand To: linux-arm-kernel@lists.infradead.org, linux@arm.linux.org.uk, catalin.marinas@arm.com, will.deacon@arm.com Cc: linux-kernel@vger.kernel.org, wcohen@redhat.com, oleg@redhat.com, dave.long@linaro.org, steve.capper@linaro.org, srikar@linux.vnet.ibm.com, vijaya.kumar@caviumnetworks.com Subject: [RFC PATCH V2 10/10] arm64: uprobes: check conditions before simulating instructions Date: Thu, 18 Jun 2015 09:28:57 +0530 Message-Id: <350cf38eb8b9008d14a51ef7e0f8099644c8b97f.1434598237.git.panand@redhat.com> In-Reply-To: References: In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1541 Lines: 51 From: Steve Capper Currently uprobes just simulates any instruction that it can't in place execute. This can lead to unpredictable behaviour if the execution condition fails and the instruction wouldn't otherwise have been executed. This patch adds the condition check Signed-off-by: Steve Capper --- arch/arm64/kernel/uprobes.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kernel/uprobes.c b/arch/arm64/kernel/uprobes.c index 2cc9114deac2..a6d12b81e9ae 100644 --- a/arch/arm64/kernel/uprobes.c +++ b/arch/arm64/kernel/uprobes.c @@ -119,15 +119,22 @@ bool arch_uprobe_skip_sstep(struct arch_uprobe *auprobe, struct pt_regs *regs) { kprobe_opcode_t insn; unsigned long addr; + struct arch_specific_insn *ainsn; if (!auprobe->simulate) return false; insn = *(kprobe_opcode_t *)(&auprobe->insn[0]); addr = instruction_pointer(regs); + ainsn = &auprobe->ainsn; + + if (ainsn->handler) { + if (!ainsn->check_condn || ainsn->check_condn(insn, ainsn, regs)) + ainsn->handler(insn, addr, regs); + else + instruction_pointer_set(regs, instruction_pointer(regs) + 4); + } - if (auprobe->ainsn.handler) - auprobe->ainsn.handler(insn, addr, regs); return true; } -- 2.1.0 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/