Received: by 2002:a25:8b12:0:0:0:0:0 with SMTP id i18csp1061862ybl; Wed, 14 Aug 2019 10:06:09 -0700 (PDT) X-Google-Smtp-Source: APXvYqyRqehOiStCW3KkYizbb1ZLEThZgIsU5FvY8fR2uGMOzPp+zlWqbDz3B2jlzSJlTLwb4Bhp X-Received: by 2002:a63:2807:: with SMTP id o7mr162787pgo.131.1565802369180; Wed, 14 Aug 2019 10:06:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1565802369; cv=none; d=google.com; s=arc-20160816; b=WffrpRUYk+2I/E7YkwmugE7/apomKb8o8DgFf76ZwMldP0dnpEXzLcD8y1LcPe9X1t lzkQMrgKQZjAk8WgARxC1/wVnspQAakSMuVyzXS+fiG7Bs6UIK3t+hv6jX/bkjFv9GbO Ek4oyPc7h4D6hF+lG0IBTwpjm2CQZMc5PL75LIKiNzMyLgD3ekL+WkMGzt8vlugMBfVI 2gkP2E1fVS8mFkRWTdm0nMyjh20rwOnTturi8QSrSJMX88k6QI50VhDh8E02vCKHlAqy sx9bX3FkUu+w1fEX/ReHLipLmWoFM6GKryqH5saxPkWEawl/JpeK/BH1F9WKEMg0ZXjj 1D3w== 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:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=p5YGFbPtrCMqu0viPkkRuqEMIpz8hqfaG3nqPoPTNII=; b=weffbkZkLhyz04uWiS7kQ1Ir/3JK9joGoECfYIGqyNh726f4E3v2rDlklTxyDmm6fO YPb2a7YlZ919mE3sAYCwxwtGcL1tDzsvImcBa4CxjV7XUW1iAOj81mEgODBDWVUsu/7z Z9NXmc58+vsbUZg61+g2a1wcKDJCeyV/d248J7ckNDplxdmnZoNvcQH26a71kadDsau6 ScAczGwI3BFtFiJtp3cWCVrYti2Co/jeXSr6ebpbyFBLbgfc0rCR18C9QsqQsypAb8GQ n7BKl8Q3UqqIb/BfQ4jMsIyC85yUO1K8AeVyf+30SlnqBrdTwFSJk+LwLSfaCMjRqi0V DRJQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=XgyQh4kS; 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 b6si85307pfd.29.2019.08.14.10.05.53; Wed, 14 Aug 2019 10:06:09 -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; dkim=pass header.i=@kernel.org header.s=default header.b=XgyQh4kS; 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 S1729242AbfHNREc (ORCPT + 99 others); Wed, 14 Aug 2019 13:04:32 -0400 Received: from mail.kernel.org ([198.145.29.99]:53326 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729215AbfHNREa (ORCPT ); Wed, 14 Aug 2019 13:04:30 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 73BBD2084D; Wed, 14 Aug 2019 17:04:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1565802269; bh=uxRHKqm3l87w3jcDPFoFAyfY8jEP22imeRNuXpLfmAc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XgyQh4kSZHzgGPjlow8OE3v4kmI9AL1ah+iIl9szq5ujNREAC507o+f9Lt5I0SvD+ IQlOH+G56FukKuujEOHD+E90YTUs+PxPKQGcT126gE9wkI7N64p2ZvPezVVieCqWZL Si69p0jBxN21FMJYni7PWecdyb0AS9fVJZvR7UN0= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Vaibhav Rustagi , Alistair Delva , Nick Desaulniers , Thomas Gleixner , Manoj Gupta Subject: [PATCH 5.2 034/144] x86/purgatory: Do not use __builtin_memcpy and __builtin_memset Date: Wed, 14 Aug 2019 18:59:50 +0200 Message-Id: <20190814165801.255920942@linuxfoundation.org> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190814165759.466811854@linuxfoundation.org> References: <20190814165759.466811854@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Nick Desaulniers commit 4ce97317f41d38584fb93578e922fcd19e535f5b upstream. Implementing memcpy and memset in terms of __builtin_memcpy and __builtin_memset is problematic. GCC at -O2 will replace calls to the builtins with calls to memcpy and memset (but will generate an inline implementation at -Os). Clang will replace the builtins with these calls regardless of optimization level. $ llvm-objdump -dr arch/x86/purgatory/string.o | tail 0000000000000339 memcpy: 339: 48 b8 00 00 00 00 00 00 00 00 movabsq $0, %rax 000000000000033b: R_X86_64_64 memcpy 343: ff e0 jmpq *%rax 0000000000000345 memset: 345: 48 b8 00 00 00 00 00 00 00 00 movabsq $0, %rax 0000000000000347: R_X86_64_64 memset 34f: ff e0 Such code results in infinite recursion at runtime. This is observed when doing kexec. Instead, reuse an implementation from arch/x86/boot/compressed/string.c. This requires to implement a stub function for warn(). Also, Clang may lower memcmp's that compare against 0 to bcmp's, so add a small definition, too. See also: commit 5f074f3e192f ("lib/string.c: implement a basic bcmp") Fixes: 8fc5b4d4121c ("purgatory: core purgatory functionality") Reported-by: Vaibhav Rustagi Debugged-by: Vaibhav Rustagi Debugged-by: Manoj Gupta Suggested-by: Alistair Delva Signed-off-by: Nick Desaulniers Signed-off-by: Thomas Gleixner Tested-by: Vaibhav Rustagi Cc: stable@vger.kernel.org Link: https://bugs.chromium.org/p/chromium/issues/detail?id=984056 Link: https://lkml.kernel.org/r/20190807221539.94583-1-ndesaulniers@google.com Signed-off-by: Greg Kroah-Hartman --- arch/x86/boot/string.c | 8 ++++++++ arch/x86/purgatory/Makefile | 3 +++ arch/x86/purgatory/purgatory.c | 6 ++++++ arch/x86/purgatory/string.c | 23 ----------------------- 4 files changed, 17 insertions(+), 23 deletions(-) --- a/arch/x86/boot/string.c +++ b/arch/x86/boot/string.c @@ -37,6 +37,14 @@ int memcmp(const void *s1, const void *s return diff; } +/* + * Clang may lower `memcmp == 0` to `bcmp == 0`. + */ +int bcmp(const void *s1, const void *s2, size_t len) +{ + return memcmp(s1, s2, len); +} + int strcmp(const char *str1, const char *str2) { const unsigned char *s1 = (const unsigned char *)str1; --- a/arch/x86/purgatory/Makefile +++ b/arch/x86/purgatory/Makefile @@ -6,6 +6,9 @@ purgatory-y := purgatory.o stack.o setup targets += $(purgatory-y) PURGATORY_OBJS = $(addprefix $(obj)/,$(purgatory-y)) +$(obj)/string.o: $(srctree)/arch/x86/boot/compressed/string.c FORCE + $(call if_changed_rule,cc_o_c) + $(obj)/sha256.o: $(srctree)/lib/sha256.c FORCE $(call if_changed_rule,cc_o_c) --- a/arch/x86/purgatory/purgatory.c +++ b/arch/x86/purgatory/purgatory.c @@ -68,3 +68,9 @@ void purgatory(void) } copy_backup_region(); } + +/* + * Defined in order to reuse memcpy() and memset() from + * arch/x86/boot/compressed/string.c + */ +void warn(const char *msg) {} --- a/arch/x86/purgatory/string.c +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * Simple string functions. - * - * Copyright (C) 2014 Red Hat Inc. - * - * Author: - * Vivek Goyal - */ - -#include - -#include "../boot/string.c" - -void *memcpy(void *dst, const void *src, size_t len) -{ - return __builtin_memcpy(dst, src, len); -} - -void *memset(void *dst, int c, size_t len) -{ - return __builtin_memset(dst, c, len); -}