From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754861AbbCBO1c (ORCPT ); Mon, 2 Mar 2015 09:27:32 -0500 Received: from szxga03-in.huawei.com ([119.145.14.66]:4423 "EHLO szxga03-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753097AbbCBO0H (ORCPT ); Mon, 2 Mar 2015 09:26:07 -0500 From: Wang Nan To: , , , , CC: , , , Subject: [RFC PATCH v4 28/34] ftrace: x86: get old instruction from early kprobes when make call. Date: Mon, 2 Mar 2015 22:25:06 +0800 Message-ID: <1425306312-3437-29-git-send-email-wangnan0@huawei.com> X-Mailer: git-send-email 1.8.4 In-Reply-To: <1425306312-3437-1-git-send-email-wangnan0@huawei.com> References: <1425306312-3437-1-git-send-email-wangnan0@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.107.197.247] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020205.54F472FD.01E3,ss=1,re=0.001,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0, ip=0.0.0.0, so=2013-05-26 15:14:31, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 13fcfe0061f671c756a5d9fa66ae4491 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org For previously detected early kprobes on ftrace, retrieve old instruction using kprobe_on_ftrace_get_old_insn() instead of ftrace_nop_replace(). Which will enable convertion an early kprobed ftrace entry directly to 'call' instrustion without turnning off kprobe. Signed-off-by: Wang Nan --- arch/x86/kernel/ftrace.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c index 7bdba65..f200cd4 100644 --- a/arch/x86/kernel/ftrace.c +++ b/arch/x86/kernel/ftrace.c @@ -21,6 +21,7 @@ #include #include #include +#include #include @@ -164,7 +165,17 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) unsigned const char *new, *old; unsigned long ip = rec->ip; - old = ftrace_nop_replace(); +#if defined(CONFIG_KPROBES_ON_FTRACE) && defined(CONFIG_EARLY_KPROBES) + unsigned char kprobes_old_insn[MCOUNT_INSN_SIZE]; + + if (unlikely(rec->flags & FTRACE_FL_EARLY_KPROBES)) + old = kprobe_on_ftrace_get_old_insn(rec, + ftrace_nop_replace(), + kprobes_old_insn, + MCOUNT_INSN_SIZE); + else +#endif + old = ftrace_nop_replace(); new = ftrace_call_replace(ip, addr); /* Should only be called when module is loaded */ @@ -335,8 +346,16 @@ static int add_brk_on_call(struct dyn_ftrace *rec, unsigned long addr) static int add_brk_on_nop(struct dyn_ftrace *rec) { unsigned const char *old; +#if defined(CONFIG_KPROBES_ON_FTRACE) && defined(CONFIG_EARLY_KPROBES) + unsigned char kprobes_old_insn[MCOUNT_INSN_SIZE]; - old = ftrace_nop_replace(); + if (unlikely(rec->flags & FTRACE_FL_EARLY_KPROBES)) + old = kprobe_on_ftrace_get_old_insn(rec, ftrace_nop_replace(), + kprobes_old_insn, + MCOUNT_INSN_SIZE); + else +#endif + old = ftrace_nop_replace(); return add_break(rec->ip, old); } -- 1.8.4