From patchwork Fri Aug 19 21:34:14 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Chamberlain X-Patchwork-Id: 9291089 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 6CCD66077B for ; Fri, 19 Aug 2016 21:37:48 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 647EE2957A for ; Fri, 19 Aug 2016 21:37:48 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 581F9295AB; Fri, 19 Aug 2016 21:37:48 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 6ED662957D for ; Fri, 19 Aug 2016 21:37:47 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1barS2-00032K-4z; Fri, 19 Aug 2016 21:35:42 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1barS1-00030n-7D for xen-devel@lists.xensource.com; Fri, 19 Aug 2016 21:35:41 +0000 Received: from [85.158.143.35] by server-7.bemta-6.messagelabs.com id BA/C3-15404-CAB77B75; Fri, 19 Aug 2016 21:35:40 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrDLMWRWlGSWpSXmKPExsVybKJsh+7q6u3 hBmffyVjcm/Ke3YHRY3vfLvYAxijWzLyk/IoE1oz5h3ezFHSrV7yZfpCtgfGXQhcjF4eQwFRG ie9tc5ggnBlMEmemv2fvYuTkYBMQl1jwYw4LSEJE4BiTxLUT75lBHGaBr1wSTz+uZAKpEhbwl Ojqfs0IYrMIqEr8+fiLBcTmFXCUuLbzN1hcQkBOouXHblYQmxMovvj0IjYQW0jAQWL3wlagOR xANQUS+w9HQ5R7SSy6cYkVwlaTuHpuE/MERr4FjAyrGDWKU4vKUot0jYz0kooy0zNKchMzc3Q NDcz0clOLixPTU3MSk4r1kvNzNzECQ4UBCHYwrpkfeIhRkoNJSZTXT217uBBfUn5KZUZicUZ8 UWlOavEhRhkODiUJ3r4qoJxgUWp6akVaZg4waGHSEhw8SiK8TiBp3uKCxNzizHSI1ClGRSlxX mGQhABIIqM0D64NFimXGGWlhHkZgQ4R4ilILcrNLEGVf8UozsGoJMzrATKFJzOvBG76K6DFTE CLefm3gCwuSURISTUwTuwoKOy6lcB/x0ZL9WqhG5tFQsHSxXk6E6MsDQ1XpOncFJJc4a62gil kwoktW70j7u9aLarxTpMl45G5zDK2zFz5k0u+f2TmPy20+o2/80rubHXB97kq06cynl1xknmH 897Vcb3f0tlzNK0TZznUPn9tlxW4Q81s37GLJSp9u5ocV866kpmoxFKckWioxVxUnAgAqwpns Y8CAAA= X-Env-Sender: mcgrof@kernel.org X-Msg-Ref: server-2.tower-21.messagelabs.com!1471642538!15395481!1 X-Originating-IP: [198.145.29.136] X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG X-StarScan-Received: X-StarScan-Version: 8.84; banners=-,-,- X-VirusChecked: Checked Received: (qmail 29099 invoked from network); 19 Aug 2016 21:35:39 -0000 Received: from mail.kernel.org (HELO mail.kernel.org) (198.145.29.136) by server-2.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 19 Aug 2016 21:35:39 -0000 Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 646EF203F3; Fri, 19 Aug 2016 21:35:28 +0000 (UTC) Received: from garbanzo.do-not-panic.com (c-73-15-241-2.hsd1.ca.comcast.net [73.15.241.2]) (using TLSv1.2 with cipher AES128-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 168B5203ED; Fri, 19 Aug 2016 21:35:25 +0000 (UTC) From: mcgrof@kernel.org To: hpa@zytor.com, tglx@linutronix.de, mingo@redhat.com, jpoimboe@redhat.com, bp@alien8.de, linux@arm.linux.org.uk, mhiramat@kernel.org, masami.hiramatsu.pt@hitachi.com, jbaron@akamai.com, heiko.carstens@de.ibm.com, ananth@linux.vnet.ibm.com, anil.s.keshavamurthy@intel.com, davem@davemloft.net, realmz6@gmail.com Date: Fri, 19 Aug 2016 14:34:14 -0700 Message-Id: <1471642454-5679-17-git-send-email-mcgrof@kernel.org> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1471642454-5679-1-git-send-email-mcgrof@kernel.org> References: <1471642454-5679-1-git-send-email-mcgrof@kernel.org> X-Virus-Scanned: ClamAV using ClamSMTP Cc: gnomes@lxorguk.ukuu.org.uk, linux-ia64@vger.kernel.org, jkosina@suse.cz, benh@kernel.crashing.org, ming.lei@canonical.com, linux@rasmusvillemoes.dk, platform-driver-x86@vger.kernel.org, James.Bottomley@HansenPartnership.com, paul.gortmaker@windriver.com, paulus@samba.org, sparclinux@vger.kernel.org, mchehab@osg.samsung.com, linux-arch@vger.kernel.org, markus.heiser@darmarit.de, xen-devel@lists.xensource.com, msalter@redhat.com, linux-sh@vger.kernel.org, mpe@ellerman.id.au, x86@kernel.org, fontana@sharpeleven.org, linux-arm-kernel@lists.infradead.org, catalin.marinas@arm.com, dvhart@infradead.org, dwmw2@infradead.org, linux-xtensa@linux-xtensa.org, pali.rohar@gmail.com, keescook@chromium.org, arnd@arndb.de, jani.nikula@intel.com, will.deacon@arm.com, rusty@rustcorp.com.au, rostedt@goodmis.org, acme@redhat.com, ak@linux.intel.com, andriy.shevchenko@linux.intel.com, mcb30@ipxe.org, linux-kbuild@vger.kernel.org, alan@linux.intel.com, jgross@suse.com, chris@zankel.net, pebolle@tiscali.nl, tony.luck@intel.com, ananth@in.ibm.com, jcmvbkbc@gmail.com, gregkh@linuxfoundation.org, luto@amacapital.net, "Luis R. Rodriguez" , mmarek@suse.com, david.vrabel@citrix.com, jolsa@kernel.org, andrew.cooper3@citrix.com, akpm@linux-foundation.org, torvalds@linux-foundation.org, korea.drzix@gmail.com Subject: [Xen-devel] [PATCH v4 16/16] kprobes: port blacklist kprobes to linker table X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: "Luis R. Rodriguez" kprobe makes use of two sections, the one dealing with the actual kprobes was recently ported using the standard section range API. The blacklist functionality of kprobes is still using a custom section and declaring its custom section using the linker script as follows: type Linux-section custom section name begin end table .init.data _kprobe_blacklist __start_kprobe_blacklist __stop_kprobe_blacklist This ports the _kprobe_blacklist custom section to the standard Linux linker table API allowing us remove all the custom blacklist kprobe section declarations from the linker script. This has been tested by trying to register a kprobe on a blacklisted symbol (these are declared with NOKPROBE_SYMBOL()), and confirms that this fails to work as expected. This was tested with: # insmod samples/kprobes/kprobe_example.ko symbol="get_kprobe" This fails to load as expected with: insmod: ERROR: could not insert module samples/kprobes/kprobe_example.ko: Invalid parameters v3: this patch was introduced in this series Acked-by: Masami Hiramatsu Signed-off-by: Luis R. Rodriguez --- include/asm-generic/kprobes.h | 4 ++-- include/asm-generic/vmlinux.lds.h | 10 ---------- include/linux/kprobes.h | 2 ++ kernel/kprobes.c | 11 ++++------- 4 files changed, 8 insertions(+), 19 deletions(-) diff --git a/include/asm-generic/kprobes.h b/include/asm-generic/kprobes.h index 7b986f4b7ccd..23a49a4c7a38 100644 --- a/include/asm-generic/kprobes.h +++ b/include/asm-generic/kprobes.h @@ -3,14 +3,14 @@ #if defined(__KERNEL__) && !defined(__ASSEMBLY__) #ifdef CONFIG_KPROBES +#include #include /* * Blacklist ganerating macro. Specify functions which is not probed * by using this macro. */ # define __NOKPROBE_SYMBOL(fname) \ -static unsigned long __used \ - __attribute__((__section__("_kprobe_blacklist"))) \ +static LINKTABLE_INIT_DATA(_kprobe_blacklist, all) \ _kbl_addr_##fname = (unsigned long)fname; # define NOKPROBE_SYMBOL(fname) __NOKPROBE_SYMBOL(fname) /* Use this to forbid a kprobes attach on very low level functions */ diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index f2444d82d02a..47ef04de9958 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -114,15 +114,6 @@ #define BRANCH_PROFILE() #endif -#ifdef CONFIG_KPROBES -#define KPROBE_BLACKLIST() . = ALIGN(8); \ - VMLINUX_SYMBOL(__start_kprobe_blacklist) = .; \ - *(_kprobe_blacklist) \ - VMLINUX_SYMBOL(__stop_kprobe_blacklist) = .; -#else -#define KPROBE_BLACKLIST() -#endif - #ifdef CONFIG_EVENT_TRACING #define FTRACE_EVENTS() . = ALIGN(8); \ VMLINUX_SYMBOL(__start_ftrace_events) = .; \ @@ -525,7 +516,6 @@ *(SECTION_INIT_RODATA) \ FTRACE_EVENTS() \ TRACE_SYSCALLS() \ - KPROBE_BLACKLIST() \ MEM_DISCARD(init.rodata) \ CLK_OF_TABLES() \ RESERVEDMEM_OF_TABLES() \ diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h index 445cc6fe7afa..2707820cbb56 100644 --- a/include/linux/kprobes.h +++ b/include/linux/kprobes.h @@ -44,8 +44,10 @@ #ifdef CONFIG_KPROBES #include +#include DECLARE_SECTION_RANGE(kprobes); +DECLARE_LINKTABLE(unsigned long, _kprobe_blacklist); /* kprobe_status settings */ #define KPROBE_HIT_ACTIVE 0x00000001 diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 387605682622..4801aa3b4adf 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c @@ -2053,14 +2053,13 @@ NOKPROBE_SYMBOL(dump_kprobe); * since a kprobe need not necessarily be at the beginning * of a function. */ -static int __init populate_kprobe_blacklist(unsigned long *start, - unsigned long *end) +static int __init populate_kprobe_blacklist(void) { unsigned long *iter; struct kprobe_blacklist_entry *ent; unsigned long entry, offset = 0, size = 0; - for (iter = start; iter < end; iter++) { + LINKTABLE_FOR_EACH(iter, _kprobe_blacklist) { entry = arch_deref_entry_point((void *)*iter); if (!kernel_text_address(entry) || @@ -2125,8 +2124,7 @@ static struct notifier_block kprobe_module_nb = { }; /* Markers of _kprobe_blacklist section */ -extern unsigned long __start_kprobe_blacklist[]; -extern unsigned long __stop_kprobe_blacklist[]; +DEFINE_LINKTABLE_INIT_DATA(unsigned long, _kprobe_blacklist); /* Actual kprobes section range */ DEFINE_SECTION_RANGE(kprobes, SECTION_TEXT); @@ -2143,8 +2141,7 @@ static int __init init_kprobes(void) raw_spin_lock_init(&(kretprobe_table_locks[i].lock)); } - err = populate_kprobe_blacklist(__start_kprobe_blacklist, - __stop_kprobe_blacklist); + err = populate_kprobe_blacklist(); if (err) { pr_err("kprobes: failed to populate blacklist: %d\n", err); pr_err("Please take care of using kprobes.\n");