From patchwork Wed Aug 14 17:01:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg KH X-Patchwork-Id: 171323 Delivered-To: patch@linaro.org Received: by 2002:a92:d204:0:0:0:0:0 with SMTP id y4csp1105261ily; Wed, 14 Aug 2019 10:13:42 -0700 (PDT) X-Google-Smtp-Source: APXvYqwlQDNjlSu8OB8JJFUGjgCTPup6OVFbMRXCLgoLx59ac5CT7jBLR3cR8PNwMAdflEWoKEM7 X-Received: by 2002:a17:902:9348:: with SMTP id g8mr475090plp.18.1565802740939; Wed, 14 Aug 2019 10:12:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1565802740; cv=none; d=google.com; s=arc-20160816; b=M53KngHLE47VUR1wEPZx2Ev4+68nTV0NDfxWLb+KohEMYIMLkjnui4S3yoCzL0HeHG UhvuzwCMvE2HHQ1wct6Eb3EVIsc1UNXIm4n/igFevIy6ovYexKc3eaTwpHDbrYaABdJF 5a1UQDOggV3/zQKZHi9D+/g7MhY3a3Jz6kh61pesq3DZUtfALKCJikS9mdS0Y2W30ga9 MPs9GCW5WvP/MK3gQWL89MKFQOC7QU/NgrVs5hqIXpxqxMA2TM0WddJIJNljspnHd12y IL7DSfGypzC5YVX9GaQgk5BBchT2/fsqE6/XLJZ/vkWebQ9CzkI/BHEz1eiWs7/MGJAQ hgHg== 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=ZEIa4h5fIYdUfhLGXSzD0xXGgcpW1HPxDzrwKn3WXxw=; b=faimJGcQsRnxaYu90gL9wV50U1i3OLgRDoS/RlqdnhtvgtmxSIPR7BtwtQo0a6lK37 ttjGUB+X5kZBT9OJeMhYFXC7TOX5zqRjS+sQD1E1JF9lUeKLpXmIwCk8jt4NSIIxtnAy d86MIW8pbbJDekX8GebjyKv/47fZ6/SJt6gOxoxgcRFkd/LUemUQihBVnhqBwUNcY/5h 9KSJp9IEYDvxKfuTH+hwEISpSNiJAma8/WAo5iCi6Gk8uRhI/AjawMtk4Iqjq1BH8Pxm nWhzRSOxsZrnJcqR225KSthMaVVMSFmhDFhoeESKI/sJtjPRechm+hEepDijXcfRDo1Z OLFA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=o3KbLzhX; 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 h65si82484pfe.216.2019.08.14.10.12.20; Wed, 14 Aug 2019 10:12:20 -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=o3KbLzhX; 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 S1730704AbfHNRMT (ORCPT + 28 others); Wed, 14 Aug 2019 13:12:19 -0400 Received: from mail.kernel.org ([198.145.29.99]:36052 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730698AbfHNRMR (ORCPT ); Wed, 14 Aug 2019 13:12:17 -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 95FCD216F4; Wed, 14 Aug 2019 17:12:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1565802736; bh=SKkNANZr+ygJCo5isJhEgLS5Oabwbiqh+RoOuJkiSlw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=o3KbLzhXXD39EX7oHGgFyDE3xoqlr+BWDX8QhnmkJdRFmv8Lp2HNq5hS4Qmc6d8PX aPqmkkqRurWbe7YvZDv5Xk4k9uG1A4z2byNdrm8EJclF4LLUVeGEk7uZbBZsCWxqVU b/GijwFhAjMLKatdzmJajKrW6cSixFUgQN/DB4JI= 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 4.19 71/91] x86/purgatory: Do not use __builtin_memcpy and __builtin_memset Date: Wed, 14 Aug 2019 19:01:34 +0200 Message-Id: <20190814165752.710198889@linuxfoundation.org> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190814165748.991235624@linuxfoundation.org> References: <20190814165748.991235624@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 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 | 25 ------------------------- 4 files changed, 17 insertions(+), 25 deletions(-) --- a/arch/x86/boot/string.c +++ b/arch/x86/boot/string.c @@ -34,6 +34,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 @@ -70,3 +70,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,25 +0,0 @@ -/* - * Simple string functions. - * - * Copyright (C) 2014 Red Hat Inc. - * - * Author: - * Vivek Goyal - * - * This source code is licensed under the GNU General Public License, - * Version 2. See the file COPYING for more details. - */ - -#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); -}