Received: by 2002:a25:868d:0:0:0:0:0 with SMTP id z13csp2796518ybk; Tue, 12 May 2020 08:20:53 -0700 (PDT) X-Google-Smtp-Source: APiQypL8LEzJtWmHxYPvTS9rMyWBYqNpbNfC+09C1Y/xjfHLurMwnIP2kp7IbaFn7IJg7633me5T X-Received: by 2002:a05:6402:30bb:: with SMTP id df27mr17568538edb.267.1589296853238; Tue, 12 May 2020 08:20:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1589296853; cv=none; d=google.com; s=arc-20160816; b=dtAlOgvW5icFzin9Q0/k5q8KILgWxZROH6tLuiYpZbUrhmfdm63Z3ZoufN91Mu442h Tz+gRhT/wvUj9fxmpjPHBnlDwoT9yynW6KdUcTXBrTAuXbucJitzzZXyq6rQsMksN/6d 5KP7eIuhGJ5AI4QJ5tMlAOiFxfWlBduWZbd7RiU5NDHJq2cVGQFJCrXmLApRtO5ug7Ky UHYqAzxJ5V/3K3qYBshN9PcQCEYZXepAViY+nTLqt0pqOVyk/xH88WGcpG2ZcezIjKAk loz9WrkFPZsJ+L3uvfIh69clzardiUVm2R3LsZ26Sb4mB9kVCdetrpH4D0eR9rd+Pe8E aAug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :robot-unsubscribe:robot-id:message-id:mime-version:references :in-reply-to:cc:subject:to:reply-to:from:date; bh=lgvhUL+ophKktoCeWIKTWfxxyY690LrI1AmJMMKyGPs=; b=FmKZukKDqzyG8wHQ4m6Nm5GF4IVIg/LcjfFpD8TSbdNdE9RBeWyxhxG+8xyO6jGOrE 4JilF5gN3OVOFiAie8FMFYoEQSoo4BUFuxhPaS4WBtuNu/DQGu85vRL2AI/JuGB6rpYm LXAmQGuh7OLi+Glah+XVRmmX4t+saR+JNYBX/XDsEuTMnVrgTNFsBRN897suLYqjdX4s NELmF/pP5F9dILrz/AB9o5TRboV56EusrEHAkf3i470OhK5vaUurcdvUPuuxGb6KYYdt f4RM20IscZPRVvEZtAjFNALxkfsMcLFf2FihVBBv2TTuNRYkWxxBEAO5tcvcptFiWNeG ltug== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id x25si6391233edi.132.2020.05.12.08.20.28; Tue, 12 May 2020 08:20:53 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730291AbgELPTD (ORCPT + 99 others); Tue, 12 May 2020 11:19:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45984 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730236AbgELPTD (ORCPT ); Tue, 12 May 2020 11:19:03 -0400 Received: from Galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 154F6C061A0C; Tue, 12 May 2020 08:19:03 -0700 (PDT) Received: from [5.158.153.53] (helo=tip-bot2.lab.linutronix.de) by Galois.linutronix.de with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.80) (envelope-from ) id 1jYWgN-0007Dx-Es; Tue, 12 May 2020 17:18:59 +0200 Received: from [127.0.1.1] (localhost [IPv6:::1]) by tip-bot2.lab.linutronix.de (Postfix) with ESMTP id EE15D1C02FC; Tue, 12 May 2020 17:18:58 +0200 (CEST) Date: Tue, 12 May 2020 15:18:58 -0000 From: "tip-bot2 for Masami Hiramatsu" Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: core/kprobes] kprobes: Support __kprobes blacklist in modules Cc: Masami Hiramatsu , Thomas Gleixner , Alexandre Chartre , Peter Zijlstra , x86 , LKML In-Reply-To: <20200505134059.678201813@linutronix.de> References: <20200505134059.678201813@linutronix.de> MIME-Version: 1.0 Message-ID: <158929673889.390.13328702877624565278.tip-bot2@tip-bot2> X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Linutronix-Spam-Score: -1.0 X-Linutronix-Spam-Level: - X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,SHORTCIRCUIT=-0.0001 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The following commit has been merged into the core/kprobes branch of tip: Commit-ID: 1e6769b0aece51ea7a3dc3117c37d4a5669e4a21 Gitweb: https://git.kernel.org/tip/1e6769b0aece51ea7a3dc3117c37d4a5669e4a21 Author: Masami Hiramatsu AuthorDate: Thu, 26 Mar 2020 23:49:48 +09:00 Committer: Thomas Gleixner CommitterDate: Tue, 12 May 2020 17:15:32 +02:00 kprobes: Support __kprobes blacklist in modules Support __kprobes attribute for blacklist functions in modules. The __kprobes attribute functions are stored in .kprobes.text section. Signed-off-by: Masami Hiramatsu Signed-off-by: Thomas Gleixner Reviewed-by: Alexandre Chartre Acked-by: Peter Zijlstra Link: https://lkml.kernel.org/r/20200505134059.678201813@linutronix.de --- include/linux/module.h | 4 ++++- kernel/kprobes.c | 42 +++++++++++++++++++++++++++++++++++++++++- kernel/module.c | 4 ++++- 3 files changed, 50 insertions(+) diff --git a/include/linux/module.h b/include/linux/module.h index 1ad393e..369c354 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -489,6 +489,10 @@ struct module { unsigned int num_ftrace_callsites; unsigned long *ftrace_callsites; #endif +#ifdef CONFIG_KPROBES + void *kprobes_text_start; + unsigned int kprobes_text_size; +#endif #ifdef CONFIG_LIVEPATCH bool klp; /* Is this a livepatch module? */ diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 570d608..b754999 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c @@ -2179,6 +2179,19 @@ int kprobe_add_area_blacklist(unsigned long start, unsigned long end) return 0; } +/* Remove all symbols in given area from kprobe blacklist */ +static void kprobe_remove_area_blacklist(unsigned long start, unsigned long end) +{ + struct kprobe_blacklist_entry *ent, *n; + + list_for_each_entry_safe(ent, n, &kprobe_blacklist, list) { + if (ent->start_addr < start || ent->start_addr >= end) + continue; + list_del(&ent->list); + kfree(ent); + } +} + int __init __weak arch_populate_kprobe_blacklist(void) { return 0; @@ -2215,6 +2228,28 @@ static int __init populate_kprobe_blacklist(unsigned long *start, return ret ? : arch_populate_kprobe_blacklist(); } +static void add_module_kprobe_blacklist(struct module *mod) +{ + unsigned long start, end; + + start = (unsigned long)mod->kprobes_text_start; + if (start) { + end = start + mod->kprobes_text_size; + kprobe_add_area_blacklist(start, end); + } +} + +static void remove_module_kprobe_blacklist(struct module *mod) +{ + unsigned long start, end; + + start = (unsigned long)mod->kprobes_text_start; + if (start) { + end = start + mod->kprobes_text_size; + kprobe_remove_area_blacklist(start, end); + } +} + /* Module notifier call back, checking kprobes on the module */ static int kprobes_module_callback(struct notifier_block *nb, unsigned long val, void *data) @@ -2225,6 +2260,11 @@ static int kprobes_module_callback(struct notifier_block *nb, unsigned int i; int checkcore = (val == MODULE_STATE_GOING); + if (val == MODULE_STATE_COMING) { + mutex_lock(&kprobe_mutex); + add_module_kprobe_blacklist(mod); + mutex_unlock(&kprobe_mutex); + } if (val != MODULE_STATE_GOING && val != MODULE_STATE_LIVE) return NOTIFY_DONE; @@ -2255,6 +2295,8 @@ static int kprobes_module_callback(struct notifier_block *nb, kill_kprobe(p); } } + if (val == MODULE_STATE_GOING) + remove_module_kprobe_blacklist(mod); mutex_unlock(&kprobe_mutex); return NOTIFY_DONE; } diff --git a/kernel/module.c b/kernel/module.c index 646f1e2..978f3fa 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -3194,6 +3194,10 @@ static int find_module_sections(struct module *mod, struct load_info *info) sizeof(*mod->ei_funcs), &mod->num_ei_funcs); #endif +#ifdef CONFIG_KPROBES + mod->kprobes_text_start = section_objs(info, ".kprobes.text", 1, + &mod->kprobes_text_size); +#endif mod->extable = section_objs(info, "__ex_table", sizeof(*mod->extable), &mod->num_exentries);