# Enter linux source dir
cd "$LINUX_SRCOBJ_DIR"
- kversion=$(make -s kernelversion)
+ # Get the kernel version using the host toolchain, some cross-compiled arch may be broken
+ kversion=$(unset ARCH; unset CROSS_COMPILE; make -s kernelversion)
+
+ if [ "${cross_arch}" = "riscv64" ] && verlt "${kversion}" "5.12"; then
+ echo "RISC-V support was upstreamed in kernel v4.19 but kprobes support was only added in v5.12. Don't try to build it."
+ exit 0
+ fi
+
+ if [ "${cross_arch}" = "arm64" ] && verlt "${kversion}" "3.7"; then
+ echo "ARM64 support was added as of v3.7. Don't try to build it."
+ exit 0
+ fi
+
+ if [ "${cross_arch}" = "arm64" ] && verlt "${kversion}" "3.18"; then
+ echo "lttng-modules requires gcc >= 5.1 for ARM64 due to compiler bugs in gcc."
+ echo "gcc-5 support was added to the kernel as of v3.18. Don't this to build it."
+ exit 0
+ fi
if { verlt "$kversion" "4.4"; }; then
# Force gcc-4.8 for kernels before 4.4
selected_cc='gcc-4.8'
+ # Due to compiler bugs in gcc on arm64, lttng-modules disallows
+ # compilation with gcc < 5.1.
+ if [[ "${cross_arch}" == "arm64" ]] ; then
+ selected_cc='gcc-5.5'
+ export PATH="${PATH:-}:/usr/local/gcc5.5/bin"
+ export LD_LIBRARY_PATH="${LD_LIBRARY_PATH:-}:/usr/local/gcc5.5/lib"
+ fi
selected_cc_version=$(echo "${selected_cc}" | cut -d'-' -f2)
else
for cc in $(list_gccs) ; do
_KCPPFLAGS=()
_HOSTCFLAGS=()
- if [ "$selected_cc" != "gcc-4.8" ]; then
+ if { vergte "$selected_cc_version" "6"; }; then
# Older kernel Makefiles do not expect the compiler to default to PIE
_KAFLAGS+=(-fno-pie)
_KCFLAGS+=(
# Generate kernel configuration
case "$ktag" in
Ubuntu*)
- if [ "${cross_arch}" = "powerpc" ]; then
- if vergte "${kversion}" "4.10"; then
- echo "Ubuntu removed big endian powerpc configuration from kernel >= 4.10. Don't try to build it."
- exit 0
- fi
+ if [ "${cross_arch}" = "powerpc" ] && vergte "${kversion}" "4.10"; then
+ echo "Ubuntu removed big endian powerpc configuration from kernel >= 4.10. Don't try to build it."
+ exit 0
fi
- fakeroot debian/rules clean KW_DEFCONFIG_DIR=.
+ if [ "${cross_arch}" = "riscv64" ] && verlt "${kversion}" "6.2"; then
+ echo "Ubuntu added RISC-V config to their 'regular' kernels in v6.2. Don't try to build it."
+ exit 0
+ fi
+
+ FAKEROOT_ARGS=(
+ 'KW_DEFCONFIG_DIR=.'
+ )
+ fakeroot debian/rules clean "${FAKEROOT_ARGS[@]}"
# Hack for kernel Ubuntu-hwe-5.8
# The debian/control file is produced by the clean target above, so this
# Ubuntu annotations.
# In any case, the configuration will be updated with any missing values
# later in our build script.
- fakeroot debian/rules genconfigs KW_DEFCONFIG_DIR=. do_skip_checks=true
+ FAKEROOT_ARGS+=('do_skip_checks=true')
+
+ # Some Ubuntu tags default the toolchain using `gcc?=gcc-XX` in
+ # `debian/rules.d/0-common-vars.mk`. This may fail if the gcc version
+ # used as a default isn't available.
+ # For example, Ubuntu-6.8.0-7.7 sets `gcc?=gcc-13`, and that version
+ # of gcc isn't available on the deb12-amd64 ci-nodes.
+ # Work has also already been done in `select_compiler` to make our
+ # own decision of which compiler to use. As a result of both cases,
+ # our compiler choice should be passed into genconfigs.
+ FAKEROOT_ARGS+=("gcc=${selected_cc}")
+
+ fakeroot debian/rules genconfigs "${FAKEROOT_ARGS[@]}"
cp CONFIGS/"${ubuntu_config}" .config
;;
scripts/config --disable CONFIG_KVM_BOOK3S_64_HV
fi
+ if [ -f "init/Kconfig.suse" ] ; then
+ # Get values from git tag, eg. 'rpm-5.14.21-150400.24.108'
+ # Note: the "150400" type of SUSE major version is only present on tags
+ # from 2022 and newer (about half-way through SLE15SP3).
+ # This will not work as expected on earlier tags.
+ SLES_RELEASE="$(echo "${ktag}" | cut -d '-' -f 3 | cut -d'.' -f 1)"
+ scripts/config --set-val CONFIG_SUSE_VERSION $((10#"$(echo "${SLES_RELEASE}" | head -c 2)"))
+ scripts/config --set-val CONFIG_SUSE_PATCHLEVEL $((10#"$(echo "${SLES_RELEASE}" | head -c 4 | tail -c 2)"))
+
+ # Disable the renesas clk driver that has build issues,
+ # eg. drivers/clk/renesas/renesas-rzg2l-cpg.c:185:17: error: ‘clk’ undeclared (first use in this function)
+ scripts/config --disable CONFIG_CLK_RENESAS
+
+ # From drives/spi/spi-atmel.c
+ # ./include/linux/gpio/consumer.h:141:49: note: expected ‘struct gpio_desc *’ but argument is of type 'int'
+ scripts/config --disable CONFIG_SPI_ATMEL
+ scripts/config --disable CONFIG_SPI_AT91_USART
+ scripts/config --disable CONFIG_SPI_ATMEL_QUADSPI
+
+ # drivers/net/wireless/mediatek/mt76/mt7915/testmode.c: In function ‘mt7915_tm_set_wmm_qid’:
+ # drivers/net/wireless/mediatek/mt76/mt7915/testmode.c:176:30: error: ‘struct mt7915_vif’ has no member named ‘mt76’
+ scripts/config --disable CONFIG_WLAN_VENDOR_MEDIATEK
+
+ # drivers/net/wireless/microchip/wilc1000/cfg80211.c: In function ‘wilc_wfi_cfg_parse_ch_attr’:
+ # drivers/net/wireless/microchip/wilc1000/cfg80211.c:970:17: error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode
+ scripts/config --disable CONFIG_WLAN_VENDOR_MICROCHIP
+
+ # fs/f2fs/file.c: In function ‘punch_hole’:
+ # fs/f2fs/file.c:1093:49: error: ‘mapping’ undeclared (first use in this function)
+ scripts/config --disable CONFIG_F2FS_FS
+ fi
+
# oldnoconfig was renamed in 4.19
if vergte "$kversion" "4.19"; then
update_conf_target="olddefconfig"
patch_linux_kernel dfbd199a7cfe3e3cd8531e1353cdbd7175bfbc5e
fi
- if { vergte "${kversion}" "3.18"; } && { verlt "${kversion}" "4.16"; } ; then
- # Compatibility with binutils >= ~ 2.31
+ # Compatibility with binutils >= ~ 2.31
+ if { vergte "${kversion}" "3.19"; } && { verlt "${kversion}" "4.16"; } ; then
patch_linux_kernel b21ebf2fb4cde1618915a97cc773e287ff49173e
fi
-
- # The above patch only partially applies linux 3.17, and has been, so a
- # rebased version is used instead.
- if { vergte "${kversion}" "3.17"; } && { verlt "${kversion}" "3.18"; } ; then
- cat <<'EOF' | patch -p1
-diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c
-index 48598105..0652c5b6 100644
---- a/arch/x86/kernel/machine_kexec_64.c
-+++ b/arch/x86/kernel/machine_kexec_64.c
-@@ -516,6 +516,7 @@ int arch_kexec_apply_relocations_add(const Elf64_Ehdr *ehdr,
- goto overflow;
- break;
- case R_X86_64_PC32:
-+ case R_X86_64_PLT32:
- value -= (u64)address;
- *(u32 *)location = value;
- break;
-diff --git a/arch/x86/kernel/module.c b/arch/x86/kernel/module.c
-index e69f9882..7c6bc9fe 100644
---- a/arch/x86/kernel/module.c
-+++ b/arch/x86/kernel/module.c
-@@ -180,6 +180,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
- goto overflow;
- break;
- case R_X86_64_PC32:
-+ case R_X86_64_PLT32:
- val -= (u64)loc;
- *(u32 *)loc = val;
- #if 0
-diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c
-index bbb1d225..8deeacbc 100644
---- a/arch/x86/tools/relocs.c
-+++ b/arch/x86/tools/relocs.c
-@@ -763,6 +763,7 @@ static int do_reloc64(struct section *sec, Elf_Rel *rel, ElfW(Sym) *sym,
- switch (r_type) {
- case R_X86_64_NONE:
- case R_X86_64_PC32:
-+ case R_X86_64_PLT32:
- /*
- * NONE can be ignored and PC relative relocations don't
- * need to be adjusted.
-EOF
+ if { vergte "${kversion}" "3.17"; } && { verlt "${kversion}" "3.18.69"; } ; then
+ patch_linux_kernel edb9d2d5e647e7a8521b0d35f8452deb02dfd138
+ fi
+ if { vergte "${kversion}" "3.17"; } && { verlt "${kversion}" "3.18.100"; } ; then
+ patch_linux_kernel 3be6583f0b6f1bf1ee650ebf473d9dee36836527
+ patch_linux_kernel 12d839211d080f6a9c370398c41a260365d34c62
+ fi
+ if { vergte "${kversion}" "3.16"; } && { verlt "${kversion}" "3.16.82"; } ; then
+ patch_linux_kernel ad10e6d464796f2a481de4039a43b9cfca034e1c
fi
if ( { vergte "${kversion}" "3.14"; } && { verlt "${kversion}" "4.4"; } ) ||
fi
fi
+ # On riscv with 5.14 the vsdo objects are required
+ if [ "${karch}" = "riscv" ] && \
+ ( { vergte "${kversion}" "5.14"; } && { verlt "${kversion}" "5.15"; } ); then
+ cp -a --parents arch/riscv/kernel/vdso/*.o "${LINUX_HDROBJ_DIR}/"
+ fi
+
# Newer kernels need objtool to build modules when CONFIG_STACK_VALIDATION=y
if [ -f tools/objtool/objtool ]; then
cp -a --parents tools/objtool/objtool "${LINUX_HDROBJ_DIR}/"
echo "#define UTS_UBUNTU_RELEASE_ABI $ABINUM" >> include/generated/utsrelease.h
echo "#define UTS_UBUNTU_RELEASE_ABI $ABINUM" >> "${LINUX_HDROBJ_DIR}/include/generated/utsrelease.h"
;;
+ rpm-*)
+ # Update the definition of UTS_RELEASE to match something akin to '5.14.21-150400.24.108-default'
+ if [ -f "init/Kconfig.suse" ] ; then
+ SLESVERSION="$(echo "${ktag}" | cut -d'-' -f 3)-default"
+ sed -E -i "s%^(#define UTS_RELEASE \"[\.a-z0-9]+)(\")%\1-${SLESVERSION}\2%g" include/generated/utsrelease.h
+ sed -E -i "s%^(#define UTS_RELEASE \"[\.a-z0-9]+)(\")%\1-${SLESVERSION}\2%g" "${LINUX_HDROBJ_DIR}/include/generated/utsrelease.h"
+ fi
+ ;;
esac
}
ubuntu_config="ppc64el-config.flavour.generic"
;;
+ "riscv64")
+ karch="riscv"
+ cross_compile="riscv64-linux-gnu-"
+ vanilla_config="defconfig"
+ ubuntu_config="riscv64-config.flavour.generic"
+ ;;
+
*)
echo "Unsupported cross arch $cross_arch"
exit 1
ubuntu_config="ppc64el-config.flavour.generic"
;;
+ "riscv64")
+ karch="riscv"
+ vanilla_config="allmodconfig"
+ ubuntu_config="riscv64-config.flavour.generic"
+ ;;
+
*)
echo "Unsupported arch $arch"
exit 1