From patchwork Fri Feb 13 05:41:10 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Nan X-Patchwork-Id: 5823571 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id EFEFB9F37F for ; Fri, 13 Feb 2015 06:09:16 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 5A66120222 for ; Fri, 13 Feb 2015 06:09:12 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id AB62020117 for ; Fri, 13 Feb 2015 06:09:07 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1YM9OT-0005Tx-Jx; Fri, 13 Feb 2015 06:06:25 +0000 Received: from szxga01-in.huawei.com ([119.145.14.64]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1YM9BD-0000hF-8p; Fri, 13 Feb 2015 05:52:50 +0000 Received: from 172.24.2.119 (EHLO lggeml425-hub.china.huawei.com) ([172.24.2.119]) by szxrg01-dlp.huawei.com (MOS 4.3.7-GA FastPath queued) with ESMTP id CJM14224; Fri, 13 Feb 2015 13:47:59 +0800 (CST) Received: from kernel-host.huawei (10.107.197.247) by lggeml425-hub.china.huawei.com (10.72.61.35) with Microsoft SMTP Server id 14.3.158.1; Fri, 13 Feb 2015 13:47:50 +0800 From: Wang Nan To: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [RFC PATCH v3 22/26] early kprobes: introduce arch_fix_ftrace_early_kprobe(). Date: Fri, 13 Feb 2015 13:41:10 +0800 Message-ID: <1423806070-62398-1-git-send-email-wangnan0@huawei.com> X-Mailer: git-send-email 1.8.4 In-Reply-To: <1423805941-61407-1-git-send-email-wangnan0@huawei.com> References: <1423805941-61407-1-git-send-email-wangnan0@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.107.197.247] X-CFilter-Loop: Reflected X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20150212_215243_687070_71FD53E0 X-CRM114-Status: UNSURE ( 9.32 ) X-CRM114-Notice: Please train this message. X-Spam-Score: -0.7 (/) Cc: lizefan@huawei.com, x86@kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch is for futher use. arch_fix_ftrace_early_kprobe() will be called when ftrace trying to convert ftrace entries to nop and fail. For x86 it should adjust the saved nop instruction here because it doesn't know what nop ftrace will choose when early probing. Signed-off-by: Wang Nan --- arch/x86/kernel/kprobes/opt.c | 31 +++++++++++++++++++++++++++++++ include/linux/kprobes.h | 5 +++++ kernel/kprobes.c | 6 ++++++ 3 files changed, 42 insertions(+) diff --git a/arch/x86/kernel/kprobes/opt.c b/arch/x86/kernel/kprobes/opt.c index 21847ab..f3ea954 100644 --- a/arch/x86/kernel/kprobes/opt.c +++ b/arch/x86/kernel/kprobes/opt.c @@ -456,3 +456,34 @@ int setup_detour_execution(struct kprobe *p, struct pt_regs *regs, int reenter) return 0; } NOKPROBE_SYMBOL(setup_detour_execution); + +#ifdef CONFIG_EARLY_KPROBES +void arch_fix_ftrace_early_kprobe(struct optimized_kprobe *op) +{ + const unsigned char *correct_nop5 = ideal_nops[NOP_ATOMIC5]; + struct kprobe *list_p; + + u32 mask = KPROBE_FLAG_EARLY | + KPROBE_FLAG_OPTIMIZED | + KPROBE_FLAG_FTRACE; + + if ((op->kp.flags & mask) != mask) + return; + + /* + * For early kprobe on ftrace, use right nop instruction. + * See x86 ftrace_make_nop and ftrace_nop_replace. Note that + * ideal_nops used by ftrace_nop_replace is setupt after early + * kprobe registration. + */ + + memcpy(&op->kp.opcode, correct_nop5, sizeof(kprobe_opcode_t)); + memcpy(op->optinsn.copied_insn, correct_nop5 + INT3_SIZE, + RELATIVE_ADDR_SIZE); + + /* Fix all kprobes connected to it */ + list_for_each_entry_rcu(list_p, &op->kp.list, list) + memcpy(&list_p->opcode, correct_nop5, sizeof(kprobe_opcode_t)); + +} +#endif diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h index 0c64df8..e483f1b 100644 --- a/include/linux/kprobes.h +++ b/include/linux/kprobes.h @@ -459,6 +459,11 @@ struct early_kprobe_slot { extern void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip, struct ftrace_ops *ops, struct pt_regs *regs); extern int arch_prepare_kprobe_ftrace(struct kprobe *p); + +#ifdef CONFIG_EARLY_KPROBES +extern void arch_fix_ftrace_early_kprobe(struct optimized_kprobe *p); +#endif + #endif int arch_check_ftrace_location(struct kprobe *p); diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 131a71a..0bbb510 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c @@ -2536,6 +2536,12 @@ EXPORT_SYMBOL_GPL(jprobe_return); #ifdef CONFIG_EARLY_KPROBES +#ifdef CONFIG_KPROBES_ON_FTRACE +void __weak arch_fix_ftrace_early_kprobe(struct optimized_kprobe *p) +{ +} +#endif + static int register_early_kprobe(struct kprobe *p) { struct early_kprobe_slot *slot;