From patchwork Wed Sep 20 16:29:02 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Senozhatsky X-Patchwork-Id: 816353 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xy4yF6QZjz9t2Q for ; Thu, 21 Sep 2017 02:31:49 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="AyyvYqXc"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3xy4yF56Z2zDqYg for ; Thu, 21 Sep 2017 02:31:49 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="AyyvYqXc"; dkim-atps=neutral X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:400e:c05::243; helo=mail-pg0-x243.google.com; envelope-from=sergey.senozhatsky@gmail.com; receiver=) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="AyyvYqXc"; dkim-atps=neutral Received: from mail-pg0-x243.google.com (mail-pg0-x243.google.com [IPv6:2607:f8b0:400e:c05::243]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3xy4vV6Cf8zDqR8 for ; Thu, 21 Sep 2017 02:29:26 +1000 (AEST) Received: by mail-pg0-x243.google.com with SMTP id d8so1911440pgt.3 for ; Wed, 20 Sep 2017 09:29:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=ceWezKCwdfMkL4vWLqX/BmC7+FolubpOepfNUVDp1iA=; b=AyyvYqXceofmH1lSb1571ojzZtyq2pEuDivJ9pp8JHQRcj9RCw/fNGoIY7jcMpNGyR rsROZAWLxb8M8I1kSmEpxXTj+1Mw0bmg9eK7i7SEVtjYGBENH8JQrQV7FQoJo7u0zjKU d7U7hfTX2v4dDMr9irInarLAxIsA6/cQ8bS79LfliC9TeD6QNrf/tUMjmTtiVvFTvicH BTQalS5XtqDhSgQkuDVROO+XZnjNslujtPb3I8XFcRk7vs6WjaLcoUMfNmAFrUUh4WrD 5RUnP/NVxduDyUurQY5FwOGSWwlPEyvzXWU1cGmosUhBzmC+72trwobdeODZDCtvpotu IX5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=ceWezKCwdfMkL4vWLqX/BmC7+FolubpOepfNUVDp1iA=; b=iJbnnlxKUZCMs/4gRxY3gZGuuJHrqsRG9+OlxHXtjnpc75vr2ZunijkDAXVsWyphLx 4bdBagQ9/hHIJqF+KbzBHCl8Bq2pRFmmKCBZvFgKnz4TeXJ2wiE4YHY8OZYaTLzBHG8X uEsxWIlQGJQOrbgWqLo40st+pdD5HbpdjQo89YWfp4L0PhAJx7fbcNjdUBXox4NOd8w3 3JgxY2MLLy416YHWBIc4wBu2U2P8jxhxMBkBabuBYI6DdxMS6DKMHI4GfjChU39NxeLa 7l/P6JHJT7RkpTuBeBoJ07JItqTp0iVghaenXSiNyewCtG8P8bKRjXPUj1YKUCjuCWsc 8MrQ== X-Gm-Message-State: AHPjjUizOb8xfGu0pZk2wbozzeXlk8NlLWfnD4NqbzU0LxGIumKkhjxL nrSNBQTTyyxsM39X3/t7cBk= X-Google-Smtp-Source: AOwi7QDK+OeB0hxfpDXWdRinKinJqp8rGBbTg5pH5fsVHp0Rm1SCBSN0gd7cTgSIW0vA9qWZT1lA2w== X-Received: by 10.84.236.78 with SMTP id h14mr2582060pln.2.1505924964407; Wed, 20 Sep 2017 09:29:24 -0700 (PDT) Received: from localhost.localdomain ([121.137.63.184]) by smtp.gmail.com with ESMTPSA id c185sm8890567pfb.57.2017.09.20.09.29.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Sep 2017 09:29:23 -0700 (PDT) From: Sergey Senozhatsky To: Tony Luck , Fenghua Yu , Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , James Bottomley , Helge Deller Subject: [RFC][PATCH v2 0/7] printk/ia64/ppc64/parisc64: let's deprecate %pF/%pf printk specifiers Date: Thu, 21 Sep 2017 01:29:02 +0900 Message-Id: <20170920162910.32053-1-sergey.senozhatsky@gmail.com> X-Mailer: git-send-email 2.14.1 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.24 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Petr Mladek , linux-ia64@vger.kernel.org, linux-parisc@vger.kernel.org, Alexei Starovoitov , Steven Rostedt , linux-kernel@vger.kernel.org, Sergey Senozhatsky , Jessica Yu , Andrew Morton , linuxppc-dev@lists.ozlabs.org Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" Hello RFC On some arches C function pointers are indirect and point to a function descriptor, which contains the actual pointer to the code. This mostly doesn't matter, except for cases when people want to print out function pointers in symbolic format, because the usual '%pS/%ps' does not work on those arches as expected. That's the reason why we have '%pF/%pf', but since it's here because of a subtle ABI detail specific to some arches (ppc64/ia64/parisc64) it's easy to misuse '%pF/%pf' and '%pS/%ps' (see [1], for example). This patch set attempts to move ia64/ppc64/parisc64 C function pointer ABI details out of printk() to arch code. Function dereference code now checks if a pointer belongs to a .opd ELF section and dereferences that pointer only if it does. The kernel and modules have their own .opd sections that's why I use two different ARCH functions: for kernel and for module pointer dereference. I planned to remove dereference_function_descriptor() entirely, but then I discovered a bunch other uses cases (kgdbts, init/main.c, extable, etc.), so I decided to keep dereference_function_descriptor() around because the main point of this patch set is to deprecate %pF/%pf. But at the same time, I think I can go further and handle both kernel and module descriptor dereference in dereference_function_descriptor(). We need a module pointer for module .opd check, so that will come at an extra cost of module lookup (may be there will some other issues along the way, haven't checked it). Right now we've got: - dereference_function_descriptor(addr) a generic (old) function. it simply attempts to dereference whatever pointer we give it. - dereference_kernel_function_descriptor(addr) dereferences a kernel pointer if it's within the kernel's .opd section. - dereference_module_function_descriptor(module, addr) dereference a module pointer if it's within the module's .opd section. *** A BIG NOTE *** I don't own ia64/ppc64/parisc64 hardware, so the patches are not tested. Sorry about that! Another note: I need to check what is BPF symbol lookup and do we need to do any dereference there. v2: -- convert dereference_function_descriptor() to unsigned long -- fix kernel descriptor range checks (Helge) -- fix parisc module descriptor range check (Helge) -- fix ppc64 module range check -- add checkpatch patch Sergey Senozhatsky (7): switch dereference_function_descriptor() to `unsigned long' sections: split dereference_function_descriptor() ia64: Add .opd based function descriptor dereference powerpc64: Add .opd based function descriptor dereference parisc64: Add .opd based function descriptor dereference symbol lookup: use new kernel and module dereference functions checkpatch: add pF/pf deprecation warning Documentation/printk-formats.txt | 15 +++++---------- arch/ia64/include/asm/sections.h | 16 ++++++++++++---- arch/ia64/kernel/module.c | 13 +++++++++++++ arch/ia64/kernel/vmlinux.lds.S | 2 ++ arch/parisc/boot/compressed/vmlinux.lds.S | 2 ++ arch/parisc/include/asm/sections.h | 4 +++- arch/parisc/kernel/module.c | 17 +++++++++++++++++ arch/parisc/kernel/process.c | 15 ++++++++++++--- arch/parisc/kernel/vmlinux.lds.S | 2 ++ arch/parisc/mm/init.c | 4 ++-- arch/powerpc/include/asm/module.h | 3 +++ arch/powerpc/include/asm/sections.h | 17 ++++++++++++++--- arch/powerpc/kernel/module_64.c | 16 ++++++++++++++++ arch/powerpc/kernel/vmlinux.lds.S | 2 ++ drivers/misc/kgdbts.c | 2 +- include/asm-generic/sections.h | 8 ++++++-- include/linux/moduleloader.h | 4 ++++ init/main.c | 2 +- kernel/extable.c | 2 +- kernel/kallsyms.c | 1 + kernel/module.c | 9 ++++++++- lib/vsprintf.c | 5 +---- scripts/checkpatch.pl | 6 ++++-- 23 files changed, 132 insertions(+), 35 deletions(-) Tested-by: Helge Deller # parisc64 Tested-by: Santosh Sivaraj Tested-by: Tony Luck Acked-by: Michael Ellerman (powerpc)