mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-14 09:11:27 +00:00
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9445 d57e44dd-8a1f-0410-8b47-8ef2f437770f
843 lines
28 KiB
Bash
843 lines
28 KiB
Bash
#!/bin/bash
|
|
# Shell functions for parsing the Linux kernel version and for downloading
|
|
# from kernel.org.
|
|
|
|
# shellcheck source=./rhel-rpm-functions
|
|
source "$(dirname "$0")/../scripts/rhel-rpm-functions" || return $?
|
|
|
|
kernel_mirror="http://cdn.kernel.org/pub/linux/kernel"
|
|
kernel_downloads="$HOME/software/downloads"
|
|
kernel_tree="$HOME/software/linux-kernel"
|
|
|
|
# Whether or not kernel version $1 is lower than or equal kernel version $2.
|
|
function kernel_version_le {
|
|
awk -v "v1=$1" -v "v2=$2" 'BEGIN { n1 = split(v1, v1a, "."); n2 = split(v2, v2a, "."); for (i=1;;i++) { e1 = i <= n1 ? v1a[i] : 0; e2 = i <= n2 ? v2a[i] : 0; if (e1 < e2 || i > n1 && i > n2) exit 0; if (e1 > e2) exit 1; }}'
|
|
}
|
|
|
|
function kernel_version_lt {
|
|
[ "$1" != "$2" ] && kernel_version_le "$1" "$2"
|
|
}
|
|
|
|
# Kernel version number.
|
|
function kernel_version {
|
|
if [ "${1#2.}" != "$1" ]; then
|
|
echo "$1" | sed -n 's/^\([0-9]*\.[0-9]*\.[0-9]*\).*$/\1/p'
|
|
else
|
|
echo "$1" | sed -n 's/^\([0-9]*\.[0-9]*\).*$/\1/p'
|
|
fi
|
|
}
|
|
|
|
# Last component of the kernel version, or the empty string if $1 does
|
|
# not contain a patchlevel.
|
|
function patchlevel {
|
|
if [ "${1#2.}" != "$1" ]; then
|
|
echo "$1" | sed -n 's/^\([0-9]*\.[0-9]*\.[0-9]*\)[.-]\(.*\)$/\2/p'
|
|
else
|
|
echo "$1" | sed -n 's/^\([0-9]*\.[0-9]*\)[.-]\(.*\)$/\2/p'
|
|
fi
|
|
}
|
|
|
|
# Download the file from URL $1 and save it in the current directory.
|
|
function download_file {
|
|
if [ ! -e "$(basename "$1")" ]; then
|
|
if [ "${quiet_download}" = "false" ]; then
|
|
{ wget -q -nc -O- "$1" 2>/dev/null | grep -q .; } \
|
|
&& echo "Downloading $1 ..."
|
|
fi
|
|
wget -q -nc "$1"
|
|
fi
|
|
[ -e "$(basename "$1")" ]
|
|
}
|
|
|
|
# Make sure the kernel tarball and patch file are present in directory
|
|
# ${kernel_downloads}. Download any missing files from ${kernel_mirror}.
|
|
function download_kernel {
|
|
local kver="$(kernel_version "$1")"
|
|
local plevel="$(patchlevel "$1")"
|
|
local series="$1"
|
|
|
|
case "${series:0:2}" in
|
|
[12].*) series="${series:0:3}";;
|
|
*) series="${series/.*/}.x";;
|
|
esac
|
|
mkdir -p "${kernel_downloads}" || return $?
|
|
test -w "${kernel_downloads}" || return $?
|
|
(
|
|
cd "${kernel_downloads}" || return $?
|
|
if [ "$plevel" = "" ] || [ "$plevel" = "0" ] ||
|
|
download_file "${kernel_mirror}/v$series/patch-$1.xz"
|
|
then
|
|
download_file "${kernel_mirror}/v$series/linux-${kver}.tar.xz" ||
|
|
return $?
|
|
else
|
|
download_file "${kernel_mirror}/v$series/linux-$1.tar.xz" ||
|
|
return $?
|
|
fi
|
|
)
|
|
}
|
|
|
|
function extract_kernel_archive {
|
|
local kver="$(kernel_version "$1")"
|
|
local plevel="$(patchlevel "$1")"
|
|
local series="$1"
|
|
|
|
if [ -e "${kernel_downloads}/linux-$1.tar.xz" ]; then
|
|
xz -cd "${kernel_downloads}/linux-$1.tar.xz" | tar xf -
|
|
elif [ -e "${kernel_downloads}/linux-$kver.tar.xz" ]; then
|
|
xz -cd "${kernel_downloads}/linux-$kver.tar.xz" | tar xf - &&
|
|
mv "linux-$kver" "linux-$1"
|
|
elif [ -e "${kernel_downloads}/linux-$1.tar.bz2" ]; then
|
|
tar xjf "${kernel_downloads}/linux-$1.tar.bz2"
|
|
elif [ -e "${kernel_downloads}/linux-$kver.tar.bz2" ]; then
|
|
tar xjf "${kernel_downloads}/linux-$kver.tar.bz2" &&
|
|
mv "linux-$kver" "linux-$1"
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Create a linux-$1 tree in the current directory, where $1 is a kernel
|
|
# version number with either three or four components.
|
|
function extract_kernel_tree {
|
|
local kver="$(kernel_version "$1")"
|
|
local plevel="$(patchlevel "$1")"
|
|
local tmpdir=kernel-tree-tmp-$$
|
|
|
|
rm -rf "linux-$1" "${tmpdir}"
|
|
mkdir "${tmpdir}" || return $?
|
|
(
|
|
cd "${tmpdir}" || return $?
|
|
if [ "$plevel" != "" ] && [ "$plevel" != "0" ] &&
|
|
[ -e "${kernel_downloads}/patch-$1.xz" ]; then
|
|
extract_kernel_archive "$kver" || return $?
|
|
mv "linux-$kver" "linux-$1"
|
|
( cd "linux-$1" && xz -cd "${kernel_downloads}/patch-$1.xz" \
|
|
| patch -p1 -f -s; ) \
|
|
|| return $?
|
|
else
|
|
extract_kernel_archive "$1" ||
|
|
{ extract_kernel_archive "$kver" && mv "linux-$kver" "linux-$1"; } ||
|
|
return $?
|
|
fi
|
|
mv "linux-$1" .. || return $?
|
|
cd "../linux-$1" || return $?
|
|
) || return $?
|
|
rmdir "${tmpdir}"
|
|
}
|
|
|
|
# Patch a kernel tree where $1 is the kernel version.
|
|
function patch_kernel {
|
|
case "$1" in
|
|
*^*)
|
|
# RHEL / CentOS or UEK.
|
|
;;
|
|
*)
|
|
# See also commit f153b82121b0 ("Sanitize gcc version header
|
|
# includes") # v2.6.29. See also commit 71458cfc782e ("kernel: add
|
|
# support for gcc 5") # v3.18. See also commit cb984d101b30
|
|
# ("compiler-gcc: integrate the various compiler-gcc[345].h
|
|
# files") # v4.2.
|
|
if kernel_version_le 2.6.29 "$1" && kernel_version_lt "$1" 4.2; then
|
|
# Tell the kernel that we are using gcc 4.6 since older kernel
|
|
# versions do not support recent gcc versions. See also commit
|
|
# 9c695203a7dd ("compiler-gcc.h: gcc-4.5 needs noclone and
|
|
# noinline on __naked functions") # v2.6.35.
|
|
if kernel_version_le 2.6.34.2 "$1"; then
|
|
patch -f -s -p1 <<'EOF'
|
|
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
|
|
index 02ae99e8e6d3..47e12c19c965 100644
|
|
--- a/include/linux/compiler-gcc.h
|
|
+++ b/include/linux/compiler-gcc.h
|
|
@@ -103,7 +103,7 @@
|
|
#define __gcc_header(x) #x
|
|
#define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h)
|
|
#define gcc_header(x) _gcc_header(x)
|
|
-#include gcc_header(__GNUC__)
|
|
+#include "linux/compiler-gcc4.h"
|
|
|
|
#if !defined(__noclone)
|
|
#define __noclone /* not needed */
|
|
EOF
|
|
else
|
|
patch -f -s -p1 <<'EOF'
|
|
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
|
|
index a3ed7cb8ca34..c5a6b8b52db4 100644
|
|
--- a/include/linux/compiler-gcc.h
|
|
+++ b/include/linux/compiler-gcc.h
|
|
@@ -83,4 +83,4 @@
|
|
#define __gcc_header(x) #x
|
|
#define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h)
|
|
#define gcc_header(x) _gcc_header(x)
|
|
-#include gcc_header(__GNUC__)
|
|
+#include "linux/compiler-gcc4.h"
|
|
EOF
|
|
fi
|
|
# See also commit 733ed6e43756 ("compiler-gcc{3,4}.h: Use
|
|
# GCC_VERSION macro") # v3.9.
|
|
if kernel_version_le 3.9 "$1"; then
|
|
patch -f -s -p1 <<'EOF'
|
|
diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h
|
|
index 769e19864632..2ec6c7a11502 100644
|
|
--- a/include/linux/compiler-gcc4.h
|
|
+++ b/include/linux/compiler-gcc4.h
|
|
@@ -2,13 +2,6 @@
|
|
#error "Please don't include <linux/compiler-gcc4.h> directly, include <linux/compiler.h> instead."
|
|
#endif
|
|
|
|
-/* GCC 4.1.[01] miscompiles __weak */
|
|
-#ifdef __KERNEL__
|
|
-# if GCC_VERSION >= 40100 && GCC_VERSION <= 40101
|
|
-# error Your version of gcc miscompiles the __weak directive
|
|
-# endif
|
|
-#endif
|
|
-
|
|
#define __used __attribute__((__used__))
|
|
#define __must_check __attribute__((warn_unused_result))
|
|
#define __compiler_offsetof(a,b) __builtin_offsetof(a,b)
|
|
EOF
|
|
else
|
|
patch -f -s -p1 <<'EOF'
|
|
diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h
|
|
index 412bc6c2b023..901ca31be7f8 100644
|
|
--- a/include/linux/compiler-gcc4.h
|
|
+++ b/include/linux/compiler-gcc4.h
|
|
@@ -2,13 +2,6 @@
|
|
#error "Please don't include <linux/compiler-gcc4.h> directly, include <linux/compiler.h> instead."
|
|
#endif
|
|
|
|
-/* GCC 4.1.[01] miscompiles __weak */
|
|
-#ifdef __KERNEL__
|
|
-# if __GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ <= 1
|
|
-# error Your version of gcc miscompiles the __weak directive
|
|
-# endif
|
|
-#endif
|
|
-
|
|
#define __used __attribute__((__used__))
|
|
#define __must_check __attribute__((warn_unused_result))
|
|
#define __compiler_offsetof(a,b) __builtin_offsetof(a,b)
|
|
EOF
|
|
fi
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
if [ "${1#2.6.31}" != "$1" ]; then
|
|
patch -f -s -p1 <<'EOF'
|
|
Checking a 2.6.31.1 kernel configured with allyesconfig/allmodconfig
|
|
with sparse (make C=2) triggers a sparse warning on code that uses the
|
|
kmemcheck_annotate_bitfield() macro. An example of such a warning:
|
|
|
|
include/net/inet_sock.h:208:17: warning: do-while statement is not a compound statement
|
|
|
|
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
|
|
Cc: Vegard Nossum <vegardno@ifi.uio.no>
|
|
Cc: Andrew Morton <akpm@linux-foundation.org>
|
|
|
|
---
|
|
See also http://lkml.org/lkml/2009/9/26/51
|
|
|
|
--- linux-2.6.31.1/include/linux/kmemcheck-orig.h 2009-09-26 13:53:44.000000000 +0200
|
|
+++ linux-2.6.31.1/include/linux/kmemcheck.h 2009-09-26 13:53:56.000000000 +0200
|
|
@@ -137,13 +137,13 @@ static inline void kmemcheck_mark_initia
|
|
int name##_end[0];
|
|
|
|
#define kmemcheck_annotate_bitfield(ptr, name) \
|
|
- do if (ptr) { \
|
|
+ do { if (ptr) { \
|
|
int _n = (long) &((ptr)->name##_end) \
|
|
- (long) &((ptr)->name##_begin); \
|
|
BUILD_BUG_ON(_n < 0); \
|
|
\
|
|
kmemcheck_mark_initialized(&((ptr)->name##_begin), _n); \
|
|
- } while (0)
|
|
+ } } while (0)
|
|
|
|
#define kmemcheck_annotate_variable(var) \
|
|
do { \
|
|
EOF
|
|
fi
|
|
if [ "${1#2.6.32}" != "$1" ] || [ "${1#2.6.33}" != "$1" ]
|
|
then
|
|
patch -f -s -p1 <<'EOF'
|
|
Get rid of sparse errors on sk_buff.protocol.
|
|
|
|
--- linux/include/linux/skbuff-orig.h 2010-12-07 13:40:51.000000000 -0500
|
|
+++ linux/include/linux/skbuff.h 2010-12-07 13:41:05.000000000 -0500
|
|
@@ -349,8 +349,8 @@ struct sk_buff {
|
|
ipvs_property:1,
|
|
peeked:1,
|
|
nf_trace:1;
|
|
- __be16 protocol:16;
|
|
kmemcheck_bitfield_end(flags1);
|
|
+ __be16 protocol;
|
|
|
|
void (*destructor)(struct sk_buff *skb);
|
|
#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
|
|
EOF
|
|
fi
|
|
|
|
if [ "${1#3.13}" != "$1" ]; then
|
|
if [ "$1" = "3.13" ] || [ "${1#3.13.}" -lt 6 ]; then
|
|
patch -f -s -p1 <<'EOF'
|
|
From 7b4ec8dd7d4ac467e9eee4d49f2c9574d773efbb Mon Sep 17 00:00:00 2001
|
|
From: Johannes Berg <johannes.berg@intel.com>
|
|
Date: Thu, 16 Jan 2014 10:18:48 +1030
|
|
Subject: [PATCH] export: declare ksymtab symbols
|
|
|
|
sparse complains about any __ksymtab symbols with the following:
|
|
|
|
warning: symbol '__ksymtab_...' was not declared. Should it be static?
|
|
|
|
due to Andi's patch making it non-static.
|
|
|
|
Mollify sparse by declaring the symbol extern, otherwise we get
|
|
drowned in sparse warnings for anything that uses EXPORT_SYMBOL
|
|
in the sources, making it easy to miss real warnings.
|
|
|
|
Fixes: e0f244c63fc9 ("asmlinkage, module: Make ksymtab [...] __visible")
|
|
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|
Acked-by: Andi Kleen <ak@linux.intel.com>
|
|
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
|
|
---
|
|
include/linux/export.h | 1 +
|
|
1 file changed, 1 insertion(+)
|
|
|
|
diff --git a/include/linux/export.h b/include/linux/export.h
|
|
index 3f2793d..96e45ea 100644
|
|
--- a/include/linux/export.h
|
|
+++ b/include/linux/export.h
|
|
@@ -59,6 +59,7 @@ extern struct module __this_module;
|
|
static const char __kstrtab_##sym[] \
|
|
__attribute__((section("__ksymtab_strings"), aligned(1))) \
|
|
= VMLINUX_SYMBOL_STR(sym); \
|
|
+ extern const struct kernel_symbol __ksymtab_##sym; \
|
|
__visible const struct kernel_symbol __ksymtab_##sym \
|
|
__used \
|
|
__attribute__((section("___ksymtab" sec "+" #sym), unused)) \
|
|
EOF
|
|
fi
|
|
fi
|
|
|
|
if [ "${1#4.15}" != "$1" ]; then
|
|
patch -f -s -p1 <<'EOF'
|
|
From ad343a98e74e85aa91d844310e797f96fee6983b Mon Sep 17 00:00:00 2001
|
|
From: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
|
|
Date: Tue, 6 Feb 2018 15:37:52 -0800
|
|
Subject: [PATCH] tools/lib/subcmd/pager.c: do not alias select() params
|
|
|
|
Use a separate fd set for select()-s exception fds param to fix the
|
|
following gcc warning:
|
|
|
|
pager.c:36:12: error: passing argument 2 to restrict-qualified parameter aliases with argument 4 [-Werror=restrict]
|
|
select(1, &in, NULL, &in, NULL);
|
|
^~~ ~~~
|
|
|
|
Link: http://lkml.kernel.org/r/20180101105626.7168-1-sergey.senozhatsky@gmail.com
|
|
Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
|
|
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
|
|
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
|
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
|
---
|
|
tools/lib/subcmd/pager.c | 5 ++++-
|
|
1 file changed, 4 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/tools/lib/subcmd/pager.c b/tools/lib/subcmd/pager.c
|
|
index 5ba754d17952..9997a8805a82 100644
|
|
--- a/tools/lib/subcmd/pager.c
|
|
+++ b/tools/lib/subcmd/pager.c
|
|
@@ -30,10 +30,13 @@ static void pager_preexec(void)
|
|
* have real input
|
|
*/
|
|
fd_set in;
|
|
+ fd_set exception;
|
|
|
|
FD_ZERO(&in);
|
|
+ FD_ZERO(&exception);
|
|
FD_SET(0, &in);
|
|
- select(1, &in, NULL, &in, NULL);
|
|
+ FD_SET(0, &exception);
|
|
+ select(1, &in, NULL, &exception, NULL);
|
|
|
|
setenv("LESS", "FRSX", 0);
|
|
}
|
|
EOF
|
|
patch -f -s -p1 <<'EOF'
|
|
From 854e55ad289ef8888e7991f0ada85d5846f5afb9 Mon Sep 17 00:00:00 2001
|
|
From: Josh Poimboeuf <jpoimboe@redhat.com>
|
|
Date: Thu, 15 Mar 2018 22:11:54 -0500
|
|
Subject: [PATCH] objtool, perf: Fix GCC 8 -Wrestrict error
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Starting with recent GCC 8 builds, objtool and perf fail to build with
|
|
the following error:
|
|
|
|
../str_error_r.c: In function 'str_error_r':
|
|
../str_error_r.c:25:3: error: passing argument 1 to restrict-qualified parameter aliases with argument 5 [-Werror=restrict]
|
|
snprintf(buf, buflen, "INTERNAL ERROR: strerror_r(%d, %p, %zd)=%d", errnum, buf, buflen, err);
|
|
|
|
The code seems harmless, but there's probably no benefit in printing the
|
|
'buf' pointer in this situation anyway, so just remove it to make GCC
|
|
happy.
|
|
|
|
Reported-by: Laura Abbott <labbott@redhat.com>
|
|
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
|
|
Tested-by: Laura Abbott <labbott@redhat.com>
|
|
Cc: Adrian Hunter <adrian.hunter@intel.com>
|
|
Cc: Jiri Olsa <jolsa@kernel.org>
|
|
Cc: Namhyung Kim <namhyung@kernel.org>
|
|
Cc: Wang Nan <wangnan0@huawei.com>
|
|
Link: http://lkml.kernel.org/r/20180316031154.juk2uncs7baffctp@treble
|
|
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
|
|
---
|
|
tools/lib/str_error_r.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/tools/lib/str_error_r.c b/tools/lib/str_error_r.c
|
|
index d6d65537b0d9..6aad8308a0ac 100644
|
|
--- a/tools/lib/str_error_r.c
|
|
+++ b/tools/lib/str_error_r.c
|
|
@@ -22,6 +22,6 @@ char *str_error_r(int errnum, char *buf, size_t buflen)
|
|
{
|
|
int err = strerror_r(errnum, buf, buflen);
|
|
if (err)
|
|
- snprintf(buf, buflen, "INTERNAL ERROR: strerror_r(%d, %p, %zd)=%d", errnum, buf, buflen, err);
|
|
+ snprintf(buf, buflen, "INTERNAL ERROR: strerror_r(%d, [buf], %zd)=%d", errnum, buflen, err);
|
|
return buf;
|
|
}
|
|
EOF
|
|
fi
|
|
|
|
if kernel_version_le 2.6.36 "$1" && kernel_version_lt "$1" 4.8; then
|
|
patch -f -s -p1 <<'EOF'
|
|
From c6a385539175ebc603da53aafb7753d39089f32e Mon Sep 17 00:00:00 2001
|
|
From: Borislav Petkov <bp@suse.de>
|
|
Date: Mon, 14 Nov 2016 19:41:31 +0100
|
|
Subject: [PATCH] kbuild: Steal gcc's pie from the very beginning
|
|
|
|
So Sebastian turned off the PIE for kernel builds but that was too late
|
|
- Kbuild.include already uses KBUILD_CFLAGS and trying to disable gcc
|
|
options with, say cc-disable-warning, fails:
|
|
|
|
gcc -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs
|
|
...
|
|
-Wno-sign-compare -fno-asynchronous-unwind-tables -Wframe-address -c -x c /dev/null -o .31392.tmp
|
|
/dev/null:1:0: error: code model kernel does not support PIC mode
|
|
|
|
because that returns an error and we can't disable the warning. For
|
|
example in this case:
|
|
|
|
KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,)
|
|
|
|
which leads to gcc issuing all those warnings again.
|
|
|
|
So let's turn off PIE/PIC at the earliest possible moment, when we
|
|
declare KBUILD_CFLAGS so that cc-disable-warning picks it up too.
|
|
|
|
Also, we need the $(call cc-option ...) because -fno-PIE is supported
|
|
since gcc v3.4 and our lowest supported gcc version is 3.2 right now.
|
|
|
|
Signed-off-by: Borislav Petkov <bp@suse.de>
|
|
Cc: stable@vger.kernel.org
|
|
Cc: Ben Hutchings <ben@decadent.org.uk>
|
|
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
Signed-off-by: Michal Marek <mmarek@suse.com>
|
|
[ bvanassche: moved -fno-PIE to start of KBUILD_CFLAGS ]
|
|
---
|
|
Makefile | 7 +++----
|
|
1 file changed, 3 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/Makefile b/Makefile
|
|
index 0ed6ce300543..c324b43712f0 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -378,7 +378,8 @@ LINUXINCLUDE := \
|
|
|
|
KBUILD_CPPFLAGS := -D__KERNEL__
|
|
|
|
-KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
|
+KBUILD_CFLAGS := $(call cc-option,-fno-PIE) \
|
|
+ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
|
-fno-strict-aliasing -fno-common \
|
|
-Werror-implicit-function-declaration \
|
|
-Wno-format-security \
|
|
@@ -387,7 +388,7 @@ KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
|
|
|
KBUILD_AFLAGS_KERNEL :=
|
|
KBUILD_CFLAGS_KERNEL :=
|
|
-KBUILD_AFLAGS := -D__ASSEMBLY__
|
|
+KBUILD_AFLAGS := -D__ASSEMBLY__ $(call cc-option,-fno-PIE)
|
|
KBUILD_AFLAGS_MODULE := -DMODULE
|
|
KBUILD_CFLAGS_MODULE := -DMODULE
|
|
KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds
|
|
EOF
|
|
else
|
|
case "$1" in
|
|
# CentOS 6.x.
|
|
2.6.32-*)
|
|
patch -f -s -p1 <<'EOF'
|
|
--- linux-2.6.32-754.29.1.el6/Makefile.orig 2020-05-13 14:09:18.448503420 -0700
|
|
+++ linux-2.6.32-754.29.1.el6/Makefile 2020-05-13 14:11:24.265441790 -0700
|
|
@@ -355,7 +355,8 @@
|
|
|
|
KBUILD_CPPFLAGS := -D__KERNEL__
|
|
|
|
-KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
|
+KBUILD_CFLAGS := $(call cc-option,-fno-PIE) \
|
|
+ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
|
-fno-strict-aliasing -fno-common \
|
|
-Werror-implicit-function-declaration \
|
|
-Wno-format-security \
|
|
@@ -380,7 +381,7 @@
|
|
endif ##($(KBUILD_EXTMOD),)
|
|
endif #(,$(filter $(ARCH), i386 x86_64))
|
|
|
|
-KBUILD_AFLAGS := -D__ASSEMBLY__
|
|
+KBUILD_AFLAGS := -D__ASSEMBLY__ $(call cc-option,-fno-PIE)
|
|
|
|
# Read KERNELRELEASE from include/config/kernel.release (if it exists)
|
|
KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
|
|
EOF
|
|
;;
|
|
2.6.3[1-5]*)
|
|
patch -f -s -p1 <<'EOF'
|
|
diff --git a/Makefile b/Makefile
|
|
index 141da26fda4b..343ec388ae2e 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -349,12 +349,13 @@ LINUXINCLUDE := -I$(srctree)/arch/$(hdr-arch)/include -Iinclude \
|
|
|
|
KBUILD_CPPFLAGS := -D__KERNEL__
|
|
|
|
-KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
|
+KBUILD_CFLAGS := $(call cc-option,-fno-PIE) \
|
|
+ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
|
-fno-strict-aliasing -fno-common \
|
|
-Werror-implicit-function-declaration \
|
|
-Wno-format-security \
|
|
-fno-delete-null-pointer-checks
|
|
-KBUILD_AFLAGS := -D__ASSEMBLY__
|
|
+KBUILD_AFLAGS := -D__ASSEMBLY__ $(call cc-option,-fno-PIE)
|
|
|
|
# Read KERNELRELEASE from include/config/kernel.release (if it exists)
|
|
KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
|
|
EOF
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
case "$1" in
|
|
4.18.0-*) # CentOS 8.x
|
|
patch -f -s -p1 <<'EOF'
|
|
From a6e60d84989fa0e91db7f236eda40453b0e44afa Mon Sep 17 00:00:00 2001
|
|
From: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
|
|
Date: Sat, 19 Jan 2019 20:59:34 +0100
|
|
Subject: [PATCH] include/linux/module.h: copy __init/__exit attrs to
|
|
init/cleanup_module
|
|
|
|
The upcoming GCC 9 release extends the -Wmissing-attributes warnings
|
|
(enabled by -Wall) to C and aliases: it warns when particular function
|
|
attributes are missing in the aliases but not in their target.
|
|
|
|
In particular, it triggers for all the init/cleanup_module
|
|
aliases in the kernel (defined by the module_init/exit macros),
|
|
ending up being very noisy.
|
|
|
|
These aliases point to the __init/__exit functions of a module,
|
|
which are defined as __cold (among other attributes). However,
|
|
the aliases themselves do not have the __cold attribute.
|
|
|
|
Since the compiler behaves differently when compiling a __cold
|
|
function as well as when compiling paths leading to calls
|
|
to __cold functions, the warning is trying to point out
|
|
the possibly-forgotten attribute in the alias.
|
|
|
|
In order to keep the warning enabled, we decided to silence
|
|
this case. Ideally, we would mark the aliases directly
|
|
as __init/__exit. However, there are currently around 132 modules
|
|
in the kernel which are missing __init/__exit in their init/cleanup
|
|
functions (either because they are missing, or for other reasons,
|
|
e.g. the functions being called from somewhere else); and
|
|
a section mismatch is a hard error.
|
|
|
|
A conservative alternative was to mark the aliases as __cold only.
|
|
However, since we would like to eventually enforce __init/__exit
|
|
to be always marked, we chose to use the new __copy function
|
|
attribute (introduced by GCC 9 as well to deal with this).
|
|
With it, we copy the attributes used by the target functions
|
|
into the aliases. This way, functions that were not marked
|
|
as __init/__exit won't have their aliases marked either,
|
|
and therefore there won't be a section mismatch.
|
|
|
|
Note that the warning would go away marking either the extern
|
|
declaration, the definition, or both. However, we only mark
|
|
the definition of the alias, since we do not want callers
|
|
(which only see the declaration) to be compiled as if the function
|
|
was __cold (and therefore the paths leading to those calls
|
|
would be assumed to be unlikely).
|
|
|
|
Link: https://lore.kernel.org/lkml/20190123173707.GA16603@gmail.com/
|
|
Link: https://lore.kernel.org/lkml/20190206175627.GA20399@gmail.com/
|
|
Suggested-by: Martin Sebor <msebor@gcc.gnu.org>
|
|
Acked-by: Jessica Yu <jeyu@kernel.org>
|
|
Signed-off-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>
|
|
---
|
|
include/linux/module.h | 4 ++--
|
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/include/linux/module.h b/include/linux/module.h
|
|
index 8fa38d3e7538..f5bc4c046461 100644
|
|
--- a/include/linux/module.h
|
|
+++ b/include/linux/module.h
|
|
@@ -129,13 +129,13 @@ extern void cleanup_module(void);
|
|
#define module_init(initfn) \
|
|
static inline initcall_t __maybe_unused __inittest(void) \
|
|
{ return initfn; } \
|
|
- int init_module(void) __attribute__((alias(#initfn)));
|
|
+ int init_module(void) __attribute__((__copy__(initfn))) __attribute__((alias(#initfn)));
|
|
|
|
/* This is only required if you want to be unloadable. */
|
|
#define module_exit(exitfn) \
|
|
static inline exitcall_t __maybe_unused __exittest(void) \
|
|
{ return exitfn; } \
|
|
- void cleanup_module(void) __attribute__((alias(#exitfn)));
|
|
+ void cleanup_module(void) __attribute__((__copy__(exitfn))) __attribute__((alias(#exitfn)));
|
|
|
|
#endif
|
|
|
|
EOF
|
|
;;
|
|
2.*|3.*)
|
|
patch -f -s -p1 <<'EOF'
|
|
--- linux-3.10.0-1127.el7/include/linux/init.h.orig 2020-05-09 20:55:48.638956513 -0700
|
|
+++ linux-3.10.0-1127.el7/include/linux/init.h 2020-05-09 20:56:46.947612445 -0700
|
|
@@ -309,13 +309,15 @@
|
|
#define module_init(initfn) \
|
|
static inline initcall_t __inittest(void) \
|
|
{ return initfn; } \
|
|
- int init_module(void) __attribute__((alias(#initfn)));
|
|
+ int init_module(void) __attribute__((__copy__(initfn))) \
|
|
+ __attribute__((alias(#initfn)));
|
|
|
|
/* This is only required if you want to be unloadable. */
|
|
#define module_exit(exitfn) \
|
|
static inline exitcall_t __exittest(void) \
|
|
{ return exitfn; } \
|
|
- void cleanup_module(void) __attribute__((alias(#exitfn)));
|
|
+ void cleanup_module(void) __attribute__((__copy__(exitfn)))\
|
|
+ __attribute__((alias(#exitfn)));
|
|
|
|
#define __setup_param(str, unique_id, fn) /* nothing */
|
|
#define __setup(str, func) /* nothing */
|
|
EOF
|
|
;;
|
|
esac
|
|
|
|
if kernel_version_le 3.2 "$1" && kernel_version_lt "$1" 3.18; then
|
|
patch -f -s -p1 <<'EOF'
|
|
From eeeda4cd06e828b331b15741a204ff9f5874d28d Mon Sep 17 00:00:00 2001
|
|
From: Ben Hutchings <ben@decadent.org.uk>
|
|
Date: Wed, 24 Sep 2014 13:30:12 +0100
|
|
Subject: [PATCH] x86/relocs: Make per_cpu_load_addr static
|
|
|
|
per_cpu_load_addr is only used for 64-bit relocations, but is
|
|
declared in both configurations of relocs.c - with different
|
|
types. This has undefined behaviour in general. GNU ld is
|
|
documented to use the larger size in this case, but other tools
|
|
may differ and some warn about this.
|
|
|
|
References: https://bugs.debian.org/748577
|
|
Reported-by: Michael Tautschnig <mt@debian.org>
|
|
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
|
Cc: 748577@bugs.debian.org
|
|
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
|
Link: http://lkml.kernel.org/r/1411561812.3659.23.camel@decadent.org.uk
|
|
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
|
---
|
|
arch/x86/tools/relocs.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c
|
|
index bbb1d2259ecf..a5efb21d5228 100644
|
|
--- a/arch/x86/tools/relocs.c
|
|
+++ b/arch/x86/tools/relocs.c
|
|
@@ -695,7 +695,7 @@ static void walk_relocs(int (*process)(struct section *sec, Elf_Rel *rel,
|
|
*
|
|
*/
|
|
static int per_cpu_shndx = -1;
|
|
-Elf_Addr per_cpu_load_addr;
|
|
+static Elf_Addr per_cpu_load_addr;
|
|
|
|
static void percpu_init(void)
|
|
{
|
|
EOF
|
|
fi
|
|
|
|
# See also commit e33a814e772c ("scripts/dtc: Remove redundant YYLOC global
|
|
# declaration") # v5.6~10^2.
|
|
if kernel_version_le 2.6.38 "$1" && kernel_version_lt "$1" 5.6; then
|
|
patch -p1 -f -s <<'EOF'
|
|
From e33a814e772cdc36436c8c188d8c42d019fda639 Mon Sep 17 00:00:00 2001
|
|
From: Dirk Mueller <dmueller@suse.com>
|
|
Date: Tue, 14 Jan 2020 18:53:41 +0100
|
|
Subject: [PATCH] scripts/dtc: Remove redundant YYLOC global declaration
|
|
|
|
gcc 10 will default to -fno-common, which causes this error at link
|
|
time:
|
|
|
|
(.text+0x0): multiple definition of `yylloc'; dtc-lexer.lex.o (symbol from plugin):(.text+0x0): first defined here
|
|
|
|
This is because both dtc-lexer as well as dtc-parser define the same
|
|
global symbol yyloc. Before with -fcommon those were merged into one
|
|
defintion. The proper solution would be to mark this as "extern",
|
|
however that leads to:
|
|
|
|
dtc-lexer.l:26:16: error: redundant redeclaration of 'yylloc' [-Werror=redundant-decls]
|
|
26 | extern YYLTYPE yylloc;
|
|
| ^~~~~~
|
|
In file included from dtc-lexer.l:24:
|
|
dtc-parser.tab.h:127:16: note: previous declaration of 'yylloc' was here
|
|
127 | extern YYLTYPE yylloc;
|
|
| ^~~~~~
|
|
cc1: all warnings being treated as errors
|
|
|
|
which means the declaration is completely redundant and can just be
|
|
dropped.
|
|
|
|
Signed-off-by: Dirk Mueller <dmueller@suse.com>
|
|
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
|
|
[robh: cherry-pick from upstream]
|
|
Cc: stable@vger.kernel.org
|
|
Signed-off-by: Rob Herring <robh@kernel.org>
|
|
---
|
|
scripts/dtc/dtc-lexer.l | 1 -
|
|
1 file changed, 1 deletion(-)
|
|
|
|
diff --git a/scripts/dtc/dtc-lexer.l b/scripts/dtc/dtc-lexer.l
|
|
index 5c6c3fd557d7..b3b7270300de 100644
|
|
--- a/scripts/dtc/dtc-lexer.l
|
|
+++ b/scripts/dtc/dtc-lexer.l
|
|
@@ -23,7 +23,6 @@ LINECOMMENT "//".*\n
|
|
#include "srcpos.h"
|
|
#include "dtc-parser.tab.h"
|
|
|
|
-YYLTYPE yylloc;
|
|
extern bool treesource_error;
|
|
|
|
/* CAUTION: this will stop working if we ever use yyless() or yyunput() */
|
|
diff --git a/scripts/dtc/dtc-lexer.lex.c_shipped b/scripts/dtc/dtc-lexer.lex.c_shipped
|
|
index 5c6c3fd557d7..b3b7270300de 100644
|
|
--- a/scripts/dtc/dtc-lexer.lex.c_shipped
|
|
+++ b/scripts/dtc/dtc-lexer.lex.c_shipped
|
|
@@ -23,7 +23,6 @@ LINECOMMENT "//".*\n
|
|
#include "srcpos.h"
|
|
#include "dtc-parser.tab.h"
|
|
|
|
-YYLTYPE yylloc;
|
|
extern bool treesource_error;
|
|
|
|
/* CAUTION: this will stop working if we ever use yyless() or yyunput() */
|
|
EOF
|
|
fi
|
|
|
|
# Use sed to patch the ____ilog2_NaN() prototype.
|
|
sed -i 's/__attribute__((const, noreturn))/__attribute__((noreturn))/' \
|
|
include/linux/log2.h tools/include/linux/log2.h 2>/dev/null
|
|
|
|
# After patch-v4.14.1[12] has been applied, the execute bit has to be
|
|
# set for sync-check.sh since patch can't do that.
|
|
for f in "tools/objtool/sync-check.sh"; do
|
|
if [ -e "$f" ]; then
|
|
chmod a+x "$f"
|
|
fi
|
|
done
|
|
}
|
|
|
|
function download_and_extract_distro_rpm {
|
|
[ -n "$1" ] || return $?
|
|
set -- ${1//^/ }
|
|
local kver=$1
|
|
local distro=$2
|
|
local release=$3
|
|
(
|
|
cd "${kernel_downloads}" || exit $?
|
|
read -a urls -r <<<"$(get_srpm_urls "$distro" "$release" x86_64 |
|
|
tr '\n' ' ')"
|
|
for url in "${urls[@]}"; do
|
|
case "$distro" in
|
|
CentOS)
|
|
wget -q -nc "${url}/kernel-${kver}.src.rpm" && break
|
|
;;
|
|
UEK)
|
|
wget -q -nc "${url}/kernel-uek-${kver}.src.rpm" && break
|
|
;;
|
|
esac
|
|
done
|
|
)
|
|
local tmpdir=kernel-tree-tmp-$$
|
|
rm -rf "linux-$1" "${tmpdir}"
|
|
mkdir "${tmpdir}" || return $?
|
|
(
|
|
cd "${tmpdir}" &&
|
|
case "$distro" in
|
|
CentOS)
|
|
rpm2cpio "${kernel_downloads}/kernel-${kver}.src.rpm" |
|
|
cpio -i --make-directories --quiet &&
|
|
tar xaf "linux-${kver}"*.tar.* &&
|
|
mv "linux-${kver}"*[^z] "../linux-${kver}"
|
|
;;
|
|
UEK)
|
|
rpm2cpio "${kernel_downloads}/kernel-uek-${kver}.src.rpm" |
|
|
cpio -i --make-directories --quiet &&
|
|
tar xaf "linux-${kver/-*}.tar."* &&
|
|
mv "linux-${kver/-*}" "../linux-${kver}"
|
|
;;
|
|
*)
|
|
echo "Error: unknown distro $distro"
|
|
;;
|
|
esac
|
|
) || return $?
|
|
rm -rf "${tmpdir}"
|
|
}
|
|
|
|
function download_and_extract_kernel_tree {
|
|
if [ "${1/^}" = "$1" ]; then
|
|
# Upstream kernel.
|
|
if [ -e "${kernel_tree}" ]; then
|
|
# If a git kernel tree is available, obtain the kernel source code
|
|
# from that git tree.
|
|
(
|
|
cd "${kernel_tree}" &&
|
|
{
|
|
{ git tag -l "v$1" | grep -q '^v'; } ||
|
|
{
|
|
echo "Could not find tag v$1;" \
|
|
"updating git repository" 1>&2
|
|
git fetch origin
|
|
git fetch stable
|
|
}
|
|
} &&
|
|
{ git tag -l "v$1" | grep -q '^v'; } &&
|
|
git archive "v$1"
|
|
) | {
|
|
rm -rf "linux-$1" &&
|
|
mkdir "linux-$1" &&
|
|
tar -C "linux-$1" -xf- 2>/dev/null
|
|
}
|
|
else
|
|
# Otherwise download a source code tar file and extract it.
|
|
download_kernel "$1" && extract_kernel_tree "$1"
|
|
fi
|
|
else
|
|
# Distro kernel.
|
|
download_and_extract_distro_rpm "$1"
|
|
fi &&
|
|
(cd "linux-${1/^*}" && patch_kernel "${1/^*}")
|
|
}
|
|
|
|
# For shellcheck
|
|
if false; then
|
|
quiet_download=true
|
|
fi
|