From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752735AbbI3CMP (ORCPT ); Tue, 29 Sep 2015 22:12:15 -0400 Received: from mail-am1on0061.outbound.protection.outlook.com ([157.56.112.61]:58336 "EHLO emea01-am1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751604AbbI3CMM (ORCPT ); Tue, 29 Sep 2015 22:12:12 -0400 Authentication-Results: spf=fail (sender IP is 124.207.145.166) smtp.mailfrom=ezchip.com; ezchip.com; dkim=none (message not signed) header.d=none;ezchip.com; dmarc=none action=none header.from=ezchip.com; From: Zhigang Lu To: , CC: Zhigang Lu Subject: [PATCH 2/2] tile/jump_label: add jump label support for TILE-Gx Date: Wed, 30 Sep 2015 10:11:45 +0800 Message-ID: <1443579106-21771-1-git-send-email-zlu@ezchip.com> X-Mailer: git-send-email 2.1.2 X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;AM1FFO11FD028;1:rx4pcbKw1ZHDFfESemaE957ZPIwG641nAj0cidyUkPeqPTygdeEXwQfZNsFCtB2JsCpvmDvNp1ZrV6uAkL+/avx3ngmRtyvXWFi+xoWSfS6wEIWHISFnQ4+DLm7peWOh4LU4jY0EX5wRp8LAS28uRxafWBLoU9yH7W4ZTEB0KGprWZob/GSgmvBQp9lqJpR+gc74uiJ2S6xs46gCc0FcYE5fsnNqyz/JKcfVopcMG3w8yvL2r6PeKZPB2xo9fMYT9xFjtD67W+QIqSnBbRlF2Y1g2KQjtLpAHFqxKzPWgbvJjnbccaKLxmbs4lTAOoKtHfXVG5ItMdGAsIH1oIgFCcS9f+FKbR1/8cQ4f62ldi56rcZNLceLTOQT13z5x7o/ePJm7BCKtem0nlwLOr0jnA== X-Forefront-Antispam-Report: CIP:124.207.145.166;CTRY:CN;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(189998001)(62966003)(107886002)(77156002)(5001960100002)(64706001)(450100001)(42186005)(47776003)(5001860100001)(5007970100001)(36756003)(5001770100001)(81156007)(4001540100001)(97736004)(5001830100001)(5008740100001)(5003940100001)(4001450100002)(92566002)(229853001)(19580405001)(33646002)(104016004)(86362001)(19580395003)(6806005)(46102003)(106466001)(105606002)(85426001)(87936001)(50226001)(50986999)(48376002)(50466002)(68736005)(9376005)(2004002)(4001430100001);DIR:OUT;SFP:1101;SCL:1;SRVR:HE1PR02MB0778;H:bjgfarm-2.internal.tilera.com;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;HE1PR02MB0778;2:Dr/AaJt3/jUQ0c618U+AxsnUk5p467tdbScSo01vt71/NMj2gTQt9WqJH8ZPBExN6Nwlm9DuScnt+lzvibzyPL8YbjTXrykIDUTiJAHzYUiNVRGvEUYHNH1gRDcuZET6asD6d1vxL78eVvX+OOAQuG45TwHIXWigUNYbPNUm4Zs=;3:b8nOVWKh5g8jodXmPJdwpKScnF5/Rg8liXQljGvKiC6eArEGOE9gOvJznc2tE0wMj4RSJLoPnOBCg6+yFMiXwPPcOPVVX8y45UpXv6QvWMloXbUdDgsPU8MHdAc+XJ9CkOhSBmvNXw3bjnLPu3hxZtS3OsRLK1fR1PfSUeqaGZC56dxu4kgveluC3bDsitQuct5C+EVs9velUfF8ojetkX2IaoGb3jraiv5W+2h0xMsWxDf/7pcZxPlGlhnA6M3L;25:MoQLS+YBcjOgC0qD7+V7PK/nKE8p+0U2Qry9oAse1SYjyYlwbCl4cIbFBXn6RfFUW7t1HlX3LK6e6eZm45KTiEpRCcrNW5yUrtPtReJQWKzt+3jlA+fH10NmRIiKY1xsSsgw0MCPpfCXwuqXdvIX7KRrbzcBUkjyjjcPBmRTbteyZNLNDpLDsUZpXG49CW6vJidxp6Agdq1wt2bGUU9ejWT8Q++lyK/ZdEB41GTCj11eA3IyxYeiBljlfrOexoz8fay/zlvZpTl6K7tuoRIHzA==;20:tQWx5m90RC+0rhyD6/kMQgnwQcMFAKWJVdChvKPbIN3TgzQmz1YdYkAjFe4H9/Mt62iYRx0cTihTlXPpmGkHwiRcqKDBidz9Y4KYBsVy5q41RCsH/4GBcEEP9SduVxsF/PHhY2SgpeWp5fZB0ohoLJpXTvfdJrUxNp2/mvLbQLI= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:HE1PR02MB0778; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(520078)(8121501046)(3002001);SRVR:HE1PR02MB0778;BCL:0;PCL:0;RULEID:;SRVR:HE1PR02MB0778; X-Microsoft-Exchange-Diagnostics: 1;HE1PR02MB0778;4:sX4HoyKhZychJ1nJUmdHC/ddEhOGLthlFIhk9VE7HU09BhF0H8wLfvyOU8q9n4ScpPOy+I57WcUgMFDsY0/sAn1v87KPAQ+//TkavFyrv/9YORFaMNupzRW4/OAvHSJfXcSnEcj8zMNLqaVLgHqGRWQy9f/5G3qxQhNbjlIxtX2rC6xkcqgi9pL/WGGrmuKSePrGetZUqJSZrr5lwB+wDt+M1QQtSUoyjli20hzkH2Q8wJZh6UmCLzJeXpAOsD6T1WftBGM8JUbtG5Mf16hR+4+35Usc493JAwYwitRNQMQvHpUzjRa/qKYKSYbXz3VWgV4lI1SER4F3I056+17r24jfJKgRp2iGUf0GULopSHk= X-Forefront-PRVS: 071518EF63 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;HE1PR02MB0778;23:21FvDKYrRz7Qr57Jsd88UW+NhKaC/lq574bWhKEf8?= =?us-ascii?Q?VIlhcSIu1e1odaUexA8cZiEmeB4xCZygsE0rShkc8aeHw2Oy9yg3d0RvpwAp?= =?us-ascii?Q?fa06y+c2/1aUPMwoUlACnLCwKGJk8D4V18Mutzx9JDNJSUa+H/sHi5rfxgnA?= =?us-ascii?Q?2+3xSwc9oKACc6G7Qzu/mxFD1JSBc3ges/sMzSMp0bm1SqZWEMS5MPe8QaPr?= =?us-ascii?Q?BokIF/evCbBnL20bUtHuT9ZsqO1gnutAaNDN+7RWi40idCPIyh41j9kUyfvZ?= =?us-ascii?Q?N89EAXCXQL6XyISdBc2cqq+0U0V4MgbXSv1hDVskiIlRIZ0YoXugAug+3mJb?= =?us-ascii?Q?TvikYsQXCKvbPi7VbOuQaFWVrrssV7D87LEWcbyhqYlmIb00pbgJ3tvoSid9?= =?us-ascii?Q?8A6+e6SrpF4N7Jzi9seywyrGayF0L2BWGS301cBhZL435qOvJbD0Ci4eHyJp?= =?us-ascii?Q?Odwzgt9YENSjZGNt60/PSpZz+1lgPGHCvRnFGkUlYx20c0qXAH59af8+JBeC?= =?us-ascii?Q?SXunRknKu/97QH1/Hu0lhl8JareoSVIFfyVJ9tsdLCvTWkR7VleYw/LgCAVv?= =?us-ascii?Q?d8RevGctWNnDgyY4Q6LPs6WAm17iUlktC9oCVY2xg3r2b4CZ+pESkDRtGlNS?= =?us-ascii?Q?RJqHsSWVLMGuxpEcG5RX0gBBbcRPNR2wn4iJ64vap0klWmcQKo3oYvVVX5lJ?= =?us-ascii?Q?YKiG5DUWLXX58jwWN11QbUsUohgGFPJMWtY6aP5roUgud3IZ4jdwKshdhP5a?= =?us-ascii?Q?+ZtuoW6xreucjFQih6VAbf6KBaxGXE5ScJz6qnrG8t7WFfc49nlMaXsgdTa7?= =?us-ascii?Q?0PHCgRlww98f3K0qEonLoHDVlx3m7OvkvYlXHMPmQhvqStcJHwejI2/JyLES?= =?us-ascii?Q?EehiJ4ngxQjVu91LpTdUDql3kIjZQgWcbOyJjUlSHrtSuzkX2x7kMQm8S2LR?= =?us-ascii?Q?HQWAFj7h7i4T6NmyyqcYv2LSWTV0ag7tSqLCB5AljmuL9TBIflDbJvxyOJul?= =?us-ascii?Q?Q34EaqMkIFOaJFXQ5yhjew9D+ZvTnExy8vhk6u6ynqcrwwxLkket1Qc0Naru?= =?us-ascii?Q?vEKTHedR45XCPjWW638qvJ03dFnSL0XkukBfMS1JDpJ9Og5nD+z8tYF+BNQg?= =?us-ascii?Q?2WSsvkCvtu5iJqXT4H3dSsJq3pYPGjsU6/KU+53AuAfmrt0GHAU344VXjvsK?= =?us-ascii?Q?eU1KXFv7IHIgDE8snL+QMw8UhuWWkQB/bBHv3LLEu2AINESIEBeegkCRXMS9?= =?us-ascii?Q?E7uPULIu3+LXhdq9CfBBUx6ls24dG3BnpAFL5ddWmh0vPjD/bQHgFZOucnDZ?= =?us-ascii?Q?bPEVazNHGAQXvcdsHrB75s=3D?= X-Microsoft-Exchange-Diagnostics: 1;HE1PR02MB0778;5:nLl0WvbirJgqAmsu3PVomlFkXxXTWVzVAtk3r2QpdBYmS1KVCJn4BBd54px7ofBVaSU+92qvyHLafJzqZ1R6Cxe6K/WgCE/aZBmzJh021uId8cO0ogCpIB00Jdqav9K5bA3U8T4PRM1pQ6c0Ro254Q==;24:d8dhDXrpZsgKvjm99Oeyb+Ya5ZwXCSStn3lTaT9Ak4ZbWoLxkDYZjKc0sTbnSR2An+O660/rqmO9fbLrQiDIp6rbmOpmbhhVU87ZZCChXjY=;20:WE2Gr/lnom/h0UrXan1gsv/OHOOAoB6781K8vzMDNROlqMYtVLmy5ygG8y5BDRv5hvsNVCBuuQ5OMfUu2V7yTA== SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: ezchip.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Sep 2015 02:12:05.4569 (UTC) X-MS-Exchange-CrossTenant-Id: 0fc16e0a-3cd3-4092-8b2f-0a42cff122c3 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=0fc16e0a-3cd3-4092-8b2f-0a42cff122c3;Ip=[124.207.145.166];Helo=[bjgfarm-2.internal.tilera.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR02MB0778 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add the arch-specific code to support jump label for TILE-Gx. This code shares NOP instruction with ftrace, so we move it to a common header file. Reviewed-by: Chris Metcalf Signed-off-by: Zhigang Lu --- arch/tile/Kconfig | 1 + arch/tile/include/asm/insn.h | 59 +++++++++++++++++++++++++++++++++++ arch/tile/include/asm/jump_label.h | 58 ++++++++++++++++++++++++++++++++++ arch/tile/kernel/Makefile | 1 + arch/tile/kernel/ftrace.c | 11 +------ arch/tile/kernel/jump_label.c | 64 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 184 insertions(+), 10 deletions(-) create mode 100644 arch/tile/include/asm/insn.h create mode 100644 arch/tile/include/asm/jump_label.h create mode 100644 arch/tile/kernel/jump_label.c diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig index 106c21b..dff39e2 100644 --- a/arch/tile/Kconfig +++ b/arch/tile/Kconfig @@ -33,6 +33,7 @@ config TILE select GENERIC_STRNCPY_FROM_USER select GENERIC_STRNLEN_USER select HAVE_ARCH_SECCOMP_FILTER + select HAVE_ARCH_JUMP_LABEL # FIXME: investigate whether we need/want these options. # select HAVE_IOREMAP_PROT diff --git a/arch/tile/include/asm/insn.h b/arch/tile/include/asm/insn.h new file mode 100644 index 0000000..f78ba5c --- /dev/null +++ b/arch/tile/include/asm/insn.h @@ -0,0 +1,59 @@ +/* + * Copyright 2015 Tilera Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or + * NON INFRINGEMENT. See the GNU General Public License for + * more details. + */ +#ifndef __ASM_TILE_INSN_H +#define __ASM_TILE_INSN_H + +#include + +static inline tilegx_bundle_bits NOP(void) +{ + return create_UnaryOpcodeExtension_X0(FNOP_UNARY_OPCODE_X0) | + create_RRROpcodeExtension_X0(UNARY_RRR_0_OPCODE_X0) | + create_Opcode_X0(RRR_0_OPCODE_X0) | + create_UnaryOpcodeExtension_X1(NOP_UNARY_OPCODE_X1) | + create_RRROpcodeExtension_X1(UNARY_RRR_0_OPCODE_X1) | + create_Opcode_X1(RRR_0_OPCODE_X1); +} + +static inline tilegx_bundle_bits tilegx_gen_branch(unsigned long pc, + unsigned long addr, + bool link) +{ + tilegx_bundle_bits opcode_x0, opcode_x1; + long pcrel_by_instr = (addr - pc) >> TILEGX_LOG2_BUNDLE_SIZE_IN_BYTES; + + if (link) { + /* opcode: jal addr */ + opcode_x1 = + create_Opcode_X1(JUMP_OPCODE_X1) | + create_JumpOpcodeExtension_X1(JAL_JUMP_OPCODE_X1) | + create_JumpOff_X1(pcrel_by_instr); + } else { + /* opcode: j addr */ + opcode_x1 = + create_Opcode_X1(JUMP_OPCODE_X1) | + create_JumpOpcodeExtension_X1(J_JUMP_OPCODE_X1) | + create_JumpOff_X1(pcrel_by_instr); + } + + /* opcode: fnop */ + opcode_x0 = + create_UnaryOpcodeExtension_X0(FNOP_UNARY_OPCODE_X0) | + create_RRROpcodeExtension_X0(UNARY_RRR_0_OPCODE_X0) | + create_Opcode_X0(RRR_0_OPCODE_X0); + + return opcode_x1 | opcode_x0; +} + +#endif /* __ASM_TILE_INSN_H */ diff --git a/arch/tile/include/asm/jump_label.h b/arch/tile/include/asm/jump_label.h new file mode 100644 index 0000000..cde7573 --- /dev/null +++ b/arch/tile/include/asm/jump_label.h @@ -0,0 +1,58 @@ +/* + * Copyright 2015 Tilera Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or + * NON INFRINGEMENT. See the GNU General Public License for + * more details. + */ + +#ifndef _ASM_TILE_JUMP_LABEL_H +#define _ASM_TILE_JUMP_LABEL_H + +#include + +#define JUMP_LABEL_NOP_SIZE TILE_BUNDLE_SIZE_IN_BYTES + +static __always_inline bool arch_static_branch(struct static_key *key, + bool branch) +{ + asm_volatile_goto("1:\n\t" + "nop" "\n\t" + ".pushsection __jump_table, \"aw\"\n\t" + ".quad 1b, %l[l_yes], %0 + %1 \n\t" + ".popsection\n\t" + : : "i" (key), "i" (branch) : : l_yes); + return false; +l_yes: + return true; +} + +static __always_inline bool arch_static_branch_jump(struct static_key *key, + bool branch) +{ + asm_volatile_goto("1:\n\t" + "j %l[l_yes]" "\n\t" + ".pushsection __jump_table, \"aw\"\n\t" + ".quad 1b, %l[l_yes], %0 + %1 \n\t" + ".popsection\n\t" + : : "i" (key), "i" (branch) : : l_yes); + return false; +l_yes: + return true; +} + +typedef u64 jump_label_t; + +struct jump_entry { + jump_label_t code; + jump_label_t target; + jump_label_t key; +}; + +#endif /* _ASM_TILE_JUMP_LABEL_H */ diff --git a/arch/tile/kernel/Makefile b/arch/tile/kernel/Makefile index 21f77bf..09936d0 100644 --- a/arch/tile/kernel/Makefile +++ b/arch/tile/kernel/Makefile @@ -32,5 +32,6 @@ obj-$(CONFIG_TILE_HVGLUE_TRACE) += hvglue_trace.o obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o mcount_64.o obj-$(CONFIG_KPROBES) += kprobes.o obj-$(CONFIG_KGDB) += kgdb.o +obj-$(CONFIG_JUMP_LABEL) += jump_label.o obj-y += vdso/ diff --git a/arch/tile/kernel/ftrace.c b/arch/tile/kernel/ftrace.c index 4180ccdf..4a57208 100644 --- a/arch/tile/kernel/ftrace.c +++ b/arch/tile/kernel/ftrace.c @@ -20,21 +20,12 @@ #include #include #include +#include #include #ifdef CONFIG_DYNAMIC_FTRACE -static inline tilegx_bundle_bits NOP(void) -{ - return create_UnaryOpcodeExtension_X0(FNOP_UNARY_OPCODE_X0) | - create_RRROpcodeExtension_X0(UNARY_RRR_0_OPCODE_X0) | - create_Opcode_X0(RRR_0_OPCODE_X0) | - create_UnaryOpcodeExtension_X1(NOP_UNARY_OPCODE_X1) | - create_RRROpcodeExtension_X1(UNARY_RRR_0_OPCODE_X1) | - create_Opcode_X1(RRR_0_OPCODE_X1); -} - static int machine_stopped __read_mostly; int ftrace_arch_code_modify_prepare(void) diff --git a/arch/tile/kernel/jump_label.c b/arch/tile/kernel/jump_label.c new file mode 100644 index 0000000..07802d5 --- /dev/null +++ b/arch/tile/kernel/jump_label.c @@ -0,0 +1,64 @@ +/* + * Copyright 2015 Tilera Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or + * NON INFRINGEMENT. See the GNU General Public License for + * more details. + * + * jump label TILE-Gx support + */ + +#include +#include +#include +#include +#include + +#include +#include + +#ifdef HAVE_JUMP_LABEL + +static void __jump_label_transform(struct jump_entry *e, + enum jump_label_type type) +{ + tilegx_bundle_bits opcode; + /* Operate on writable kernel text mapping. */ + unsigned long pc_wr = ktext_writable_addr(e->code); + + if (type == JUMP_LABEL_JMP) + opcode = tilegx_gen_branch(e->code, e->target, false); + else + opcode = NOP(); + + *(tilegx_bundle_bits *)pc_wr = opcode; + /* Make sure that above mem writes were issued towards the memory. */ + smp_wmb(); +} + +void arch_jump_label_transform(struct jump_entry *e, + enum jump_label_type type) +{ + get_online_cpus(); + mutex_lock(&text_mutex); + + __jump_label_transform(e, type); + flush_icache_range(e->code, e->code + sizeof(tilegx_bundle_bits)); + + mutex_unlock(&text_mutex); + put_online_cpus(); +} + +__init_or_module void arch_jump_label_transform_static(struct jump_entry *e, + enum jump_label_type type) +{ + __jump_label_transform(e, type); +} + +#endif /* HAVE_JUMP_LABEL */ -- 2.1.2