FAILED: patch "[PATCH] x86/purgatory: Do not use __builtin_memcpy and" failed to apply to 4.4-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 4ce97317f41d38584fb93578e922fcd19e535f5b Mon Sep 17 00:00:00 2001
From: Nick Desaulniers <[email protected]>
Date: Wed, 7 Aug 2019 15:15:32 -0700
Subject: [PATCH] x86/purgatory: Do not use __builtin_memcpy and
__builtin_memset
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 *%rax0000000000000345 memset:
345: 48 b8 00 00 00 00 00 00 00 00 movabsq $0, %rax
0000000000000347: R_X86_64_64 memset
34f: ff e0Such 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")
arch/x86/boot/string.c +8 -0
@@ -37,6 +37,14 @@ int memcmp(const void *s1, const void *s2, size_t len)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;
arch/x86/purgatory/Makefile +3 -0
@@ -6,6 +6,9 @@ purgatory-y := purgatory.o stack.o setup-x86_$(BITS).o sha256.o entry64.o string 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)
arch/x86/purgatory/purgatory.c +6 -0
@@ -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) {}
arch/x86/purgatory/string.c deleted +0 -23
@@ -1,23 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* -* Simple string functions. -* -* Copyright (C) 2014 Red Hat Inc. -* -* Author: -* Vivek Goyal <[email protected]> -*/ - -#include <linux/types.h> - -#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); -}