X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=scripts%2Flttng-modules%2Fparam-build.sh;h=cf3689d5b615bb013ec532f718c608467d2885b5;hb=cb36638c299f66aad1dc6280f2796afffeb37c1e;hp=77ab74e7ea8aadd50fc7cbcb15ebefff840a36e5;hpb=53300bf0457063d653203922cc23809059eeef40;p=lttng-ci.git diff --git a/scripts/lttng-modules/param-build.sh b/scripts/lttng-modules/param-build.sh index 77ab74e..cf3689d 100644 --- a/scripts/lttng-modules/param-build.sh +++ b/scripts/lttng-modules/param-build.sh @@ -96,7 +96,32 @@ git_clone_modules_sources() { # Checkout a shallow kernel tree of the specified tag git_clone_linux_sources() { mkdir -p "$LINUX_GIT_DIR" - git clone --depth=1 -b "${ktag}" --reference "$LINUX_GIT_REF_REPO_DIR" "${kgitrepo}" "$LINUX_GIT_DIR" + case "${distroversion:-}" in + el*) + git clone -b "${ktag}" "${kgitrepo}" src/linux-rpm + + # Get the source files + pushd src/linux-rpm + "${WORKSPACE}/src/getsrc/getsrc/getsrc.sh" + tar -x -C "${LINUX_GIT_DIR}" --strip-components=1 -f SOURCES/linux-*.tar.xz + popd + + # Pretend we're a repo like the default expects + pushd "${LINUX_GIT_DIR}" + git init . + git config user.name 'Jenkins' + git config user.email 'jenkins@efficios.com' + git add . + git commit -a -m 'Initial commit' + git tag "${ktag}" + echo "${LINUX_GIT_REF_REPO_DIR}" > .git/objects/info/alternates + popd + ;; + + *) + git clone --depth=1 -b "${ktag}" --reference-if-able "$LINUX_GIT_REF_REPO_DIR" "${kgitrepo}" "$LINUX_GIT_DIR" + ;; + esac } @@ -143,11 +168,35 @@ select_compiler() { # 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 @@ -194,7 +243,7 @@ export_kbuild_flags() { _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+=( @@ -287,15 +336,50 @@ build_linux_kernel() { # Generate kernel configuration case "$ktag" in + *el*) + # Copy the EL kernel configuration + el_arch="${cross_arch:-$arch}" + case "${el_arch}" in + amd64) + el_arch=x86_64 + ;; + arm64) + el_arch=aarch64 + ;; + ppc64el) + el_arch=ppc64le + ;; + *) + ;; + esac + ls "${WORKSPACE}/src/linux-rpm/SOURCES/" + if [ -f "${WORKSPACE}/src/linux-rpm/SOURCES/kernel-${el_arch}.config" ] ; then + cp "${WORKSPACE}/src/linux-rpm/SOURCES/kernel-${el_arch}.config" .config + elif [ -f "${WORKSPACE}/src/linux-rpm/SOURCES/kernel-${el_arch}-rhel.config" ] ; then + cp "${WORKSPACE}/src/linux-rpm/SOURCES/kernel-${el_arch}-rhel.config" .config + fi + + # Eg. + # mm/mempolicy.c: In function ‘mpol_parse_str’: + # mm/mempolicy.c:2980:26: error: writing 1 byte into a region of size 0 [-Werror=stringop-overflow=] + export KCFLAGS="${KCFLAGS} -Wno-error -Wno-all -Wno-error=stringop-overflow -Wno-error=address-of-packed-member" + ;; + 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 @@ -309,7 +393,19 @@ build_linux_kernel() { # 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 ;; @@ -333,6 +429,38 @@ build_linux_kernel() { 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" @@ -448,52 +576,19 @@ build_linux_kernel() { 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"; } ) || @@ -636,7 +731,9 @@ EOF if [ "$(scripts/config --state CONFIG_DEBUG_INFO_BTF)" == "y" ] && { vergte "${pahole_version}" "1.24"; } && - { vergte "${kversion}" "5.10"; } && { verlt "${kversion}" "6.0"; } ;then + ( + ( { vergte "${kversion}" "5.10"; } && { verlt "${kversion}" "6.0"; } ) || [[ "${ktag}" =~ .el8 ]] + ) ; then # Some kernels Eg. Ubuntu-hwe-5.13-5.13.0-52.59_20.04.1 # fail with the following error: # BTFIDS vmlinux @@ -655,6 +752,8 @@ EOF else # shellcheck disable=SC2016 sed -i 's/ -J ${extra_paholeopt} / -J ${extra_paholeopt} --skip_encoding_btf_enum64 /' scripts/link-vmlinux.sh + # Some older versions of RHEL don't have '${extra_paholeopt}' + sed -i 's/${PAHOLE} -J ${1}/${PAHOLE} -J --skip_encoding_btf_enum64 ${1}/' scripts/link-vmlinux.sh fi fi @@ -803,6 +902,12 @@ extract_distro_headers() { 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}/" @@ -875,6 +980,14 @@ extract_distro_headers() { 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 } @@ -992,6 +1105,13 @@ if [ "x${cross_arch}" != "x" ]; then 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 @@ -1042,6 +1162,12 @@ elif [ "x${arch}" != "x" ]; then ubuntu_config="ppc64el-config.flavour.generic" ;; + "riscv64") + karch="riscv" + vanilla_config="allmodconfig" + ubuntu_config="riscv64-config.flavour.generic" + ;; + *) echo "Unsupported arch $arch" exit 1