diff --git a/packages/kernel/0008-Provide-in-kernel-headers-to-make-extending-kernel-e.patch b/packages/kernel/0008-Provide-in-kernel-headers-to-make-extending-kernel-e.patch new file mode 100644 index 00000000000..c2aa41bb6d3 --- /dev/null +++ b/packages/kernel/0008-Provide-in-kernel-headers-to-make-extending-kernel-e.patch @@ -0,0 +1,294 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: "Joel Fernandes (Google)" +Date: Fri, 26 Apr 2019 15:04:29 -0400 +Subject: [PATCH 1/6] Provide in-kernel headers to make extending kernel easier + +Introduce in-kernel headers which are made available as an archive +through proc (/proc/kheaders.tar.xz file). This archive makes it +possible to run eBPF and other tracing programs that need to extend the +kernel for tracing purposes without any dependency on the file system +having headers. + +A github PR is sent for the corresponding BCC patch at: +https://github.com/iovisor/bcc/pull/2312 + +On Android and embedded systems, it is common to switch kernels but not +have kernel headers available on the file system. Further once a +different kernel is booted, any headers stored on the file system will +no longer be useful. This is an issue even well known to distros. +By storing the headers as a compressed archive within the kernel, we can +avoid these issues that have been a hindrance for a long time. + +The best way to use this feature is by building it in. Several users +have a need for this, when they switch debug kernels, they do not want to +update the filesystem or worry about it where to store the headers on +it. However, the feature is also buildable as a module in case the user +desires it not being part of the kernel image. This makes it possible to +load and unload the headers from memory on demand. A tracing program can +load the module, do its operations, and then unload the module to save +kernel memory. The total memory needed is 3.3MB. + +By having the archive available at a fixed location independent of +filesystem dependencies and conventions, all debugging tools can +directly refer to the fixed location for the archive, without concerning +with where the headers on a typical filesystem which significantly +simplifies tooling that needs kernel headers. + +The code to read the headers is based on /proc/config.gz code and uses +the same technique to embed the headers. + +Other approaches were discussed such as having an in-memory mountable +filesystem, but that has drawbacks such as requiring an in-kernel xz +decompressor which we don't have today, and requiring usage of 42 MB of +kernel memory to host the decompressed headers at anytime. Also this +approach is simpler than such approaches. + +Reviewed-by: Masahiro Yamada +Signed-off-by: Joel Fernandes (Google) +Signed-off-by: Greg Kroah-Hartman +(cherry picked from commit 43d8ce9d65a54846d378545770991e65838981e0) +--- + init/Kconfig | 10 +++++ + kernel/.gitignore | 1 + + kernel/Makefile | 10 +++++ + kernel/gen_ikh_data.sh | 89 ++++++++++++++++++++++++++++++++++++++++++ + kernel/kheaders.c | 74 +++++++++++++++++++++++++++++++++++ + 5 files changed, 184 insertions(+) + create mode 100755 kernel/gen_ikh_data.sh + create mode 100644 kernel/kheaders.c + +diff --git a/init/Kconfig b/init/Kconfig +index 47035b5a46f6..1b52fbedbfdb 100644 +--- a/init/Kconfig ++++ b/init/Kconfig +@@ -533,6 +533,16 @@ config IKCONFIG_PROC + This option enables access to the kernel configuration file + through /proc/config.gz. + ++config IKHEADERS_PROC ++ tristate "Enable kernel header artifacts through /proc/kheaders.tar.xz" ++ depends on PROC_FS ++ help ++ This option enables access to the kernel header and other artifacts that ++ are generated during the build process. These can be used to build eBPF ++ tracing programs, or similar programs. If you build the headers as a ++ module, a module called kheaders.ko is built which can be loaded on-demand ++ to get access to the headers. ++ + config LOG_BUF_SHIFT + int "Kernel log buffer size (16 => 64KB, 17 => 128KB)" + range 12 25 +diff --git a/kernel/.gitignore b/kernel/.gitignore +index b3097bde4e9c..084572ac1290 100644 +--- a/kernel/.gitignore ++++ b/kernel/.gitignore +@@ -3,5 +3,6 @@ + # + config_data.h + config_data.gz ++kheaders.md5 + timeconst.h + hz.bc +diff --git a/kernel/Makefile b/kernel/Makefile +index df5e3ca30acd..d8e581bed66f 100644 +--- a/kernel/Makefile ++++ b/kernel/Makefile +@@ -74,6 +74,7 @@ obj-$(CONFIG_UTS_NS) += utsname.o + obj-$(CONFIG_USER_NS) += user_namespace.o + obj-$(CONFIG_PID_NS) += pid_namespace.o + obj-$(CONFIG_IKCONFIG) += configs.o ++obj-$(CONFIG_IKHEADERS_PROC) += kheaders.o + obj-$(CONFIG_SMP) += stop_machine.o + obj-$(CONFIG_KPROBES_SANITY_TEST) += test_kprobes.o + obj-$(CONFIG_AUDIT) += audit.o auditfilter.o +@@ -128,3 +129,12 @@ $(obj)/config_data.gz: $(KCONFIG_CONFIG) FORCE + targets += config_data.h + $(obj)/config_data.h: $(obj)/config_data.gz FORCE + $(call filechk,ikconfiggz) ++ ++$(obj)/kheaders.o: $(obj)/kheaders_data.tar.xz ++ ++quiet_cmd_genikh = CHK $(obj)/kheaders_data.tar.xz ++cmd_genikh = $(srctree)/kernel/gen_ikh_data.sh $@ ++$(obj)/kheaders_data.tar.xz: FORCE ++ $(call cmd,genikh) ++ ++clean-files := kheaders_data.tar.xz kheaders.md5 +diff --git a/kernel/gen_ikh_data.sh b/kernel/gen_ikh_data.sh +new file mode 100755 +index 000000000000..591a94f7b387 +--- /dev/null ++++ b/kernel/gen_ikh_data.sh +@@ -0,0 +1,89 @@ ++#!/bin/bash ++# SPDX-License-Identifier: GPL-2.0 ++ ++# This script generates an archive consisting of kernel headers ++# for CONFIG_IKHEADERS_PROC. ++set -e ++spath="$(dirname "$(readlink -f "$0")")" ++kroot="$spath/.." ++outdir="$(pwd)" ++tarfile=$1 ++cpio_dir=$outdir/$tarfile.tmp ++ ++# Script filename relative to the kernel source root ++# We add it to the archive because it is small and any changes ++# to this script will also cause a rebuild of the archive. ++sfile="$(realpath --relative-to $kroot "$(readlink -f "$0")")" ++ ++src_file_list=" ++include/ ++arch/$SRCARCH/include/ ++$sfile ++" ++ ++obj_file_list=" ++include/ ++arch/$SRCARCH/include/ ++" ++ ++# Support incremental builds by skipping archive generation ++# if timestamps of files being archived are not changed. ++ ++# This block is useful for debugging the incremental builds. ++# Uncomment it for debugging. ++# iter=1 ++# if [ ! -f /tmp/iter ]; then echo 1 > /tmp/iter; ++# else; iter=$(($(cat /tmp/iter) + 1)); fi ++# find $src_file_list -type f | xargs ls -lR > /tmp/src-ls-$iter ++# find $obj_file_list -type f | xargs ls -lR > /tmp/obj-ls-$iter ++ ++# include/generated/compile.h is ignored because it is touched even when none ++# of the source files changed. This causes pointless regeneration, so let us ++# ignore them for md5 calculation. ++pushd $kroot > /dev/null ++src_files_md5="$(find $src_file_list -type f | ++ grep -v "include/generated/compile.h" | ++ xargs ls -lR | md5sum | cut -d ' ' -f1)" ++popd > /dev/null ++obj_files_md5="$(find $obj_file_list -type f | ++ grep -v "include/generated/compile.h" | ++ xargs ls -lR | md5sum | cut -d ' ' -f1)" ++ ++if [ -f $tarfile ]; then tarfile_md5="$(md5sum $tarfile | cut -d ' ' -f1)"; fi ++if [ -f kernel/kheaders.md5 ] && ++ [ "$(cat kernel/kheaders.md5|head -1)" == "$src_files_md5" ] && ++ [ "$(cat kernel/kheaders.md5|head -2|tail -1)" == "$obj_files_md5" ] && ++ [ "$(cat kernel/kheaders.md5|tail -1)" == "$tarfile_md5" ]; then ++ exit ++fi ++ ++if [ "${quiet}" != "silent_" ]; then ++ echo " GEN $tarfile" ++fi ++ ++rm -rf $cpio_dir ++mkdir $cpio_dir ++ ++pushd $kroot > /dev/null ++for f in $src_file_list; ++ do find "$f" ! -name "*.cmd" ! -name ".*"; ++done | cpio --quiet -pd $cpio_dir ++popd > /dev/null ++ ++# The second CPIO can complain if files already exist which can ++# happen with out of tree builds. Just silence CPIO for now. ++for f in $obj_file_list; ++ do find "$f" ! -name "*.cmd" ! -name ".*"; ++done | cpio --quiet -pd $cpio_dir >/dev/null 2>&1 ++ ++# Remove comments except SDPX lines ++find $cpio_dir -type f -print0 | ++ xargs -0 -P8 -n1 perl -pi -e 'BEGIN {undef $/;}; s/\/\*((?!SPDX).)*?\*\///smg;' ++ ++tar -Jcf $tarfile -C $cpio_dir/ . > /dev/null ++ ++echo "$src_files_md5" > kernel/kheaders.md5 ++echo "$obj_files_md5" >> kernel/kheaders.md5 ++echo "$(md5sum $tarfile | cut -d ' ' -f1)" >> kernel/kheaders.md5 ++ ++rm -rf $cpio_dir +diff --git a/kernel/kheaders.c b/kernel/kheaders.c +new file mode 100644 +index 000000000000..70ae6052920d +--- /dev/null ++++ b/kernel/kheaders.c +@@ -0,0 +1,74 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Provide kernel headers useful to build tracing programs ++ * such as for running eBPF tracing tools. ++ * ++ * (Borrowed code from kernel/configs.c) ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++/* ++ * Define kernel_headers_data and kernel_headers_data_end, within which the ++ * compressed kernel headers are stored. The file is first compressed with xz. ++ */ ++ ++asm ( ++" .pushsection .rodata, \"a\" \n" ++" .global kernel_headers_data \n" ++"kernel_headers_data: \n" ++" .incbin \"kernel/kheaders_data.tar.xz\" \n" ++" .global kernel_headers_data_end \n" ++"kernel_headers_data_end: \n" ++" .popsection \n" ++); ++ ++extern char kernel_headers_data; ++extern char kernel_headers_data_end; ++ ++static ssize_t ++ikheaders_read_current(struct file *file, char __user *buf, ++ size_t len, loff_t *offset) ++{ ++ return simple_read_from_buffer(buf, len, offset, ++ &kernel_headers_data, ++ &kernel_headers_data_end - ++ &kernel_headers_data); ++} ++ ++static const struct file_operations ikheaders_file_ops = { ++ .read = ikheaders_read_current, ++ .llseek = default_llseek, ++}; ++ ++static int __init ikheaders_init(void) ++{ ++ struct proc_dir_entry *entry; ++ ++ /* create the current headers file */ ++ entry = proc_create("kheaders.tar.xz", S_IRUGO, NULL, ++ &ikheaders_file_ops); ++ if (!entry) ++ return -ENOMEM; ++ ++ proc_set_size(entry, ++ &kernel_headers_data_end - ++ &kernel_headers_data); ++ return 0; ++} ++ ++static void __exit ikheaders_cleanup(void) ++{ ++ remove_proc_entry("kheaders.tar.xz", NULL); ++} ++ ++module_init(ikheaders_init); ++module_exit(ikheaders_cleanup); ++ ++MODULE_LICENSE("GPL v2"); ++MODULE_AUTHOR("Joel Fernandes"); ++MODULE_DESCRIPTION("Echo the kernel header artifacts used to build the kernel"); +-- +2.17.1 + diff --git a/packages/kernel/0009-kernel-Makefile-don-t-assume-that-kernel-gen_ikh_dat.patch b/packages/kernel/0009-kernel-Makefile-don-t-assume-that-kernel-gen_ikh_dat.patch new file mode 100644 index 00000000000..f76c1a86f62 --- /dev/null +++ b/packages/kernel/0009-kernel-Makefile-don-t-assume-that-kernel-gen_ikh_dat.patch @@ -0,0 +1,36 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Andrew Morton +Date: Tue, 14 May 2019 15:40:43 -0700 +Subject: [PATCH 2/6] kernel/Makefile: don't assume that kernel/gen_ikh_data.sh + is executable + +If the user downloads and applies patch-5.1.gz using patch(1), the x bit +on kernel/gen_ikh_data.sh is not set. + + /bin/sh: 1: ./kernel/gen_ikh_data.sh: Permission denied + +Fix this by using CONFIG_SHELL. + +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +(cherry picked from commit acb2ec3dd003b50b6fb5772057a08ec0dc45d42a) +--- + kernel/Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/Makefile b/kernel/Makefile +index d8e581bed66f..576f5293df7c 100644 +--- a/kernel/Makefile ++++ b/kernel/Makefile +@@ -133,7 +133,7 @@ $(obj)/config_data.h: $(obj)/config_data.gz FORCE + $(obj)/kheaders.o: $(obj)/kheaders_data.tar.xz + + quiet_cmd_genikh = CHK $(obj)/kheaders_data.tar.xz +-cmd_genikh = $(srctree)/kernel/gen_ikh_data.sh $@ ++cmd_genikh = $(CONFIG_SHELL) $(srctree)/kernel/gen_ikh_data.sh $@ + $(obj)/kheaders_data.tar.xz: FORCE + $(call cmd,genikh) + +-- +2.17.1 + diff --git a/packages/kernel/0010-kheaders-Move-from-proc-to-sysfs.patch b/packages/kernel/0010-kheaders-Move-from-proc-to-sysfs.patch new file mode 100644 index 00000000000..33d70c83958 --- /dev/null +++ b/packages/kernel/0010-kheaders-Move-from-proc-to-sysfs.patch @@ -0,0 +1,162 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: "Joel Fernandes (Google)" +Date: Wed, 15 May 2019 17:35:51 -0400 +Subject: [PATCH 3/6] kheaders: Move from proc to sysfs + +The kheaders archive consisting of the kernel headers used for compiling +bpf programs is in /proc. However there is concern that moving it here +will make it permanent. Let us move it to /sys/kernel as discussed [1]. + +[1] https://lore.kernel.org/patchwork/patch/1067310/#1265969 + +Suggested-by: Steven Rostedt +Signed-off-by: Joel Fernandes (Google) +Signed-off-by: Greg Kroah-Hartman +(cherry picked from commit f7b101d33046a837c2aa4526cef28a3c785d7af2) +--- + init/Kconfig | 17 +++++---- + kernel/Makefile | 4 +-- + kernel/{gen_ikh_data.sh => gen_kheaders.sh} | 2 +- + kernel/kheaders.c | 40 +++++++++------------ + 4 files changed, 27 insertions(+), 36 deletions(-) + rename kernel/{gen_ikh_data.sh => gen_kheaders.sh} (98%) + +diff --git a/init/Kconfig b/init/Kconfig +index 1b52fbedbfdb..f6f85b40636c 100644 +--- a/init/Kconfig ++++ b/init/Kconfig +@@ -533,15 +533,14 @@ config IKCONFIG_PROC + This option enables access to the kernel configuration file + through /proc/config.gz. + +-config IKHEADERS_PROC +- tristate "Enable kernel header artifacts through /proc/kheaders.tar.xz" +- depends on PROC_FS +- help +- This option enables access to the kernel header and other artifacts that +- are generated during the build process. These can be used to build eBPF +- tracing programs, or similar programs. If you build the headers as a +- module, a module called kheaders.ko is built which can be loaded on-demand +- to get access to the headers. ++config IKHEADERS ++ tristate "Enable kernel headers through /sys/kernel/kheaders.tar.xz" ++ depends on SYSFS ++ help ++ This option enables access to the in-kernel headers that are generated during ++ the build process. These can be used to build eBPF tracing programs, ++ or similar programs. If you build the headers as a module, a module called ++ kheaders.ko is built which can be loaded on-demand to get access to headers. + + config LOG_BUF_SHIFT + int "Kernel log buffer size (16 => 64KB, 17 => 128KB)" +diff --git a/kernel/Makefile b/kernel/Makefile +index 576f5293df7c..cfc7ac4056e3 100644 +--- a/kernel/Makefile ++++ b/kernel/Makefile +@@ -74,7 +74,7 @@ obj-$(CONFIG_UTS_NS) += utsname.o + obj-$(CONFIG_USER_NS) += user_namespace.o + obj-$(CONFIG_PID_NS) += pid_namespace.o + obj-$(CONFIG_IKCONFIG) += configs.o +-obj-$(CONFIG_IKHEADERS_PROC) += kheaders.o ++obj-$(CONFIG_IKHEADERS) += kheaders.o + obj-$(CONFIG_SMP) += stop_machine.o + obj-$(CONFIG_KPROBES_SANITY_TEST) += test_kprobes.o + obj-$(CONFIG_AUDIT) += audit.o auditfilter.o +@@ -133,7 +133,7 @@ $(obj)/config_data.h: $(obj)/config_data.gz FORCE + $(obj)/kheaders.o: $(obj)/kheaders_data.tar.xz + + quiet_cmd_genikh = CHK $(obj)/kheaders_data.tar.xz +-cmd_genikh = $(CONFIG_SHELL) $(srctree)/kernel/gen_ikh_data.sh $@ ++cmd_genikh = $(CONFIG_SHELL) $(srctree)/kernel/gen_kheaders.sh $@ + $(obj)/kheaders_data.tar.xz: FORCE + $(call cmd,genikh) + +diff --git a/kernel/gen_ikh_data.sh b/kernel/gen_kheaders.sh +similarity index 98% +rename from kernel/gen_ikh_data.sh +rename to kernel/gen_kheaders.sh +index 591a94f7b387..581b83534587 100755 +--- a/kernel/gen_ikh_data.sh ++++ b/kernel/gen_kheaders.sh +@@ -2,7 +2,7 @@ + # SPDX-License-Identifier: GPL-2.0 + + # This script generates an archive consisting of kernel headers +-# for CONFIG_IKHEADERS_PROC. ++# for CONFIG_IKHEADERS. + set -e + spath="$(dirname "$(readlink -f "$0")")" + kroot="$spath/.." +diff --git a/kernel/kheaders.c b/kernel/kheaders.c +index 70ae6052920d..8f69772af77b 100644 +--- a/kernel/kheaders.c ++++ b/kernel/kheaders.c +@@ -8,9 +8,8 @@ + + #include + #include +-#include ++#include + #include +-#include + + /* + * Define kernel_headers_data and kernel_headers_data_end, within which the +@@ -31,39 +30,32 @@ extern char kernel_headers_data; + extern char kernel_headers_data_end; + + static ssize_t +-ikheaders_read_current(struct file *file, char __user *buf, +- size_t len, loff_t *offset) ++ikheaders_read(struct file *file, struct kobject *kobj, ++ struct bin_attribute *bin_attr, ++ char *buf, loff_t off, size_t len) + { +- return simple_read_from_buffer(buf, len, offset, +- &kernel_headers_data, +- &kernel_headers_data_end - +- &kernel_headers_data); ++ memcpy(buf, &kernel_headers_data + off, len); ++ return len; + } + +-static const struct file_operations ikheaders_file_ops = { +- .read = ikheaders_read_current, +- .llseek = default_llseek, ++static struct bin_attribute kheaders_attr __ro_after_init = { ++ .attr = { ++ .name = "kheaders.tar.xz", ++ .mode = 0444, ++ }, ++ .read = &ikheaders_read, + }; + + static int __init ikheaders_init(void) + { +- struct proc_dir_entry *entry; +- +- /* create the current headers file */ +- entry = proc_create("kheaders.tar.xz", S_IRUGO, NULL, +- &ikheaders_file_ops); +- if (!entry) +- return -ENOMEM; +- +- proc_set_size(entry, +- &kernel_headers_data_end - +- &kernel_headers_data); +- return 0; ++ kheaders_attr.size = (&kernel_headers_data_end - ++ &kernel_headers_data); ++ return sysfs_create_bin_file(kernel_kobj, &kheaders_attr); + } + + static void __exit ikheaders_cleanup(void) + { +- remove_proc_entry("kheaders.tar.xz", NULL); ++ sysfs_remove_bin_file(kernel_kobj, &kheaders_attr); + } + + module_init(ikheaders_init); +-- +2.17.1 + diff --git a/packages/kernel/0011-kheaders-Do-not-regenerate-archive-if-config-is-not-.patch b/packages/kernel/0011-kheaders-Do-not-regenerate-archive-if-config-is-not-.patch new file mode 100644 index 00000000000..effc3075d1a --- /dev/null +++ b/packages/kernel/0011-kheaders-Do-not-regenerate-archive-if-config-is-not-.patch @@ -0,0 +1,70 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: "Joel Fernandes (Google)" +Date: Wed, 15 May 2019 17:35:52 -0400 +Subject: [PATCH 4/6] kheaders: Do not regenerate archive if config is not + changed + +Linus reported an issue that doing an allmodconfig was causing the +kheaders archive to be regenerated even though the config is the same. +This patch fixes the issue by ignoring the config-related header files +for "knowing when to regenerate based on timestamps". Instead, if the +CONFIG_X_Y option really changes, then we there are the +include/config/X/Y.h which will already tells us "if a config really +changed". So we don't really need these files for regeneration detection +anyway, and ignoring them fixes Linus's issue. + +Reported-by: Linus Torvalds +Signed-off-by: Joel Fernandes (Google) +Signed-off-by: Greg Kroah-Hartman +(cherry picked from commit 1457dc9ed8da871fbbc0a2ebdaed0405eeeed0cf) +--- + kernel/gen_kheaders.sh | 15 +++++++++++---- + 1 file changed, 11 insertions(+), 4 deletions(-) + +diff --git a/kernel/gen_kheaders.sh b/kernel/gen_kheaders.sh +index 581b83534587..9a34e1d9bd7f 100755 +--- a/kernel/gen_kheaders.sh ++++ b/kernel/gen_kheaders.sh +@@ -31,9 +31,8 @@ arch/$SRCARCH/include/ + + # This block is useful for debugging the incremental builds. + # Uncomment it for debugging. +-# iter=1 +-# if [ ! -f /tmp/iter ]; then echo 1 > /tmp/iter; +-# else; iter=$(($(cat /tmp/iter) + 1)); fi ++# if [ ! -f /tmp/iter ]; then iter=1; echo 1 > /tmp/iter; ++# else iter=$(($(cat /tmp/iter) + 1)); echo $iter > /tmp/iter; fi + # find $src_file_list -type f | xargs ls -lR > /tmp/src-ls-$iter + # find $obj_file_list -type f | xargs ls -lR > /tmp/obj-ls-$iter + +@@ -43,10 +42,18 @@ arch/$SRCARCH/include/ + pushd $kroot > /dev/null + src_files_md5="$(find $src_file_list -type f | + grep -v "include/generated/compile.h" | ++ grep -v "include/generated/autoconf.h" | ++ grep -v "include/config/auto.conf" | ++ grep -v "include/config/auto.conf.cmd" | ++ grep -v "include/config/tristate.conf" | + xargs ls -lR | md5sum | cut -d ' ' -f1)" + popd > /dev/null + obj_files_md5="$(find $obj_file_list -type f | + grep -v "include/generated/compile.h" | ++ grep -v "include/generated/autoconf.h" | ++ grep -v "include/config/auto.conf" | ++ grep -v "include/config/auto.conf.cmd" | ++ grep -v "include/config/tristate.conf" | + xargs ls -lR | md5sum | cut -d ' ' -f1)" + + if [ -f $tarfile ]; then tarfile_md5="$(md5sum $tarfile | cut -d ' ' -f1)"; fi +@@ -82,7 +89,7 @@ find $cpio_dir -type f -print0 | + + tar -Jcf $tarfile -C $cpio_dir/ . > /dev/null + +-echo "$src_files_md5" > kernel/kheaders.md5 ++echo "$src_files_md5" > kernel/kheaders.md5 + echo "$obj_files_md5" >> kernel/kheaders.md5 + echo "$(md5sum $tarfile | cut -d ' ' -f1)" >> kernel/kheaders.md5 + +-- +2.17.1 + diff --git a/packages/kernel/0012-kheaders-remove-meaningless-R-option-of-ls.patch b/packages/kernel/0012-kheaders-remove-meaningless-R-option-of-ls.patch new file mode 100644 index 00000000000..f6bb35f5bf4 --- /dev/null +++ b/packages/kernel/0012-kheaders-remove-meaningless-R-option-of-ls.patch @@ -0,0 +1,58 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Masahiro Yamada +Date: Mon, 1 Jul 2019 09:58:43 +0900 +Subject: [PATCH 5/6] kheaders: remove meaningless -R option of 'ls' + +The -R option of 'ls' is supposed to be used for directories. + + -R, --recursive + list subdirectories recursively + +Since 'find ... -type f' only matches to regular files, we do not +expect directories passed to the 'ls' command here. + +Giving -R is harmless at least, but unneeded. + +Signed-off-by: Masahiro Yamada +Reviewed-by: Joel Fernandes (Google) +(cherry picked from commit b60b7c2ea9b7f854d457fefd592c77f621a86580) +--- + kernel/gen_kheaders.sh | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/kernel/gen_kheaders.sh b/kernel/gen_kheaders.sh +index 9a34e1d9bd7f..86a666f5cb17 100755 +--- a/kernel/gen_kheaders.sh ++++ b/kernel/gen_kheaders.sh +@@ -33,8 +33,8 @@ arch/$SRCARCH/include/ + # Uncomment it for debugging. + # if [ ! -f /tmp/iter ]; then iter=1; echo 1 > /tmp/iter; + # else iter=$(($(cat /tmp/iter) + 1)); echo $iter > /tmp/iter; fi +-# find $src_file_list -type f | xargs ls -lR > /tmp/src-ls-$iter +-# find $obj_file_list -type f | xargs ls -lR > /tmp/obj-ls-$iter ++# find $src_file_list -type f | xargs ls -l > /tmp/src-ls-$iter ++# find $obj_file_list -type f | xargs ls -l > /tmp/obj-ls-$iter + + # include/generated/compile.h is ignored because it is touched even when none + # of the source files changed. This causes pointless regeneration, so let us +@@ -46,7 +46,7 @@ src_files_md5="$(find $src_file_list -type f | + grep -v "include/config/auto.conf" | + grep -v "include/config/auto.conf.cmd" | + grep -v "include/config/tristate.conf" | +- xargs ls -lR | md5sum | cut -d ' ' -f1)" ++ xargs ls -l | md5sum | cut -d ' ' -f1)" + popd > /dev/null + obj_files_md5="$(find $obj_file_list -type f | + grep -v "include/generated/compile.h" | +@@ -54,7 +54,7 @@ obj_files_md5="$(find $obj_file_list -type f | + grep -v "include/config/auto.conf" | + grep -v "include/config/auto.conf.cmd" | + grep -v "include/config/tristate.conf" | +- xargs ls -lR | md5sum | cut -d ' ' -f1)" ++ xargs ls -l | md5sum | cut -d ' ' -f1)" + + if [ -f $tarfile ]; then tarfile_md5="$(md5sum $tarfile | cut -d ' ' -f1)"; fi + if [ -f kernel/kheaders.md5 ] && +-- +2.17.1 + diff --git a/packages/kernel/0013-kheaders-include-only-headers-into-kheaders_data.tar.patch b/packages/kernel/0013-kheaders-include-only-headers-into-kheaders_data.tar.patch new file mode 100644 index 00000000000..7adfd755a63 --- /dev/null +++ b/packages/kernel/0013-kheaders-include-only-headers-into-kheaders_data.tar.patch @@ -0,0 +1,137 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Masahiro Yamada +Date: Mon, 1 Jul 2019 09:58:44 +0900 +Subject: [PATCH 6/6] kheaders: include only headers into kheaders_data.tar.xz + +Currently, kheaders_data.tar.xz contains some build scripts as well as +headers. None of them is needed in the header archive. + +For ARCH=x86, this commit excludes the following from the archive: + + arch/x86/include/asm/Kbuild + arch/x86/include/uapi/asm/Kbuild + include/asm-generic/Kbuild + include/config/auto.conf + include/config/kernel.release + include/config/tristate.conf + include/uapi/asm-generic/Kbuild + include/uapi/Kbuild + kernel/gen_kheaders.sh + +This change is actually motivated for the planned header compile-testing +because it will generate more build artifacts, which should not be +included in the archive. + +Signed-off-by: Masahiro Yamada +Reviewed-by: Joel Fernandes (Google) +(cherry picked from commit 7199ff7d74003b5aad1e6328bf6128cd8ceea735) +--- + kernel/gen_kheaders.sh | 47 ++++++++++++++---------------------------- + 1 file changed, 16 insertions(+), 31 deletions(-) + +diff --git a/kernel/gen_kheaders.sh b/kernel/gen_kheaders.sh +index 86a666f5cb17..9ff449888d9c 100755 +--- a/kernel/gen_kheaders.sh ++++ b/kernel/gen_kheaders.sh +@@ -4,24 +4,12 @@ + # This script generates an archive consisting of kernel headers + # for CONFIG_IKHEADERS. + set -e +-spath="$(dirname "$(readlink -f "$0")")" +-kroot="$spath/.." ++sfile="$(readlink -f "$0")" + outdir="$(pwd)" + tarfile=$1 + cpio_dir=$outdir/$tarfile.tmp + +-# Script filename relative to the kernel source root +-# We add it to the archive because it is small and any changes +-# to this script will also cause a rebuild of the archive. +-sfile="$(realpath --relative-to $kroot "$(readlink -f "$0")")" +- +-src_file_list=" +-include/ +-arch/$SRCARCH/include/ +-$sfile +-" +- +-obj_file_list=" ++dir_list=" + include/ + arch/$SRCARCH/include/ + " +@@ -33,33 +21,29 @@ arch/$SRCARCH/include/ + # Uncomment it for debugging. + # if [ ! -f /tmp/iter ]; then iter=1; echo 1 > /tmp/iter; + # else iter=$(($(cat /tmp/iter) + 1)); echo $iter > /tmp/iter; fi +-# find $src_file_list -type f | xargs ls -l > /tmp/src-ls-$iter +-# find $obj_file_list -type f | xargs ls -l > /tmp/obj-ls-$iter ++# find $src_file_list -name "*.h" | xargs ls -l > /tmp/src-ls-$iter ++# find $obj_file_list -name "*.h" | xargs ls -l > /tmp/obj-ls-$iter + + # include/generated/compile.h is ignored because it is touched even when none + # of the source files changed. This causes pointless regeneration, so let us + # ignore them for md5 calculation. +-pushd $kroot > /dev/null +-src_files_md5="$(find $src_file_list -type f | ++pushd $srctree > /dev/null ++src_files_md5="$(find $dir_list -name "*.h" | + grep -v "include/generated/compile.h" | + grep -v "include/generated/autoconf.h" | +- grep -v "include/config/auto.conf" | +- grep -v "include/config/auto.conf.cmd" | +- grep -v "include/config/tristate.conf" | + xargs ls -l | md5sum | cut -d ' ' -f1)" + popd > /dev/null +-obj_files_md5="$(find $obj_file_list -type f | ++obj_files_md5="$(find $dir_list -name "*.h" | + grep -v "include/generated/compile.h" | + grep -v "include/generated/autoconf.h" | +- grep -v "include/config/auto.conf" | +- grep -v "include/config/auto.conf.cmd" | +- grep -v "include/config/tristate.conf" | + xargs ls -l | md5sum | cut -d ' ' -f1)" +- ++# Any changes to this script will also cause a rebuild of the archive. ++this_file_md5="$(ls -l $sfile | md5sum | cut -d ' ' -f1)" + if [ -f $tarfile ]; then tarfile_md5="$(md5sum $tarfile | cut -d ' ' -f1)"; fi + if [ -f kernel/kheaders.md5 ] && + [ "$(cat kernel/kheaders.md5|head -1)" == "$src_files_md5" ] && + [ "$(cat kernel/kheaders.md5|head -2|tail -1)" == "$obj_files_md5" ] && ++ [ "$(cat kernel/kheaders.md5|head -3|tail -1)" == "$this_file_md5" ] && + [ "$(cat kernel/kheaders.md5|tail -1)" == "$tarfile_md5" ]; then + exit + fi +@@ -71,16 +55,16 @@ fi + rm -rf $cpio_dir + mkdir $cpio_dir + +-pushd $kroot > /dev/null +-for f in $src_file_list; +- do find "$f" ! -name "*.cmd" ! -name ".*"; ++pushd $srctree > /dev/null ++for f in $dir_list; ++ do find "$f" -name "*.h"; + done | cpio --quiet -pd $cpio_dir + popd > /dev/null + + # The second CPIO can complain if files already exist which can + # happen with out of tree builds. Just silence CPIO for now. +-for f in $obj_file_list; +- do find "$f" ! -name "*.cmd" ! -name ".*"; ++for f in $dir_list; ++ do find "$f" -name "*.h"; + done | cpio --quiet -pd $cpio_dir >/dev/null 2>&1 + + # Remove comments except SDPX lines +@@ -91,6 +75,7 @@ tar -Jcf $tarfile -C $cpio_dir/ . > /dev/null + + echo "$src_files_md5" > kernel/kheaders.md5 + echo "$obj_files_md5" >> kernel/kheaders.md5 ++echo "$this_file_md5" >> kernel/kheaders.md5 + echo "$(md5sum $tarfile | cut -d ' ' -f1)" >> kernel/kheaders.md5 + + rm -rf $cpio_dir +-- +2.17.1 + diff --git a/packages/kernel/config-thar b/packages/kernel/config-thar index 1e711a9f704..684ca17dfb1 100644 --- a/packages/kernel/config-thar +++ b/packages/kernel/config-thar @@ -28,3 +28,6 @@ CONFIG_SECURITY_YAMA=y # enable /proc/config.gz CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y + +# kernel headers at /sys/kernel/kheaders.tar.xz +CONFIG_IKHEADERS=y diff --git a/packages/kernel/kernel.spec b/packages/kernel/kernel.spec index 86283ba0fe0..ef42af45c79 100644 --- a/packages/kernel/kernel.spec +++ b/packages/kernel/kernel.spec @@ -16,6 +16,12 @@ Patch0004: 0004-dm-ioctl-fix-hang-in-early-create-error-condition.patch Patch0005: 0005-dm-init-fix-incorrect-uses-of-kstrndup.patch Patch0006: 0006-dm-init-remove-trailing-newline-from-calls-to-DMERR-.patch Patch0007: 0007-lustrefsx-Disable-Werror-stringop-overflow.patch +Patch0008: 0008-Provide-in-kernel-headers-to-make-extending-kernel-e.patch +Patch0009: 0009-kernel-Makefile-don-t-assume-that-kernel-gen_ikh_dat.patch +Patch0010: 0010-kheaders-Move-from-proc-to-sysfs.patch +Patch0011: 0011-kheaders-Do-not-regenerate-archive-if-config-is-not-.patch +Patch0012: 0012-kheaders-remove-meaningless-R-option-of-ls.patch +Patch0013: 0013-kheaders-include-only-headers-into-kheaders_data.tar.patch BuildRequires: bc BuildRequires: elfutils-devel BuildRequires: gcc-%{_cross_target} @@ -23,9 +29,18 @@ BuildRequires: hostname BuildRequires: kmod BuildRequires: openssl-devel +%global kernel_sourcedir %{_usrsrc}/kernels/%{version} + %description %{summary}. +%package devel +Summary: Configured Linux kernel source for module building +Requires: %{_cross_os}filesystem + +%description devel +%{summary}. + %package modules Summary: Modules for the Linux kernel @@ -83,6 +98,30 @@ find %{buildroot}%{_cross_prefix} \ %cross_generate_attribution +# files for external module compilation +( + find * -name Kbuild\* -type f -print \ + -o -name Kconfig\* -type f -print \ + -o -name Makefile\* -type f -print \ + -o -name module.lds -type f -print \ + -o -name Platform -type f -print + find arch/*/include/ include/ -type f -o -type l + find scripts/ -executable -type f + find scripts/ ! \( -name Makefile\* -o -name Kbuild\* \) -type f + echo .config + echo Module.symvers + echo System.map +) | sort -u > kernel_devel_files + +# remove x86 intermediate files like generated/asm/.syscalls_32.h.cmd +sed -i '/asm\/.*\.cmd$/d' kernel_devel_files + +install -d %{buildroot}%{kernel_sourcedir} +for file in $(cat kernel_devel_files); do + install -D ${file} %{buildroot}%{kernel_sourcedir}/${file} + +done + %files %license COPYING LICENSES/preferred/GPL-2.0 LICENSES/exceptions/Linux-syscall-note %{_cross_attribution_file} @@ -118,4 +157,9 @@ find %{buildroot}%{_cross_prefix} \ %{_cross_includedir}/video/* %{_cross_includedir}/xen/* +%files devel +%dir %{kernel_sourcedir} +%{kernel_sourcedir}/* +%{kernel_sourcedir}/.config + %changelog