Received: by 10.192.165.156 with SMTP id m28csp1654965imm; Tue, 17 Apr 2018 03:13:27 -0700 (PDT) X-Google-Smtp-Source: AIpwx49eVmni/0MB8Ynd74T1vbkslOC16CvZXHSbzwzwn8EoXE3/ZOwL5HmQEhHRlGxUgWv1DOZt X-Received: by 2002:a17:902:bf49:: with SMTP id u9-v6mr1469415pls.133.1523960007849; Tue, 17 Apr 2018 03:13:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523960007; cv=none; d=google.com; s=arc-20160816; b=sZSdObsdiwQ+Du3L8Fef1T3JqALlpdlOvIjz29qe5DrrV2nuK785jTrsAqvEMB8ldq H1IOdNURMeXlg+6ossF+4SUlShyd+th4en675Z3oPjujmKODbKXkTIGx3tnu2o9Gfb6P 2/pQxH+bWwFD9vZSwpJ3pfJSuoGpn3a07SCOSLAqQSww22jQjuRfOb2MgPl9XTe8v8Ct EAPtM8IEWdlsDFKG8BETmWJXiW/XYopJrLk+FiqVpH0l19EF7rReum8rQQsXZ8KoV9j/ NEiJOAjuMr3DTNG71AM+XWDbA6+FcPhulDHko9wipyMM8011mQBVyWdxOEpP7tPLOaVd D0kA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:references :in-reply-to:message-id:date:subject:cc:to:from:dmarc-filter :arc-authentication-results; bh=y9/MyePXBWZcOTRIy3+eeOHJUznBn7pTvom5fj58fLs=; b=t2MNIrjU9SeD5Iliu0dvtlIKOELV877t9Ge41Q2lTTWpG7MLBsLysDBiZFsJa68dcn 7WTOS1VNjqiLmRZOKOJkzUn5V/XNxTw7ykZ5N8kl577A9yadvWRw4u5lsWAw4aKipf3l DHEyVEJpC4orUbTPu7mkmZ7LbYiz2zYGPuLgwOkyi0W2uH2c4J0wGh6UojvgmV6YWsa4 0z2MmXCR9U7fQLvtsaohksR3BNX9cBsDTK6WJMbJOXOLbIl77C3I5vtir4E8yZvFNbg+ 5j0DIAsOOcpitVQVc/34xTkpWuwPV0QMiKO5idihMiySwiJTxltkiP1S73Wm8wVphNOI aYyQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w9-v6si5569108plp.389.2018.04.17.03.13.14; Tue, 17 Apr 2018 03:13:27 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752719AbeDQKMF (ORCPT + 99 others); Tue, 17 Apr 2018 06:12:05 -0400 Received: from mail.kernel.org ([198.145.29.99]:60812 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752048AbeDQKLy (ORCPT ); Tue, 17 Apr 2018 06:11:54 -0400 Received: from localhost.localdomain (jahogan.plus.com [212.159.75.221]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 608DF2183A; Tue, 17 Apr 2018 10:11:51 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 608DF2183A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=jhogan@kernel.org From: James Hogan To: linux-mips@linux-mips.org, Arnd Bergmann , Richard Henderson , Ivan Kokshaysky , Matt Turner , linux-alpha@vger.kernel.org Cc: linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, James Hogan , Paul Burton , Matthew Fortune , Robert Suchanek , Ralf Baechle Subject: [PATCH v3 3/3] MIPS: Workaround GCC __builtin_unreachable reordering bug Date: Tue, 17 Apr 2018 11:11:06 +0100 Message-Id: X-Mailer: git-send-email 2.13.6 In-Reply-To: References: In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Paul Burton Older versions of GCC for the MIPS architecture suffer from a bug which can lead to instructions from beyond an unreachable statement being incorrectly reordered into earlier branch delay slots if the unreachable statement is the only content of a case in a switch statement. This can lead to seemingly random behaviour, such as invalid memory accesses from incorrectly reordered loads or stores, and link failures on microMIPS builds. See this potential GCC fix for details: https://gcc.gnu.org/ml/gcc-patches/2015-09/msg00360.html This bug can be worked around by placing a volatile asm statement, which GCC is prevented from reordering past, prior to the __builtin_unreachable call. This was actually done for other reasons by commit 173a3efd3edb ("bug.h: work around GCC PR82365 in BUG()"), but without the MIPS specific .insn, which broke microMIPS builds on newer GCC 7.2 toolchains with errors like the following: arch/mips/mm/dma-default.s:3265: Error: branch to a symbol in another ISA mode arch/mips/mm/dma-default.s:5027: Error: branch to a symbol in another ISA mode The original bug affects at least a maltasmvp_defconfig kernel built from the v4.4 tag using GCC 4.9.2 (from a Codescape SDK 2015.06-05 toolchain), with the result being an address exception taken after log messages about the L1 caches (during probe of the L2 cache): Initmem setup node 0 [mem 0x0000000080000000-0x000000009fffffff] VPE topology {2,2} total 4 Primary instruction cache 64kB, VIPT, 4-way, linesize 32 bytes. Primary data cache 64kB, 4-way, PIPT, no aliases, linesize 32 bytes This is early enough that the kernel exception vectors are not in use, so any further output depends upon the bootloader. This is reproducible in QEMU where no further output occurs - ie. the system hangs here. Given the nature of the bug it may potentially be hit with differing symptoms. Fixes: 173a3efd3edb ("bug.h: work around GCC PR82365 in BUG()") Signed-off-by: Paul Burton [jhogan@kernel.org: Forward port and use asm/compiler.h instead of asm/compiler-gcc.h] Signed-off-by: James Hogan Reviewed-by: Paul Burton Cc: Matthew Fortune Cc: Robert Suchanek Cc: Ralf Baechle Cc: Arnd Bergmann Cc: linux-mips@linux-mips.org --- This is an alternative approach to this earlier patch which seems to have been rejected: https://patchwork.linux-mips.org/patch/12556/ https://marc.info/?l=linux-mips&m=145555921408274&w=2 Changes in v3 (James): - Forward port to v4.17-rc and update commit message. - Drop stable tag for now. Changes in v2 (Paul): - Remove generic-y entry. --- arch/mips/include/asm/compiler.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/arch/mips/include/asm/compiler.h b/arch/mips/include/asm/compiler.h index e081a265f422..ff2a412899d4 100644 --- a/arch/mips/include/asm/compiler.h +++ b/arch/mips/include/asm/compiler.h @@ -8,6 +8,29 @@ #ifndef _ASM_COMPILER_H #define _ASM_COMPILER_H +/* + * With GCC v4.5 onwards can use __builtin_unreachable to indicate to the + * compiler that a particular code path will never be hit. This allows it to be + * optimised out of the generated binary. + * + * Unfortunately GCC from at least v4.9.2 to current head of tree as of May + * 2016 suffer from a bug that can lead to instructions from beyond an + * unreachable statement being incorrectly reordered into earlier delay slots + * if the unreachable statement is the only content of a case in a switch + * statement. This can lead to seemingly random behaviour, such as invalid + * memory accesses from incorrectly reordered loads or stores. See this + * potential GCC fix for details: + * + * https://gcc.gnu.org/ml/gcc-patches/2015-09/msg00360.html + * + * We work around this by placing a volatile asm statement, which GCC is + * prevented from reordering past, prior to the __builtin_unreachable call. The + * .insn statement is required to ensure that any branches to the statement, + * which sadly must be kept due to the asm statement, are known to be branches + * to code and satisfy linker requirements for microMIPS kernels. + */ +#define barrier_before_unreachable() asm volatile(".insn") + #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) #define GCC_IMM_ASM() "n" #define GCC_REG_ACCUM "$0" -- git-series 0.9.1