diff --git a/.gitattributes b/.gitattributes index 2325c529e185..9741eec81882 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,3 +3,4 @@ *.dts diff=dts *.dts[io] diff=dts *.rs diff=rust +dist/ export-ignore diff --git a/.gitignore b/.gitignore index 0bbae167bf93..350925d5d3d7 100644 --- a/.gitignore +++ b/.gitignore @@ -170,3 +170,11 @@ sphinx_*/ # Rust analyzer configuration /rust-project.json + +# Dist files +/dist/rpm +/dist/workdir + +# Tencent dist files +/dist/rpm +/dist/workdir diff --git a/Makefile b/Makefile index 1eefa893f048..62340088d725 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,10 @@ +# SPDX-License-Identifier: GPL-2.0 + +# dist_make: Tencent Dist Makefile, which contains dist-* make targets +ifneq ($(shell echo $(MAKECMDGOALS) | grep "^dist-"),) +include dist/Makefile +else + # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 6 @@ -2053,3 +2060,5 @@ FORCE: # Declare the contents of the PHONY variable as phony. We keep that # information in a variable so we can use it in if_changed and friends. .PHONY: $(PHONY) + +endif # dist_make diff --git a/dist/Makefile b/dist/Makefile new file mode 100644 index 000000000000..7a8e4832f944 --- /dev/null +++ b/dist/Makefile @@ -0,0 +1,399 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# A simple and clean build system initially inspired by Fedora ARK Kernel and Tencent Linux Kernel public. +# + +TOPDIR := $(shell git rev-parse --show-toplevel) +ifeq ("$(TOPDIR)", "") + TOPDIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))/..) +endif + +DISTPATH = dist +DISTDIR := $(TOPDIR)/$(DISTPATH) +ifeq ("$(abspath $(DISTDIR)/Makefile)", "$(lastword $(MAKEFILE_LIST))") +$(error Can't detect Makefile, aborting) +endif + +### Downstream marker, update this when forking to another downstream +KDIST = + +### Vendor mark +VENDOR = opencloudos +VENDOR_CAPITALIZED = OpenCloudOS +URL = https://github.com/OpenCloudOS/OpenCloudOS-Kernel-Stream + +### Get native arch for binary build by default +NATIVE_ARCH := $(shell uname -m | sed -e 's/amd64/x86_64/;s/arm64/aarch64/;s/*86$$/x86/') + +###### Build parameters, change them with `make =` ###### +# When building binary package, which arch to build against +ARCH := $(NATIVE_ARCH) +# ARCH to be covered by spec file +SPEC_ARCH := x86_64 aarch64 riscv64 +# Which kernel config to use, this build system supports multiple config targets, +# Get the available config by scripts/ls-config.sh +CONFIG := $(shell $(DISTDIR)/scripts/ls-config-targets.sh | tail -n 1) +# Build a specific tag/commit with `make TAG=` or `make COMMIT=` +TAG := $(COMMIT) +# Extra RPM flags +RPMFLAGS := +####### Build parameters end ###### + +### Basic variables +DISTCONFIGDIR = $(DISTDIR)/configs +DISTWORKDIR = $(DISTDIR)/workdir + +DISTTEMPLATES = $(wildcard $(DISTDIR)/templates/*) +DISTCONFIGS = $(shell find $(DISTDIR)/configs) +DISTSCRIPTS = $(wildcard $(DISTDIR)/scripts/*) +DISTSOURCES = $(wildcard $(DISTDIR)/sources/*) +DISTKABIS = $(wildcard $(DISTDIR)/kabi/*) +DISTFILES = $(DISTDIR) $(DISTTEMPLATES) $(DISTCONFIGS) $(DISTSCRIPTS) $(DISTSOURCES) $(DISTKABIS) + +### Force unify arch name, so Kbuild, and other Makefiles can work seamlessly +# BUILD_ARCH is for RPM, Dist make +BUILD_ARCH := $(ARCH) +override BUILD_ARCH := $(shell echo $(BUILD_ARCH) | sed -e 's/amd64/x86_64/;s/arm64/aarch64/;s/*86$$/x86/') +# ARCH is for Kbuild +override ARCH := $(shell echo $(BUILD_ARCH) | sed -e 's/amd64/x86_64/;s/aarch64/arm64/;s/*86$$/x86/') + +### Check if TAG is valid +TAG := HEAD +# If COMMIT is specified, this line won't take effect +COMMIT := $(shell git rev-parse --verify --quiet $(TAG)) +ifeq ($(COMMIT),) +$(error Invalid git reference, tag '$(TAG)' commit '$(COMMIT)', aborting) +endif +# Prefer using TAG, if not set, use COMMIT +TAG := $(COMMIT) +GITREF := $(TAG) + +### RPM dir and workdir +RPM_TOPDIR := $(DISTDIR)/rpm +RPM_BUILDDIR := $(RPM_TOPDIR)/BUILD +RPM_RPMDIR := $(RPM_TOPDIR)/RPMS +RPM_SOURCEDIR := $(RPM_TOPDIR)/SOURCES +RPM_SPECDIR := $(RPM_TOPDIR)/SPECS +RPM_SRCRPMDIR := $(RPM_TOPDIR)/SRPMS +RPM_BUILDROOTDIR := $(RPM_TOPDIR)/BUILDROOT +WORKDIRS = $(DISTWORKDIR) $(RPM_TOPDIR) $(RPM_BUILDDIR) $(RPM_RPMDIR) $(RPM_SOURCEDIR) $(RPM_SPECDIR) $(RPM_SRCRPMDIR) $(RPM_BUILDROOTDIR) + +# Prepare workdir and variables for dist scripts +$(shell mkdir -p $(WORKDIRS); \ + { \ + echo "KDIST=$(KDIST)"; \ + echo "VENDOR=$(VENDOR)"; \ + echo "VENDOR_CAPITALIZED=$(VENDOR_CAPITALIZED)"; \ + echo "URL=$(URL)"; \ + } > $(DISTPATH)/.distenv \ +) + +### Build files +KFULLVER := $(shell $(DISTDIR)/scripts/get-version.sh $(GITREF) vr) +CONFIGFILE := $(shell $(DISTDIR)/scripts/ls-config-files.sh $(CONFIG)) +SPECFILE = $(RPM_SOURCEDIR)/kernel.spec +TARFILE = $(RPM_SOURCEDIR)/kernel-$(KFULLVER).tar.gz +TESTPATCH = $(RPM_SOURCEDIR)/linux-kernel-test.patch +ifeq ($(CONFIGFILE),) +$(error Invalid CONFIG value '$(CONFIG)', no matching config target found) +endif + +### RPM build options +# All params enabled by default (except kABI check, see below), ENABLED overrides DEFAULT_DISABLE. +DISABLED=$(DEFAULT_DISABLED) +ENABLED=$(DEFAULT_ENABLED) + +## A few shortcut for commonly used params: +# Disable KABI check by default +KABI=0 +ifeq ($(KABI), 0) +override DISABLED := kabichk $(DISABLED) +endif + +# Enabled module sign by default +MODSIGN=1 +ifeq ($(MODSIGN), 0) +override DISABLED := modsign $(DISABLED) +endif + +# Disable private key pkg by default +KEYPKG=0 +ifeq ($(KEYPKG), 0) +override DISABLED := keypkg $(DISABLED) +endif + +# Allow to skip RPM dependency check +NODEP=0 +ifeq ($(NODEP), 1) +override RPMFLAGS := --nodeps $(RPMFLAGS) +endif + +# Crossbuild +ifneq ($(BUILD_ARCH),$(NATIVE_ARCH)) +RPMCROSSFLAGS = --with crossbuild --target $(BUILD_ARCH) --define "_cross_compile $(BUILD_ARCH)-linux-gnu-" +else +RPMCROSSFLAGS = --without crossbuild +endif + +# For re-distribute to another distro +ifneq ($(DIST),) +override RPMFLAGS := --define "dist .$(DIST)" $(RPMFLAGS) +$(info "NOTE: DIST is set, building for another distro $(DIST)") +$(info " You shoudn't do this unless you know what you are doing.") +endif + +default: dist-help + +$(TARFILE): + @echo "Generating kernel source tar: $(TARFILE)" + @cd $(TOPDIR); git archive $(GITREF) $(TOPDIR) --format=tar.gz --prefix=kernel-$(KFULLVER)/ --output $(TARFILE) + +dist-tarball: $(TARFILE) + @echo "$(TARFILE)" + +$(CONFIGFILE): $(DISTFILES) + @echo "Generating kernel config style '$(CONFIG)'" + @$(DISTDIR)/scripts/gen-configs.sh "$(CONFIG)" "$(GITREF)" + +dist-configs: $(CONFIGFILE) +dist-config: dist-configs + rm -f $(TOPDIR)/.config + cp $(RPM_SOURCEDIR)/$(CONFIG).$(BUILD_ARCH).config $(TOPDIR)/.config + @printf "\033[0;32mDefault kernel config copied as $(TOPDIR)/.config\033[0m\n" + +# TODO: Build from a unclean tree is not working yet +# which can't be detected by make. +# $(TESTPATCH): always-rebuild +# @git diff --no-renames HEAD -- ":(exclude)$(DISTDIR)" > $(TESTPATCH) +# @[ -s "$(TESTPATCH)" ] && echo "Building from a unclean tree" || : + +# TODO: Remove always-rebuild - currently these targets depend on git worktree or variables, +.PHONY: always-rebuild +$(SPECFILE): always-rebuild dist-configs + @echo "Generating kernel RPM spec: $(SPECFILE)" + @$(DISTDIR)/scripts/gen-spec.sh \ + --gitref "$(GITREF)" \ + --build-arch "$(SRPM_ARCH)" \ + --kernel-config "$(CONFIG)" \ + --set-default-disabled "$(DISABLED)" \ + --set-default-enabled "$(ENABLED)" \ + > $(SPECFILE) + @grep -A2 "# == Package options ==" $(SPECFILE) | cut -c3- + +dist-specfile: $(SPECFILE) + @echo "$(SPECFILE)" + +dist-sources: dist-configs $(TARFILE) $(DISTSOURCES) $(DISTKABIS) $(SPECFILE) + @cp $(DISTSOURCES) $(DISTKABIS) $(RPM_SOURCEDIR) + +define DO_RPMBUILD +@echo "=== DISTBUILD ===" +@echo "Building kernel: $(shell rpmspec -q --qf "%{name}-%{version}-%{release}\n" --srpm $(SPECFILE))" +@echo "Kernel uname-r: $(shell rpmspec -q --provides $(SPECFILE) | grep kernel-uname-r | awk -F ' = ' '{print $$2}')" +@echo "Config style: $(CONFIG)" +@echo "RPM build flags: $(1)" +@echo "=== RPMBULID ===" +rpmbuild \ + --define '_topdir $(RPM_TOPDIR)' \ + --define '_builddir $(RPM_BUILDDIR)' \ + --define '_rpmdir $(RPM_RPMDIR)' \ + --define '_sourcedir $(RPM_SOURCEDIR)' \ + --define '_specdir $(RPM_SPECDIR)' \ + --define '_srcrpmdir $(RPM_SRCRPMDIR)' \ + --define '_buildrootdir $(RPM_BUILDROOTDIR)' \ + $(SPECFILE) $(1) +endef + +dist-srpm: dist-sources + $(call DO_RPMBUILD,-bs --nodeps --rmsource --rmspec $(RPMFLAGS)) + +dist: dist-rpm +dist-rpms: dist-rpm +dist-rpm: dist-sources + $(call DO_RPMBUILD,-bb $(RPMCROSSFLAGS) --rmsource --rmspec $(RPMFLAGS)) + +dist-prep: dist-sources + $(call DO_RPMBUILD,-bp --nodeps $(RPMCROSSFLAGS) $(RPMFLAGS)) + +dist-new-release: dist-new-maj-release + +dist-new-maj-release: + @$(DISTDIR)/scripts/make-release.sh --maj-release + +dist-new-sub-release: + @$(DISTDIR)/scripts/make-release.sh --sub-release + +dist-clean: + @for i in $(RPM_TOPDIR)/* $(DISTWORKDIR); do \ + echo Cleaning up $$i; \ + rm -rf $$i/*; \ + rm -rf $$i/.* 2>/dev/null; \ + done; :; + +BUILDDEPS=$(shell rpmspec -q --buildrequires $(SPECFILE) | cut -d ' ' -f 1) +MISSINGDEPS=$(shell echo "$(BUILDDEPS)" | xargs -n1 echo | while read -r _d; do rpm -q --whatprovides "$$_d" >/dev/null || echo "$$_d"; done) +dist-check-buildrequires: dist-specfile + @if [ -n "$(MISSINGDEPS)" ]; then \ + echo "Error: Build dependency packages missing, please install: $(MISSINGDEPS)"; \ + echo "Hint: You can try run \`make dist-install-buildrequires\` to fix this."; \ + exit 1; \ + fi; + +dist-install-buildrequires: dist-specfile + @if [ -n "$(MISSINGDEPS)" ]; then \ + echo "Installing kernel build dependency '$(MISSINGDEPS)' using yum..."; \ + echo "Missing dependency packages: '$(MISSINGDEPS)...'"; \ + if [ -x /usr/bin/yum ]; then \ + echo "Trying to install..."; \ + echo "$(MISSINGDEPS)" | sudo xargs yum install -y && exit 0; \ + else \ + echo "Yum is not available for current user."; \ + fi; \ + echo "Error: Intallation failed."; \ + exit 1; \ + fi + +dist-check-requires: dist-check-buildrequires + @if [ ! -x /usr/bin/python3 ]; then \ + echo "ERROR: Python 3 is required." ; \ + exit 1; \ + fi + @if [ ! -x /usr/bin/git ]; then \ + echo "ERROR: Git is required." ; \ + exit 1; \ + fi + +dist-format-config: + @$(DISTDIR)/scripts/format-configs.sh +dist-format-configs: dist-format-config + +dist-check-new-config: + @echo "Checking for unset Kconfig..." + @$(DISTDIR)/scripts/check-configs.sh check-new-configs $(CONFIG) +dist-check-new-configs: dist-check-new-config + +dist-fix-new-config: + @echo "Fixing unset Kconfig issue..." + @$(DISTDIR)/scripts/check-configs.sh check-new-configs --autofix $(CONFIG) +dist-fix-new-configs: dist-fix-new-config + +dist-check-dup-config: + @echo "Checking for duplicated Kconfig..." + @$(DISTDIR)/scripts/check-configs.sh check-dup-configs $(CONFIG) +dist-check-dup-configs: dist-check-dup-config + +dist-fix-dup-config: + @echo "Fixing duplicated Kconfig issue..." + @$(DISTDIR)/scripts/check-configs.sh check-dup-configs --autofix $(CONFIG) +dist-fix-dup-configs: dist-fix-dup-config + +dist-check-diff-config: + @echo "Checking for duplicated Kconfig..." + @$(DISTDIR)/scripts/check-configs.sh check-diff-configs $(CONFIG) +dist-check-diff-configs: dist-check-diff-config + +dist-check-config: dist-check-new-config dist-check-dup-config dist-check-diff-config +dist-check-configs: dist-check-config + +dist-check-commit: + @echo "Checking for new commits..." + @$(DISTDIR)/scripts/check-commits.sh +dist-check-commits: dist-check-commit + +dist-check-tag: + @echo "Checking tag of '$(TAG)' ..." + @$(DISTDIR)/scripts/check-tag.sh '$(TAG)' + +dist-check-kabi: dist-sources + @echo "Checking kABI for $(BUILD_ARCH)..." + $(call DO_RPMBUILD,-bi $(RPMCROSSFLAGS) \ + --without doc --without headers --without perf --without tools --without bpftool \ + --without debuginfo --without selftest \ + --with kabichk \ + ) + +dist-update-kabi: KABI_WORKDIR:=$(shell mktemp -d $(DISTWORKDIR)/kabi.XXXX) +dist-update-kabi: RPM_BUILDDIR:=$(KABI_WORKDIR) +dist-update-kabi: dist-sources dist-check-buildrequires + @echo "Updating kABI for $(BUILD_ARCH)..." + $(call DO_RPMBUILD,-bc $(RPMCROSSFLAGS) \ + --without doc --without headers --without perf --without tools --without bpftool \ + --without debuginfo --without selftest --without kabichk \ + ) + MODSYM=$$(find $(KABI_WORKDIR) -maxdepth 3 -type f -name 'Module.symvers'); \ + if [ -f "$$MODSYM" ]; then \ + echo "Using $$MODSYM as kABI reference file."; \ + $(DISTDIR)/scripts/helper/update-kabi.sh \ + $(DISTDIR)/kabi/Module.kabi_$(BUILD_ARCH) $$MODSYM > $(KABI_WORKDIR)/Module.kabi.updated; \ + cp $(KABI_WORKDIR)/Module.kabi.updated $(DISTDIR)/kabi/Module.kabi_$(BUILD_ARCH); \ + else \ + echo "Failed to find Module.symvers."; \ + exit 1; \ + fi + +# Do a fast check +dist-check: dist-check-commit dist-check-new-config +dist-help: + @echo 'This helps you to manage, release, and develop $(VENDOR_CAPITALIZED) Linux kernel.' + @echo 'Use below make targets as sub-command:' + @echo + @echo 'NOTE: Before you submit any patch, please see the "Sanity check" targets and at lease run:' + @echo '`make dist-check`' + @echo 'And ensure there is no error.' + @echo + @echo 'For building a kernel RPM distrobution package:' + @echo ' dist, dist-rpms - Alias to dist-rpm.' + @echo ' dist-rpm - Create the binary RPMS for the kernel and put it under:' + @echo ' $(RPM_RPMDIR)' + @echo ' dist-srpm - Create a source RPM and put it under:' + @echo ' $(RPM_SRCRPMDIR)' + @echo ' dist-prep - Prep the kernel dist build source code under:' + @echo ' $(RPM_BUILDDIR)' + @echo + @echo 'Available params (most of these params are usable for all sub-commands besides dist-rpm/dist-srpm):' + @echo ' ARCH="$(ARCH)"' + @echo ' Target ARCH used for binary/RPM build.' + @echo ' SPEC_ARCH="$(SPEC_ARCH)"' + @echo ' Targer ARCH coverted by spec/SRPM build.' + @echo ' TAG="$(TAG)" (or COMMIT="$(COMMIT)")' + @echo ' Specify a git tag or commit, and this Makefile will build the kernel from that version.' + @echo ' RPMFLAGS="$(RPMFLAGS)"' + @echo ' Extra RPM flags to be passed to rpmbuild for RPM bulding related commands.' + @echo ' CONFIG="$(CONFIG)"' + @echo ' Which kernel config to use, $(VENDOR_CAPITALIZED) build system supports multiple config targets,' + @echo ' Avaiable targets:' + @$(DISTDIR)/scripts/ls-config-targets.sh | xargs -n3 printf " %s %s %s\n" + @echo + @echo 'To make a new kernel version release:' + @echo ' dist-new-release - Update changelog, increase release number and tag a new commit properly.' + @echo ' dist-new-sub-release - Same as dist-new-release but increase the sub release number (eg. 5.18.0-1, 5.18.0-1.1, 5.18.0-1.2, ...).' + @echo + @echo 'Build prepare:' + @echo ' dist-check-requires - Check build time and dist targets package dependency.' + @echo ' dist-check-buildrequires - Check build time package dependency.' + @echo ' dist-install-buildrequires - Check and automatically install build time dependency, requires root.' + @echo + @echo 'Sanity check:' + @echo ' dist-check-commit - Check commit message and patch.' + @printf " \033[1;33m* Please at least ensure this check doesn't raise any error before submitting a patch.\033[0m\n" + @echo ' dist-check-diff-config - Check for invalid configs. If a CONFIG_XXX=y is set in config file but gone after make oldconfig,' + @echo ' it it considered a invalid config. There are many potential resons causing this, changed or missing' + @echo ' config dependency, deprecated config, auto-select configs, this tool will also provide some hint.' + @echo ' dist-check-dup-config - Check for duplicated configs, ' + @echo ' dist-check-new-config - Check for unset configs. If any config is not set, kbuild will prompt during built time.' + @echo ' This helper will check for unset configs so you can set them properly in predefined config file.' + @echo 'Code clean up:' + @echo ' dist-fix-new-config - Same as dist-check-new-configs but automatically set unset configs to its default value and' + @echo ' update config files.' + @echo ' dist-fix-dup-config - Automatically remove duplicated configs.' + @echo " dist-format-config - Sort and simplify the base config files, won\'t change the final config output." + @printf ' \033[1;33m* Please run this before submitting any config change.\033[0m\n' + @echo ' dist-clean - Clean up directories under:' + @echo ' $(DISTDIR)' + @echo + @echo 'Configuration targets:' + @echo ' dist-configs - Generate dist config files, using config matrix in:' + @echo ' $(DISTDIR)/config/' + @echo ' dist-config - Generate config, and override .config file with the config corresponding' + @echo ' to arch $(BUILD_ARCH)' + @echo diff --git a/dist/README b/dist/README new file mode 100644 index 000000000000..a171f5f91eac --- /dev/null +++ b/dist/README @@ -0,0 +1,10 @@ +RPM based dist Makefile and build system for the Linux kernel. + +Run `make dist-help` to see the usage. + +Authors: +Kairui Song +Katrin Zhou +Kaixu Xia + +Bundle with the Linux Kernel, licensed under the GPLv2 diff --git a/dist/configs/00base/defconfig/aarch64.config b/dist/configs/00base/defconfig/aarch64.config new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/dist/configs/00base/defconfig/default.config b/dist/configs/00base/defconfig/default.config new file mode 100644 index 000000000000..beee055279eb --- /dev/null +++ b/dist/configs/00base/defconfig/default.config @@ -0,0 +1,9 @@ +CONFIG_BPF_SYSCALL=y +CONFIG_DEBUG_INFO_BTF=y +CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y +CONFIG_DEBUG_KERNEL=y +CONFIG_IKCONFIG=m +CONFIG_IKCONFIG_PROC=y +CONFIG_MODULES=y +CONFIG_MODVERSIONS=y +# CONFIG_LOCALVERSION_AUTO is not set diff --git a/dist/configs/00base/defconfig/x86_64.config b/dist/configs/00base/defconfig/x86_64.config new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/dist/configs/00base/generic/riscv64.config b/dist/configs/00base/generic/riscv64.config new file mode 100644 index 000000000000..abf60c355a7f --- /dev/null +++ b/dist/configs/00base/generic/riscv64.config @@ -0,0 +1,3046 @@ +CONFIG_8139CP=m +CONFIG_8139TOO=m +CONFIG_8139TOO_8129=y +# CONFIG_8139TOO_PIO is not set +CONFIG_A11Y_BRAILLE_CONSOLE=y +CONFIG_ABP060MG=m +CONFIG_ACCESSIBILITY=y +CONFIG_ACENIC=m +CONFIG_AD5272=m +CONFIG_AD5770R=m +CONFIG_AD7124=m +CONFIG_AD7292=m +CONFIG_AD7766=m +CONFIG_AD7949=m +CONFIG_AD9467=m +CONFIG_ADAPTEC_STARFIRE=m +CONFIG_ADIN_PHY=m +CONFIG_ADIS16475=m +CONFIG_ADI_AXI_ADC=m +CONFIG_ADUX1020=m +CONFIG_ADXL372_I2C=m +CONFIG_ADXL372_SPI=m +CONFIG_ADXRS290=m +CONFIG_AFFS_FS=m +CONFIG_AFS_DEBUG=y +CONFIG_AFS_FS=m +CONFIG_AFS_FSCACHE=y +CONFIG_AF_KCM=m +CONFIG_AF_RXRPC_DEBUG=y +CONFIG_AF_RXRPC_IPV6=y +CONFIG_AIC79XX_CMDS_PER_DEVICE=4 +# CONFIG_AIC79XX_DEBUG_ENABLE is not set +# CONFIG_AIC79XX_REG_PRETTY_PRINT is not set +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +CONFIG_AIC7XXX_CMDS_PER_DEVICE=4 +# CONFIG_AIC7XXX_DEBUG_ENABLE is not set +# CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +CONFIG_AIX_PARTITION=y +CONFIG_AL3010=m +CONFIG_ALIM7101_WDT=m +CONFIG_ALTERA_MSGDMA=m +CONFIG_ALTERA_PR_IP_CORE=m +CONFIG_ALTERA_PR_IP_CORE_PLAT=m +CONFIG_ALTERA_TSE=m +CONFIG_ALX=m +CONFIG_AMD8111_ETH=m +CONFIG_AMD_PHY=m +CONFIG_AMIGA_PARTITION=y +CONFIG_APDS9802ALS=m +CONFIG_APPLE_MFI_FASTCHARGE=m +CONFIG_AQUANTIA_PHY=m +CONFIG_AR5523=m +CONFIG_ASYMMETRIC_TPM_KEY_SUBTYPE=m +CONFIG_ASYNC_RAID6_TEST=m +CONFIG_ASYNC_TX_DMA=y +CONFIG_AT803X_PHY=m +CONFIG_ATA=y +CONFIG_ATALK=m +CONFIG_ATA_GENERIC=m +CONFIG_ATA_OVER_ETH=m +CONFIG_ATA_PIIX=y +CONFIG_ATH10K=m +CONFIG_ATH10K_DEBUGFS=y +CONFIG_ATH10K_PCI=m +CONFIG_ATH10K_SDIO=m +CONFIG_ATH10K_USB=m +CONFIG_ATH11K=m +CONFIG_ATH11K_AHB=m +CONFIG_ATH11K_DEBUGFS=y +CONFIG_ATH11K_PCI=m +CONFIG_ATH5K=m +CONFIG_ATH5K_DEBUG=y +CONFIG_ATH6KL=m +CONFIG_ATH6KL_DEBUG=y +CONFIG_ATH6KL_SDIO=m +CONFIG_ATH6KL_USB=m +CONFIG_ATH9K=m +CONFIG_ATH9K_AHB=y +CONFIG_ATH9K_DEBUGFS=y +CONFIG_ATH9K_HTC=m +CONFIG_ATH9K_PCI_NO_EEPROM=m +CONFIG_ATL1=m +CONFIG_ATL1C=m +CONFIG_ATL1E=m +CONFIG_ATL2=m +CONFIG_ATM=m +CONFIG_ATM_BR2684=m +CONFIG_ATM_CLIP=m +CONFIG_ATM_ENI=m +CONFIG_ATM_HE=m +CONFIG_ATM_LANE=m +CONFIG_ATM_NICSTAR=m +CONFIG_ATM_SOLOS=m +CONFIG_ATM_TCP=m +CONFIG_ATOMIC64_SELFTEST=y +CONFIG_AUDIT=y +CONFIG_AUTOFS4_FS=y +CONFIG_AUXDISPLAY=y +CONFIG_AX25=m +CONFIG_B43=m +CONFIG_B43LEGACY=m +# CONFIG_B43LEGACY_DEBUG is not set +CONFIG_B43_SDIO=y +CONFIG_B44=m +CONFIG_B53_MDIO_DRIVER=m +CONFIG_B53_MMAP_DRIVER=m +CONFIG_B53_SERDES=m +CONFIG_B53_SPI_DRIVER=m +CONFIG_B53_SRAB_DRIVER=m +CONFIG_BACKLIGHT_ARCXCNN=m +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_BACKLIGHT_KTD253=m +CONFIG_BACKLIGHT_LED=m +CONFIG_BACKLIGHT_LP855X=m +CONFIG_BACKLIGHT_PWM=m +CONFIG_BAREUDP=m +CONFIG_BATTERY_CW2015=m +CONFIG_BAYCOM_SER_FDX=m +CONFIG_BAYCOM_SER_HDX=m +CONFIG_BCACHE=m +CONFIG_BCM54140_PHY=m +CONFIG_BCM87XX_PHY=m +CONFIG_BCMA_DRIVER_GMAC_CMN=y +CONFIG_BCMA_DRIVER_GPIO=y +CONFIG_BCMGENET=m +CONFIG_BE2ISCSI=m +# CONFIG_BE2NET_HWMON is not set +CONFIG_BEFS_FS=m +CONFIG_BFQ_GROUP_IOSCHED=y +CONFIG_BH1750=m +CONFIG_BINFMT_MISC=m +CONFIG_BLK_CGROUP=y +CONFIG_BLK_CGROUP_IOCOST=y +CONFIG_BLK_CGROUP_IOLATENCY=y +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_BLK_DEV_DM=y +CONFIG_BLK_DEV_DRBD=m +CONFIG_BLK_DEV_IO_TRACE=y +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_LOOP_MIN_COUNT=0 +CONFIG_BLK_DEV_MD=y +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_NULL_BLK=m +CONFIG_BLK_DEV_NVME=m +CONFIG_BLK_DEV_RAM=m +CONFIG_BLK_DEV_RAM_SIZE=16384 +CONFIG_BLK_DEV_RBD=m +CONFIG_BLK_DEV_RNBD_CLIENT=m +CONFIG_BLK_DEV_RNBD_SERVER=m +CONFIG_BLK_DEV_SD=y +CONFIG_BLK_DEV_SR=y +CONFIG_BLK_DEV_SX8=m +CONFIG_BLK_DEV_THROTTLING=y +CONFIG_BLK_DEV_ZONED=y +CONFIG_BLK_INLINE_ENCRYPTION=y +CONFIG_BLK_SED_OPAL=y +CONFIG_BLK_WBT=y +CONFIG_BMC150_ACCEL=m +CONFIG_BME680=m +CONFIG_BMP280=m +CONFIG_BNA=m +CONFIG_BNX2X=m +CONFIG_BNXT=m +CONFIG_BNXT_DCB=y +CONFIG_BONDING=m +CONFIG_BOOTTIME_TRACING=y +CONFIG_BOOT_PRINTK_DELAY=y +CONFIG_BPF_LIRC_MODE2=y +CONFIG_BPF_STREAM_PARSER=y +CONFIG_BPQETHER=m +CONFIG_BRCMFMAC=m +CONFIG_BRCMFMAC_PCIE=y +CONFIG_BRCMFMAC_USB=y +CONFIG_BRCMSMAC=m +CONFIG_BRIDGE=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_IP6=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_NFLOG=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_MRP=y +CONFIG_BRIDGE_NETFILTER=m +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BROADCOM_PHY=m +CONFIG_BSD_DISKLABEL=y +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_BT=m +CONFIG_BTRFS_FS=y +CONFIG_BTRFS_FS_POSIX_ACL=y +CONFIG_BT_6LOWPAN=m +CONFIG_BT_ATH3K=m +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +# CONFIG_BT_DEBUGFS is not set +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIBLUECARD=m +CONFIG_BT_HCIBPA10X=m +CONFIG_BT_HCIBT3C=m +CONFIG_BT_HCIBTSDIO=m +CONFIG_BT_HCIBTUSB=m +CONFIG_BT_HCIBTUSB_AUTOSUSPEND=y +CONFIG_BT_HCIDTL1=m +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_3WIRE=y +CONFIG_BT_HCIUART_AG6XX=y +CONFIG_BT_HCIUART_ATH3K=y +CONFIG_BT_HCIUART_BCM=y +CONFIG_BT_HCIUART_BCSP=y +CONFIG_BT_HCIUART_INTEL=y +CONFIG_BT_HCIUART_LL=y +CONFIG_BT_HCIUART_MRVL=y +CONFIG_BT_HCIUART_QCA=y +CONFIG_BT_HCIVHCI=m +CONFIG_BT_HIDP=m +CONFIG_BT_HS=y +CONFIG_BT_LEDS=y +CONFIG_BT_MRVL=m +CONFIG_BT_MRVL_SDIO=m +CONFIG_BT_MSFTEXT=y +CONFIG_BT_MTKSDIO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BUG_ON_DATA_CORRUPTION=y +CONFIG_CACHEFILES=m +CONFIG_CAN=m +CONFIG_CAN_8DEV_USB=m +CONFIG_CAN_CC770=m +CONFIG_CAN_CC770_PLATFORM=m +CONFIG_CAN_C_CAN=m +CONFIG_CAN_C_CAN_PCI=m +CONFIG_CAN_C_CAN_PLATFORM=m +CONFIG_CAN_EMS_PCI=m +CONFIG_CAN_EMS_USB=m +CONFIG_CAN_ESD_USB2=m +CONFIG_CAN_GS_USB=m +CONFIG_CAN_HI311X=m +CONFIG_CAN_IFI_CANFD=m +CONFIG_CAN_KVASER_PCI=m +CONFIG_CAN_KVASER_USB=m +CONFIG_CAN_MCBA_USB=m +CONFIG_CAN_M_CAN=m +CONFIG_CAN_PEAK_PCI=m +CONFIG_CAN_PEAK_PCIEFD=m +CONFIG_CAN_PEAK_USB=m +CONFIG_CAN_PLX_PCI=m +CONFIG_CAN_SJA1000=m +CONFIG_CAN_SJA1000_PLATFORM=m +CONFIG_CAN_SLCAN=m +CONFIG_CAN_SOFTING=m +CONFIG_CAN_VCAN=m +CONFIG_CAN_VXCAN=m +CONFIG_CARDMAN_4000=m +CONFIG_CARDMAN_4040=m +CONFIG_CARL9170=m +CONFIG_CASSINI=m +CONFIG_CDROM_PKTCDVD=m +CONFIG_CEC_CH7322=m +CONFIG_CEPH_FS=m +CONFIG_CEPH_FSCACHE=y +CONFIG_CEPH_FS_POSIX_ACL=y +CONFIG_CEPH_FS_SECURITY_LABEL=y +CONFIG_CFG80211=m +CONFIG_CFG80211_DEBUGFS=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_CGROUP_BPF=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_CGROUP_DEVICE=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CGROUP_HUGETLB=y +CONFIG_CGROUP_NET_PRIO=y +CONFIG_CGROUP_PERF=y +CONFIG_CGROUP_PIDS=y +CONFIG_CHARGER_BD99954=m +CONFIG_CHARGER_BQ2515X=m +CONFIG_CHARGER_LT3651=m +CONFIG_CHARGER_MAX77650=m +CONFIG_CHARGER_SMB347=m +CONFIG_CHARGER_UCS1002=m +CONFIG_CHECKPOINT_RESTORE=y +CONFIG_CHELSIO_IPSEC_INLINE=m +CONFIG_CHELSIO_T1=m +CONFIG_CHELSIO_T1_1G=y +CONFIG_CHELSIO_T4VF=m +CONFIG_CHELSIO_T4_DCB=y +CONFIG_CHELSIO_TLS_DEVICE=m +CONFIG_CHR_DEV_SCH=m +CONFIG_CHR_DEV_SG=y +CONFIG_CHR_DEV_ST=m +CONFIG_CICADA_PHY=m +CONFIG_CIFS=m +CONFIG_CIFS_DFS_UPCALL=y +CONFIG_CIFS_FSCACHE=y +CONFIG_CIFS_POSIX=y +# CONFIG_CIFS_STATS2 is not set +CONFIG_CIFS_UPCALL=y +CONFIG_CIFS_XATTR=y +CONFIG_CLEANCACHE=y +CONFIG_CLS_U32_MARK=y +CONFIG_CLS_U32_PERF=y +CONFIG_CM32181=m +CONFIG_CM3605=m +CONFIG_CMA=y +CONFIG_CMA_DEBUGFS=y +CONFIG_CMA_SIZE_MBYTES=32 +CONFIG_CODA_FS=m +CONFIG_COMMON_CLK_PWM=m +CONFIG_COMMON_CLK_SI544=m +CONFIG_COMPAT_32BIT_TIME=y +# CONFIG_COMPAT_BRK is not set +CONFIG_CONFIGFS_FS=y +CONFIG_CONNECTOR=y +CONFIG_CONSOLE_LOGLEVEL_QUIET=3 +CONFIG_CORTINA_PHY=m +CONFIG_CPUSETS=y +CONFIG_CRAMFS=m +CONFIG_CRYPTO_ADIANTUM=m +CONFIG_CRYPTO_AEGIS128=m +CONFIG_CRYPTO_AES_TI=m +CONFIG_CRYPTO_ANSI_CPRNG=m +CONFIG_CRYPTO_BLAKE2S=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_CAMELLIA=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_CFB=m +CONFIG_CRYPTO_CHACHA20POLY1305=m +CONFIG_CRYPTO_CURVE25519=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_DEV_ATMEL_ECC=m +CONFIG_CRYPTO_DEV_ATMEL_SHA204A=m +CONFIG_CRYPTO_DEV_CHELSIO=m +CONFIG_CRYPTO_DEV_VIRTIO=m +CONFIG_CRYPTO_DRBG_CTR=y +CONFIG_CRYPTO_DRBG_HASH=y +CONFIG_CRYPTO_ECRDSA=m +CONFIG_CRYPTO_FIPS=y +CONFIG_CRYPTO_GCM=y +CONFIG_CRYPTO_KEYWRAP=m +CONFIG_CRYPTO_LRW=m +# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set +CONFIG_CRYPTO_OFB=m +CONFIG_CRYPTO_PCRYPT=m +CONFIG_CRYPTO_RMD160=m +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_SHA3=m +CONFIG_CRYPTO_SM2=m +CONFIG_CRYPTO_SM4=m +CONFIG_CRYPTO_STATS=y +CONFIG_CRYPTO_TEST=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_USER=m +CONFIG_CRYPTO_USER_API_AEAD=y +# CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set +CONFIG_CRYPTO_USER_API_HASH=y +CONFIG_CRYPTO_USER_API_RNG=y +CONFIG_CRYPTO_USER_API_SKCIPHER=y +CONFIG_CRYPTO_VMAC=m +CONFIG_CRYPTO_WP512=m +CONFIG_CRYPTO_XCBC=m +CONFIG_CUSE=m +CONFIG_CW1200=m +CONFIG_CW1200_WLAN_SDIO=m +CONFIG_CW1200_WLAN_SPI=m +CONFIG_DA280=m +CONFIG_DA311=m +CONFIG_DAVICOM_PHY=m +CONFIG_DCB=y +CONFIG_DE2104X=m +CONFIG_DEBUG_DEVRES=y +CONFIG_DEBUG_INFO=y +CONFIG_DEBUG_INFO_BTF=y +# CONFIG_DEBUG_MISC is not set +CONFIG_DEBUG_RODATA_TEST=y +CONFIG_DEBUG_SHIRQ=y +CONFIG_DEBUG_VM=y +# CONFIG_DEBUG_VM_PGTABLE is not set +CONFIG_DEBUG_WX=y +# CONFIG_DETECT_HUNG_TASK is not set +CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=m +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +CONFIG_DEV_APPLETALK=m +CONFIG_DHT11=m +CONFIG_DL2K=m +CONFIG_DLM=m +CONFIG_DLM_DEBUG=y +CONFIG_DM9102=m +CONFIG_DMABUF_HEAPS=y +CONFIG_DMABUF_HEAPS_SYSTEM=y +CONFIG_DMADEVICES=y +CONFIG_DMARD10=m +CONFIG_DMA_CMA=y +CONFIG_DM_CACHE=m +CONFIG_DM_CLONE=m +CONFIG_DM_CRYPT=m +CONFIG_DM_DEBUG=y +CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING=y +CONFIG_DM_DELAY=m +CONFIG_DM_DUST=m +CONFIG_DM_EBS=m +CONFIG_DM_FLAKEY=m +CONFIG_DM_INIT=y +CONFIG_DM_INTEGRITY=m +CONFIG_DM_LOG_USERSPACE=m +CONFIG_DM_LOG_WRITES=m +CONFIG_DM_MIRROR=y +CONFIG_DM_MULTIPATH=m +CONFIG_DM_MULTIPATH_HST=m +CONFIG_DM_MULTIPATH_QL=m +CONFIG_DM_MULTIPATH_ST=m +CONFIG_DM_RAID=m +CONFIG_DM_SNAPSHOT=y +CONFIG_DM_SWITCH=m +CONFIG_DM_THIN_PROVISIONING=m +CONFIG_DM_UEVENT=y +CONFIG_DM_UNSTRIPED=m +CONFIG_DM_VERITY=m +CONFIG_DM_VERITY_FEC=y +CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG=y +CONFIG_DM_WRITECACHE=m +CONFIG_DM_ZERO=y +CONFIG_DM_ZONED=m +CONFIG_DNET=m +CONFIG_DP83640_PHY=m +CONFIG_DP83822_PHY=m +CONFIG_DP83848_PHY=m +CONFIG_DP83869_PHY=m +CONFIG_DPOT_DAC=m +CONFIG_DRAGONRISE_FF=y +CONFIG_DRM=y +CONFIG_DRM_AMDGPU=m +CONFIG_DRM_AMDGPU_CIK=y +CONFIG_DRM_AMDGPU_SI=y +CONFIG_DRM_AMDGPU_USERPTR=y +CONFIG_DRM_AMD_ACP=y +CONFIG_DRM_AMD_DC_HDCP=y +CONFIG_DRM_AMD_DC_SI=y +CONFIG_DRM_ANALOGIX_ANX6345=m +CONFIG_DRM_ANALOGIX_ANX78XX=m +CONFIG_DRM_AST=m +CONFIG_DRM_BOCHS=m +CONFIG_DRM_CHRONTEL_CH7033=m +CONFIG_DRM_CIRRUS_QEMU=m +CONFIG_DRM_DISPLAY_CONNECTOR=m +CONFIG_DRM_DP_AUX_CHARDEV=y +CONFIG_DRM_DP_CEC=y +CONFIG_DRM_GM12U320=m +CONFIG_DRM_I2C_NXP_TDA9950=y +CONFIG_DRM_I2C_NXP_TDA998X=y +CONFIG_DRM_LOAD_EDID_FIRMWARE=y +CONFIG_DRM_MGAG200=m +CONFIG_DRM_NOUVEAU=m +CONFIG_DRM_PANEL_BOE_TV101WUM_NL6=m +CONFIG_DRM_PANEL_ELIDA_KD35T133=m +CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02=m +CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D=m +CONFIG_DRM_PANEL_MANTIX_MLAF057WE51=m +CONFIG_DRM_PANEL_NOVATEK_NT35510=m +CONFIG_DRM_PANEL_ORISETECH_OTM8009A=m +CONFIG_DRM_PANEL_RONBO_RB070D30=m +CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03=m +CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01=m +CONFIG_DRM_PANEL_SEIKO_43WVF1G=m +CONFIG_DRM_PANEL_VISIONOX_RM69299=m +CONFIG_DRM_PARADE_PS8640=m +CONFIG_DRM_QXL=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_RADEON_USERPTR=y +CONFIG_DRM_SII9234=m +CONFIG_DRM_SIMPLE_BRIDGE=m +CONFIG_DRM_STARFIVE=y +CONFIG_DRM_TI_SN65DSI86=m +CONFIG_DRM_TI_TFP410=m +CONFIG_DRM_TI_TPD12S015=m +CONFIG_DRM_TOSHIBA_TC358762=m +CONFIG_DRM_TOSHIBA_TC358764=m +CONFIG_DRM_TOSHIBA_TC358768=m +CONFIG_DRM_TOSHIBA_TC358775=m +CONFIG_DRM_UDL=m +CONFIG_DRM_VGEM=m +CONFIG_DRM_VIRTIO_GPU=m +CONFIG_DUMMY=m +CONFIG_DVB_AS102=m +CONFIG_DVB_AV7110=m +CONFIG_DVB_B2C2_FLEXCOP_PCI=m +CONFIG_DVB_B2C2_FLEXCOP_USB=m +CONFIG_DVB_BT8XX=m +CONFIG_DVB_BUDGET=m +CONFIG_DVB_BUDGET_AV=m +CONFIG_DVB_BUDGET_CI=m +CONFIG_DVB_BUDGET_CORE=m +CONFIG_DVB_BUDGET_PATCH=m +CONFIG_DVB_DDBRIDGE=m +CONFIG_DVB_DM1105=m +CONFIG_DVB_FIREDTV=m +CONFIG_DVB_HOPPER=m +CONFIG_DVB_MANTIS=m +CONFIG_DVB_NETUP_UNIDVB=m +CONFIG_DVB_NGENE=m +CONFIG_DVB_PLUTO2=m +CONFIG_DVB_PT1=m +CONFIG_DVB_SMIPCIE=m +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m +CONFIG_DVB_USB=m +CONFIG_DVB_USB_A800=m +CONFIG_DVB_USB_AF9005=m +CONFIG_DVB_USB_AF9005_REMOTE=m +CONFIG_DVB_USB_AF9015=m +CONFIG_DVB_USB_AF9035=m +CONFIG_DVB_USB_ANYSEE=m +CONFIG_DVB_USB_AU6610=m +CONFIG_DVB_USB_AZ6007=m +CONFIG_DVB_USB_AZ6027=m +CONFIG_DVB_USB_CE6230=m +CONFIG_DVB_USB_CINERGY_T2=m +CONFIG_DVB_USB_CXUSB=m +CONFIG_DVB_USB_CXUSB_ANALOG=y +CONFIG_DVB_USB_DIB0700=m +CONFIG_DVB_USB_DIBUSB_MB=m +CONFIG_DVB_USB_DIBUSB_MC=m +CONFIG_DVB_USB_DIGITV=m +CONFIG_DVB_USB_DTT200U=m +CONFIG_DVB_USB_DTV5100=m +CONFIG_DVB_USB_DVBSKY=m +CONFIG_DVB_USB_DW2102=m +CONFIG_DVB_USB_EC168=m +CONFIG_DVB_USB_GL861=m +CONFIG_DVB_USB_GP8PSK=m +CONFIG_DVB_USB_LME2510=m +CONFIG_DVB_USB_M920X=m +CONFIG_DVB_USB_MXL111SF=m +CONFIG_DVB_USB_NOVA_T_USB2=m +CONFIG_DVB_USB_OPERA1=m +CONFIG_DVB_USB_PCTV452E=m +CONFIG_DVB_USB_RTL28XXU=m +CONFIG_DVB_USB_TECHNISAT_USB2=m +CONFIG_DVB_USB_TTUSB2=m +CONFIG_DVB_USB_UMT_010=m +CONFIG_DVB_USB_V2=m +CONFIG_DVB_USB_VP702X=m +CONFIG_DVB_USB_VP7045=m +CONFIG_DVB_USB_ZD1301=m +CONFIG_DWMAC_DWC_QOS_ETH=m +CONFIG_DWMAC_GENERIC=m +CONFIG_DWMAC_INTEL_PLAT=m +CONFIG_DW_AXI_DMAC=y +CONFIG_DW_DMAC=m +CONFIG_DW_DMAC_PCI=m +CONFIG_DW_EDMA_PCIE=m +CONFIG_DYNAMIC_DEBUG=y +CONFIG_E100=m +CONFIG_E1000=m +CONFIG_E1000E=m +CONFIG_ECHO=m +CONFIG_ECRYPT_FS=m +CONFIG_EDAC=y +CONFIG_EDAC_SIFIVE=y +CONFIG_EEPROM_AT24=m +CONFIG_EEPROM_EE1004=m +CONFIG_EEPROM_IDT_89HPESX=m +CONFIG_EEPROM_LEGACY=m +CONFIG_EEPROM_MAX6875=m +CONFIG_EFIVAR_FS=y +CONFIG_EFI_TEST=m +CONFIG_ENCLOSURE_SERVICES=m +CONFIG_ENIC=m +CONFIG_ENVELOPE_DETECTOR=m +CONFIG_EPIC100=m +CONFIG_EQUALIZER=m +CONFIG_EROFS_FS=m +CONFIG_ET131X=m +CONFIG_ETHOC=m +CONFIG_EVM=y +CONFIG_EXFAT_FS=m +CONFIG_EXPERT=y +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_F2FS_FS=m +CONFIG_F2FS_FS_COMPRESSION=y +CONFIG_F2FS_FS_SECURITY=y +CONFIG_FANOTIFY=y +CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y +CONFIG_FAT_DEFAULT_IOCHARSET="ascii" +CONFIG_FB=y +CONFIG_FB_EFI=y +CONFIG_FB_SSD1307=m +CONFIG_FB_TILEBLITTING=y +CONFIG_FB_VIRTUAL=m +CONFIG_FCOE=m +CONFIG_FEALNX=m +CONFIG_FIREWIRE=m +CONFIG_FIREWIRE_NET=m +CONFIG_FIREWIRE_NOSY=m +CONFIG_FIREWIRE_OHCI=m +CONFIG_FIREWIRE_SBP2=m +CONFIG_FIRMWARE_EDID=y +CONFIG_FM10K=m +CONFIG_FORCEDETH=m +CONFIG_FPGA=m +CONFIG_FPGA_DFL=m +CONFIG_FPGA_DFL_AFU=m +CONFIG_FPGA_DFL_FME=m +CONFIG_FPGA_DFL_FME_BRIDGE=m +CONFIG_FPGA_DFL_FME_MGR=m +CONFIG_FPGA_DFL_FME_REGION=m +CONFIG_FPGA_DFL_PCI=m +CONFIG_FPGA_MGR_ALTERA_CVP=m +CONFIG_FPGA_MGR_ALTERA_PS_SPI=m +CONFIG_FPGA_MGR_ICE40_SPI=m +CONFIG_FPGA_MGR_MACHXO2_SPI=m +CONFIG_FPGA_MGR_XILINX_SPI=m +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER=y +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +CONFIG_FRONTSWAP=y +CONFIG_FSCACHE=m +CONFIG_FSCACHE_STATS=y +CONFIG_FSI=m +CONFIG_FSI_MASTER_GPIO=m +CONFIG_FSI_MASTER_HUB=m +CONFIG_FSI_SCOM=m +CONFIG_FS_DAX=y +CONFIG_FS_ENCRYPTION=y +CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y +CONFIG_FS_VERITY=y +CONFIG_FTRACE_SYSCALLS=y +CONFIG_FUNCTION_PROFILER=y +CONFIG_FUSE_FS=m +CONFIG_FUSION=y +CONFIG_FUSION_CTL=m +CONFIG_FUSION_FC=m +CONFIG_FUSION_LAN=m +CONFIG_FUSION_LOGGING=y +CONFIG_FUSION_MAX_SGE=40 +CONFIG_FUSION_SAS=m +CONFIG_FUSION_SPI=m +CONFIG_FW_LOADER_COMPRESS=y +CONFIG_FW_LOADER_USER_HELPER=y +CONFIG_FXAS21002C=m +CONFIG_FXOS8700_I2C=m +CONFIG_FXOS8700_SPI=m +CONFIG_GACT_PROB=y +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_FM801=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GENEVE=m +CONFIG_GFS2_FS=m +CONFIG_GFS2_FS_LOCKING_DLM=y +CONFIG_GNSS=m +CONFIG_GNSS_MTK_SERIAL=m +CONFIG_GNSS_SIRF_SERIAL=m +CONFIG_GNSS_UBX_SERIAL=m +CONFIG_GP2AP002=m +CONFIG_GPIOLIB_FASTPATH_LIMIT=256 +CONFIG_GPIO_AGGREGATOR=m +CONFIG_GPIO_BD9571MWV=m +CONFIG_GPIO_CADENCE=m +CONFIG_GPIO_EXAR=m +CONFIG_GPIO_MAX77650=m +CONFIG_GPIO_PCA953X=m +CONFIG_GPIO_PCA9570=m +CONFIG_GPIO_PCI_IDIO_16=m +CONFIG_GPIO_SIFIVE=y +CONFIG_GPIO_SYSCON=m +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_TPS65086=m +CONFIG_GPIO_VIPERBOARD=m +CONFIG_GREENASIA_FF=y +CONFIG_GTP=m +CONFIG_HAMACHI=m +CONFIG_HAMRADIO=y +CONFIG_HAPPYMEAL=m +CONFIG_HARDENED_USERCOPY=y +CONFIG_HD44780=m +CONFIG_HDC2010=m +CONFIG_HEADERS_INSTALL=y +CONFIG_HERMES=m +CONFIG_HERMES_PRISM=y +CONFIG_HFSPLUS_FS=m +CONFIG_HFS_FS=m +CONFIG_HIDRAW=y +CONFIG_HID_A4TECH=m +CONFIG_HID_ACCUTOUCH=m +CONFIG_HID_ACRUX=m +CONFIG_HID_ACRUX_FF=y +CONFIG_HID_ALPS=m +CONFIG_HID_APPLE=m +CONFIG_HID_APPLEIR=m +CONFIG_HID_AUREAL=m +CONFIG_HID_BATTERY_STRENGTH=y +CONFIG_HID_BELKIN=m +CONFIG_HID_BETOP_FF=m +CONFIG_HID_BIGBEN_FF=m +CONFIG_HID_CHERRY=m +CONFIG_HID_CHICONY=m +CONFIG_HID_CMEDIA=m +CONFIG_HID_CORSAIR=m +CONFIG_HID_COUGAR=m +CONFIG_HID_CP2112=m +CONFIG_HID_CREATIVE_SB0540=m +CONFIG_HID_CYPRESS=m +CONFIG_HID_DRAGONRISE=m +CONFIG_HID_ELAN=m +CONFIG_HID_ELECOM=m +CONFIG_HID_ELO=m +CONFIG_HID_EMS_FF=m +CONFIG_HID_EZKEY=m +CONFIG_HID_GEMBIRD=m +CONFIG_HID_GFRM=m +CONFIG_HID_GLORIOUS=m +CONFIG_HID_GREENASIA=m +CONFIG_HID_GT683R=m +CONFIG_HID_GYRATION=m +CONFIG_HID_HOLTEK=m +CONFIG_HID_ICADE=m +CONFIG_HID_ITE=m +CONFIG_HID_JABRA=m +CONFIG_HID_KENSINGTON=m +CONFIG_HID_KEYTOUCH=m +CONFIG_HID_KYE=m +CONFIG_HID_LCPOWER=m +CONFIG_HID_LENOVO=m +CONFIG_HID_LOGITECH=m +CONFIG_HID_LOGITECH_DJ=m +CONFIG_HID_MACALLY=m +CONFIG_HID_MAGICMOUSE=y +CONFIG_HID_MALTRON=m +CONFIG_HID_MAYFLASH=m +CONFIG_HID_MCP2221=m +CONFIG_HID_MICROSOFT=m +CONFIG_HID_MONTEREY=m +CONFIG_HID_MULTITOUCH=m +CONFIG_HID_NTI=m +CONFIG_HID_NTRIG=y +CONFIG_HID_ORTEK=m +CONFIG_HID_PANTHERLORD=m +CONFIG_HID_PENMOUNT=m +CONFIG_HID_PETALYNX=m +CONFIG_HID_PICOLCD=m +CONFIG_HID_PID=y +CONFIG_HID_PLANTRONICS=m +CONFIG_HID_PRIMAX=m +CONFIG_HID_PRODIKEYS=m +CONFIG_HID_RETRODE=m +CONFIG_HID_RMI=m +CONFIG_HID_ROCCAT=m +CONFIG_HID_SAITEK=m +CONFIG_HID_SAMSUNG=m +CONFIG_HID_SENSOR_ACCEL_3D=m +CONFIG_HID_SENSOR_ALS=m +CONFIG_HID_SENSOR_DEVICE_ROTATION=m +CONFIG_HID_SENSOR_GYRO_3D=m +CONFIG_HID_SENSOR_HUB=m +CONFIG_HID_SENSOR_HUMIDITY=m +CONFIG_HID_SENSOR_INCLINOMETER_3D=m +CONFIG_HID_SENSOR_MAGNETOMETER_3D=m +CONFIG_HID_SENSOR_TEMP=m +CONFIG_HID_SMARTJOYPLUS=m +CONFIG_HID_SONY=m +CONFIG_HID_SPEEDLINK=m +CONFIG_HID_STEAM=m +CONFIG_HID_STEELSERIES=m +CONFIG_HID_SUNPLUS=m +CONFIG_HID_THINGM=m +CONFIG_HID_THRUSTMASTER=m +CONFIG_HID_TIVO=m +CONFIG_HID_TOPSEED=m +CONFIG_HID_TWINHAN=m +CONFIG_HID_U2FZERO=m +CONFIG_HID_UCLOGIC=m +CONFIG_HID_UDRAW_PS3=m +CONFIG_HID_VIEWSONIC=m +CONFIG_HID_VIVALDI=m +CONFIG_HID_WACOM=m +CONFIG_HID_WALTOP=m +CONFIG_HID_WIIMOTE=m +CONFIG_HID_XINMO=m +CONFIG_HID_ZEROPLUS=m +CONFIG_HID_ZYDACRON=m +CONFIG_HIGH_RES_TIMERS=y +CONFIG_HISI_HIKEY_USB=m +CONFIG_HMC425=m +CONFIG_HOLTEK_FF=y +CONFIG_HOTPLUG_CPU=y +CONFIG_HOTPLUG_PCI=y +CONFIG_HOTPLUG_PCI_PCIE=y +CONFIG_HT16K33=m +CONFIG_HTS221=m +CONFIG_HUGETLBFS=y +CONFIG_HVC_RISCV_SBI=y +CONFIG_HWLAT_TRACER=y +CONFIG_HWSPINLOCK=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_TIMERIOMEM=m +CONFIG_HW_RANDOM_VIRTIO=y +CONFIG_HW_RANDOM_XIPHERA=m +CONFIG_HZ_100=y +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_DESIGNWARE_PCI=m +CONFIG_I2C_DESIGNWARE_PLATFORM=y +CONFIG_I2C_DESIGNWARE_SLAVE=y +CONFIG_I2C_DIOLAN_U2C=m +CONFIG_I2C_MUX_GPMUX=m +CONFIG_I2C_MUX_LTC4306=m +CONFIG_I2C_MUX_MLXCPLD=m +CONFIG_I2C_NFORCE2=m +CONFIG_I2C_NVIDIA_GPU=m +CONFIG_I2C_PCA_PLATFORM=m +CONFIG_I2C_SI470X=m +CONFIG_I2C_SIMTEC=m +CONFIG_I2C_SLAVE_EEPROM=m +CONFIG_I2C_STUB=m +CONFIG_I2C_TINY_USB=m +CONFIG_I2C_VIPERBOARD=m +CONFIG_I40E=m +CONFIG_I40EVF=m +CONFIG_I6300ESB_WDT=m +CONFIG_I82092=m +CONFIG_ICE=m +CONFIG_ICP10100=m +CONFIG_ICPLUS_PHY=m +CONFIG_IEEE802154=m +CONFIG_IEEE802154_6LOWPAN=m +CONFIG_IEEE802154_ADF7242=m +CONFIG_IEEE802154_AT86RF230=m +CONFIG_IEEE802154_ATUSB=m +CONFIG_IEEE802154_CA8210=m +CONFIG_IEEE802154_CC2520=m +CONFIG_IEEE802154_FAKELB=m +CONFIG_IEEE802154_MCR20A=m +CONFIG_IEEE802154_MRF24J40=m +CONFIG_IFB=m +CONFIG_IFCVF=m +CONFIG_IGB=m +CONFIG_IGBVF=m +CONFIG_IGC=m +CONFIG_IIO=m +CONFIG_IIO_INTERRUPT_TRIGGER=m +CONFIG_IIO_MUX=m +CONFIG_IIO_RESCALE=m +CONFIG_IIO_ST_ACCEL_3AXIS=m +CONFIG_IIO_ST_GYRO_3AXIS=m +CONFIG_IIO_ST_LSM6DSX=m +CONFIG_IIO_ST_MAGN_3AXIS=m +CONFIG_IIO_SW_DEVICE=m +CONFIG_IIO_SW_TRIGGER=m +CONFIG_IIO_TIGHTLOOP_TRIGGER=m +CONFIG_IIO_TRIGGERED_EVENT=m +CONFIG_IKCONFIG=m +CONFIG_IKCONFIG_PROC=y +CONFIG_IKHEADERS=m +CONFIG_IMA=y +CONFIG_IMA_APPRAISE=y +CONFIG_IMA_APPRAISE_MODSIG=y +CONFIG_IMA_DEFAULT_HASH_SHA256=y +CONFIG_IMA_KEYRINGS_PERMIT_SIGNED_BY_BUILTIN_OR_SECONDARY=y +# CONFIG_IMA_TRUSTED_KEYRING is not set +CONFIG_IMA_WRITE_POLICY=y +CONFIG_INET=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_ESPINTCP=y +CONFIG_INET6_ESP_OFFLOAD=m +CONFIG_INET6_IPCOMP=m +CONFIG_INET_AH=m +CONFIG_INET_DIAG=m +CONFIG_INET_DIAG_DESTROY=y +CONFIG_INET_ESP=m +CONFIG_INET_ESPINTCP=y +CONFIG_INET_ESP_OFFLOAD=m +CONFIG_INET_IPCOMP=m +CONFIG_INET_RAW_DIAG=m +CONFIG_INET_UDP_DIAG=m +CONFIG_INFINIBAND=m +CONFIG_INFINIBAND_CXGB4=m +CONFIG_INFINIBAND_EFA=m +CONFIG_INFINIBAND_IPOIB=m +CONFIG_INFINIBAND_IPOIB_CM=y +CONFIG_INFINIBAND_IPOIB_DEBUG_DATA=y +CONFIG_INFINIBAND_ISER=m +CONFIG_INFINIBAND_ISERT=m +CONFIG_INFINIBAND_MTHCA=m +CONFIG_INFINIBAND_OCRDMA=m +CONFIG_INFINIBAND_QEDR=m +CONFIG_INFINIBAND_RTRS_CLIENT=m +CONFIG_INFINIBAND_RTRS_SERVER=m +CONFIG_INFINIBAND_SRP=m +CONFIG_INFINIBAND_SRPT=m +CONFIG_INFINIBAND_USER_ACCESS=m +CONFIG_INFINIBAND_USER_MAD=m +CONFIG_INPUT_ATI_REMOTE2=m +CONFIG_INPUT_CM109=m +CONFIG_INPUT_CMA3000=m +CONFIG_INPUT_CMA3000_I2C=m +CONFIG_INPUT_E3X0_BUTTON=m +CONFIG_INPUT_EVDEV=y +CONFIG_INPUT_GPIO_ROTARY_ENCODER=m +CONFIG_INPUT_GPIO_VIBRA=m +CONFIG_INPUT_IQS269A=m +CONFIG_INPUT_JOYDEV=m +CONFIG_INPUT_JOYSTICK=y +CONFIG_INPUT_KEYSPAN_REMOTE=m +CONFIG_INPUT_KXTJ9=m +CONFIG_INPUT_MAX77650_ONKEY=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_POWERMATE=m +CONFIG_INPUT_PWM_BEEPER=m +CONFIG_INPUT_REGULATOR_HAPTIC=m +CONFIG_INPUT_SPARSEKMAP=m +CONFIG_INPUT_TABLET=y +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_INPUT_UINPUT=m +CONFIG_INPUT_YEALINK=m +CONFIG_INTEGRITY_ASYMMETRIC_KEYS=y +CONFIG_INTEGRITY_SIGNATURE=y +CONFIG_INTEL_XWAY_PHY=m +CONFIG_INTERCONNECT=y +CONFIG_INV_ICM42600_I2C=m +CONFIG_INV_ICM42600_SPI=m +CONFIG_IONIC=m +CONFIG_IOSCHED_BFQ=y +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_MATCH_AH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_MH=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_RPFILTER=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_SRH=m +CONFIG_IP6_NF_NAT=m +CONFIG_IP6_NF_RAW=m +CONFIG_IP6_NF_SECURITY=m +CONFIG_IP6_NF_TARGET_HL=m +CONFIG_IP6_NF_TARGET_MASQUERADE=m +CONFIG_IP6_NF_TARGET_NPT=m +CONFIG_IP6_NF_TARGET_REJECT=m +CONFIG_IP6_NF_TARGET_SYNPROXY=m +CONFIG_IPDDP=m +CONFIG_IPDDP_ENCAP=y +CONFIG_IPMI_DEVICE_INTERFACE=m +CONFIG_IPMI_HANDLER=m +CONFIG_IPMI_POWEROFF=m +CONFIG_IPMI_SSIF=m +CONFIG_IPMI_WATCHDOG=m +CONFIG_IPV6_GRE=m +CONFIG_IPV6_ILA=m +CONFIG_IPV6_MIP6=y +CONFIG_IPV6_MROUTE=y +CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_IPV6_PIMSM_V2=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_RPL_LWTUNNEL=y +CONFIG_IPV6_SEG6_HMAC=y +CONFIG_IPV6_SEG6_LWTUNNEL=y +CONFIG_IPV6_SIT=m +CONFIG_IPV6_SIT_6RD=y +CONFIG_IPV6_SUBTREES=y +CONFIG_IPV6_VTI=m +CONFIG_IPVLAN=m +CONFIG_IPVTAP=m +CONFIG_IPWIRELESS=m +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_FIB_TRIE_STATS=y +CONFIG_IP_MROUTE=y +CONFIG_IP_MROUTE_MULTIPLE_TABLES=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARP_MANGLE=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_MATCH_AH=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_RPFILTER=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_SECURITY=m +CONFIG_IP_NF_TARGET_CLUSTERIP=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_TARGET_SYNPROXY=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_IP_SET=m +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPMAC=m +CONFIG_IP_SET_HASH_IPMARK=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_MAC=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_HASH_NETNET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETPORTNET=m +CONFIG_IP_SET_LIST_SET=m +CONFIG_IP_VS=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_FO=m +CONFIG_IP_VS_FTP=m +CONFIG_IP_VS_IPV6=y +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_MH=m +CONFIG_IP_VS_NQ=m +CONFIG_IP_VS_OVF=m +CONFIG_IP_VS_PE_SIP=m +CONFIG_IP_VS_PROTO_AH=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_SCTP=y +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_WRR=m +CONFIG_IR_GPIO_CIR=m +CONFIG_IR_GPIO_TX=m +CONFIG_IR_HIX5HD2=m +CONFIG_IR_IGORPLUGUSB=m +CONFIG_IR_IGUANA=m +CONFIG_IR_IMON=m +CONFIG_IR_IMON_DECODER=m +CONFIG_IR_IMON_RAW=m +CONFIG_IR_JVC_DECODER=m +CONFIG_IR_MCEUSB=m +CONFIG_IR_MCE_KBD_DECODER=m +CONFIG_IR_NEC_DECODER=m +CONFIG_IR_PWM_TX=m +CONFIG_IR_RC5_DECODER=m +CONFIG_IR_RC6_DECODER=m +CONFIG_IR_RCMM_DECODER=m +CONFIG_IR_REDRAT3=m +CONFIG_IR_SANYO_DECODER=m +CONFIG_IR_SERIAL=m +CONFIG_IR_SERIAL_TRANSMITTER=y +CONFIG_IR_SHARP_DECODER=m +CONFIG_IR_SONY_DECODER=m +CONFIG_IR_SPI=m +CONFIG_IR_STREAMZAP=m +CONFIG_IR_TOY=m +CONFIG_IR_TTUSBIR=m +CONFIG_IR_XMP_DECODER=m +CONFIG_ISCSI_TARGET=m +CONFIG_ISCSI_TARGET_CXGB4=m +CONFIG_ISCSI_TCP=m +CONFIG_ISL29003=m +CONFIG_ISL29020=m +CONFIG_ISO9660_FS=m +CONFIG_IWL3945=m +CONFIG_IWL4965=m +CONFIG_IWLDVM=m +CONFIG_IWLEGACY_DEBUG=y +CONFIG_IWLEGACY_DEBUGFS=y +CONFIG_IWLMVM=m +CONFIG_IWLWIFI=m +CONFIG_IWLWIFI_DEBUG=y +CONFIG_IWLWIFI_DEBUGFS=y +# CONFIG_IWLWIFI_DEVICE_TRACING is not set +CONFIG_IXGB=m +CONFIG_IXGBE=m +CONFIG_IXGBEVF=m +CONFIG_IXGBE_DCB=y +CONFIG_JFFS2_FS=m +CONFIG_JFFS2_FS_XATTR=y +CONFIG_JFFS2_SUMMARY=y +CONFIG_JFS_FS=m +CONFIG_JFS_POSIX_ACL=y +CONFIG_JFS_SECURITY=y +CONFIG_JME=m +CONFIG_JOLIET=y +CONFIG_JOYSTICK_A3D=m +CONFIG_JOYSTICK_ADC=m +CONFIG_JOYSTICK_ADI=m +CONFIG_JOYSTICK_ANALOG=m +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_GF2K=m +CONFIG_JOYSTICK_GRIP=m +CONFIG_JOYSTICK_GRIP_MP=m +CONFIG_JOYSTICK_GUILLEMOT=m +CONFIG_JOYSTICK_IFORCE=m +CONFIG_JOYSTICK_IFORCE_232=m +CONFIG_JOYSTICK_IFORCE_USB=m +CONFIG_JOYSTICK_INTERACT=m +CONFIG_JOYSTICK_JOYDUMP=m +CONFIG_JOYSTICK_PSXPAD_SPI=m +CONFIG_JOYSTICK_PSXPAD_SPI_FF=y +CONFIG_JOYSTICK_PXRC=m +CONFIG_JOYSTICK_SIDEWINDER=m +CONFIG_JOYSTICK_TMDC=m +CONFIG_JOYSTICK_XPAD=m +CONFIG_JOYSTICK_XPAD_FF=y +CONFIG_JOYSTICK_XPAD_LEDS=y +CONFIG_JUMP_LABEL=y +CONFIG_KARMA_PARTITION=y +CONFIG_KEYBOARD_QT1050=m +CONFIG_KEYBOARD_QT1070=m +CONFIG_KEYBOARD_TM2_TOUCHKEY=m +CONFIG_KEYS_REQUEST_CACHE=y +CONFIG_KEY_DH_OPERATIONS=y +CONFIG_KEY_NOTIFICATIONS=y +CONFIG_KGDB=y +CONFIG_KGDB_TESTS=y +CONFIG_KSM=y +CONFIG_KSZ884X_PCI=m +CONFIG_KXCJK1013=m +CONFIG_L2TP=m +CONFIG_L2TP_DEBUGFS=m +CONFIG_L2TP_ETH=m +CONFIG_L2TP_IP=m +CONFIG_L2TP_V3=y +CONFIG_LATENCYTOP=y +CONFIG_LCD_CLASS_DEVICE=m +CONFIG_LCD_PLATFORM=m +CONFIG_LDM_PARTITION=y +CONFIG_LEDS_AN30259A=m +CONFIG_LEDS_AS3645A=m +CONFIG_LEDS_BLINKM=m +CONFIG_LEDS_BRIGHTNESS_HW_CHANGED=y +CONFIG_LEDS_CLASS=y +CONFIG_LEDS_CLASS_FLASH=m +CONFIG_LEDS_CLASS_MULTICOLOR=m +CONFIG_LEDS_CR0014114=m +CONFIG_LEDS_GPIO=m +CONFIG_LEDS_IS31FL32XX=m +CONFIG_LEDS_LM3530=m +CONFIG_LEDS_LM3532=m +CONFIG_LEDS_LM3601X=m +CONFIG_LEDS_LM3692X=m +CONFIG_LEDS_LP3944=m +CONFIG_LEDS_LP3952=m +CONFIG_LEDS_LP50XX=m +CONFIG_LEDS_LT3593=m +CONFIG_LEDS_MAX77650=m +CONFIG_LEDS_MLXREG=m +CONFIG_LEDS_PCA9532=m +CONFIG_LEDS_PCA9532_GPIO=y +CONFIG_LEDS_PWM=m +CONFIG_LEDS_REGULATOR=m +CONFIG_LEDS_SYSCON=y +CONFIG_LEDS_TRIGGER_ACTIVITY=m +CONFIG_LEDS_TRIGGER_BACKLIGHT=m +CONFIG_LEDS_TRIGGER_CAMERA=m +CONFIG_LEDS_TRIGGER_CPU=y +CONFIG_LEDS_TRIGGER_DEFAULT_ON=m +CONFIG_LEDS_TRIGGER_DISK=y +CONFIG_LEDS_TRIGGER_GPIO=m +CONFIG_LEDS_TRIGGER_HEARTBEAT=m +CONFIG_LEDS_TRIGGER_MTD=y +CONFIG_LEDS_TRIGGER_NETDEV=m +CONFIG_LEDS_TRIGGER_ONESHOT=m +CONFIG_LEDS_TRIGGER_PANIC=y +CONFIG_LEDS_TRIGGER_PATTERN=m +CONFIG_LEDS_TRIGGER_TIMER=m +CONFIG_LEDS_TRIGGER_TRANSIENT=m +CONFIG_LEDS_USER=m +CONFIG_LED_TRIGGER_PHY=y +# CONFIG_LEGACY_PTYS is not set +CONFIG_LIBERTAS=m +CONFIG_LIBERTAS_CS=m +CONFIG_LIBERTAS_MESH=y +CONFIG_LIBERTAS_SDIO=m +CONFIG_LIBERTAS_USB=m +CONFIG_LIBFC=m +CONFIG_LIBFCOE=m +CONFIG_LIRC=y +CONFIG_LMP91000=m +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_LOGIG940_FF=y +CONFIG_LOGIRUMBLEPAD2_FF=y +CONFIG_LOGITECH_FF=y +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +# CONFIG_LOGO_LINUX_VGA16 is not set +CONFIG_LOG_BUF_SHIFT=18 +CONFIG_LOOPBACK_TARGET=m +CONFIG_LSI_ET1011C_PHY=m +CONFIG_LSM="yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor" +CONFIG_LTC1660=m +CONFIG_LTC2983=m +CONFIG_LTR501=m +CONFIG_LV0104CS=m +CONFIG_LXT_PHY=m +CONFIG_MAC80211=m +CONFIG_MAC80211_HWSIM=m +CONFIG_MAC80211_MESH=y +CONFIG_MAC802154=m +CONFIG_MACB=m +CONFIG_MACB_PCI=m +CONFIG_MACSEC=m +CONFIG_MACVLAN=m +CONFIG_MACVTAP=m +CONFIG_MAC_PARTITION=y +CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x0 +CONFIG_MANTIS_CORE=m +CONFIG_MARVELL_10G_PHY=m +CONFIG_MARVELL_PHY=y +CONFIG_MAX1241=m +CONFIG_MAX1363=m +CONFIG_MAX30100=m +CONFIG_MAX31856=m +CONFIG_MAX44009=m +CONFIG_MAXIM_THERMOCOUPLE=m +CONFIG_MB1232=m +CONFIG_MCP3911=m +CONFIG_MCP4018=m +CONFIG_MCP41010=m +CONFIG_MD=y +CONFIG_MDIO_BITBANG=m +CONFIG_MDIO_MVUSB=m +CONFIG_MD_FAULTY=m +CONFIG_MD_LINEAR=m +CONFIG_MD_MULTIPATH=m +CONFIG_MEDIA_ALTERA_CI=m +CONFIG_MEDIA_CEC_RC=y +CONFIG_MEDIA_PCI_SUPPORT=y +CONFIG_MEDIA_SUPPORT=y +CONFIG_MEDIA_USB_SUPPORT=y +CONFIG_MEGARAID_LEGACY=m +CONFIG_MEGARAID_MAILBOX=m +CONFIG_MEGARAID_MM=m +CONFIG_MEGARAID_NEWGEN=y +CONFIG_MEGARAID_SAS=m +CONFIG_MEMCG=y +CONFIG_MEMSTICK=m +CONFIG_MEMSTICK_JMICRON_38X=m +CONFIG_MEMSTICK_R592=m +CONFIG_MEMSTICK_REALTEK_PCI=m +CONFIG_MEMSTICK_REALTEK_USB=m +CONFIG_MEMSTICK_TIFM_MS=m +CONFIG_MFD_BD9571MWV=m +CONFIG_MFD_INTEL_M10_BMC=m +CONFIG_MFD_MAX77650=m +CONFIG_MFD_SM501=m +CONFIG_MFD_SM501_GPIO=y +CONFIG_MFD_TPS65086=y +CONFIG_MFD_VIPERBOARD=m +CONFIG_MFD_VX855=m +CONFIG_MICREL_PHY=m +CONFIG_MICROSEMI_PHY=m +CONFIG_MINIX_FS=m +CONFIG_MINIX_SUBPARTITION=y +CONFIG_MISC_ALCOR_PCI=m +CONFIG_MISC_RTSX_PCI=m +CONFIG_MISC_RTSX_USB=m +CONFIG_MKISS=m +CONFIG_MLX4_EN=m +CONFIG_MLX4_INFINIBAND=m +CONFIG_MLX5_CORE=m +CONFIG_MLX5_CORE_EN=y +CONFIG_MLX5_CORE_IPOIB=y +CONFIG_MLX5_EN_IPSEC=y +CONFIG_MLX5_INFINIBAND=m +CONFIG_MLX5_IPSEC=y +CONFIG_MLX5_VDPA_NET=m +CONFIG_MLX90614=m +CONFIG_MLX90632=m +CONFIG_MLXSW_CORE=m +CONFIG_MMA7660=m +CONFIG_MMC=y +CONFIG_MMC_ALCOR=m +CONFIG_MMC_CB710=m +CONFIG_MMC_CQHCI=y +CONFIG_MMC_DW=y +CONFIG_MMC_DW_PCI=y +CONFIG_MMC_HSQ=y +CONFIG_MMC_REALTEK_PCI=m +CONFIG_MMC_REALTEK_USB=m +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_CADENCE=m +CONFIG_MMC_SDHCI_OF_DWCMSHC=y +CONFIG_MMC_SDHCI_PCI=m +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_XENON=m +CONFIG_MMC_SDRICOH_CS=m +CONFIG_MMC_SPI=y +CONFIG_MMC_TIFM_SD=m +CONFIG_MMC_USHC=m +CONFIG_MMC_VIA_SDMMC=m +CONFIG_MMC_VUB300=m +CONFIG_MODULES=y +CONFIG_MODULE_SIG_SHA512=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MOUSE_APPLETOUCH=m +CONFIG_MOUSE_BCM5974=m +CONFIG_MOUSE_CYAPA=m +CONFIG_MOUSE_ELAN_I2C=m +CONFIG_MOUSE_ELAN_I2C_SMBUS=y +CONFIG_MOUSE_PS2_ELANTECH=y +CONFIG_MOUSE_PS2_SENTELIC=y +CONFIG_MOUSE_SERIAL=m +CONFIG_MOUSE_SYNAPTICS_I2C=m +CONFIG_MOUSE_SYNAPTICS_USB=m +CONFIG_MOUSE_VSXXXAA=m +CONFIG_MPL115_I2C=m +CONFIG_MPLS_IPTUNNEL=m +CONFIG_MPLS_ROUTING=m +CONFIG_MPTCP=y +CONFIG_MPU3050_I2C=m +CONFIG_MSDOS_FS=m +CONFIG_MSPRO_BLOCK=m +CONFIG_MT7601U=m +CONFIG_MT7603E=m +CONFIG_MT7615E=m +CONFIG_MT7663S=m +CONFIG_MT7663U=m +CONFIG_MT76x0E=m +CONFIG_MT76x0U=m +CONFIG_MT76x2E=m +CONFIG_MT76x2U=m +CONFIG_MT7915E=m +CONFIG_MTD=m +CONFIG_MTD_BLOCK=m +CONFIG_MTD_BLOCK2MTD=m +CONFIG_MTD_CFI=m +CONFIG_MTD_CFI_AMDSTD=m +CONFIG_MTD_CFI_INTELEXT=m +CONFIG_MTD_CFI_STAA=m +CONFIG_MTD_NAND_CADENCE=m +CONFIG_MTD_NAND_NANDSIM=m +CONFIG_MTD_PHYSMAP=m +CONFIG_MTD_PHYSMAP_OF=y +CONFIG_MTD_RAW_NAND=m +CONFIG_MTD_SPI_NOR=m +# CONFIG_MTD_SPI_NOR_USE_4K_SECTORS is not set +CONFIG_MTD_UBI=m +CONFIG_MUX_ADG792A=m +CONFIG_MUX_GPIO=m +CONFIG_MUX_MMIO=m +CONFIG_MVMDIO=m +CONFIG_MWIFIEX=m +CONFIG_MWIFIEX_PCIE=m +CONFIG_MWIFIEX_SDIO=m +CONFIG_MWIFIEX_USB=m +CONFIG_MWL8K=m +CONFIG_MXC4005=m +CONFIG_MXC6255=m +CONFIG_MYRI10GE=m +CONFIG_NAMESPACES=y +CONFIG_NATIONAL_PHY=m +CONFIG_NATSEMI=m +CONFIG_NCSI_OEM_CMD_GET_MAC=y +CONFIG_NE2K_PCI=m +CONFIG_NET=y +CONFIG_NETCONSOLE=m +CONFIG_NETCONSOLE_DYNAMIC=y +CONFIG_NETDEVSIM=m +CONFIG_NETFILTER=y +CONFIG_NETFILTER_XTABLES=y +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m +CONFIG_NETFILTER_XT_MATCH_CGROUP=m +CONFIG_NETFILTER_XT_MATCH_CLUSTER=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_CPU=m +CONFIG_NETFILTER_XT_MATCH_DCCP=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m +CONFIG_NETFILTER_XT_MATCH_DSCP=m +CONFIG_NETFILTER_XT_MATCH_ESP=m +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m +CONFIG_NETFILTER_XT_MATCH_HELPER=m +CONFIG_NETFILTER_XT_MATCH_IPCOMP=m +CONFIG_NETFILTER_XT_MATCH_IPRANGE=m +CONFIG_NETFILTER_XT_MATCH_IPVS=m +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NETFILTER_XT_MATCH_LIMIT=m +CONFIG_NETFILTER_XT_MATCH_MAC=m +CONFIG_NETFILTER_XT_MATCH_MARK=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_NFACCT=m +CONFIG_NETFILTER_XT_MATCH_OSF=m +CONFIG_NETFILTER_XT_MATCH_OWNER=m +CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m +CONFIG_NETFILTER_XT_MATCH_POLICY=m +CONFIG_NETFILTER_XT_MATCH_QUOTA=m +CONFIG_NETFILTER_XT_MATCH_RATEEST=m +CONFIG_NETFILTER_XT_MATCH_REALM=m +CONFIG_NETFILTER_XT_MATCH_RECENT=m +CONFIG_NETFILTER_XT_MATCH_SOCKET=m +CONFIG_NETFILTER_XT_MATCH_STATE=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_NETFILTER_XT_MATCH_STRING=m +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m +CONFIG_NETFILTER_XT_MATCH_TIME=m +CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_NETFILTER_XT_SET=m +CONFIG_NETFILTER_XT_TARGET_AUDIT=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m +CONFIG_NETFILTER_XT_TARGET_CONNMARK=m +CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m +CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LED=m +CONFIG_NETFILTER_XT_TARGET_LOG=m +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_TARGET_NFLOG=m +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_SECMARK=m +CONFIG_NETFILTER_XT_TARGET_TCPMSS=m +CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m +CONFIG_NETFILTER_XT_TARGET_TEE=m +CONFIG_NETFILTER_XT_TARGET_TPROXY=m +CONFIG_NETFILTER_XT_TARGET_TRACE=m +CONFIG_NETLABEL=y +CONFIG_NETLINK_DIAG=m +CONFIG_NETROM=m +CONFIG_NETWORK_PHY_TIMESTAMPING=y +CONFIG_NETXEN_NIC=m +CONFIG_NET_9P=m +CONFIG_NET_9P_RDMA=m +CONFIG_NET_9P_VIRTIO=m +CONFIG_NET_ACT_BPF=m +CONFIG_NET_ACT_CONNMARK=m +CONFIG_NET_ACT_CSUM=m +CONFIG_NET_ACT_CT=m +CONFIG_NET_ACT_CTINFO=m +CONFIG_NET_ACT_GACT=m +CONFIG_NET_ACT_GATE=m +CONFIG_NET_ACT_IFE=m +CONFIG_NET_ACT_IPT=m +CONFIG_NET_ACT_MIRRED=m +CONFIG_NET_ACT_MPLS=m +CONFIG_NET_ACT_NAT=m +CONFIG_NET_ACT_PEDIT=m +CONFIG_NET_ACT_POLICE=m +CONFIG_NET_ACT_SAMPLE=m +CONFIG_NET_ACT_SIMP=m +CONFIG_NET_ACT_SKBEDIT=m +CONFIG_NET_ACT_SKBMOD=m +CONFIG_NET_ACT_TUNNEL_KEY=m +CONFIG_NET_ACT_VLAN=m +CONFIG_NET_CLS_ACT=y +CONFIG_NET_CLS_BASIC=m +CONFIG_NET_CLS_BPF=m +CONFIG_NET_CLS_CGROUP=y +CONFIG_NET_CLS_FLOW=m +CONFIG_NET_CLS_FLOWER=m +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_MATCHALL=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_U32=m +CONFIG_NET_DROP_MONITOR=y +CONFIG_NET_DSA=m +CONFIG_NET_DSA_BCM_SF2=m +CONFIG_NET_DSA_LOOP=m +CONFIG_NET_DSA_MICROCHIP_KSZ9477=m +CONFIG_NET_DSA_MICROCHIP_KSZ9477_SPI=m +CONFIG_NET_DSA_MT7530=m +CONFIG_NET_DSA_MV88E6XXX=m +CONFIG_NET_DSA_MV88E6XXX_PTP=y +CONFIG_NET_DSA_QCA8K=m +CONFIG_NET_DSA_SMSC_LAN9303_I2C=m +CONFIG_NET_DSA_SMSC_LAN9303_MDIO=m +CONFIG_NET_DSA_TAG_GSWIP=m +CONFIG_NET_DSA_TAG_RTL4_A=m +CONFIG_NET_DSA_TAG_SJA1105=m +CONFIG_NET_DSA_TAG_TRAILER=m +CONFIG_NET_EMATCH=y +CONFIG_NET_EMATCH_CANID=m +CONFIG_NET_EMATCH_CMP=m +CONFIG_NET_EMATCH_IPSET=m +CONFIG_NET_EMATCH_IPT=m +CONFIG_NET_EMATCH_META=m +CONFIG_NET_EMATCH_NBYTE=m +CONFIG_NET_EMATCH_TEXT=m +CONFIG_NET_EMATCH_U32=m +CONFIG_NET_FC=y +CONFIG_NET_FOU_IP_TUNNELS=y +CONFIG_NET_IFE_SKBMARK=m +CONFIG_NET_IFE_SKBPRIO=m +CONFIG_NET_IFE_SKBTCINDEX=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_NET_IPGRE_DEMUX=m +CONFIG_NET_IPIP=m +CONFIG_NET_IPVTI=m +CONFIG_NET_KEY=m +CONFIG_NET_KEY_MIGRATE=y +CONFIG_NET_NCSI=y +CONFIG_NET_PKTGEN=m +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_CAKE=m +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_CBS=m +CONFIG_NET_SCH_CHOKE=m +CONFIG_NET_SCH_CODEL=m +CONFIG_NET_SCH_DRR=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_ETF=m +CONFIG_NET_SCH_ETS=m +CONFIG_NET_SCH_FQ=m +CONFIG_NET_SCH_FQ_CODEL=y +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_HHF=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_SCH_MQPRIO=m +CONFIG_NET_SCH_MULTIQ=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_PIE=m +CONFIG_NET_SCH_PLUG=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_QFQ=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFB=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TAPRIO=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_TC_SKB_EXT=y +CONFIG_NET_TEAM=m +CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m +CONFIG_NET_TEAM_MODE_BROADCAST=m +CONFIG_NET_TEAM_MODE_LOADBALANCE=m +CONFIG_NET_TEAM_MODE_RANDOM=m +CONFIG_NET_TEAM_MODE_ROUNDROBIN=m +CONFIG_NET_TULIP=y +# CONFIG_NET_VENDOR_ALACRITECH is not set +# CONFIG_NET_VENDOR_CAVIUM is not set +# CONFIG_NET_VENDOR_CORTINA is not set +# CONFIG_NET_VENDOR_EZCHIP is not set +# CONFIG_NET_VENDOR_FUJITSU is not set +# CONFIG_NET_VENDOR_HUAWEI is not set +# CONFIG_NET_VENDOR_I825XX is not set +# CONFIG_NET_VENDOR_MICROCHIP is not set +# CONFIG_NET_VENDOR_MICROSEMI is not set +# CONFIG_NET_VENDOR_NI is not set +# CONFIG_NET_VENDOR_QUALCOMM is not set +# CONFIG_NET_VENDOR_RENESAS is not set +# CONFIG_NET_VENDOR_SAMSUNG is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_SOCIONEXT is not set +# CONFIG_NET_VENDOR_SOLARFLARE is not set +# CONFIG_NET_VENDOR_SYNOPSYS is not set +CONFIG_NET_VRF=m +CONFIG_NFC=m +CONFIG_NFC_DIGITAL=m +CONFIG_NFC_HCI=m +CONFIG_NFC_MICROREAD_I2C=m +CONFIG_NFC_MRVL_USB=m +CONFIG_NFC_NCI=m +CONFIG_NFC_NCI_SPI=m +CONFIG_NFC_NXP_NCI=m +CONFIG_NFC_NXP_NCI_I2C=m +CONFIG_NFC_PN533_I2C=m +CONFIG_NFC_PN533_USB=m +CONFIG_NFC_PN544_I2C=m +CONFIG_NFC_PORT100=m +CONFIG_NFC_SHDLC=y +CONFIG_NFC_SIM=m +CONFIG_NFC_ST21NFCA_I2C=m +CONFIG_NFC_TRF7970A=m +CONFIG_NFP=m +# CONFIG_NFP_APP_ABM_NIC is not set +CONFIG_NFSD=m +CONFIG_NFSD_BLOCKLAYOUT=y +CONFIG_NFSD_FLEXFILELAYOUT=y +CONFIG_NFSD_SCSILAYOUT=y +CONFIG_NFSD_V3_ACL=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_V4_2_INTER_SSC=y +CONFIG_NFSD_V4_SECURITY_LABEL=y +# CONFIG_NFS_DISABLE_UDP_SUPPORT is not set +CONFIG_NFS_FS=m +CONFIG_NFS_FSCACHE=y +CONFIG_NFS_SWAP=y +# CONFIG_NFS_V2 is not set +CONFIG_NFS_V3_ACL=y +CONFIG_NFS_V4=m +CONFIG_NFS_V4_1=y +CONFIG_NFS_V4_2=y +CONFIG_NFT_BRIDGE_META=m +CONFIG_NFT_BRIDGE_REJECT=m +CONFIG_NFT_COMPAT=m +CONFIG_NFT_COUNTER=m +CONFIG_NFT_CT=m +CONFIG_NFT_DUP_IPV4=m +CONFIG_NFT_DUP_IPV6=m +CONFIG_NFT_DUP_NETDEV=m +CONFIG_NFT_FIB_INET=m +CONFIG_NFT_FIB_IPV4=m +CONFIG_NFT_FIB_IPV6=m +CONFIG_NFT_FIB_NETDEV=m +CONFIG_NFT_FLOW_OFFLOAD=m +CONFIG_NFT_FWD_NETDEV=m +CONFIG_NFT_HASH=m +CONFIG_NFT_LIMIT=m +CONFIG_NFT_LOG=m +CONFIG_NFT_MASQ=m +CONFIG_NFT_NAT=m +CONFIG_NFT_NUMGEN=m +CONFIG_NFT_OBJREF=m +CONFIG_NFT_QUEUE=m +CONFIG_NFT_QUOTA=m +CONFIG_NFT_REDIR=m +CONFIG_NFT_REJECT=m +CONFIG_NFT_SOCKET=m +CONFIG_NFT_SYNPROXY=m +CONFIG_NFT_TPROXY=m +CONFIG_NFT_TUNNEL=m +CONFIG_NFT_XFRM=m +CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_AMANDA=m +CONFIG_NF_CONNTRACK_BRIDGE=m +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CONNTRACK_FTP=m +CONFIG_NF_CONNTRACK_H323=m +CONFIG_NF_CONNTRACK_IRC=m +CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_PPTP=m +CONFIG_NF_CONNTRACK_SANE=m +CONFIG_NF_CONNTRACK_SECMARK=y +CONFIG_NF_CONNTRACK_SIP=m +CONFIG_NF_CONNTRACK_SNMP=m +CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NF_CONNTRACK_TIMESTAMP=y +CONFIG_NF_CONNTRACK_ZONES=y +CONFIG_NF_CT_NETLINK=m +CONFIG_NF_FLOW_TABLE=m +CONFIG_NF_FLOW_TABLE_INET=m +CONFIG_NF_FLOW_TABLE_IPV4=m +CONFIG_NF_FLOW_TABLE_IPV6=m +CONFIG_NF_LOG_ARP=m +CONFIG_NF_LOG_IPV4=m +CONFIG_NF_TABLES=m +CONFIG_NF_TABLES_ARP=y +CONFIG_NF_TABLES_BRIDGE=m +CONFIG_NF_TABLES_INET=y +CONFIG_NF_TABLES_NETDEV=y +CONFIG_NILFS2_FS=m +CONFIG_NIU=m +CONFIG_NLMON=m +CONFIG_NLS_ASCII=y +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_DEFAULT="utf8" +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_MAC_CELTIC=m +CONFIG_NLS_MAC_CENTEURO=m +CONFIG_NLS_MAC_CROATIAN=m +CONFIG_NLS_MAC_CYRILLIC=m +CONFIG_NLS_MAC_GAELIC=m +CONFIG_NLS_MAC_GREEK=m +CONFIG_NLS_MAC_ICELAND=m +CONFIG_NLS_MAC_INUIT=m +CONFIG_NLS_MAC_ROMAN=m +CONFIG_NLS_MAC_ROMANIAN=m +CONFIG_NLS_MAC_TURKISH=m +CONFIG_NOP_USB_XCEIV=m +CONFIG_NORTEL_HERMES=m +# CONFIG_NOUVEAU_LEGACY_CTX_SUPPORT is not set +CONFIG_NOZOMI=m +CONFIG_NO_HZ=y +CONFIG_NO_HZ_FULL=y +CONFIG_NR_CPUS=32 +CONFIG_NS83820=m +CONFIG_NULL_TTY=m +CONFIG_NVDLA=m +CONFIG_NVME_FC=m +CONFIG_NVME_HWMON=y +CONFIG_NVME_MULTIPATH=y +CONFIG_NVME_RDMA=m +CONFIG_NVME_TARGET=m +CONFIG_NVME_TARGET_FC=m +CONFIG_NVME_TARGET_FCLOOP=m +CONFIG_NVME_TARGET_LOOP=m +CONFIG_NVME_TARGET_PASSTHRU=y +CONFIG_NVME_TARGET_RDMA=m +CONFIG_NVME_TARGET_TCP=m +CONFIG_NVME_TCP=m +CONFIG_N_GSM=m +CONFIG_N_HDLC=m +# CONFIG_OCFS2_DEBUG_MASKLOG is not set +CONFIG_OCFS2_FS=m +# CONFIG_OCFS2_FS_STATS is not set +CONFIG_OF=y +CONFIG_OF_FPGA_REGION=m +CONFIG_OF_OVERLAY=y +CONFIG_OPENVSWITCH=m +CONFIG_OPT3001=m +CONFIG_ORANGEFS_FS=m +CONFIG_ORINOCO_USB=m +CONFIG_OSF_PARTITION=y +CONFIG_OVERLAY_FS=m +CONFIG_PA12203001=m +CONFIG_PACKET=y +CONFIG_PACKET_DIAG=m +CONFIG_PANTHERLORD_FF=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_PCCARD=y +CONFIG_PCI=y +CONFIG_PCIEAER=y +CONFIG_PCIEAER_INJECT=m +CONFIG_PCIEPORTBUS=y +CONFIG_PCIE_DPC=y +CONFIG_PCIE_ECRC=y +CONFIG_PCIE_PTM=y +CONFIG_PCIE_XILINX=y +CONFIG_PCIPCWATCHDOG=m +CONFIG_PCI_HERMES=m +CONFIG_PCI_HOST_GENERIC=y +CONFIG_PCI_IOV=y +CONFIG_PCI_J721E_HOST=y +CONFIG_PCI_PASID=y +CONFIG_PCI_PF_STUB=m +CONFIG_PCI_PRI=y +CONFIG_PCI_STUB=y +CONFIG_PCI_SW_SWITCHTEC=m +CONFIG_PCNET32=m +CONFIG_PD6729=m +CONFIG_PDC_ADMA=m +CONFIG_PERSISTENT_KEYRINGS=y +CONFIG_PHY_CADENCE_SALVO=m +CONFIG_PHY_CADENCE_SIERRA=m +CONFIG_PHY_CADENCE_TORRENT=m +CONFIG_PKCS8_PRIVATE_KEY_PARSER=m +CONFIG_PLX_HERMES=m +CONFIG_PMBUS=m +CONFIG_PMS7003=m +CONFIG_PM_DEVFREQ=y +CONFIG_POSIX_MQUEUE=y +CONFIG_POWERCAP=y +CONFIG_POWER_RESET_GPIO=y +CONFIG_POWER_RESET_GPIO_RESTART=y +CONFIG_POWER_RESET_RESTART=y +CONFIG_POWER_RESET_TPS65086=y +CONFIG_PPPOATM=m +CONFIG_PPPOE=m +CONFIG_PPPOL2TP=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_FILTER=y +CONFIG_PPP_MPPE=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPS_CLIENT_GPIO=m +CONFIG_PPS_CLIENT_LDISC=m +CONFIG_PPTP=m +CONFIG_PREEMPT_VOLUNTARY=y +CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=12 +CONFIG_PRINTK_TIME=y +CONFIG_PROC_KCORE=y +CONFIG_PROFILING=y +CONFIG_PSI=y +CONFIG_PSTORE=y +CONFIG_PSTORE_842_COMPRESS=y +CONFIG_PSTORE_LZ4HC_COMPRESS=m +CONFIG_PSTORE_LZ4_COMPRESS=m +CONFIG_PSTORE_LZO_COMPRESS=m +CONFIG_PSTORE_RAM=m +CONFIG_PTP_1588_CLOCK_IDT82P33=m +CONFIG_PTP_1588_CLOCK_IDTCM=m +CONFIG_PVPANIC=y +CONFIG_PWM_SIFIVE=y +CONFIG_PWM_SIFIVE_PTC=y +CONFIG_PWRSEQ_SD8787=m +CONFIG_PWRSEQ_SIMPLE=m +CONFIG_QED=m +CONFIG_QEDE=m +CONFIG_QEDF=m +CONFIG_QEDI=m +CONFIG_QFMT_V2=y +CONFIG_QLA3XXX=m +CONFIG_QLCNIC=m +CONFIG_QLGE=m +CONFIG_QRTR_SMD=m +CONFIG_QRTR_TUN=m +CONFIG_QSEMI_PHY=m +CONFIG_QTNFMAC_PCIE=m +CONFIG_QUOTA_NETLINK_INTERFACE=y +CONFIG_R6040=m +CONFIG_R8169=m +CONFIG_R8712U=m +CONFIG_RADIO_MAXIRADIO=m +CONFIG_RADIO_SAA7706H=m +CONFIG_RADIO_SHARK=m +CONFIG_RADIO_SHARK2=m +CONFIG_RADIO_SI470X=m +CONFIG_RADIO_SI4713=m +CONFIG_RADIO_TEA5764=m +CONFIG_RADIO_WL1273=m +# CONFIG_RAID6_PQ_BENCHMARK is not set +CONFIG_RAPIDIO=m +CONFIG_RAPIDIO_CHMAN=m +CONFIG_RAPIDIO_CPS_GEN2=m +CONFIG_RAPIDIO_CPS_XX=m +CONFIG_RAPIDIO_DMA_ENGINE=y +CONFIG_RAPIDIO_ENUM_BASIC=m +CONFIG_RAPIDIO_MPORT_CDEV=m +CONFIG_RAPIDIO_RXS_GEN3=m +CONFIG_RAPIDIO_TSI568=m +CONFIG_RAPIDIO_TSI57X=m +CONFIG_RAPIDIO_TSI721=m +CONFIG_RCU_CPU_STALL_TIMEOUT=60 +CONFIG_RCU_TORTURE_TEST=m +# CONFIG_RCU_TRACE is not set +CONFIG_RC_ATI_REMOTE=m +CONFIG_RC_CORE=y +CONFIG_RC_DECODERS=y +CONFIG_RC_DEVICES=y +CONFIG_RC_LOOPBACK=m +CONFIG_RC_MAP=m +CONFIG_RC_XBOX_DVD=m +CONFIG_RDMA_RXE=m +CONFIG_RDMA_SIW=m +CONFIG_RDS=m +CONFIG_RDS_RDMA=m +CONFIG_RDS_TCP=m +CONFIG_REALTEK_PHY=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_BD9571MWV=m +CONFIG_REGULATOR_FIXED_VOLTAGE=m +CONFIG_REGULATOR_MAX77650=m +CONFIG_REGULATOR_MP5416=m +CONFIG_REGULATOR_MP886X=m +CONFIG_REGULATOR_PWM=y +CONFIG_REGULATOR_RT4801=m +CONFIG_REGULATOR_RTMV20=m +CONFIG_REGULATOR_VCTRL=m +CONFIG_REMOTEPROC=y +CONFIG_RFKILL=m +CONFIG_RFKILL_GPIO=m +CONFIG_RING_BUFFER_BENCHMARK=m +CONFIG_RIONET=m +CONFIG_RMI4_F34=y +CONFIG_RMI4_F3A=y +CONFIG_RMI4_F55=y +CONFIG_RMI4_I2C=m +CONFIG_RMI4_SMB=m +CONFIG_RMI4_SPI=m +CONFIG_ROCKER=m +CONFIG_ROMFS_FS=m +CONFIG_ROSE=m +CONFIG_RPMSG_CHAR=m +CONFIG_RPMSG_VIRTIO=m +CONFIG_RPR0521=m +CONFIG_RSI_91X=m +CONFIG_RT2400PCI=m +CONFIG_RT2500PCI=m +CONFIG_RT2500USB=m +CONFIG_RT2800PCI=m +CONFIG_RT2800USB=m +CONFIG_RT2800USB_RT3573=y +CONFIG_RT2800USB_RT53XX=y +CONFIG_RT2800USB_RT55XX=y +CONFIG_RT2800USB_UNKNOWN=y +CONFIG_RT2X00=m +CONFIG_RT2X00_LIB_DEBUGFS=y +CONFIG_RT61PCI=m +CONFIG_RT73USB=m +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_ABEOZ9=m +CONFIG_RTC_DRV_ABX80X=m +CONFIG_RTC_DRV_BQ32K=m +CONFIG_RTC_DRV_BQ4802=m +CONFIG_RTC_DRV_DS1286=m +CONFIG_RTC_DRV_DS1305=m +CONFIG_RTC_DRV_DS1307=m +CONFIG_RTC_DRV_DS1343=m +CONFIG_RTC_DRV_DS1347=m +CONFIG_RTC_DRV_DS1374=m +CONFIG_RTC_DRV_DS1374_WDT=y +CONFIG_RTC_DRV_DS1390=m +CONFIG_RTC_DRV_DS1511=m +CONFIG_RTC_DRV_DS1553=m +CONFIG_RTC_DRV_DS1672=m +CONFIG_RTC_DRV_DS1685_FAMILY=m +CONFIG_RTC_DRV_DS1742=m +CONFIG_RTC_DRV_DS2404=m +CONFIG_RTC_DRV_DS3232=m +# CONFIG_RTC_DRV_DS3232_HWMON is not set +CONFIG_RTC_DRV_EFI=y +CONFIG_RTC_DRV_EM3027=m +CONFIG_RTC_DRV_FM3130=m +CONFIG_RTC_DRV_ISL12022=m +CONFIG_RTC_DRV_ISL12026=m +CONFIG_RTC_DRV_ISL1208=m +CONFIG_RTC_DRV_M41T80=m +CONFIG_RTC_DRV_M41T80_WDT=y +CONFIG_RTC_DRV_M41T93=m +CONFIG_RTC_DRV_M41T94=m +CONFIG_RTC_DRV_M48T35=m +CONFIG_RTC_DRV_M48T59=m +CONFIG_RTC_DRV_MAX6900=m +CONFIG_RTC_DRV_MAX6902=m +CONFIG_RTC_DRV_MAX6916=m +CONFIG_RTC_DRV_MCP795=m +CONFIG_RTC_DRV_MSM6242=m +CONFIG_RTC_DRV_PCF2123=m +CONFIG_RTC_DRV_PCF2127=m +CONFIG_RTC_DRV_PCF85063=m +CONFIG_RTC_DRV_PCF8523=m +CONFIG_RTC_DRV_PCF8563=m +CONFIG_RTC_DRV_PCF8583=m +CONFIG_RTC_DRV_R7301=m +CONFIG_RTC_DRV_R9701=m +CONFIG_RTC_DRV_RP5C01=m +CONFIG_RTC_DRV_RS5C348=m +CONFIG_RTC_DRV_RS5C372=m +CONFIG_RTC_DRV_RV3028=m +CONFIG_RTC_DRV_RV3029C2=m +CONFIG_RTC_DRV_RV3032=m +CONFIG_RTC_DRV_RX4581=m +CONFIG_RTC_DRV_RX8010=m +CONFIG_RTC_DRV_RX8025=m +CONFIG_RTC_DRV_RX8581=m +CONFIG_RTC_DRV_SD3078=m +CONFIG_RTC_DRV_STK17TA8=m +CONFIG_RTC_DRV_V3020=m +CONFIG_RTC_DRV_X1205=m +# CONFIG_RTC_SYSTOHC is not set +CONFIG_RTL8180=m +CONFIG_RTL8187=m +CONFIG_RTL8188EE=m +CONFIG_RTL8192CE=m +CONFIG_RTL8192CU=m +CONFIG_RTL8192DE=m +CONFIG_RTL8192E=m +CONFIG_RTL8192EE=m +CONFIG_RTL8192SE=m +CONFIG_RTL8723AE=m +CONFIG_RTL8723BE=m +CONFIG_RTL8723BS=m +CONFIG_RTL8821AE=m +CONFIG_RTL8XXXU=m +CONFIG_RTL8XXXU_UNTESTED=y +CONFIG_RTLLIB=m +# CONFIG_RTLWIFI_DEBUG is not set +CONFIG_RTW88=m +CONFIG_RTW88_8723DE=m +CONFIG_RTW88_8821CE=m +CONFIG_RTW88_8822BE=m +CONFIG_RTW88_8822CE=m +CONFIG_RXKAD=y +CONFIG_S2IO=m +CONFIG_SATA_ACARD_AHCI=m +CONFIG_SATA_AHCI=y +CONFIG_SATA_AHCI_PLATFORM=m +CONFIG_SATA_INIC162X=m +CONFIG_SATA_MOBILE_LPM_POLICY=3 +CONFIG_SATA_MV=m +CONFIG_SATA_NV=m +CONFIG_SATA_PROMISE=m +CONFIG_SATA_QSTOR=m +CONFIG_SATA_SIL=m +CONFIG_SATA_SIL24=m +CONFIG_SATA_SIS=m +CONFIG_SATA_SVW=m +CONFIG_SATA_SX4=m +CONFIG_SATA_ULI=m +CONFIG_SATA_VIA=m +CONFIG_SATA_VITESSE=m +CONFIG_SBP_TARGET=m +CONFIG_SC92031=m +CONFIG_SCD30_CORE=m +CONFIG_SCD30_I2C=m +CONFIG_SCD30_SERIAL=m +CONFIG_SCHED_AUTOGROUP=y +CONFIG_SCHED_TRACER=y +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_3W_SAS=m +CONFIG_SCSI_AACRAID=m +CONFIG_SCSI_ACARD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_SCSI_AIC7XXX=m +CONFIG_SCSI_AM53C974=m +CONFIG_SCSI_ARCMSR=m +CONFIG_SCSI_BFA_FC=m +CONFIG_SCSI_BNX2X_FCOE=m +CONFIG_SCSI_BNX2_ISCSI=m +CONFIG_SCSI_CHELSIO_FCOE=m +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_CXGB3_ISCSI=m +CONFIG_SCSI_CXGB4_ISCSI=m +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_DEBUG=m +CONFIG_SCSI_DH=y +CONFIG_SCSI_DH_ALUA=m +CONFIG_SCSI_DH_EMC=m +CONFIG_SCSI_DH_HP_SW=m +CONFIG_SCSI_DH_RDAC=m +CONFIG_SCSI_DMX3191D=m +CONFIG_SCSI_ENCLOSURE=m +CONFIG_SCSI_ESAS2R=m +CONFIG_SCSI_FC_ATTRS=m +CONFIG_SCSI_FDOMAIN_PCI=m +CONFIG_SCSI_HPSA=m +CONFIG_SCSI_HPTIOP=m +CONFIG_SCSI_INIA100=m +CONFIG_SCSI_INITIO=m +CONFIG_SCSI_IPR=m +CONFIG_SCSI_IPS=m +CONFIG_SCSI_LOGGING=y +CONFIG_SCSI_MPT2SAS=m +CONFIG_SCSI_MVSAS=m +# CONFIG_SCSI_MVSAS_DEBUG is not set +CONFIG_SCSI_MVSAS_TASKLET=y +CONFIG_SCSI_MVUMI=m +CONFIG_SCSI_MYRB=m +CONFIG_SCSI_MYRS=m +CONFIG_SCSI_PM8001=m +CONFIG_SCSI_PMCRAID=m +CONFIG_SCSI_QLA_FC=m +CONFIG_SCSI_QLA_ISCSI=m +CONFIG_SCSI_QLOGIC_1280=m +CONFIG_SCSI_SAS_ATA=y +CONFIG_SCSI_SCAN_ASYNC=y +CONFIG_SCSI_SMARTPQI=m +CONFIG_SCSI_SNIC=m +CONFIG_SCSI_STEX=m +CONFIG_SCSI_SYM53C8XX_2=m +CONFIG_SCSI_VIRTIO=m +CONFIG_SCSI_WD719X=m +CONFIG_SCTP_COOKIE_HMAC_MD5=y +CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1=y +CONFIG_SDIO_UART=m +CONFIG_SECONDARY_TRUSTED_KEYRING=y +CONFIG_SECURITY=y +CONFIG_SECURITY_INFINIBAND=y +CONFIG_SECURITY_LOCKDOWN_LSM=y +CONFIG_SECURITY_LOCKDOWN_LSM_EARLY=y +CONFIG_SECURITY_NETWORK=y +CONFIG_SECURITY_NETWORK_XFRM=y +CONFIG_SECURITY_SELINUX=y +CONFIG_SECURITY_SELINUX_BOOTPARAM=y +CONFIG_SECURITY_YAMA=y +CONFIG_SENSORS_AD7314=m +CONFIG_SENSORS_AD7414=m +CONFIG_SENSORS_AD7418=m +CONFIG_SENSORS_ADC128D818=m +CONFIG_SENSORS_ADCXX=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1026=m +CONFIG_SENSORS_ADM1029=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ADM1266=m +CONFIG_SENSORS_ADM1275=m +CONFIG_SENSORS_ADM9240=m +CONFIG_SENSORS_ADS7828=m +CONFIG_SENSORS_ADS7871=m +CONFIG_SENSORS_ADT7310=m +CONFIG_SENSORS_ADT7410=m +CONFIG_SENSORS_ADT7411=m +CONFIG_SENSORS_ADT7462=m +CONFIG_SENSORS_ADT7470=m +CONFIG_SENSORS_ADT7475=m +CONFIG_SENSORS_AMC6821=m +CONFIG_SENSORS_APDS990X=m +CONFIG_SENSORS_ASC7621=m +CONFIG_SENSORS_ASPEED=m +CONFIG_SENSORS_ATXP1=m +CONFIG_SENSORS_AXI_FAN_CONTROL=m +CONFIG_SENSORS_BEL_PFE=m +CONFIG_SENSORS_BH1770=m +CONFIG_SENSORS_CORSAIR_CPRO=m +CONFIG_SENSORS_DME1737=m +CONFIG_SENSORS_DRIVETEMP=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_DS620=m +CONFIG_SENSORS_EMC1403=m +CONFIG_SENSORS_EMC6W201=m +CONFIG_SENSORS_F71805F=m +CONFIG_SENSORS_F71882FG=m +CONFIG_SENSORS_F75375S=m +CONFIG_SENSORS_FTSTEUTATES=m +CONFIG_SENSORS_G760A=m +CONFIG_SENSORS_G762=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_GL520SM=m +CONFIG_SENSORS_IBMAEM=m +CONFIG_SENSORS_IBMPEX=m +CONFIG_SENSORS_INA209=m +CONFIG_SENSORS_INA2XX=m +CONFIG_SENSORS_INA3221=m +CONFIG_SENSORS_INTEL_M10_BMC_HWMON=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_JC42=m +CONFIG_SENSORS_LINEAGE=m +CONFIG_SENSORS_LIS3_I2C=m +CONFIG_SENSORS_LM25066=m +CONFIG_SENSORS_LM63=m +CONFIG_SENSORS_LM70=m +CONFIG_SENSORS_LM73=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM77=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM87=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_LM92=m +CONFIG_SENSORS_LM93=m +CONFIG_SENSORS_LM95234=m +CONFIG_SENSORS_LM95241=m +CONFIG_SENSORS_LM95245=m +CONFIG_SENSORS_LTC2945=m +CONFIG_SENSORS_LTC2947_I2C=m +CONFIG_SENSORS_LTC2947_SPI=m +CONFIG_SENSORS_LTC2978=m +CONFIG_SENSORS_LTC2990=m +CONFIG_SENSORS_LTC3815=m +CONFIG_SENSORS_LTC4151=m +CONFIG_SENSORS_LTC4215=m +CONFIG_SENSORS_LTC4222=m +CONFIG_SENSORS_LTC4245=m +CONFIG_SENSORS_LTC4260=m +CONFIG_SENSORS_LTC4261=m +CONFIG_SENSORS_MAX1111=m +CONFIG_SENSORS_MAX16064=m +CONFIG_SENSORS_MAX16065=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_MAX1668=m +CONFIG_SENSORS_MAX197=m +CONFIG_SENSORS_MAX20751=m +CONFIG_SENSORS_MAX31722=m +CONFIG_SENSORS_MAX31790=m +CONFIG_SENSORS_MAX34440=m +CONFIG_SENSORS_MAX6639=m +CONFIG_SENSORS_MAX6642=m +CONFIG_SENSORS_MAX6650=m +CONFIG_SENSORS_MAX6697=m +CONFIG_SENSORS_MAX8688=m +CONFIG_SENSORS_MCP3021=m +CONFIG_SENSORS_MP2975=m +CONFIG_SENSORS_MR75203=m +CONFIG_SENSORS_NCT6683=m +CONFIG_SENSORS_NCT6775=m +CONFIG_SENSORS_NCT7802=m +CONFIG_SENSORS_NCT7904=m +CONFIG_SENSORS_NPCM7XX=m +CONFIG_SENSORS_NTC_THERMISTOR=m +CONFIG_SENSORS_PC87360=m +CONFIG_SENSORS_PC87427=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_POWR1220=m +CONFIG_SENSORS_PWM_FAN=m +CONFIG_SENSORS_RM3100_I2C=m +CONFIG_SENSORS_RM3100_SPI=m +CONFIG_SENSORS_SCH5627=m +CONFIG_SENSORS_SCH5636=m +CONFIG_SENSORS_SFCTEMP=m +CONFIG_SENSORS_SHT15=m +CONFIG_SENSORS_SHT21=m +CONFIG_SENSORS_SHT3x=m +CONFIG_SENSORS_SHTC1=m +CONFIG_SENSORS_SIS5595=m +CONFIG_SENSORS_SMSC47B397=m +CONFIG_SENSORS_SMSC47M1=m +CONFIG_SENSORS_SMSC47M192=m +CONFIG_SENSORS_TC654=m +CONFIG_SENSORS_TC74=m +CONFIG_SENSORS_THMC50=m +CONFIG_SENSORS_TMP102=m +CONFIG_SENSORS_TMP103=m +CONFIG_SENSORS_TMP108=m +CONFIG_SENSORS_TMP401=m +CONFIG_SENSORS_TMP421=m +CONFIG_SENSORS_TMP513=m +CONFIG_SENSORS_TPS40422=m +CONFIG_SENSORS_TPS53679=m +CONFIG_SENSORS_TSL2550=m +CONFIG_SENSORS_UCD9000=m +CONFIG_SENSORS_UCD9200=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_VT1211=m +CONFIG_SENSORS_VT8231=m +CONFIG_SENSORS_W83627EHF=m +CONFIG_SENSORS_W83627HF=m +CONFIG_SENSORS_W83773G=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83791D=m +CONFIG_SENSORS_W83792D=m +CONFIG_SENSORS_W83793=m +CONFIG_SENSORS_W83795=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83L786NG=m +CONFIG_SENSORS_ZL6100=m +CONFIG_SERIAL_8250=y +# CONFIG_SERIAL_8250_16550A_VARIANTS is not set +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_CS=m +# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set +CONFIG_SERIAL_8250_DW=y +CONFIG_SERIAL_8250_EXAR=m +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_NR_UARTS=32 +CONFIG_SERIAL_8250_RSA=y +CONFIG_SERIAL_8250_RT288X=y +CONFIG_SERIAL_8250_RUNTIME_UARTS=32 +CONFIG_SERIAL_8250_SHARE_IRQ=y +CONFIG_SERIAL_ARC=m +CONFIG_SERIAL_DEV_BUS=y +CONFIG_SERIAL_EARLYCON_RISCV_SBI=y +CONFIG_SERIAL_JSM=m +CONFIG_SERIAL_NONSTANDARD=y +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_SERIAL_SC16IS7XX=m +# CONFIG_SERIAL_SC16IS7XX_I2C is not set +CONFIG_SERIAL_SC16IS7XX_SPI=y +CONFIG_SERIO_ALTERA_PS2=m +CONFIG_SERIO_ARC_PS2=m +CONFIG_SERIO_RAW=m +CONFIG_SFP=m +CONFIG_SF_PDMA=y +CONFIG_SGI_PARTITION=y +CONFIG_SHUFFLE_PAGE_ALLOCATOR=y +CONFIG_SIGNED_PE_FILE_VERIFICATION=y +CONFIG_SIS190=m +CONFIG_SIS900=m +CONFIG_SKGE=m +CONFIG_SKGE_GENESIS=y +CONFIG_SKY2=m +CONFIG_SLAB_FREELIST_HARDENED=y +CONFIG_SLAB_FREELIST_RANDOM=y +CONFIG_SLIP=m +CONFIG_SLIP_COMPRESSED=y +CONFIG_SLIP_SMART=y +CONFIG_SMARTJOYPLUS_FF=y +CONFIG_SMC=m +CONFIG_SMC_DIAG=m +CONFIG_SMP=y +CONFIG_SMSC911X=m +CONFIG_SMSC9420=m +CONFIG_SMS_SDIO_DRV=m +CONFIG_SMS_USB_DRV=m +CONFIG_SND=m +CONFIG_SND_AC97_POWER_SAVE=y +CONFIG_SND_AD1889=m +CONFIG_SND_ALOOP=m +CONFIG_SND_ATIIXP=m +CONFIG_SND_ATIIXP_MODEM=m +CONFIG_SND_AU8810=m +CONFIG_SND_AU8820=m +CONFIG_SND_AU8830=m +CONFIG_SND_BCD2000=m +CONFIG_SND_BEBOB=m +CONFIG_SND_BT87X=m +CONFIG_SND_CA0106=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_CS4281=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CTXFI=m +CONFIG_SND_DARLA20=m +CONFIG_SND_DARLA24=m +CONFIG_SND_DESIGNWARE_I2S=m +CONFIG_SND_DESIGNWARE_PCM=y +CONFIG_SND_DICE=m +CONFIG_SND_DUMMY=m +CONFIG_SND_ECHO3G=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_FIREFACE=m +CONFIG_SND_FIREWIRE_DIGI00X=m +CONFIG_SND_FIREWIRE_MOTU=m +CONFIG_SND_FIREWIRE_TASCAM=m +CONFIG_SND_FIREWORKS=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X_BOOL=y +CONFIG_SND_GINA20=m +CONFIG_SND_GINA24=m +CONFIG_SND_HDA_CODEC_ANALOG=m +CONFIG_SND_HDA_CODEC_CA0110=m +CONFIG_SND_HDA_CODEC_CA0132=m +CONFIG_SND_HDA_CODEC_CIRRUS=m +CONFIG_SND_HDA_CODEC_CMEDIA=m +CONFIG_SND_HDA_CODEC_CONEXANT=m +CONFIG_SND_HDA_CODEC_HDMI=m +CONFIG_SND_HDA_CODEC_REALTEK=m +CONFIG_SND_HDA_CODEC_SI3054=m +CONFIG_SND_HDA_CODEC_SIGMATEL=m +CONFIG_SND_HDA_CODEC_VIA=m +CONFIG_SND_HDA_HWDEP=y +CONFIG_SND_HDA_INPUT_BEEP=y +CONFIG_SND_HDA_INPUT_BEEP_MODE=0 +CONFIG_SND_HDA_INTEL=m +CONFIG_SND_HDA_INTEL_HDMI_SILENT_STREAM=y +CONFIG_SND_HDA_PATCH_LOADER=y +CONFIG_SND_HDA_PREALLOC_SIZE=4096 +CONFIG_SND_HDSP=m +CONFIG_SND_HDSPM=m +CONFIG_SND_HRTIMER=m +CONFIG_SND_I2S_HI6210_I2S=m +CONFIG_SND_ICE1724=m +CONFIG_SND_INDIGO=m +CONFIG_SND_INDIGODJ=m +CONFIG_SND_INDIGODJX=m +CONFIG_SND_INDIGOIO=m +CONFIG_SND_INDIGOIOX=m +CONFIG_SND_ISIGHT=m +CONFIG_SND_KORG1212=m +CONFIG_SND_LAYLA20=m +CONFIG_SND_LAYLA24=m +CONFIG_SND_LOLA=m +CONFIG_SND_LX6464ES=m +CONFIG_SND_MIA=m +CONFIG_SND_MIXART=m +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_MONA=m +CONFIG_SND_MPU401=m +CONFIG_SND_MTPAV=m +CONFIG_SND_NM256=m +CONFIG_SND_OSSEMUL=y +CONFIG_SND_OXFW=m +CONFIG_SND_OXYGEN=m +# CONFIG_SND_PCMCIA is not set +CONFIG_SND_PCM_OSS=m +CONFIG_SND_PCXHR=m +CONFIG_SND_RIPTIDE=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_SEQUENCER=m +CONFIG_SND_SEQUENCER_OSS=m +CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_SERIAL_U16550=m +CONFIG_SND_SIMPLE_CARD=m +CONFIG_SND_SOC=m +CONFIG_SND_SOC_AC97_CODEC=m +CONFIG_SND_SOC_ADAU1761_I2C=m +CONFIG_SND_SOC_ADAU1761_SPI=m +CONFIG_SND_SOC_ADAU7002=m +CONFIG_SND_SOC_ADAU7118_HW=m +CONFIG_SND_SOC_ADAU7118_I2C=m +CONFIG_SND_SOC_AK5558=m +CONFIG_SND_SOC_AMD_ACP=m +CONFIG_SND_SOC_AMD_CZ_RT5645_MACH=m +CONFIG_SND_SOC_BD28623=m +CONFIG_SND_SOC_CS35L34=m +CONFIG_SND_SOC_CS35L35=m +CONFIG_SND_SOC_CS35L36=m +CONFIG_SND_SOC_CS4234=m +CONFIG_SND_SOC_CS42L42=m +CONFIG_SND_SOC_CS43130=m +CONFIG_SND_SOC_CX2072X=m +CONFIG_SND_SOC_DA7213=m +CONFIG_SND_SOC_DMIC=m +CONFIG_SND_SOC_ES7134=m +CONFIG_SND_SOC_ES8328_I2C=m +CONFIG_SND_SOC_ES8328_SPI=m +CONFIG_SND_SOC_MAX9759=m +CONFIG_SND_SOC_MAX98088=m +CONFIG_SND_SOC_MAX98357A=m +CONFIG_SND_SOC_MAX98373_I2C=m +CONFIG_SND_SOC_MAX98373_SDW=m +CONFIG_SND_SOC_MAX98390=m +CONFIG_SND_SOC_MAX9867=m +CONFIG_SND_SOC_MAX98927=m +CONFIG_SND_SOC_NAU8824=m +CONFIG_SND_SOC_PCM1789_I2C=m +CONFIG_SND_SOC_PCM186X_I2C=m +CONFIG_SND_SOC_PCM186X_SPI=m +CONFIG_SND_SOC_PCM3060_I2C=m +CONFIG_SND_SOC_PCM3060_SPI=m +CONFIG_SND_SOC_RT1308_SDW=m +CONFIG_SND_SOC_RT5682_SDW=m +CONFIG_SND_SOC_RT700_SDW=m +CONFIG_SND_SOC_RT711_SDW=m +CONFIG_SND_SOC_RT715_SDW=m +CONFIG_SND_SOC_SIMPLE_AMPLIFIER=m +CONFIG_SND_SOC_SOF_PCI=m +CONFIG_SND_SOC_SOF_TOPLEVEL=y +CONFIG_SND_SOC_SPDIF=m +CONFIG_SND_SOC_TAS2562=m +CONFIG_SND_SOC_TAS2764=m +CONFIG_SND_SOC_TAS2770=m +CONFIG_SND_SOC_TAS6424=m +CONFIG_SND_SOC_TDA7419=m +CONFIG_SND_SOC_TLV320ADCX140=m +CONFIG_SND_SOC_TLV320AIC32X4_I2C=m +CONFIG_SND_SOC_TLV320AIC32X4_SPI=m +CONFIG_SND_SOC_TSCS42XX=m +CONFIG_SND_SOC_WM8524=m +CONFIG_SND_SOC_ZL38060=m +# CONFIG_SND_SPI is not set +CONFIG_SND_STARFIVE_PWMDAC=m +# CONFIG_SND_SUPPORT_OLD_API is not set +CONFIG_SND_USB_6FIRE=m +CONFIG_SND_USB_AUDIO=m +CONFIG_SND_USB_CAIAQ=m +CONFIG_SND_USB_CAIAQ_INPUT=y +CONFIG_SND_USB_HIFACE=m +CONFIG_SND_USB_POD=m +CONFIG_SND_USB_PODHD=m +CONFIG_SND_USB_TONEPORT=m +CONFIG_SND_USB_UA101=m +CONFIG_SND_USB_VARIAX=m +CONFIG_SND_VIRMIDI=m +CONFIG_SND_VIRTUOSO=m +CONFIG_SND_VX222=m +CONFIG_SND_YMFPCI=m +CONFIG_SOC_SIFIVE=y +CONFIG_SOC_STARFIVE=y +CONFIG_SOC_VIRT=y +CONFIG_SOFTLOCKUP_DETECTOR=y +CONFIG_SOFT_WATCHDOG=m +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_SONY_FF=y +CONFIG_SOUND=m +CONFIG_SOUNDWIRE=y +CONFIG_SPARSEMEM_MANUAL=y +CONFIG_SPEAKUP=m +CONFIG_SPEAKUP_SYNTH_ACNTSA=m +CONFIG_SPEAKUP_SYNTH_APOLLO=m +CONFIG_SPEAKUP_SYNTH_AUDPTR=m +CONFIG_SPEAKUP_SYNTH_BNS=m +CONFIG_SPEAKUP_SYNTH_DECTLK=m +CONFIG_SPEAKUP_SYNTH_LTLK=m +CONFIG_SPEAKUP_SYNTH_SOFT=m +CONFIG_SPEAKUP_SYNTH_SPKOUT=m +CONFIG_SPEAKUP_SYNTH_TXPRT=m +CONFIG_SPI=y +CONFIG_SPI_CADENCE_QUADSPI=y +CONFIG_SPI_DESIGNWARE=y +CONFIG_SPI_DW_DMA=y +CONFIG_SPI_DW_MMIO=y +CONFIG_SPI_DW_PCI=y +CONFIG_SPI_FSI=m +CONFIG_SPI_MUX=m +CONFIG_SPI_SIFIVE=y +CONFIG_SPI_SPIDEV=y +CONFIG_SQUASHFS=m +CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y +CONFIG_SQUASHFS_FILE_DIRECT=y +CONFIG_SQUASHFS_LZ4=y +CONFIG_SQUASHFS_LZO=y +CONFIG_SQUASHFS_XATTR=y +CONFIG_SQUASHFS_XZ=y +CONFIG_SQUASHFS_ZSTD=y +CONFIG_SSB_DRIVER_GPIO=y +# CONFIG_STACKPROTECTOR_STRONG is not set +CONFIG_STACK_TRACER=y +CONFIG_STAGING=y +CONFIG_STAGING_MEDIA=y +CONFIG_STARFIVE_WATCHDOG=m +CONFIG_STE10XP=m +CONFIG_STK3310=m +CONFIG_STMMAC_ETH=y +CONFIG_STMMAC_PCI=y +# CONFIG_STRICT_DEVMEM is not set +CONFIG_STRIP_ASM_SYMS=y +CONFIG_ST_UVIS25=m +CONFIG_SUNDANCE=m +CONFIG_SUNGEM=m +CONFIG_SUNRPC_DEBUG=y +CONFIG_SUN_PARTITION=y +CONFIG_SX9310=m +CONFIG_SYNCLINK_GT=m +CONFIG_SYNTH_EVENTS=y +CONFIG_SYSCON_REBOOT_MODE=y +CONFIG_SYSTEM_BLACKLIST_KEYRING=y +CONFIG_SYSTEM_EXTRA_CERTIFICATE=y +CONFIG_SYSVIPC=y +CONFIG_SYSV_FS=m +CONFIG_TABLET_SERIAL_WACOM4=m +CONFIG_TABLET_USB_ACECAD=m +CONFIG_TABLET_USB_AIPTEK=m +CONFIG_TABLET_USB_HANWANG=m +CONFIG_TABLET_USB_KBTAB=m +CONFIG_TABLET_USB_PEGASUS=m +CONFIG_TARGET_CORE=m +CONFIG_TASKSTATS=y +CONFIG_TASK_DELAY_ACCT=y +CONFIG_TASK_IO_ACCOUNTING=y +CONFIG_TASK_XACCT=y +CONFIG_TCG_ATMEL=m +CONFIG_TCG_TIS=y +CONFIG_TCG_TIS_SPI=m +CONFIG_TCG_TIS_SPI_CR50=y +CONFIG_TCG_VTPM_PROXY=m +CONFIG_TCM_FC=m +CONFIG_TCM_FILEIO=m +CONFIG_TCM_IBLOCK=m +CONFIG_TCM_PSCSI=m +CONFIG_TCM_QLA2XXX=m +CONFIG_TCM_USER2=m +CONFIG_TCP_CONG_ADVANCED=y +CONFIG_TCP_CONG_BBR=m +CONFIG_TCP_CONG_CDG=m +CONFIG_TCP_CONG_DCTCP=m +CONFIG_TCP_CONG_HSTCP=m +CONFIG_TCP_CONG_HYBLA=m +CONFIG_TCP_CONG_ILLINOIS=m +CONFIG_TCP_CONG_LP=m +CONFIG_TCP_CONG_NV=m +CONFIG_TCP_CONG_SCALABLE=m +CONFIG_TCP_CONG_VENO=m +CONFIG_TCP_CONG_YEAH=m +CONFIG_TCP_MD5SIG=y +CONFIG_TEHUTI=m +CONFIG_TERANETICS_PHY=m +CONFIG_TEST_KSTRTOX=y +CONFIG_THERMAL_GOV_FAIR_SHARE=y +CONFIG_THERMAL_NETLINK=y +# CONFIG_THERMAL_OF is not set +CONFIG_THERMAL_STATISTICS=y +CONFIG_THRUSTMASTER_FF=y +CONFIG_TIGON3=m +CONFIG_TINYDRM_ILI9486=m +CONFIG_TIPC=m +CONFIG_TI_ADC128S052=m +CONFIG_TI_ADS1015=m +CONFIG_TI_ADS8344=m +CONFIG_TI_DAC7311=m +CONFIG_TLAN=m +CONFIG_TLS=m +CONFIG_TLS_DEVICE=y +CONFIG_TMPFS=y +CONFIG_TMPFS_INODE64=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_TOUCHSCREEN_ATMEL_MXT=m +CONFIG_TOUCHSCREEN_AUO_PIXCIR=m +CONFIG_TOUCHSCREEN_CY8CTMA140=m +CONFIG_TOUCHSCREEN_DYNAPRO=m +CONFIG_TOUCHSCREEN_EDT_FT5X06=m +CONFIG_TOUCHSCREEN_EETI=m +CONFIG_TOUCHSCREEN_EGALAX=m +CONFIG_TOUCHSCREEN_EGALAX_SERIAL=m +CONFIG_TOUCHSCREEN_ELAN=m +CONFIG_TOUCHSCREEN_ELO=m +CONFIG_TOUCHSCREEN_FUJITSU=m +CONFIG_TOUCHSCREEN_GUNZE=m +CONFIG_TOUCHSCREEN_ILI210X=m +CONFIG_TOUCHSCREEN_INEXIO=m +CONFIG_TOUCHSCREEN_IQS5XX=m +CONFIG_TOUCHSCREEN_MCS5000=m +CONFIG_TOUCHSCREEN_MK712=m +CONFIG_TOUCHSCREEN_MMS114=m +CONFIG_TOUCHSCREEN_MTOUCH=m +CONFIG_TOUCHSCREEN_PENMOUNT=m +CONFIG_TOUCHSCREEN_PIXCIR=m +CONFIG_TOUCHSCREEN_RM_TS=m +CONFIG_TOUCHSCREEN_SILEAD=m +CONFIG_TOUCHSCREEN_SIS_I2C=m +CONFIG_TOUCHSCREEN_ST1232=m +CONFIG_TOUCHSCREEN_TOUCHIT213=m +CONFIG_TOUCHSCREEN_TOUCHRIGHT=m +CONFIG_TOUCHSCREEN_TOUCHWIN=m +CONFIG_TOUCHSCREEN_TSC2007=m +CONFIG_TOUCHSCREEN_TSC2007_IIO=y +CONFIG_TOUCHSCREEN_TSC_SERIO=m +CONFIG_TOUCHSCREEN_USB_COMPOSITE=m +CONFIG_TOUCHSCREEN_WACOM_I2C=m +CONFIG_TOUCHSCREEN_WACOM_W8001=m +CONFIG_TOUCHSCREEN_ZET6223=m +CONFIG_TOUCHSCREEN_ZFORCE=m +CONFIG_TOUCHSCREEN_ZINITIX=m +CONFIG_TPM_KEY_PARSER=m +CONFIG_TRACE_EVAL_MAP_FILE=y +CONFIG_TRUSTED_KEYS=m +CONFIG_TSL2772=m +CONFIG_TULIP=m +CONFIG_TULIP_MMIO=y +CONFIG_TUN=m +CONFIG_TYPEC=m +CONFIG_TYPEC_DP_ALTMODE=m +CONFIG_TYPEC_FUSB302=m +CONFIG_TYPEC_HD3SS3220=m +CONFIG_TYPEC_MUX_PI3USB30532=m +CONFIG_TYPEC_NVIDIA_ALTMODE=m +CONFIG_TYPEC_STUSB160X=m +CONFIG_TYPEC_TCPCI=m +CONFIG_TYPEC_TCPCI_MAXIM=m +CONFIG_TYPEC_TCPM=m +CONFIG_TYPEC_TPS6598X=m +CONFIG_TYPEC_UCSI=m +CONFIG_TYPHOON=m +CONFIG_UACCE=m +CONFIG_UBIFS_ATIME_SUPPORT=y +CONFIG_UBIFS_FS=m +CONFIG_UBIFS_FS_AUTHENTICATION=y +CONFIG_UCSI_CCG=m +CONFIG_UDF_FS=m +CONFIG_UDMABUF=y +CONFIG_UFS_FS=m +CONFIG_UHID=m +CONFIG_UIO_AEC=m +CONFIG_UIO_CIF=m +CONFIG_UIO_PCI_GENERIC=m +CONFIG_UIO_SERCOS3=m +CONFIG_ULI526X=m +CONFIG_UNICODE=y +CONFIG_UNIX=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_UNIX_DIAG=m +CONFIG_USB=y +CONFIG_USB4=y +CONFIG_USB4_NET=m +CONFIG_USBIP_CORE=m +CONFIG_USBIP_HOST=m +CONFIG_USBIP_VHCI_HCD=m +CONFIG_USBPCWATCHDOG=m +CONFIG_USB_ADUTUX=m +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +CONFIG_USB_APPLEDISPLAY=m +CONFIG_USB_ATM=m +CONFIG_USB_CATC=m +CONFIG_USB_CDNS3=m +CONFIG_USB_CDNS3_HOST=y +CONFIG_USB_CDNS_SUPPORT=m +CONFIG_USB_CHAOSKEY=m +CONFIG_USB_CXACRU=m +CONFIG_USB_DSBR=m +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_HCD_PLATFORM=m +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_EMI26=m +CONFIG_USB_EMI62=m +CONFIG_USB_EPSON2888=y +CONFIG_USB_FTDI_ELAN=m +CONFIG_USB_HIDDEV=y +CONFIG_USB_HSIC_USB3503=m +CONFIG_USB_HSIC_USB4604=m +CONFIG_USB_HSO=m +CONFIG_USB_HUB_USB251XB=m +CONFIG_USB_IDMOUSE=m +CONFIG_USB_IOWARRIOR=m +CONFIG_USB_IPHETH=m +CONFIG_USB_ISIGHTFW=m +CONFIG_USB_KAWETH=m +CONFIG_USB_KC2190=y +CONFIG_USB_KEENE=m +CONFIG_USB_LAN78XX=m +CONFIG_USB_LCD=m +CONFIG_USB_LD=m +CONFIG_USB_LEDS_TRIGGER_USBPORT=m +CONFIG_USB_LED_TRIG=y +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_MA901=m +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +CONFIG_USB_MON=y +CONFIG_USB_MR800=m +CONFIG_USB_MUSB_HDRC=m +CONFIG_USB_NET_AQC111=m +CONFIG_USB_NET_CDC_EEM=m +CONFIG_USB_NET_CDC_MBIM=m +CONFIG_USB_NET_CH9200=m +CONFIG_USB_NET_CX82310_ETH=m +CONFIG_USB_NET_DM9601=m +CONFIG_USB_NET_GL620A=m +CONFIG_USB_NET_HUAWEI_CDC_NCM=m +CONFIG_USB_NET_INT51X1=m +CONFIG_USB_NET_KALMIA=m +CONFIG_USB_NET_MCS7830=m +CONFIG_USB_NET_PLUSB=m +CONFIG_USB_NET_QMI_WWAN=m +CONFIG_USB_NET_RNDIS_WLAN=m +CONFIG_USB_NET_SMSC75XX=m +CONFIG_USB_NET_SMSC95XX=m +CONFIG_USB_NET_SR9700=m +CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_HCD_PLATFORM=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_PRINTER=m +CONFIG_USB_PULSE8_CEC=m +CONFIG_USB_PWC=m +CONFIG_USB_RAINSHADOW_CEC=m +CONFIG_USB_ROLE_SWITCH=y +CONFIG_USB_RTL8150=m +CONFIG_USB_RTL8152=m +CONFIG_USB_S2255=m +CONFIG_USB_SERIAL=y +CONFIG_USB_SERIAL_AIRCABLE=m +CONFIG_USB_SERIAL_ARK3116=m +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_CH341=m +CONFIG_USB_SERIAL_CONSOLE=y +CONFIG_USB_SERIAL_CP210X=m +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_CYPRESS_M8=m +CONFIG_USB_SERIAL_DEBUG=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_F8153X=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_GARMIN=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IPW=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_IUU=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_MOS7720=m +CONFIG_USB_SERIAL_MOS7840=m +CONFIG_USB_SERIAL_NAVMAN=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_SERIAL_OPTICON=m +CONFIG_USB_SERIAL_OPTION=m +CONFIG_USB_SERIAL_OTI6858=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_QCAUX=m +CONFIG_USB_SERIAL_QT2=m +CONFIG_USB_SERIAL_QUALCOMM=m +CONFIG_USB_SERIAL_SAFE=m +CONFIG_USB_SERIAL_SAFE_PADDED=y +CONFIG_USB_SERIAL_SIERRAWIRELESS=m +CONFIG_USB_SERIAL_SIMPLE=m +CONFIG_USB_SERIAL_SPCP8X5=m +CONFIG_USB_SERIAL_SSU100=m +CONFIG_USB_SERIAL_SYMBOL=m +CONFIG_USB_SERIAL_TI=m +CONFIG_USB_SERIAL_UPD78F0730=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_WHITEHEAT=m +CONFIG_USB_SERIAL_XSENS_MT=m +CONFIG_USB_SEVSEG=m +CONFIG_USB_SI470X=m +CONFIG_USB_SIERRA_NET=m +CONFIG_USB_SISUSBVGA=m +CONFIG_USB_SL811_HCD=m +CONFIG_USB_SL811_HCD_ISO=y +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_STKWEBCAM=m +CONFIG_USB_STORAGE=m +CONFIG_USB_STORAGE_ALAUDA=m +CONFIG_USB_STORAGE_CYPRESS_ATACB=m +CONFIG_USB_STORAGE_DATAFAB=m +CONFIG_USB_STORAGE_ENE_UB6250=m +CONFIG_USB_STORAGE_FREECOM=m +CONFIG_USB_STORAGE_ISD200=m +CONFIG_USB_STORAGE_JUMPSHOT=m +CONFIG_USB_STORAGE_KARMA=m +CONFIG_USB_STORAGE_ONETOUCH=m +CONFIG_USB_STORAGE_REALTEK=m +CONFIG_USB_STORAGE_SDDR09=m +CONFIG_USB_STORAGE_SDDR55=m +CONFIG_USB_STORAGE_USBAT=m +CONFIG_USB_TMC=m +CONFIG_USB_TRANCEVIBRATOR=m +CONFIG_USB_UAS=m +CONFIG_USB_UEAGLEATM=m +CONFIG_USB_UHCI_HCD=y +CONFIG_USB_ULPI_BUS=m +CONFIG_USB_VIDEO_CLASS=m +CONFIG_USB_VL600=m +CONFIG_USB_XHCI_DBGCAP=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_PCI_RENESAS=m +CONFIG_USB_XHCI_PLATFORM=y +CONFIG_USB_XUSBATM=m +CONFIG_USB_YUREX=m +CONFIG_USB_ZR364XX=m +CONFIG_USERFAULTFD=y +CONFIG_USER_NS=y +CONFIG_V4L_MEM2MEM_DRIVERS=y +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_VALIDATE_FS_PARSER=y +CONFIG_VCNL3020=m +CONFIG_VCNL4035=m +CONFIG_VDPA=m +CONFIG_VDPA_SIM=m +CONFIG_VEML6030=m +CONFIG_VETH=m +CONFIG_VFAT_FS=m +CONFIG_VFIO=m +CONFIG_VFIO_MDEV=m +CONFIG_VFIO_PCI=m +CONFIG_VHOST_NET=m +CONFIG_VHOST_SCSI=m +CONFIG_VHOST_VDPA=m +CONFIG_VHOST_VSOCK=m +CONFIG_VIA_RHINE=m +CONFIG_VIA_RHINE_MMIO=y +CONFIG_VIA_VELOCITY=m +CONFIG_VIDEO_AD5820=m +CONFIG_VIDEO_ADP1653=m +CONFIG_VIDEO_AK7375=m +CONFIG_VIDEO_AU0828=m +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_CPIA2=m +CONFIG_VIDEO_CX18=m +CONFIG_VIDEO_CX18_ALSA=m +CONFIG_VIDEO_CX231XX=m +CONFIG_VIDEO_CX231XX_ALSA=m +CONFIG_VIDEO_CX231XX_DVB=m +CONFIG_VIDEO_CX23885=m +CONFIG_VIDEO_CX88=m +CONFIG_VIDEO_CX88_ALSA=m +CONFIG_VIDEO_CX88_BLACKBIRD=m +CONFIG_VIDEO_CX88_DVB=m +CONFIG_VIDEO_DW9714=m +CONFIG_VIDEO_DW9768=m +CONFIG_VIDEO_DW9807_VCM=m +CONFIG_VIDEO_EM28XX=m +CONFIG_VIDEO_EM28XX_ALSA=m +CONFIG_VIDEO_EM28XX_DVB=m +CONFIG_VIDEO_EM28XX_V4L2=m +CONFIG_VIDEO_ET8EK8=m +CONFIG_VIDEO_FB_IVTV=m +CONFIG_VIDEO_GO7007=m +CONFIG_VIDEO_GO7007_USB=m +CONFIG_VIDEO_GO7007_USB_S2250_BOARD=m +CONFIG_VIDEO_HDPVR=m +CONFIG_VIDEO_HEXIUM_GEMINI=m +CONFIG_VIDEO_HEXIUM_ORION=m +CONFIG_VIDEO_HI556=m +CONFIG_VIDEO_IMX214=m +CONFIG_VIDEO_IMX219=m +CONFIG_VIDEO_IMX258=m +CONFIG_VIDEO_IMX274=m +CONFIG_VIDEO_IMX290=m +CONFIG_VIDEO_IMX319=m +CONFIG_VIDEO_IMX355=m +CONFIG_VIDEO_IVTV=m +CONFIG_VIDEO_LM3560=m +CONFIG_VIDEO_LM3646=m +CONFIG_VIDEO_M5MOLS=m +CONFIG_VIDEO_MT9M001=m +CONFIG_VIDEO_MT9M032=m +CONFIG_VIDEO_MT9P031=m +CONFIG_VIDEO_MT9T001=m +CONFIG_VIDEO_MT9T112=m +CONFIG_VIDEO_MT9V032=m +CONFIG_VIDEO_MT9V111=m +CONFIG_VIDEO_MXB=m +CONFIG_VIDEO_NOON010PC30=m +CONFIG_VIDEO_OV13858=m +CONFIG_VIDEO_OV2659=m +CONFIG_VIDEO_OV2680=m +CONFIG_VIDEO_OV2685=m +CONFIG_VIDEO_OV5640=m +CONFIG_VIDEO_OV5645=m +CONFIG_VIDEO_OV5647=m +CONFIG_VIDEO_OV5670=m +CONFIG_VIDEO_OV5675=m +CONFIG_VIDEO_OV5695=m +CONFIG_VIDEO_OV6650=m +CONFIG_VIDEO_OV7251=m +CONFIG_VIDEO_OV7670=m +CONFIG_VIDEO_OV772X=m +CONFIG_VIDEO_OV7740=m +CONFIG_VIDEO_OV8856=m +CONFIG_VIDEO_OV9640=m +CONFIG_VIDEO_OV9650=m +CONFIG_VIDEO_PVRUSB2=m +CONFIG_VIDEO_RDACM20=m +CONFIG_VIDEO_RJ54N1=m +CONFIG_VIDEO_S5C73M3=m +CONFIG_VIDEO_S5K4ECGX=m +CONFIG_VIDEO_S5K5BAF=m +CONFIG_VIDEO_S5K6A3=m +CONFIG_VIDEO_S5K6AA=m +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_SAA7134_ALSA=m +CONFIG_VIDEO_SAA7134_DVB=m +CONFIG_VIDEO_SAA7134_GO7007=m +CONFIG_VIDEO_SAA7164=m +CONFIG_VIDEO_SOLO6X10=m +CONFIG_VIDEO_SR030PC30=m +CONFIG_VIDEO_STK1160_COMMON=m +CONFIG_VIDEO_TM6000=m +CONFIG_VIDEO_TM6000_ALSA=m +CONFIG_VIDEO_TM6000_DVB=m +CONFIG_VIDEO_TW686X=m +CONFIG_VIDEO_USBTV=m +CONFIG_VIDEO_VS6624=m +CONFIG_VIRTIO_BALLOON=m +CONFIG_VIRTIO_BLK=m +CONFIG_VIRTIO_CONSOLE=m +CONFIG_VIRTIO_FS=m +CONFIG_VIRTIO_INPUT=m +CONFIG_VIRTIO_MMIO=m +CONFIG_VIRTIO_NET=m +CONFIG_VIRTIO_PCI=y +CONFIG_VIRTIO_VDPA=m +CONFIG_VIRTIO_VSOCKETS=m +CONFIG_VIRT_WIFI=m +CONFIG_VITESSE_PHY=m +CONFIG_VL53L0X_I2C=m +CONFIG_VL6180=m +CONFIG_VORTEX=m +CONFIG_VSOCKETS=m +CONFIG_VSOCKMON=m +CONFIG_VXGE=m +CONFIG_VXLAN=m +CONFIG_W1=m +CONFIG_W1_MASTER_DS2482=m +CONFIG_W1_MASTER_DS2490=m +CONFIG_W1_SLAVE_DS2405=m +CONFIG_W1_SLAVE_DS2406=m +CONFIG_W1_SLAVE_DS2408=m +# CONFIG_W1_SLAVE_DS2408_READBACK is not set +CONFIG_W1_SLAVE_DS2413=m +CONFIG_W1_SLAVE_DS2423=m +CONFIG_W1_SLAVE_DS2430=m +CONFIG_W1_SLAVE_DS2431=m +CONFIG_W1_SLAVE_DS2433=m +CONFIG_W1_SLAVE_DS2433_CRC=y +CONFIG_W1_SLAVE_DS2438=m +CONFIG_W1_SLAVE_DS2780=m +CONFIG_W1_SLAVE_DS2781=m +CONFIG_W1_SLAVE_DS2805=m +CONFIG_W1_SLAVE_DS28E04=m +CONFIG_W1_SLAVE_SMEM=m +CONFIG_W1_SLAVE_THERM=m +CONFIG_WATCHDOG=y +CONFIG_WATCHDOG_CORE=y +CONFIG_WATCHDOG_SYSFS=y +CONFIG_WATCH_QUEUE=y +CONFIG_WCN36XX=m +CONFIG_WDTPCI=m +CONFIG_WIL6210=m +CONFIG_WINBOND_840=m +CONFIG_WIREGUARD=m +CONFIG_WIZNET_W5100=m +CONFIG_WIZNET_W5100_SPI=m +CONFIG_WIZNET_W5300=m +CONFIG_WL1251=m +CONFIG_WL1251_SDIO=m +CONFIG_WL1251_SPI=m +CONFIG_WL12XX=m +CONFIG_WL18XX=m +# CONFIG_WLAN_VENDOR_ADMTEK is not set +# CONFIG_WLAN_VENDOR_ATMEL is not set +# CONFIG_WLAN_VENDOR_CISCO is not set +CONFIG_WLCORE_SDIO=m +CONFIG_WLCORE_SPI=m +CONFIG_XDP_SOCKETS=y +CONFIG_XDP_SOCKETS_DIAG=m +CONFIG_XFRM_INTERFACE=m +CONFIG_XFRM_STATISTICS=y +CONFIG_XFRM_SUB_POLICY=y +CONFIG_XFRM_USER=y +CONFIG_XFS_FS=m +CONFIG_XFS_ONLINE_SCRUB=y +CONFIG_XFS_POSIX_ACL=y +CONFIG_XFS_QUOTA=y +CONFIG_XILINX_GMII2RGMII=m +CONFIG_XILINX_LL_TEMAC=m +CONFIG_XILINX_PR_DECOUPLER=m +CONFIG_XILINX_VCU=m +CONFIG_XILLYBUS=m +CONFIG_XILLYBUS_PCIE=m +CONFIG_YAM=m +CONFIG_YELLOWFIN=m +CONFIG_YENTA=m +CONFIG_Z3FOLD=y +CONFIG_ZD1211RW=m +CONFIG_ZEROPLUS_FF=y +CONFIG_ZISOFS=y +CONFIG_ZOPT2201=m diff --git a/dist/configs/50variant/debug/aarch64.config b/dist/configs/50variant/debug/aarch64.config new file mode 100644 index 000000000000..88c8ed1ce096 --- /dev/null +++ b/dist/configs/50variant/debug/aarch64.config @@ -0,0 +1,17 @@ +CONFIG_DEBUG_PERF_USE_VMALLOC=y +# CONFIG_DEBUG_VM is not set +CONFIG_DEVMEM=y +# CONFIG_IP_VS_DEBUG is not set +CONFIG_KASAN=y +CONFIG_KASAN_GENERIC=y +# CONFIG_KASAN_HW_TAGS is not set +CONFIG_KASAN_INLINE=y +CONFIG_KDB_DEFAULT_ENABLE=0x1 +# CONFIG_LOCK_STAT is not set +CONFIG_MAILBOX_TEST=m +CONFIG_PANIC_ON_OOPS=y +CONFIG_PANIC_ON_OOPS_VALUE=1 +CONFIG_PERCPU_TEST=m +# CONFIG_RANDOM32_SELFTEST is not set +CONFIG_SPI_DEBUG=y +CONFIG_WQ_WATCHDOG=y diff --git a/dist/configs/50variant/debug/default.config b/dist/configs/50variant/debug/default.config new file mode 100644 index 000000000000..f49a37e493ec --- /dev/null +++ b/dist/configs/50variant/debug/default.config @@ -0,0 +1,134 @@ +CONFIG_ACPI_APEI_ERST_DEBUG=m +CONFIG_LOCALVERSION="+debug" +CONFIG_ACPI_CONFIGFS=m +CONFIG_ACPI_CUSTOM_METHOD=m +CONFIG_ACPI_DEBUG=y +CONFIG_ACPI_DEBUGGER=y +CONFIG_ACPI_DEBUGGER_USER=m +CONFIG_ACPI_EC_DEBUGFS=m +CONFIG_ATH10K_DEBUG=y +CONFIG_ATH10K_TRACING=y +CONFIG_ATH_DEBUG=y +# CONFIG_BLK_DEV_NULL_BLK_FAULT_INJECTION is not set +CONFIG_CAN_DEBUG_DEVICES=y +CONFIG_CEPH_LIB_PRETTYDEBUG=y +CONFIG_CFG80211_DEBUGFS=y +CONFIG_CGROUP_DEBUG=y +CONFIG_CPUMASK_OFFSTACK=y +CONFIG_CRYPTO_DEV_CCP_DEBUGFS=y +CONFIG_CSD_LOCK_WAIT_DEBUG=y +CONFIG_DEBUG_ATOMIC_SLEEP=y +CONFIG_DEBUG_CREDENTIALS=y +CONFIG_DEBUG_IRQFLAGS=y +CONFIG_DEBUG_KMEMLEAK=y +CONFIG_DEBUG_KMEMLEAK_AUTO_SCAN=y +CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y +CONFIG_DEBUG_KMEMLEAK_MEM_POOL_SIZE=40000 +CONFIG_DEBUG_LOCK_ALLOC=y +CONFIG_DEBUG_MUTEXES=y +CONFIG_DEBUG_NOTIFIERS=y +CONFIG_DEBUG_OBJECTS=y +CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1 +CONFIG_DEBUG_OBJECTS_FREE=y +CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y +CONFIG_DEBUG_OBJECTS_RCU_HEAD=y +CONFIG_DEBUG_OBJECTS_TIMERS=y +CONFIG_DEBUG_OBJECTS_WORK=y +CONFIG_DEBUG_PAGEALLOC=y +# CONFIG_DEBUG_PAGEALLOC_ENABLE_DEFAULT is not set +CONFIG_DEBUG_PAGE_REF=y +CONFIG_DEBUG_PER_CPU_MAPS=y +CONFIG_DEBUG_PREEMPT=y +CONFIG_DEBUG_RT_MUTEXES=y +CONFIG_DEBUG_RWSEMS=y +CONFIG_DEBUG_SG=y +CONFIG_DEBUG_SPINLOCK=y +CONFIG_DEBUG_STACK_USAGE=y +CONFIG_DEBUG_VM=y +CONFIG_DEBUG_VM_PGTABLE=y +CONFIG_DEBUG_WW_MUTEX_SLOWPATH=y +CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 +CONFIG_DMABUF_DEBUG=y +CONFIG_DMADEVICES_DEBUG=y +CONFIG_DMADEVICES_VDEBUG=y +CONFIG_DMA_API_DEBUG=y +CONFIG_DMA_API_DEBUG_SG=y +CONFIG_EDAC_DEBUG=y +CONFIG_EXT4_DEBUG=y +CONFIG_FAILSLAB=y +# CONFIG_FAIL_FUNCTION is not set +CONFIG_FAIL_FUTEX=y +CONFIG_FAIL_IO_TIMEOUT=y +CONFIG_FAIL_MAKE_REQUEST=y +CONFIG_FAIL_MMC_REQUEST=y +CONFIG_FAIL_PAGE_ALLOC=y +CONFIG_FAIL_SUNRPC=y +CONFIG_FAULT_INJECTION=y +CONFIG_FAULT_INJECTION_DEBUG_FS=y +CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y +CONFIG_FSCACHE_OBJECT_LIST=y +CONFIG_GENERIC_IRQ_DEBUGFS=y +CONFIG_I2C_GPIO_FAULT_INJECTOR=y +CONFIG_IOMMU_DEBUGFS=y +CONFIG_IP_VS_DEBUG=y +CONFIG_IWLWIFI_DEBUG=y +CONFIG_IWLWIFI_DEVICE_TRACING=y +CONFIG_KASAN=y +CONFIG_KASAN_INLINE=y +CONFIG_KASAN_KUNIT_TEST=m +# CONFIG_KASAN_OUTLINE is not set +CONFIG_KASAN_VMALLOC=y +CONFIG_KCOV=y +CONFIG_KCOV_ENABLE_COMPARISONS=y +CONFIG_KCOV_INSTRUMENT_ALL=y +CONFIG_KDB_CONTINUE_CATASTROPHIC=0 +CONFIG_KPROBE_EVENT_GEN_TEST=m +CONFIG_LATENCYTOP=y +CONFIG_LOCKDEP_BITS=16 +CONFIG_LOCKDEP_CHAINS_BITS=17 +CONFIG_LOCKDEP_CIRCULAR_QUEUE_BITS=12 +CONFIG_LOCKDEP_STACK_TRACE_BITS=19 +CONFIG_LOCKDEP_STACK_TRACE_HASH_BITS=14 +CONFIG_LOCK_EVENT_COUNTS=y +CONFIG_LOCK_STAT=y +CONFIG_MAC80211_DEBUGFS=y +CONFIG_MAC80211_MESSAGE_TRACING=y +CONFIG_MMIOTRACE=y +CONFIG_NET_DEV_REFCNT_TRACKER=y +CONFIG_NET_NS_REFCNT_TRACKER=y +CONFIG_NFP_DEBUG=y +CONFIG_NOUVEAU_DEBUG_MMU=y +CONFIG_NOUVEAU_DEBUG_PUSH=y +CONFIG_PAGE_TABLE_CHECK=y +CONFIG_PAGE_TABLE_CHECK_ENFORCED=y +# CONFIG_PANIC_ON_OOPS is not set +CONFIG_PERCPU_STATS=y +CONFIG_PM_ADVANCED_DEBUG=y +CONFIG_PM_TEST_SUSPEND=y +CONFIG_PM_TRACE_RTC=y +CONFIG_PROVE_LOCKING=y +CONFIG_PTDUMP_DEBUGFS=y +CONFIG_QUOTA_DEBUG=y +CONFIG_RANDOM32_SELFTEST=y +CONFIG_RC_LOOPBACK=m +CONFIG_RTLWIFI_DEBUG=y +CONFIG_RTW88_DEBUG=y +CONFIG_RTW88_DEBUGFS=y +CONFIG_RTW89_DEBUGFS=y +CONFIG_RTW89_DEBUGMSG=y +CONFIG_SCF_TORTURE_TEST=m +CONFIG_SND_CTL_VALIDATION=y +CONFIG_SND_DEBUG=y +CONFIG_SND_JACK_INJECTION_DEBUG=y +CONFIG_SND_PCM_XRUN_DEBUG=y +CONFIG_SND_SOC_SOF_DEBUG_PROBES=y +CONFIG_SND_SOC_SOF_HDA_PROBES=y +CONFIG_SND_VERBOSE_PRINTK=y +CONFIG_SYNTH_EVENT_GEN_TEST=m +CONFIG_TEST_FPU=m +CONFIG_TEST_LIST_SORT=m +CONFIG_TEST_MIN_HEAP=m +CONFIG_TEST_STRING_HELPERS=m +# CONFIG_USB_XHCI_DBGCAP is not set +CONFIG_XFS_WARN=y +CONFIG_ZRAM_MEMORY_TRACKING=y diff --git a/dist/configs/50variant/debug/x86_64.config b/dist/configs/50variant/debug/x86_64.config new file mode 100644 index 000000000000..f981bef2062c --- /dev/null +++ b/dist/configs/50variant/debug/x86_64.config @@ -0,0 +1,9 @@ +CONFIG_HYPERV_TESTING=y +CONFIG_KASAN=y +CONFIG_KASAN_GENERIC=y +CONFIG_KASAN_INLINE=y +CONFIG_PM_SLEEP_DEBUG=y +# CONFIG_PM_TEST_SUSPEND is not set +CONFIG_USB_XHCI_DBGCAP=y +CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y +CONFIG_X86_DEBUG_FPU=y diff --git a/dist/configs/50variant/gcov/default.config b/dist/configs/50variant/gcov/default.config new file mode 100644 index 000000000000..9c87dbf2b6f5 --- /dev/null +++ b/dist/configs/50variant/gcov/default.config @@ -0,0 +1,3 @@ +CONFIG_GCOV_KERNEL=y +CONFIG_GCOV_PROFILE_ALL=y +CONFIG_LOCALVERSION="+gcov" diff --git a/dist/configs/50variant/release/default.config b/dist/configs/50variant/release/default.config new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/dist/kabi/Module.kabi_aarch64 b/dist/kabi/Module.kabi_aarch64 new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/dist/kabi/Module.kabi_riscv64 b/dist/kabi/Module.kabi_riscv64 new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/dist/kabi/Module.kabi_x86_64 b/dist/kabi/Module.kabi_x86_64 new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/dist/scripts/check-commits.sh b/dist/scripts/check-commits.sh new file mode 100755 index 000000000000..e7d30c8ee424 --- /dev/null +++ b/dist/scripts/check-commits.sh @@ -0,0 +1,331 @@ +#!/bin/bash --norc +# SPDX-License-Identifier: GPL-2.0 +# +# Check kernel commit messages + +# shellcheck source=./lib.sh +. "$(dirname "$(realpath "$0")")/lib.sh" + +usage() +{ + cat << EOF +check-commit-msg.sh ... + + --extra-author Who is triggering this check, check for corresponding signed-off-by in commit body + For example, if this script is triggered by a Merge Request, the one who submitted + the Merge Request should also sign all commits within the MR. + + Can be also enabled by setting EXTRA_AUTHOR= in environmental variable. + + --gen-report Generate error report under corrent directory for each commit being checked + in current directory. + + Can be also enabled by setting GEN_REPORT=1 in environmental variable. + + --output-dir Specify where the report should be put if '--gen-report' is used + An directory path is expected. + + Defaults to current directory. + + --vendor-only Author should be limited to vendor only. + (Git commit email address must end with @$VENDOR.com). +EOF +} + +if ! [[ -x "$TOPDIR/scripts/checkpatch.pl" ]]; then + die "This command requires scripts/checkpatch.pl" +fi + +COMMITS=() +HEAD_COMMIT= +OUTPUT_DIR=$(pwd) +VENDOR_ONLY= +while [[ $# -gt 0 ]]; do + case $1 in + --extra-author ) + EXTRA_AUTHOR=$2 + shift 2 + ;; + --output-dir ) + OUTPUT_DIR=$2 + shift 2 + ;; + --gen-report ) + GEN_REPORT=1 + shift + ;; + --vendor-only ) + VENDOR_ONLY=1 + shift + ;; + -* ) + usage + exit 1 + ;; + * ) + COMMITS+=( "$1" ) + shift + esac +done + +if [[ -z "${COMMITS[*]}" ]]; then + echo "Checking all commits that are ahead of remote tracking branch." + + if ! UPSTREAM_BASE=$(git -C "$repo" merge-base HEAD "@{u}" 2>/dev/null); then + warn "Can't find a valid upstream, will only check HEAD commit." + COMMITS=HEAD + else + if [[ $(git rev-list "$UPSTREAM_BASE..HEAD" --count) -eq 0 ]]; then + COMMITS="HEAD" + else + COMMITS="$UPSTREAM_BASE..HEAD" + fi + fi +fi + +is_valid_commit() { + case $1 in + *[!0-9A-Fa-f]* | "" ) + return 1 + ;; + * ) + if [ "${#1}" -lt 12 ] || [ "${#1}" -gt 41 ]; then + return 1 + fi + ;; + esac + + return 0 +} + +# Check if a commit id is valid upstream commit id +# $1: commit id to check +is_valid_upstream_commit() { + local commit=$1 + local upstream_repo=( + "torvalds https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/patch/?id=<>" + "stable https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/patch/?id=<>" + "tip https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git/patch/?id=<>" + ) + local repo repo_name repo_url commit_url + + for repo in "${upstream_repo[@]}"; do + repo_name=${repo%% *} + repo_url=${repo#* } + commit_url=${repo_url/<>/$commit} + if curl --fail --silent --output /dev/null "$commit_url"; then + echo "$commit_url" + return 0 + fi + done + + return 1 +} + +# TODO(katinzhou): 需要测试。且能支持本地调用检查commit msg是否合规 +# Check a commit for all potential issues +# returns number of issues found +check_commit() { + local ret=0 + local commit=$1 + local commit_msg=$2 + + local author=$(git log --pretty=format:"%an" "$commit" -1) + local author_email=$(git log --pretty=format:"%ae" "$commit" -1) + local committer=$(git log --pretty=format:"%cn" "$commit" -1) + local committer_email=$(git log --pretty=format:"%ce" "$commit" -1) + local commit_body=$(git log --pretty=format:"%b" "$commit" -1) + local commit_summary=$(git log --pretty=format:"%s" "$commit" -1) + + # Ignore merge commit + if [ "$(git show --no-patch --format="%P" "$commit" | wc -w)" -ne 1 ]; then + echo "Found merge commit $commit" + echo "NOTICE: This checking routine only follows one parent commit." + return 0 + fi + + local ignore_line="ERROR: Please use git commit description style 'commit <12+ chars of sha1> (\"\")'" + + local patch_content + if ! patch_content=$(git format-patch --stdout -1 "$commit"); then + echo "ERROR: FATAL: Failed to format $commit into a patch" + echo + return 1 + fi + + if ! echo "$commit_body" | grep -iq "^checkpatch:.*\bno\b"; then + local patch_err + patch_err=$(echo "$patch_content" | "$TOPDIR/scripts/checkpatch.pl" --terse | grep -v "$ignore_line" | grep "ERROR: ") + + if [[ -n "$patch_err" ]]; then + echo "ERROR: scripts/checkpatch.pl reported following error:" + echo " $patch_err" + echo + ret=$(( ret + 1 )) + fi + fi + + if ! echo "$commit_body" | grep -q "Signed-off-by: .*\b$author\b"; then + echo "ERROR: Commit author ($author) need to sign the commit, so a Signed-off-by: <$author's sign> is needed" + echo + ret=$(( ret + 1 )) + fi + + if [[ $EXTRA_AUTHOR ]]; then + if ! echo "$commit_body" | grep -q "Signed-off-by: .*\b$EXTRA_AUTHOR\b"; then + echo "ERROR: Commit co-author (eg. MR author) need to sign the commit, so a Signed-off-by: <$EXTRA_AUTHOR's sign> is needed" + echo + ret=$(( ret + 1 )) + fi + fi + + upstream_commit=$(echo "$commit_body" | sed -nE "s/^(Upstream commit:|Upstream: commit) ([^[:space:]]+)/\2/pg") + upstream_status=$(echo "$commit_body" | sed -nE "s/^(Upstream status:|Upstream:) ([^[:space:]]+)/\2/pg") + commits_cnt=$(echo "$upstream_commit" | wc -w) + + if [[ $commit_summary == $VENDOR:* ]]; then + if [[ -z "$upstream_status" ]]; then + echo "ERROR: It seems this is a downstream commit." + echo " Please add following mark in the commit message:" + echo ' ```' + echo ' Upstream status: <no/pending/downstream-only...>' + echo ' ```' + echo " to explain this is a downstream commit." + echo + ret=$(( ret + 1 )) + fi + + if [[ $commits_cnt -ne 0 ]]; then + echo "ERROR: It seems this is a downstream commit, but a Upstream commit mark is provided." + echo + ret=$(( ret + 1 )) + fi + fi + + # This is an upstream commit + if [[ $commits_cnt -eq 0 ]]; then + if [[ $VENDOR_ONLY ]] && [[ $commit_summary != $VENDOR:* ]]; then + echo "ERROR: '$VENDOR:' is missing in the commit summary, and no 'Upstream commit:' mark is found." + echo " If this is a downstream commit, please add '$VENDOR': in commit summary, and add this mark in commit message:" + echo + ret=$(( ret + 1 )) + fi + + if [[ -z "$upstream_status" ]]; then + echo "ERROR: No upstream mark found." + echo " If this is a downstream commit, please add this mark:" + echo ' ```' + echo ' Upstream status: <no/pending/downstream-only...>' + echo ' ```' + echo " to explain this is a downstream commit." + echo + echo " If this is a backported upstream commit, please add one and only one mark:" + echo ' ```' + echo " Upstream commit: <commit id>" + echo ' ```' + echo " to indicate which commit is being backported." + echo + ret=$(( ret + 1 )) + elif [[ "$upstream_status" =~ ^[a-f0-9]{7,}$ ]]; then + echo "ERROR: It seems you pasted a plain commit id after 'Upstream:' or 'Upstream status:' mark." + echo " Please use this format instead:" + echo ' ```' + echo " Upstream commit: <commit id>" + echo ' ```' + echo " If this is a actually downstream commit, please use less confusing words" + echo " for the 'Upstream status:' mark." + echo + ret=$(( ret + 1 )) + fi + else + if [[ $commits_cnt -ne 1 ]]; then + echo "ERROR: It seems this is a upstream commit, please add one *and only one* upstream commit indicator per commit, in following format:" + echo ' ```' + echo " Upstream commit: <commit id>" + echo ' ```' + echo " If this is a downstream commit, please add \"$VENDOR:\" header in commit summary." + echo + ret=$(( ret + 1 )) + else + if ! is_valid_commit "$upstream_commit"; then + echo "ERROR: $upstream_commit is not an valid commit!" + echo + ret=$(( ret + 1 )) + else + if ! is_valid_upstream_commit "$upstream_commit" > /dev/null; then + echo "ERROR: $upstream_commit is not an valid upstream commit!" + echo + ret=$(( ret + 1 )) + fi + fi + fi + + conflict_cnt=$(echo "$commit_body" | grep -c "^Conflict: ") + if [ "$conflict_cnt" -ne 1 ]; then + echo "ERROR: This is an upstream commit, please add one (and only one) conflict indicator in following format:" + echo ' ```' + echo " Conflict: <none/refactored/minor/resolved...>" + echo ' ```' + echo + ret=$(( ret + 1 )) + fi + fi + + if [[ $VENDOR_ONLY ]] && [[ $author_email != *@$VENDOR.com ]]; then + echo "ERROR: The author of this commit is not from $VENDOR.com, did you forget to reset author?" + echo " You can reset author to your self for better backports commits tracking, use:" + echo " > git commit --amend --reset-author" + echo " Or:" + echo " > git commit --amend --author=\"yourname <yourname@$VENDOR.com>\"" + echo " If there are many commits to be modified, use:" + echo " > git filter-branch." + echo + ret=$(( ret + 1 )) + fi + + return $ret +} + +if ! git_logs=$(git log --no-walk=sorted --no-decorate --pretty=oneline --first-parent "${COMMITS[*]}"); then + die "Failed to parse git references '${COMMITS[*]}'" + exit 1 +fi + +IDX=0 +ERROR_MSG="" +echo "$git_logs" | { + ERROR=0 + while read -r commit_id commit_msg; do + echo "=== Checking $commit_id ('$commit_msg') ..." + + IDX=$(( IDX + 1 )) + ERROR_MSG=$(check_commit "$commit_id") + RET=$? + OUTFILE=$(printf "$OUTPUT_DIR/%04d-%s.err" $IDX "$commit_id") + + if [[ $RET -ne 0 ]]; then + ERROR=$(( ERROR + 1 )) + echo_yellow "Found following issues with $commit_id ('$commit_msg'):" + echo_red "$ERROR_MSG" + if [[ "$GEN_REPORT" ]] && [[ "$GEN_REPORT" != "0" ]]; then + { + echo "$ERROR_MSG" + } > "$OUTFILE" + fi + else + if [[ -n "$ERROR_MSG" ]]; then + echo_yellow "$commit_id have some warnings:" + echo_red "$ERROR_MSG" + else + echo_green "$commit_id looks OK" + fi + fi + + # Newline as seperator + echo + done + + exit "$ERROR" +} + +exit $? diff --git a/dist/scripts/check-configs.sh b/dist/scripts/check-configs.sh new file mode 100755 index 000000000000..6fc453147647 --- /dev/null +++ b/dist/scripts/check-configs.sh @@ -0,0 +1,215 @@ +#!/bin/bash --norc +# SPDX-License-Identifier: GPL-2.0 +# +# This script takes the merged config files and processes them through listnewconfig +# then append the new options to pending config + +# shellcheck source=./lib-config.sh +. "$(dirname "$(realpath "$0")")/lib-config.sh" + +# shellcheck disable=SC2164 +export CONFIG_OUTDIR=$DISTDIR/workdir +AUTOFIX=0 + +usage() +{ + cat << EOF +check-configs.sh [sub command] [--autofix] [ <config targets> ... ] + Available sub command: + + check-new-configs Check for new unset kernel options. + If --autofix (or env var AUTOFIX) is enabled, + will append to pending configs + + check-dup-configs Check for kernel configs of the same value in different archs. + If --autofix (or env var AUTOFIX) is enabled, + will move these configs from arch + specific config to the default base config. + + check-diff-configs Check for kernel configs that failed to enabled, + which means, they are set =y/=m in config matrix, + but end up disabled in the final .config file. + Doesn't support AUTOFIX since issues caused by + Kconfig dependency is complex and always need manual fix. +EOF +} + +# Use make listnewconfig to check new Kconfigs +check_new_configs() { + # First generate plain concated config files + populate_configs "$@" + + # Check if there are unset config + _check_new_kconfigs() { + local arch=$1 config_file=$2 base_file=$3 base_configs new_configs + + echo_green "=== Checking $config_file..." + new_configs=$(config_make "$arch" KCONFIG_CONFIG="$config_file" --no-print-directory listnewconfig) + + if [ -n "$new_configs" ]; then + echo_yellow "=== Following configs are not set properly:" + echo "$new_configs" + + if [[ $AUTOFIX -eq 1 ]]; then + echo_green "=== Appending these new configs to the base config file: '$base_file'" + echo "$new_configs" >> "$base_file" + + base_configs=$(<"$base_file") + { + echo "$base_configs" + echo "$new_configs" + } | config_sanitizer > "$base_file" + fi + else + echo_green "=== Config is all clear" + fi + + # Add a newline as seperator + echo + } + + for_each_config_product _check_new_kconfigs "$@" +} + +check_dup_configs() { + # Merge common config items among different archs with same value into base default config. + _dedup_single_dir() { + local dir=$1 + local common_conf base_conf + + echo_green "=== Checking config dir '$dir'" + for arch in "${CONFIG_ARCH[@]}"; do + [[ -e "$dir/$arch.config" ]] || continue + + if [[ -z "$common_conf" ]]; then + # Read-in first arch specific config + common_conf=$(config_sanitizer < "$dir/$arch.config") + else + # Keep the common config items of differnt archs + # The content is filtered with config_sanitizer so `comm` is enough + common_conf=$(comm -12 \ + <(echo "$common_conf") \ + <(config_sanitizer < "$dir/$arch.config") + ) + fi + done + + if [[ "$common_conf" ]]; then + echo_yellow "=== Common configs shared by all sub arch:" + echo "$common_conf" + + if [[ $AUTOFIX -eq 1 ]]; then + base_conf=$(<"$dir/default.config") + { + echo "$base_conf" + echo "$common_conf" + } | config_sanitizer > "$dir/default.config" + fi + else + echo_green "=== Config is all clear" + fi + } + + _get_config_dirs() { + shift; printf "%s\n" "$@" + } + + for dir in $(for_each_config_target _get_config_dirs "$@" | sort -u); do + _dedup_single_dir "$dir" + done +} + +# generate diff file using kernel script diffconfig after make olddefconfig +# param: config.file.old config.file +check_diff_configs() { + local ALL_CONFIGS + + [[ -x "$TOPDIR"/scripts/diffconfig ]] || die "This command rely on linux's in-tree diffconfig script" + + ALL_CONFIGS=$(find "$TOPDIR" -name "Kconfig*" -exec grep -h "^config .*" {} + | sed "s/^config //") + + # First generate plain concated config files + populate_configs "$@" + + _make_a_copy() { + cp "$2" "$2.orig" + } + for_each_config_product _make_a_copy "$@" + + makedef_configs "$@" + + # Check why a config is not enabled + _check_config_issue() { + local _config=$1 _config_file=$2 + + if ! echo "$ALL_CONFIGS" | grep -q "\b$_config\b"; then + echo "$_config no longer exists, maybe it's deprecated or renamed." + return + fi + + echo "$_config have following depends:" + get_all_depends "$_config" "$_config_file" || echo "No dependency found, likely not available on this arch." + echo + } + + _check_diff_configs() { + local arch=$1 config_file=$2 diff_configs + + echo "=== Checking config $config_file" + + echo "= Parsing Kconfig ..." + kconfig_parser "$arch" "$TOPDIR/Kconfig" "$config_file" + + echo "= Checking configs ..." + diff_configs=$("$TOPDIR"/scripts/diffconfig "$config_file.orig" "$config_file" | + # Ignore new added config, they should be covered by check_new_configs + # If kernel didn't ask us to fill one config, then it's an auto-selected config + grep -v "^+" | \ + # Ignore disappeared configs that were unset + grep -v "^\-.*n$" \ + ) + + if [[ -z "$diff_configs" ]]; then + echo_green "=== Config is all clear" + return + fi + + echo "$diff_configs" | while read -r _line; do + local config config_hint="" + case $_line in + -*" m" | -*" y" ) + config=${_line% *} + config=${config#-} + config_hint=$(_check_config_issue "$config" "$config_file") + ;; + esac + + echo_yellow "$_line" + if [[ "$config_hint" ]]; then + echo_yellow "$config_hint" | sed "s/^/ /" + fi + echo + done + echo + } + + for_each_config_product _check_diff_configs "$@" +} + +CMD=$1; shift +[[ $1 == '--autofix' ]] && AUTOFIX=1 +case "$CMD" in + check-new-configs ) + check_new_configs "$@" + ;; + check-dup-configs ) + check_dup_configs "$@" + ;; + check-diff-configs ) + check_diff_configs "$@" + ;; + *) + usage + exit 1 + ;; +esac diff --git a/dist/scripts/check-tag.sh b/dist/scripts/check-tag.sh new file mode 100755 index 000000000000..5214f652c3a4 --- /dev/null +++ b/dist/scripts/check-tag.sh @@ -0,0 +1,23 @@ +#!/bin/bash --norc +# SPDX-License-Identifier: GPL-2.0 +# +# $1: tag +# $2: (opt) git repo + +# shellcheck source=./lib-version.sh +. "$(dirname "$(realpath "$0")")/lib-version.sh" + +prepare_kernel_ver "$@" +KERNEL_UNAMER="$KERNEL_UNAMER_BASE.<dist>.<arch>" +if [[ $KERNEL_UNAMER_FORCE ]]; then + KERNEL_UNAMER="$KERNEL_UNAMER_FORCE" +fi + +# If tag is not recognized, prepare_kernel_ver will version it as snapshot +# use this as an indicator of invalid tag +if ! [[ $KTAGRELEASE ]]; then + warn "Invalid tag, will override with Kernel uname-r '$KERNEL_UNAMER', RPM NVR version '${KERNEL_NAME}-${KERNEL_MAJVER}-${KERNEL_RELVER}'" + exit 1 +else + info "Tag '$KTAGRELEASE' OK, Kernel uname-r '$KERNEL_UNAMER', RPM NVR version '${KERNEL_NAME}-${KERNEL_MAJVER}-${KERNEL_RELVER}'" +fi diff --git a/dist/scripts/dummy-tools/gcc b/dist/scripts/dummy-tools/gcc new file mode 100755 index 000000000000..b2483149bbe5 --- /dev/null +++ b/dist/scripts/dummy-tools/gcc @@ -0,0 +1,111 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-only +# +# Staring v4.18, Kconfig evaluates compiler capabilities, and hides CONFIG +# options your compiler does not support. This works well if you configure and +# build the kernel on the same host machine. +# +# It is inconvenient if you prepare the .config that is carried to a different +# build environment (typically this happens when you package the kernel for +# distros) because using a different compiler potentially produces different +# CONFIG options than the real build environment. So, you probably want to make +# as many options visible as possible. In other words, you need to create a +# super-set of CONFIG options that cover any build environment. If some of the +# CONFIG options turned out to be unsupported on the build machine, they are +# automatically disabled by the nature of Kconfig. +# +# However, it is not feasible to get a full-featured compiler for every arch. +# Hence these dummy toolchains to make all compiler tests pass. +# +# Usage: +# +# From the top directory of the source tree, run +# +# $ make CROSS_COMPILE=scripts/dummy-tools/ oldconfig +# +# Most of compiler features are tested by cc-option, which simply checks the +# exit code of $(CC). This script does nothing and just exits with 0 in most +# cases. So, $(cc-option, ...) is evaluated as 'y'. +# +# This scripts caters to more checks; handle --version and pre-process __GNUC__ +# etc. to pretend to be GCC, and also do right things to satisfy some scripts. + +# Check if the first parameter appears in the rest. Succeeds if found. +# This helper is useful if a particular option was passed to this script. +# Typically used like this: +# arg_contain <word-you-are-searching-for> "$@" +arg_contain () +{ + search="$1" + shift + + while [ $# -gt 0 ] + do + if [ "$search" = "$1" ]; then + return 0 + fi + shift + done + + return 1 +} + +# To set CONFIG_CC_IS_GCC=y +if arg_contain --version "$@"; then + echo "gcc (scripts/dummy-tools/gcc)" + exit 0 +fi + +if arg_contain -E "$@"; then + # For scripts/cc-version.sh; This emulates GCC 20.0.0 + if arg_contain - "$@"; then + sed -n '/^GCC/{s/__GNUC__/20/; s/__GNUC_MINOR__/0/; s/__GNUC_PATCHLEVEL__/0/; p;}' + exit 0 + else + echo "no input files" >&2 + exit 1 + fi +fi + +# To set CONFIG_AS_IS_GNU +if arg_contain -Wa,--version "$@"; then + echo "GNU assembler (scripts/dummy-tools) 2.50" + exit 0 +fi + +if arg_contain -S "$@"; then + # For scripts/gcc-x86-*-has-stack-protector.sh + if arg_contain -fstack-protector "$@"; then + if arg_contain -mstack-protector-guard-reg=fs "$@"; then + echo "%fs" + else + echo "%gs" + fi + exit 0 + fi + + # For arch/powerpc/tools/gcc-check-mprofile-kernel.sh + if arg_contain -m64 "$@" && arg_contain -mlittle-endian "$@" && + arg_contain -mprofile-kernel "$@"; then + if ! test -t 0 && ! grep -q notrace; then + echo "_mcount" + fi + exit 0 + fi +fi + +# To set GCC_PLUGINS +if arg_contain -print-file-name=plugin "$@"; then + plugin_dir=$(mktemp -d) + + mkdir -p $plugin_dir/include + touch $plugin_dir/include/plugin-version.h + + echo $plugin_dir + exit 0 +fi + +# inverted return value +if arg_contain -D__SIZEOF_INT128__=0 "$@"; then + exit 1 +fi diff --git a/dist/scripts/dummy-tools/ld b/dist/scripts/dummy-tools/ld new file mode 100755 index 000000000000..f68233050405 --- /dev/null +++ b/dist/scripts/dummy-tools/ld @@ -0,0 +1,30 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0-only + +# Dummy script that always succeeds. + +# Check if the first parameter appears in the rest. Succeeds if found. +# This helper is useful if a particular option was passed to this script. +# Typically used like this: +# arg_contain <word-you-are-searching-for> "$@" +arg_contain () +{ + search="$1" + shift + + while [ $# -gt 0 ] + do + if [ "$search" = "$1" ]; then + return 0 + fi + shift + done + + return 1 +} + +if arg_contain --version "$@" || arg_contain -v "$@"; then + progname=$(basename $0) + echo "GNU $progname (scripts/dummy-tools/$progname) 2.50" + exit 0 +fi diff --git a/dist/scripts/dummy-tools/nm b/dist/scripts/dummy-tools/nm new file mode 120000 index 000000000000..c0648b38dd42 --- /dev/null +++ b/dist/scripts/dummy-tools/nm @@ -0,0 +1 @@ +ld \ No newline at end of file diff --git a/dist/scripts/dummy-tools/objcopy b/dist/scripts/dummy-tools/objcopy new file mode 120000 index 000000000000..c0648b38dd42 --- /dev/null +++ b/dist/scripts/dummy-tools/objcopy @@ -0,0 +1 @@ +ld \ No newline at end of file diff --git a/dist/scripts/format-configs.sh b/dist/scripts/format-configs.sh new file mode 100755 index 000000000000..2abe34df4033 --- /dev/null +++ b/dist/scripts/format-configs.sh @@ -0,0 +1,14 @@ +#!/bin/bash --norc +# SPDX-License-Identifier: GPL-2.0 +# +# Generate kernel config according to config matrix + +# shellcheck source=./lib-config.sh +. "/$(dirname "$(realpath "$0")")/lib-config.sh" + +# Sort and remove duplicated items in each config base file +for file in "$CONFIG_PATH"/*/*/*.config; do + config_sanitizer < "$file" > "$file.fmt.tmp" + + mv "$file.fmt.tmp" "$file" +done diff --git a/dist/scripts/gen-configs.sh b/dist/scripts/gen-configs.sh new file mode 100755 index 000000000000..51a93b999402 --- /dev/null +++ b/dist/scripts/gen-configs.sh @@ -0,0 +1,19 @@ +#!/bin/bash --norc +# SPDX-License-Identifier: GPL-2.0 +# +# Generate kernel config according to config matrix +# +# Params: +# $@: [ <filter>... ] When non-empty, only generate kernel configs style matching <filter> + +# shellcheck source=./lib-config.sh +. "$(dirname "$(realpath "$0")")/lib-config.sh" + +# Populate basic config entries based on our config file tree +populate_configs "$@" + +# Process the config files with make olddefconfig +makedef_configs "$@" + +# Check config values (eg. LOCALVERSION) +sanity_check_configs "$@" diff --git a/dist/scripts/gen-spec.sh b/dist/scripts/gen-spec.sh new file mode 100755 index 000000000000..fe75b77f7ab3 --- /dev/null +++ b/dist/scripts/gen-spec.sh @@ -0,0 +1,249 @@ +#!/bin/bash --norc +# SPDX-License-Identifier: GPL-2.0 + +# shellcheck source=./lib-version.sh +. "/$(dirname "$(realpath "$0")")/lib-version.sh" + +usage() +{ + cat << EOF +gen-spec.sh [OPTION] + + --kernel-dist Kernel distribution marker, eg. tks/tlinux4/tlinux3 + --kernel-config Kernel config base name, will look for the corresponding kernel config under $DISTDIR/configs + --kernel-variant Kernel variant, eg. debug, gcov, kdb + --build-arch What arch's are supported, defaults to '$SPEC_ARCH'" +EOF +} + +# gen-spec need to parse info from source (currently only parse LOCALVERSION from config), +# so check if the kernel configs are valid here. +prepare_source_info() { + local localversion arch_localversion file + + if [ -z "$KERNEL_CONFIG" ]; then + die "Config target not specified." + fi + + for arch in $BUILD_ARCH; do + file="$SOURCEDIR/$KERNEL_CONFIG.$arch.config" + if ! [ -e "$file" ]; then + die "Config file missing '$file'" + fi + if [ -z "$localversion" ]; then + localversion=$(sed -ne 's/^CONFIG_LOCALVERSION=\(.*\)$/\1/pg' "$file") + else + arch_localversion=$(sed -ne 's/^CONFIG_LOCALVERSION=\(.*\)$/\1/pg' "$file") + if [ "$arch_localversion" != "$localversion" ]; then + die "LOCALVERSION inconsistent between sub-arches for config target '$file', this breaks SRPM package naming." + fi + fi + done + + localversion=${localversion#\"} + localversion=${localversion%\"} + LOCALVERSION=$localversion +} + +DEFAULT_DISALBED="" +while [[ $# -gt 0 ]]; do + case $1 in + --kernel-config ) + KERNEL_CONFIG=$2 + shift 2 + ;; + --build-arch ) + BUILD_ARCH=$2 + shift 2 + ;; + --gitref ) + GITREF=$2 + shift 2 + ;; + --set-default-disabled ) + for param in $2; do + DEFAULT_DISALBED=" $param $DEFAULT_DISALBED" + done + shift 2 + ;; + --set-default-enabled ) + for param in $2; do + DEFAULT_DISALBED="${DEFAULT_DISALBED/ $param /}" + done + shift 2 + ;; + * ) + die "Unrecognized parameter $1" + ;; + esac +done + +BUILD_ARCH="${BUILD_ARCH:-$SPEC_ARCH}" + +# This helper prepares LOCALVERSION +prepare_source_info +# This function will prepare $KERNEL_MAJVER, $KERNEL_RELVER +prepare_kernel_ver "${GITREF:-HEAD}" "$LOCALVERSION" + +_gen_arch_spec() { + local arch kernel_arch + cat << EOF +ExclusiveArch: $BUILD_ARCH +EOF + for arch in $BUILD_ARCH; do + if ! kernel_arch=$(get_kernel_arch "$arch"); then + die "Unsupported arch '$arch'" + fi + cat << EOF +%ifarch $arch +%define kernel_arch $kernel_arch +%endif +EOF + done +} + +_gen_kerver_spec() { + cat << EOF +%define kernel_majver $KERNEL_MAJVER +%define kernel_relver $KERNEL_RELVER +%define kernel_variant ${LOCALVERSION:-"%{nil}"} +%define kernel_unamer_base $KERNEL_UNAMER_BASE +%define kernel_unamer_force ${KERNEL_UNAMER_FORCE:-"%{nil}"} +%define rpm_name $KERNEL_NAME +%define rpm_vendor $VENDOR_CAPITALIZED +%define rpm_url $URL +EOF +} + +_gen_arch_source() { + # Source1000 - Source1199 for kernel config + local config_source_num=1000 arch + for arch in $BUILD_ARCH; do + echo "Source$config_source_num: $KERNEL_CONFIG.$arch.config" + config_source_num=$((config_source_num + 1)) + done + + # Source1200 - Source1399 for kabi source + local kabi_source_num=1200 arch + for arch in $BUILD_ARCH; do + echo "Source$kabi_source_num: Module.kabi_$arch" + kabi_source_num=$((kabi_source_num + 1)) + done +} + +_gen_config_build() { + cat << EOF +%ifnarch $BUILD_ARCH +{error:unsupported arch} +%endif +EOF + local config_source_num=1000 arch + for arch in $BUILD_ARCH; do + cat << EOF +%ifarch $arch +BuildConfig %{SOURCE$config_source_num} +%endif +EOF + config_source_num=$((config_source_num + 1)) + done +} + +_gen_kabi_check() { + cat << EOF +%ifnarch $BUILD_ARCH +{error:unsupported arch} +%endif +EOF + local kabi_source_num=1200 arch + for arch in $BUILD_ARCH; do + cat << EOF +%ifarch $arch +CheckKernelABI %{SOURCE$kabi_source_num} +%endif +EOF + kabi_source_num=$((kabi_source_num + 1)) + done +} + +_gen_changelog_spec() { + cat "$DISTDIR/templates/changelog" +} + +_gen_pkgopt_spec() { + local enabled_opts disabled_opts opts_output + for opt in \ + core \ + doc \ + headers \ + perf \ + tools \ + bpftool \ + debuginfo \ + modsign \ + kabichk \ + traceevent_dyn \ + keypkg + do + case $DEFAULT_DISALBED in + *" $opt "* ) + disabled_opts="$disabled_opts $opt" + opts_output="$opts_output +%define with_$opt %{?_with_$opt:1}%{?!_with_$opt:0}" + ;; + * ) + enabled_opts="$enabled_opts $opt" + opts_output="$opts_output +%define with_$opt %{?_without_$opt:0}%{?!_without_$opt:1}" + esac + done + + # Marker for dist build system, a little bit ugly, maybe find a better way to present this info later + echo "" + echo "# === Package options ===" + echo "# Eanbled by default: $enabled_opts" + echo "# Disabled by default: $disabled_opts" + echo "$opts_output" +} + +gen_spec() { + local _line + local _spec + + while IFS='' read -r _line; do + case $_line in + "{{PKGPARAMSPEC}}"* ) + _spec+="$(_gen_pkgopt_spec)" + ;; + "{{ARCHSPEC}}"* ) + _spec+="$(_gen_arch_spec)" + ;; + "{{VERSIONSPEC}}"* ) + _spec+="$(_gen_kerver_spec)" + ;; + "{{ARCHSOURCESPEC}}"* ) + _spec+="$(_gen_arch_source)" + ;; + "{{CONFBUILDSPEC}}"* ) + _spec+="$(_gen_config_build)" + ;; + "{{KABICHECKSPEC}}"* ) + _spec+="$(_gen_kabi_check)" + ;; + "{{CHANGELOGSPEC}}"* ) + _spec+="$(_gen_changelog_spec)" + ;; + "{{"*"}}"*) + die "Unrecognized template keywork $_line" + ;; + * ) + _spec+="$_line" + ;; + esac + _spec+=" +" + done + + echo "$_spec" +} + +gen_spec < "$DISTDIR/templates/kernel.template.spec" diff --git a/dist/scripts/get-next-sub-version.sh b/dist/scripts/get-next-sub-version.sh new file mode 100755 index 000000000000..6e80b662d29d --- /dev/null +++ b/dist/scripts/get-next-sub-version.sh @@ -0,0 +1,9 @@ +#!/bin/bash --norc +# SPDX-License-Identifier: GPL-2.0 + +# shellcheck source=./lib-version.sh +. "$(dirname "$(realpath "$0")")/lib-version.sh" + +prepare_next_sub_kernel_ver "$@" + +echo "$KERNEL_UNAMER_BASE" diff --git a/dist/scripts/get-next-version.sh b/dist/scripts/get-next-version.sh new file mode 100755 index 000000000000..f2cec89617e7 --- /dev/null +++ b/dist/scripts/get-next-version.sh @@ -0,0 +1,9 @@ +#!/bin/bash --norc +# SPDX-License-Identifier: GPL-2.0 + +# shellcheck source=./lib-version.sh +. "$(dirname "$(realpath "$0")")/lib-version.sh" + +prepare_next_kernel_ver "$@" + +echo "$KERNEL_UNAMER_BASE" diff --git a/dist/scripts/get-version.sh b/dist/scripts/get-version.sh new file mode 100755 index 000000000000..c49f7de28324 --- /dev/null +++ b/dist/scripts/get-version.sh @@ -0,0 +1,23 @@ +#!/bin/bash --norc +# SPDX-License-Identifier: GPL-2.0 +# +# Print out the tkernel version based on git commit and work tree. +# +# $1: git reference, tag or commit +# $2: version type, 'nvr' or 'unamer', defaults to 'unamer' +# +# shellcheck source=./lib-version.sh +. "$(dirname "$(realpath "$0")")/lib-version.sh" + +prepare_kernel_ver "$1" +case $2 in + vr ) + echo "$KERNEL_MAJVER"-"$KERNEL_RELVER" + ;; + nvr ) + echo "$KERNEL_NAME"-"$KERNEL_MAJVER"-"$KERNEL_RELVER" + ;; + * | unamer ) + echo "$KERNEL_UNAMER" + ;; +esac diff --git a/dist/scripts/helper/backporter.sh b/dist/scripts/helper/backporter.sh new file mode 100755 index 000000000000..edbd6b67304e --- /dev/null +++ b/dist/scripts/helper/backporter.sh @@ -0,0 +1,88 @@ +#!/bin/bash --norc +# SPDX-License-Identifier: GPL-2.0 + +# shellcheck source=../lib.sh +. "/$(dirname "$(realpath "$0")")/../lib.sh" + +AUTHOR="$(git config user.name) <$(git config user.email)>" +REASON=$1 +COMMIT=$2 +UPSTRAM="upstream" + +[ -z "$COMMIT" ] && die "Usage: $0 <upstream commit id>" + +_resolve_conflict_shell() { + error "Failed to backport, please fix the problem, then commit it." + error "then exit the shell with \`exit 0\`." + error "To abort the backport, exited with a dirty worktree or exit with non-zero." + + export PS1="RESOLVING CONFLICT" + + $SHELL || { + RET=$? + error "Shell exited with non-zero, aborting backport" + git reset --hard HEAD + exit $RET + } + + git diff-index --quiet HEAD || { + RET=$? + error "Dirty worktree, aborting backport" + git reset --hard HEAD + exit $RET + } +} + +_fetch_upstream() { + # Try to fetch from well-known upstream + local commit=$1 + local upstream_repos=( + "torvalds https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/patch/?id=<> git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git" + "tip https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git/patch/?id=<> git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git" + "mm https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git/patch/?id=<> git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git" + "stable https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/patch/?id=<> git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git" + ) + + for repo in "${upstream_repos[@]}"; do + repo_http_git=${repo#* } + repo_name=${repo%% *} + repo_http=${repo_http_git% *} + repo_git=${repo_http_git#* } + commit_url=${repo_http/<>/$commit} + echo curl --fail --silent --output /dev/null "$commit_url" + if curl --fail --silent --output /dev/null "$commit_url"; then + echo "Found commit '$commit' in '$repo_name' repo" + echo git fetch "$repo_git" "$commit" + git fetch "$repo_git" "$commit" + return + fi + done + + echo "Can't find commit $commit in upstream." + return 1 +} + +if ! git cat-file -e "$COMMIT"; then + # Available locally, just cherry-pick + _fetch_upstream "$COMMIT" +fi + +if ! git cherry-pick "$COMMIT"; then + _resolve_conflict_shell + CONFLICT=resolved +else + CONFLICT=none +fi + +git commit \ + --am \ + --message \ + "$(git log -1 --format=%s "$COMMIT") + +commit $COMMIT $UPSTRAM + +Conflicts: $CONFLICT +Back$(echo "port-reason: $REASON" | fold -s -w 75 | sed -e '2,$s/^/ /') + +$(git show --pretty=format:"%B" --no-patch "$COMMIT" | tail -n +3) +Signed-off-by: $AUTHOR" diff --git a/dist/scripts/helper/dist-repo-init.sh b/dist/scripts/helper/dist-repo-init.sh new file mode 100755 index 000000000000..0e456d077e87 --- /dev/null +++ b/dist/scripts/helper/dist-repo-init.sh @@ -0,0 +1,80 @@ +#!/bin/bash --norc +# SPDX-License-Identifier: GPL-2.0 +# +# After dropping the dist build system into a upstream kernel repo, +# use this to hook the dist build system into Kbuild Makefile. + +# shellcheck source=../lib.sh +. "/$(dirname "$(realpath "$0")")/../lib.sh" + +VENDOR_CAPITALIZED=$(get_dist_makefile_var VENDOR_CAPITALIZED) +KMAKEFILE_CONTENT="" + +[ -d "$TOPDIR" ] || { + die "Not a valid git repo." +} + +[ -e "$TOPDIR/Kbuild" ] && [ -e "$TOPDIR/Kconfig" ] && [ -e "$TOPDIR/Makefile" ] || { + die "Not a valid kernel repo." +} + +[ -e "$DISTDIR/Makefile" ] || { + die "Dist files are not properly configured, aborting." +} + +[[ "$DISTDIR" == "$TOPDIR"/* ]] || { + die "Dist files are not properly configured, aborting." +} + +if [[ $1 == "--reset" ]]; then + ### Clean up changelog + echo -n > "$DISTDIR"/templates/changelog + + ### Clean up kABI + for i in $SPEC_ARCH; do + echo -n > "$DISTDIR"/kabi/Module.kabi_$i + done + + ### Clean up generic-default config + echo -n > "$DISTDIR"/configs/00base/generic/default.config + for i in $SPEC_ARCH; do + echo -n > "$DISTDIR"/configs/00base/generic/$i.config + done +fi + +### Patch .gitignore +grep -qF "# ${VENDOR_CAPITALIZED:+${VENDOR_CAPITALIZED} }dist files" "$TOPDIR/.gitignore" || { + echo "Updating Kernel .gitignore to ignore dist files..." + cat >> "$TOPDIR/.gitignore" << EOF + +# ${VENDOR_CAPITALIZED:+${VENDOR_CAPITALIZED} }dist files +/$DISTPATH/rpm +/$DISTPATH/workdir +EOF +} + +### Patch .gitattributes +for i in ".ci" "$DISTPATH"; do \ + [[ -d $TOPDIR/$i ]] || continue + grep -qF "$i/" $TOPDIR/.gitattributes 2>/dev/null || { + echo "$i/ export-ignore" >> $TOPDIR/.gitattributes + } +done; + +### Patch kernel Makefile +grep -qF "# dist_make: ${VENDOR_CAPITALIZED:+${VENDOR_CAPITALIZED} }" "$TOPDIR/Makefile" || { + echo "Updating Kenrel Makefile..." + KMAKEFILE_CONTENT=$(<"$TOPDIR/Makefile") + cat > "$TOPDIR/Makefile" << EOF +# SPDX-License-Identifier: GPL-2.0 + +# dist_make: ${VENDOR_CAPITALIZED:+${VENDOR_CAPITALIZED} }Dist Makefile, which contains dist-* make targets +ifneq (\$(shell echo \$(MAKECMDGOALS) | grep "^dist-"),) +include $DISTPATH/Makefile +else + +$KMAKEFILE_CONTENT + +endif # dist_make +EOF +} diff --git a/dist/scripts/helper/gen-module-kabi.sh b/dist/scripts/helper/gen-module-kabi.sh new file mode 100755 index 000000000000..e91ff6a9e79f --- /dev/null +++ b/dist/scripts/helper/gen-module-kabi.sh @@ -0,0 +1,116 @@ +#!/usr/bin/env sh +# + +KERNEL= +SYMVER= +TMPDIR= + +error() { + echo "error: $*" > /dev/stderr +} + +usage() { + cat << EOF +Provide a list of modules, this script will print the SYMBOLS used by these modules + +gen-module-kabi.sh: [--kernel <kernel name>] [--symver <symver file>] [<module name or file>, ...] + +<kernel name>: default to \$(uname -r), or specify a installed kernel +<symver file>: default to /usr/lib/<kernel name>/symvers.gz, or specify a symver file +<module>: module name +EOF +} + +while true; do + case $1 in + --symver ) + SYMVER=$2 + shift 2 + ;; + --kernel ) + KERNEL=$2 + shift 2 + ;; + --usage|--help|-h ) + usage + exit 0 + ;; + * ) + break + ;; + esac +done + +if ! TMPDIR="$(mktemp -d -t gen-module-kabi.XXXXXX)"; then + error "mktemp failed" + exit 1 +fi + +trap 'ret=$?; +[[ -d $TMPDIR ]] && rm --one-file-system -rf -- "$TMPDIR"; +exit $ret; +' EXIT + +[ "$KERNEL" ] || KERNEL=$(uname -r) +[ -f "$SYMVER" ] || SYMVER=/lib/modules/$KERNEL/symvers.gz +[ -f "$SYMVER" ] || SYMVER=/boot/symvers-$KERNEL.gz +[ -f "$SYMVER" ] || SYMVER=./Module.symvers + +if [[ "$#" -eq 0 ]]; then + usage +fi + +case $SYMVER in *.gz ) + gzip < "$SYMVER" -d > "$TMPDIR/symver" + SYMVER=$TMPDIR/symver + ;; +esac + +_get_export_syms() { + _temp_extract=$TMPDIR/extracted.ko + case $1 in + *.ko ) + modfile=$1 + ;; + *.xz ) + modfile=$_temp_extract + xz -c -d "$1" > "$_temp_extract" + ;; + * ) + error "unsupported file format of file: $1" + esac + + nm -uAg "$modfile" +} + +for mod in "$@"; do + if [[ $mod == *.ko ]] && [[ -f $mod ]]; then + mods=$mod + elif [[ $mod == *.ko.* ]] && [[ -f $mod ]]; then + mods=$mod + elif ! mods="$(modinfo --set-version "$KERNEL" --filename "$mod" 2> /dev/null)"; then + error "'$mod' is not a valid module name" + fi + + for m in $mods; do + _get_export_syms "$m" + done +done | sort | while read -r file_path type sym_name; do + in_symver=0 + in_vmlinux=0 + sym_line=$(grep "\s$sym_name\s" "$SYMVER") && in_symver=1 + case $sym_line in + # print only symbol in vmlinux + *vmlinux*EXPORT_SYMBOL* ) + in_vmlinux=1 + ;; + esac + echo -n "$file_path $type $sym_name" + if [[ $in_symver -eq 0 ]]; then + echo -n " (NO-KABI: NOT IN SYMVER)" + fi + if [[ $in_vmlinux -eq 0 ]]; then + echo -n " (NO-KABI: NOT IN VMLINUX)" + fi + echo +done diff --git a/dist/scripts/helper/update-kabi.sh b/dist/scripts/helper/update-kabi.sh new file mode 100755 index 000000000000..b8fa69db7426 --- /dev/null +++ b/dist/scripts/helper/update-kabi.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env sh +# + +error() { + echo "error: $*" > /dev/stderr +} + +usage() { + cat << EOF +update-kabi.sh: <kABI Module.symvers> <new Module.symvers> + +Take kABI Module.symvers as reference and generate a new kABI symvers file. +EOF +} + +KABI=$1 +SYMVER=$2 + +if ! [ -s "$KABI" ] || ! [ -s "$SYMVER" ]; then + error "Invalid params." + usage + exit 1 +fi + +cat "$KABI" | while read -r _crc _symbol _vmlinux _gpl; do + grep "\b$_symbol\b.*vmlinux" "$SYMVER" +done | sed -e "s/\t$//" diff --git a/dist/scripts/lib-config.sh b/dist/scripts/lib-config.sh new file mode 100755 index 000000000000..09a33856f67e --- /dev/null +++ b/dist/scripts/lib-config.sh @@ -0,0 +1,457 @@ +#!/bin/bash --norc +# +# To support different arches, compile options, and distributions, +# Kernel configs are managed with a hierarchy matrix. +# +# This script is the helper for parsing and updating the config matrix +# +# shellcheck source=./lib.sh +. "$(dirname "$(realpath "$0")")/lib.sh" + +CONFIG_PATH=${CONFIG_PATH:-$DISTDIR/configs} +# shellcheck disable=SC2206 +CONFIG_ARCH=( $SPEC_ARCH ) +CONFIG_SPECS=( "$CONFIG_PATH"/[0-9][0-9]* ) +CONFIG_OUTDIR=$SOURCEDIR +CONFIG_CACHE=$DISTDIR/workdir/config_cache + +_get_config_cross_compiler () { + if [[ "$1" == $(get_native_arch) ]]; then + : + elif [[ -d "$TOPDIR/scripts/dummy-tools/" ]]; then + echo "scripts/dummy-tools/" + else + echo "$DISTDIR/scripts/dummy-tools/" + fi +} + +get_config_val() { + # If it's y/m/n/0-9, return plain text, else get from .config + # + # To be more accurate, maybe we need to check right/left-value? + case $1 in + n ) + ;; + y|m|[0-9] ) + echo "$1" ;; + * ) + local _val + _val=$(grep "^CONFIG_$1=" "$2") + _val=${_val#*=} + echo "${_val:-not set}" + ;; + esac +} + +# Eval a Kconfig condition statement +kconfig_eval() { + local _line=$1 + + local _if + # Convert Kconfig cond statement to bash syntax then eval it + _if=$(echo "$_line" | sed -E \ + -e "s/(\|\||&&|=|!=|<|<=|>|>=|!|\(|\))/ \1 /g" \ + -e "s/([[:alnum:]_-]+)/ \"\$(get_kconf_val \'\1\')\" /g") + eval "[[ $_if ]]" +} + +get_depends() { + local _conf=$1 + local _deps _line + + sed -nE "s/^[[:space:]]*depends on //p;" "$CONFIG_CACHE/$_conf" +} + +# $1: Parsed Kconfig file +get_all_depends() { + local _dep + local _deps=( ) + + [[ ! -e "$CONFIG_CACHE/$1" ]] && return 1 + + # shellcheck disable=SC2207 + while read -r _dep; do + if ! [[ "$_dep" ]]; then + continue + elif [[ "$_dep" =~ y|n|m ]]; then + _deps+=( "$_dep" ) + elif [[ "$_dep" =~ [a-zA-Z0-9] ]]; then + _deps+=( "$_dep[=$(get_config_val "$_dep" "$2")]" ) + else + _deps+=( "$_dep" ) + fi + done <<< "$(get_depends "$1" | sed -E \ + -e 's/^([^\(])/(\1/' \ + -e 's/([^\)])$/\1)/' \ + -e '2,$s/^/\&\&/' \ + -e 's/(\|\||&&|=|!=|<|<=|>|>=|!|\(|\)|([[:alnum:]_-]+))/\n\1\n/g')" + # The regex above simply tokenize the Kconfig expression + + echo "${_deps[@]}" + + return 0 +} + +kconfig_parser() { + local _arch=$1 _kconfig=$2 _config=$3 + + [[ -s $_kconfig ]] || error "Invalid Kconfig '$_kconfig'" + [[ -s $_config ]] || error "Invalid config file '$_kconfig'" + + rm -r "${CONFIG_CACHE:?}" 2>/dev/null + mkdir -p "$CONFIG_CACHE" + + local _CONFIG_FILE=$CONFIG_CACHE/_invalid + local _PARSE_DEPS=() + + _reader() { + local _f=$1 + + if [[ $_f == *"\$(SRCARCH)"* ]]; then + _f=${_f/\$(SRCARCH)/$(get_kernel_src_arch "$_arch")} + fi + + local _line + while :; do + _line=${_line%%#*} + case $_line in + "config "* | "menuconfig "* ) + _CONFIG_FILE=${_line#* } + _CONFIG_FILE=${_CONFIG_FILE## } + _CONFIG_FILE=$CONFIG_CACHE/$_CONFIG_FILE + for _dep in "${_PARSE_DEPS[@]}"; do [[ $_dep ]] && echo "depends on $_dep"; done >> "$_CONFIG_FILE" + ;; + "source "* ) + _line=${_line#* } + _line=${_line#\"} + _line=${_line%\"} + _reader "$_line" + ;; + "if "* ) + _line=${_line#if } + _PARSE_DEPS+=( "${_line}" ) + ;; + "menu "* | "choice" ) + local _sub_dep="" + while read -r _line; do + case $_line in + if*|menu*|config*|end*|source*|choice* ) break ;; + "depends on"* ) + _line="${_line#depends on}" + _sub_dep="${_sub_dep:+$_sub_dep && }(${_line## })" + ;; + "visible if"* ) + _line="${_line#visible if}" + _sub_dep="${_sub_dep:+$_sub_dep && }(${_line## })" + ;; + esac + done + _PARSE_DEPS+=( "${_sub_dep## }" ) + continue + ;; + "end"* ) + # We don't care about correctness, + # it's always paired with previous if/menu/choice + unset '_PARSE_DEPS[${#_PARSE_DEPS[@]}-1]' + ;; + '' | ' ' ) + ;; + * ) + echo "$_line" >> "$_CONFIG_FILE" + esac + IFS='' read -r _line || break + done <<< "$(<"$_f")" + } + + pushd "$(dirname "$_kconfig")" > /dev/null || die "Failed pushd to '$TOPDIR'" + + _reader "$_kconfig" + + popd || die +} + +# Call make for config related make target. Will set proper cross compiler and kernel arch name. +# $1: Target arch. +config_make() { + local arch=$1; shift + local config_cross_compiler config_arch + + pushd "$TOPDIR" >/dev/null || die "Not in a valid git repo." + + config_cross_compiler=$(_get_config_cross_compiler "$arch") + config_arch=$(get_kernel_arch "$arch") + + if [[ -z "$config_arch" ]]; then + die "Unsupported arch $arch" + fi + + make ARCH="$config_arch" CROSS_COMPILE="$config_cross_compiler" "$@" + + popd >/dev/null || die "Failed popd" +} + +# Dedup, and filter valid config lines, print the sanitized content sorted by config name. +config_sanitizer() { + # AWK will add an extra column of CONFIG_NAME for sort to work properly + LC_ALL=C + awk ' + /is not set/ { + split($0, val, "#"); + split(val[2], val); + configs[val[1]]=$0 + } + /^CONFIG.*=/ { + split($0, val, "="); + if (val[2] == "n") + configs[val[1]]="# "val[1]" is not set" + else + configs[val[1]]=$0 + } + END { + for (config in configs) { + print config " " configs[config] + } + }' \ + | LC_ALL=C sort -k 1 \ + | sed -e 's/[ \t]*$//' \ + | cut -d ' ' -f 2- +} + +# Iterate the dot product of all config options +# param: <callback> [<filter>... ] +# [<filter>... ]: Filters config targets to use. eg. kernel-default-*, kernel-minimal-debug +# <callback>: A callback function, see below for <callback> params. +# +# Will generate a matrix, and call <callback> like this: +# <callback> <config-target> [ <dir entry of configs in inherit order> ... ] +# +# eg. +# <callback> "kernel-generic-release" "$TOPDIR/00pending/kernel" "$TOPDIR/20preset/generic" "$TOPDIR/50variant/release" +# <callback> "kernel-generic-debug" "$TOPDIR/00pending/kernel" "$TOPDIR/20preset/generic" "$TOPDIR/50variant/debug" +# ... +# +for_each_config_target () { + local filters callback + local target cur_target i j + + callback=$1; shift + filters=("$@") + + _match () { + [[ ${#filters[@]} -eq 0 ]] && return 0 + + for _f in "${filters[@]}"; do + # shellcheck disable=SC2053 + [[ $1 == $_f ]] && return 0 + done + + return 1 + } + + # The '_' is used to bootstrap the file loop + local -a hierarchy=( _ ) prev_hierarchy target_conf prev_target_conf + + for folder in "${CONFIG_SPECS[@]}"; do + prev_hierarchy=( "${hierarchy[@]}" ) + prev_target_conf=( "${target_conf[@]}" ) + + hierarchy=( ) + target_conf=( ) + + i=0 + for config in "$folder"/*; do + if ! [[ -e "$config/default.config" ]]; then + error "Invalid config folder $config" + return 1 + fi + + j=0 + for target in "${prev_hierarchy[@]}"; do + cur_target=$target-$(basename "$config") + hierarchy+=( "$cur_target" ) + # config files can't have spece in their path since the + # list is split by space, seems no better way + target_conf[$i]="${prev_target_conf[$j]} $config" + i=$(( i + 1 )) + j=$(( j + 1 )) + done + done + done + + i=0 + for target in "${hierarchy[@]}"; do + # split target_conf by space is what we want here + target="${target#_-}" + # shellcheck disable=SC2086 + _match $target && "$callback" "${target#_-}" ${target_conf[$i]} + i=$(( i + 1 )) + done +} + +# Iterate populated config files +# param: <callback> [<filter>... ] +# [<filter>... ]: Filters config targets to use. eg. kernel-default-*, kernel-minimal-debug +# <callback>: A callback function, see below for <callback> params. +# +# Will generate a matrix, and call <callback> like this: +# <callback> <arch> <config-file> [ <backing config files in inherit order>... ] +# +# eg. +# <callback> "x86_64" "kernel-generic-release" \ +# "$TOPDIR/00pending/kernel/default.config" "$TOPDIR/00pending/kernel/x86_64.config" \ +# "$TOPDIR/20preset/generic/default.config" "$TOPDIR/20preset/generic/x86_64.config" \ +# "$TOPDIR/50variant/release/default.config" "$TOPDIR/50variant/release/x86_64.config" +# <callback> "aarch64" "kernel-generic-release" \ +# "$TOPDIR/00pending/kernel/default.config" "$TOPDIR/00pending/kernel/aarch64.config" \ +# "$TOPDIR/20preset/generic/default.config" "$TOPDIR/20preset/generic/aarch64.config" \ +# "$TOPDIR/50variant/release/default.config" "$TOPDIR/50variant/release/aarch64.config" +# ... +# +for_each_config_product () { + local _wrapper_cb=$1; shift + + _wrapper () { + local target=$1; shift + local files=( "$@" ) + + for arch in "${CONFIG_ARCH[@]}"; do + local config_basename="$target.$arch.config" + local config_product="$CONFIG_OUTDIR/$config_basename" + local config_files=( ) + + for _conf in "${files[@]}"; do + config_files+=( "$_conf/default.config" ) + if [[ -e "$_conf/$arch.config" ]]; then + config_files+=( "$_conf/$arch.config" ) + fi + done + + $_wrapper_cb "$arch" "$config_product" "${config_files[@]}" + done + } + + for_each_config_target _wrapper "$@" +} + +# Simply concat the backing config files in order into a single files for each config target +populate_configs () { + _merge_config () { + local target=$1; shift + local config_basename output_config + for arch in "${CONFIG_ARCH[@]}"; do + config_basename="$target.$arch.config" + output_config="$CONFIG_OUTDIR/$config_basename" + + echo "Populating $config_basename from base configs..." + + for conf in "$@"; do + cat "$conf/default.config" + if [[ -e "$conf/$arch.config" ]]; then + cat "$conf/$arch.config" + fi + done | config_sanitizer > "$output_config" + done + } + + for_each_config_target _merge_config "$@" +} + +makedef_configs () { + _makedef_config() { + local target=$1; shift + local populated_config + + for arch in "${CONFIG_ARCH[@]}"; do + populated_config="$CONFIG_OUTDIR/$target.$arch.config" + + # config base name is always in this format: <name>.<arch>.config + echo "Processing $(basename "$populated_config") with make olddefconfig..." + + if ! [ -f "$populated_config" ]; then + error "Config not found: '$populated_config'" + continue + fi + + pushd "$TOPDIR" > /dev/null || exit 1 + + config_make "$arch" KCONFIG_CONFIG="$populated_config" olddefconfig + + popd > /dev/null || return + done + } + + for_each_config_target _makedef_config "$@" +} + +sanity_check_configs () { + # We use LOCALVERSION in Kconfig for variant, save a make flag, but require more sanity check to avoid misuse. + # First ensure all arch have the same value + # Then ensure it's in a acceptable format + _sanity_check_configs() { + local target=$1; shift + local populated_config + local localversion arch_localversion auto_localversion conf_localversion + + for arch in "${CONFIG_ARCH[@]}"; do + populated_config="$CONFIG_OUTDIR/$target.$arch.config" + + # config base name is always in this format: <name>.<arch>.config + echo "Checking $(basename "$populated_config")..." + + if ! [ -f "$populated_config" ]; then + error "Config not populated: '$populated_config'" + error "sanity_check_configs need to be called after the configs are populated" + exit 1 + fi + + auto_localversion=$(sed -ne 's/^CONFIG_LOCALVERSION_AUTO=\(.*\)$/\1/pg' "$populated_config") + if [ -n "$auto_localversion" ] && [ "$auto_localversion" != "n" ]; then + error "CONFIG_LOCALVERSION_AUTO must be unset, but it's set in config target $target" + error "This will break dist build system's release versioning." + exit 1 + fi + + conf_localversion=$(sed -ne 's/^CONFIG_LOCALVERSION=\(.*\)$/\1/pg' "$populated_config") + conf_localversion=${conf_localversion##\"} + conf_localversion=${conf_localversion%%\"} + if [ 1 -lt "$(echo "$conf_localversion" | wc -l)" ]; then + error "More than one LOCALVERSION is set for config target '$target'" + exit 1 + fi + + if [ -z "$localversion" ]; then + localversion=$conf_localversion + else + arch_localversion=$conf_localversion + if [ "$arch_localversion" != "$localversion" ]; then + error "Unexpected '$arch_localversion' != '$localversion':" + error "This breaks SRPM package naming, LOCALVERSION inconsistent between sub-arches for config target '$target'" + exit 1 + fi + fi + done + + localversion=${localversion#\"} + localversion=${localversion%\"} + + case $localversion in + +debuginfo|+core|+devel|+headers|+modules|+$KDIST ) + error "Unexpected LOCALVERSION '$localversion':" + error "LOCALVERSION is using a reserved keyword, this will cause package dependency breakage." + exit 1 + ;; + +* ) + ;; + '' ) + # Empty value is default and fine + ;; + *) + error "Unexpected LOCALVERSION '$localversion':" + error "LOCALVERSION is not in acceptable format, for dist building system, it need to start with a '+'" + error "to distinguish it from release string, and dist build system also need to manipulate the string based on above fact." + exit 1 + esac + } + + for_each_config_target _sanity_check_configs "$@" +} diff --git a/dist/scripts/lib-version.sh b/dist/scripts/lib-version.sh new file mode 100755 index 000000000000..df397e91c18f --- /dev/null +++ b/dist/scripts/lib-version.sh @@ -0,0 +1,743 @@ +#!/bin/bash +# +# Version conversion helpers for building a TK kernel. +# +# shellcheck source=./lib.sh +. "$(dirname "$(realpath "$0")")/lib.sh" + +## Standardized kernel package version and uname are composed as follows: +# +# A valid tag: [PREFIX-]<KERNEL_MAJVER>-<KERNEL_RELVER>[.<KERNEL_DIST>] +# uname -r: <KERNEL_MAJVER>-<KERNEL_RELVER>[.<KERNEL_DIST>][+<LOCALVER>] +# RPM NVR: kepnel[-<KERNEL_DIST>][-<LOCALVER>]-<KERNEL_MAJVER>-<KERNEL_RELVER> +# <NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN>-<VVVVVVVVVVVVV>-<RRRRRRRRRRRRR> +# +# Some NOTES about why we compose these string in above way: +# - Notice KERNEL_DIST is moved to N part of the RPM NVR, this is how TK3/TK4 release have been doing +# and that is correct because we need to distingush between kernel release streams. And there are +# things will break if we move it out of this part (mostly due to package name change). +# - RPM split the whole package name by '-', then recognize the right most part as R, second right +# most part is V, so KERNEL_MAJVER and KERNEL_RELVER can't contain '-'. +# - LOCALVER is commonly used to present variants of kernel, that is, using same kernel repo commit/version/tag, +# just built with a different config. +# A example is RPM pkg kernel-5.4.119-1 (uname 5.4.119-1) and kernel-debug-5.4.119-1 (uname 5.4.119-1+debug), +# the later one is same kernel built with more debug configs enabled. When kernel-5.4.119-1 run into unkown +# issues, kernel-debug-5.4.119-1 could be installed to do more diagnosis. +# - Notice LOCALVER is moved to "N" part of the RPM NVR, because adding to "V" or "R" part breaks kernel +# package versioning. A suffix, prefix or in-fix of "V" or "R" could cause the package or repo manager +# to make variants override each other, and fails the system unexpectly. For example, an debug kernel +# could be wrongly installed with a normal system wide package update, since the suffix made it had a +# high version number and it shares same Name with vanilla kernel. +# - Some old TK4 tag will have KERNEL_DIST as part of KERNEL_RELVER, we cover that too. +# +## More explanations of each field: +# +### PREFIX: <none>/release/x86/aarch64/oc/.... +# - Could be some well-known string like "release", "x86", ..., could be used to make tags more distinguishable. +# +### KERNEL_MAJVER: <VERSION>.<PATCHLEVEL>.<SUBLEVEL> +# - It's the standdard upstream linux kernel release version, presents in kernel's root Makefile, eg: +# VERSION = 5 +# PATCHLEVEL = 4 +# SUBLEVEL = 203 +# Which stands for kernel 5.4.203 +# +### KERNEL_RELVER: [0.<SNAPSHOT>.][<EXTRAVERSION>.]<REL> +# - If starts with 0, indicates it's a snapshot, unofficial release. Else it must be a tagged release. +# The <SNAPSHOT> string is automatically generated using git commit as versioning base for untagged +# test builds. +# - If EXTRAVERSION is non-empty, it must present here. +# - REL is a custom release string, should be alphanums be splitted by '.'. +# eg. 0011, 0009.12, 0011.prerelease1, ... +# eg. 2207.1.1, 2207.1.2, ... +# +# NOTE: due to historical reason, in KERNEL_RELVER, it could contain '-', but the final generated string that will be used in +# spec file and uname will always be converted to contain '.' only, to comply the RPM NVR naming style, also make things cleaner. +# +### KERNEL_DIST: <none>/tks/tlinux4/stable/stream/... +# Indicates this is a special build kernel, will show up in RPM package name to distinguish different kernel release stream. +# Is configurable through the KDIST variable in dist/Makefile. +# +# NOTE: Due to historical reason, if KDIST is added as first part of KERNEL_RELVER's <REL> string, it will be move to tail. +# To make the KERNEL_RELVER part consistent between RPM name, tag and uname. +# +# Example: +# git describe --tag RPM uname -r +# 5.4.119-1-tlinux4-0007 kernel-tlinux4-5.4.119-1.0007 5.4.119-1.0007.tlinux4 +# 5.4.119-1-tlinux4-0007-2-g884a77bf0ba6 kernel-tlinux4-5.4.119-0.20211115git1135ec008ef3.1.0007 5.4.119-0.20211115git1135ec008ef3.1.0007.tlinux4 +# 5.4.119-1-tlinux4-0007.subrelease kernel-tlinux4-5.4.119-1.0007.subrelease 5.4.119-1.0007.subrelease.tlinux4 +# 5.4.119-1-tlinux4-0007~rc1 kernel-tlinux4-5.4.119-1.0007~rc1 5.4.119-1.0007~rc1.tlinux4 (*) +# +# NOTE: Sometime TK4's release version may go backwards, it's a known issue we have to live with. +# TK4 used tag like 5.4.119-1-tlinux4-0007.prerelease to indicate a release candidate. +# You can check this with `rpmdev-vercmp`: +# $ rpmdev-vercmp 5.4.119-1-tlinux4-0007.prerelease 5.4.119-1-tlinux4-0007 +# $ 5.4.119-1-tlinux4-0007.prerelease > 5.4.119-1-tlinux4-0007 +# This means RPM thinks the release candidate is higher than the real release, to fix that, +# try use tilde symbol to indicate it's a RC. + +## Macros and values: +# Alias of four-part linux kernel version from kernel's Makefile +KVERSION= +KPATCHLEVEL= +KSUBLEVEL= +KEXTRAVERSION= + +# KPREMERGEWINDOW: If we are building a commit in the first merge window +# In the first merge time window, after a formal kernel release, and before rc1 release of next kernel, +# the KPATCHLEVEL will be stuck in lower value, which confuses RPM in many ways. So just bump +# KSUBLEVEL upon build in such case. +# +# For example, after 5.15 release, and before 5.16, upstream will start merging features for 5.16 +# without bumping KPATCHLEVEL, which is stuck in 15. +# As now our build will be newer than 5.15 build, we have to make the version higher than 5.15 +# To avoid conflict with 5.15 stable build like 5.15.Y-Z, we can't bump the Y part or Z part. +# So instead bump to 5.16 and mark it rc0 as 5.16.0-0.rc0. (Just as what Fedora does). +KPREMERGEWINDOW= +# Set to true if this is a rolling build tracks upstream +KROLLING= +# Set to 1 to allow git tag force override uname +KFORCEUNAMER= + +# git snapshot versioning +KGIT_SNAPSHOT= +# Raw info from current git tag +KGIT_TAG_RELEASE_INFO_RAW= +# Set if current commit is tagged with valid release info +KGIT_TAG_RELEASE_INFO= +# Set if a previous commit is found tagged with valid release info +KGIT_LATEST_TAG_RELEASE_INFO= +# Set if current commit is tagged with a valid test tag name +KGIT_TESTBUILD_TAG= +# Release: Start from 1.0, indicate the release version, info embedded in git tag +KGIT_RELEASE_NUM= +KGIT_SUB_RELEASE_NUM= + +### The formal kernel version and release +# Simulate base part of uname output, which is always "$KVERSION.$KPATCHLEVEL.$KSUBLEVEL$KEXTRAVERSION" +# The full `uname -r` will also include <dist>.<arch>[+<flavor>] +export KERNEL_UNAMER_BASE= +# Force set a value for `uname -r`, see KFORCEUNAMER. +export KERNEL_UNAMER_FORCE= +# Basically: $KVERSION.$KPATCHLEVEL.$KSUBLEVEL (eg. 5.17.0, 5.16.3) +export KERNEL_MAJVER= +# Release version (eg. 1, 0.rc0, 0.20220329gita11bf64a6e8f), see comments at the beginning of this file +export KERNEL_RELVER= +# Kernel dist repo variable (eg. tks, tlinux4, <none>), with any leading "." or "-" removed, see comments at the beginning of this file +export KERNEL_DIST= +# Only used for make-release sub command, get latest release tag of current commit +export KERNEL_PREV_RELREASE_TAG= + +# Set if it's a tagged release +export KTAGRELEASE= +# KTESTRELEASE: If we are building based on a test tag +KTESTRELEASE= +# KSNAPRELEASE: If we are building a snapshot-release +KSNAPRELEASE= +# KRCRELEASE: If we are building a rc-release +KRCRELEASE= + +_is_num() { + [ "$1" -eq "$1" ] &>/dev/null +} + +# Get the tag of a git ref, if the git ref itself is a valid tag, just return itself +# else, search latest tag before this git ref. +_get_git_tag_of() { + local gitref=$1; shift + local tag tags + + tags=$(git "$@" tag --points-at "$gitref") + # If multiple tags presents, used the one specified by user + for tag in $tags; do + if [[ "$tag" == "$gitref" ]]; then + echo "$tag" + return + fi + done + + # If HEAD is tagged with multiple tags and user is not asking to use one of them, + # use the first one found matching release info. + for tag in $tags; do + if _get_rel_info_from_tag "$tag" > /dev/null; then + echo "$tag" + return + fi + done + + # Else just return the first tag + for tag in $tags; do + echo "$tag" + return + done +} + +# git-describe, but customized for kernel, and prefer specified tag +_get_git_describe_of() { + local gitref=$1; shift + local gitdesc + + gitdesc=$(_get_git_tag_of "$gitref" "$@") + + if [[ -n "$gitdesc" ]]; then + echo "$gitdesc" + else + git "$@" describe --always --tags --abbrev=12 "$gitref" + fi +} + +# Get the tag of a git ref, if the git ref itself is a valid tag, just return itself +# else, search latest tag before this git ref. +# Return 1 if git ref is tagged, +_get_last_git_tag_of() { + local gitref=$1; shift + local gittag + + gittag=$(_get_git_tag_of "$gitref" "$@") + + if [[ -z "$gittag" ]]; then + git "$@" describe --always --tags --abbrev=0 "$gitref" + return 0 + else + echo "$gittag" + return 1 + fi +} + +# $1: git tag or git commit, defaults to HEAD +# $2: kernel source tree, should be a git repo +# Parse fondunmental kernel versioning info from Makefiles. +get_kernel_code_version() { + local gitref=${1:-HEAD} + local repo=${2:-$TOPDIR} + local makefile + + makefile=$(git -C "$repo" show "$gitref:Makefile" 2>/dev/null || cat "$repo/Makefile") + + if [ ! "$makefile" ]; then + die "Error: Failed to read Makefile" + return 1 + fi + + KVERSION=$(get_makefile_var VERSION <<< "$makefile") + KPATCHLEVEL=$(get_makefile_var PATCHLEVEL <<< "$makefile") + KSUBLEVEL=$(get_makefile_var SUBLEVEL <<< "$makefile") + KEXTRAVERSION=$(get_makefile_var EXTRAVERSION <<< "$makefile") + # Replace '-' in KEXTRAVERSION + KEXTRAVERSION=${KEXTRAVERSION//-/.} + KEXTRAVERSION=${KEXTRAVERSION#.} + + if [[ -z "$KVERSION" ]] || [[ -z "$KPATCHLEVEL" ]] || [[ -z "$KSUBLEVEL" ]]; then + error "Invalid VERSION, PATCHLEVEL or SUBLEVEL in Makefile:" + error "$KVERSION.$KPATCHLEVEL.$KSUBLEVEL:" + exit 1 + fi + + if [[ "$KEXTRAVERSION" == "rc"* ]] || [[ $KEXTRAVERSION == "-rc"* ]]; then + KRCRELEASE=1 + fi + + # Read KDIST using gitref for historical accurate value. + KERNEL_DIST=$(get_dist_makefile_var KDIST "$gitref" "$repo") + + return 0 +} + +_first_merge_window_detection() { + local gitref=${1:-HEAD} + local repo=${2:-$TOPDIR} + local upstream_base upstream_lasttag upstream_gitdesc + local tagged + + # If KSUBLEVEL or KEXTRAVERSION is set, it's not in the first merge window of a major release + [[ $KSUBLEVEL -eq 0 ]] || return 1 + [[ -n $KEXTRAVERSION ]] && return 1 + [[ $upstream ]] || upstream="@{u}" + + # Get latest merge base if forked from upstream to merge window detection + # merge window is an upstream-only thing + if upstream_base=$(git -C "$repo" merge-base "$gitref" "$upstream" 2>/dev/null); then + upstream_gitdesc=$(git -C "$repo" describe --tags --abbrev=12 "$upstream_base" 2>/dev/null) + upstream_lasttag=$(_get_last_git_tag_of "$upstream_base" -C "$repo") + tagged=$? + + if \ + # If last tag is an tagged upstream release + [[ $upstream_lasttag == v$KVERSION.$KPATCHLEVEL ]] && \ + # And if merge base is ahead of the taggewd release + [[ "$tagged" -eq 1 ]]; then + # Then it's in first merge window + return 0 + fi + else + warn "Not tracking a valid upstream, merge window detecting is disabled ." + fi + + return 1 +} + +_do_strip_kernel_majver() { + local rel + + if [[ $1 == *"$KVERSION.$KPATCHLEVEL.$KSUBLEVEL"* ]]; then + rel=${1#*"$KVERSION.$KPATCHLEVEL.$KSUBLEVEL"} + elif [[ "$KSUBLEVEL" = "0" ]] && [[ $1 == *"$KVERSION.$KPATCHLEVEL"* ]]; then + rel=${1#*"$KVERSION.$KPATCHLEVEL"} + elif [[ $KPREMERGEWINDOW ]] && [[ $1 == *"$KVERSION.$((KPATCHLEVEL + 1)).$KSUBLEVEL"* ]]; then + rel=${1#*"$KVERSION.$((KPATCHLEVEL + 1)).$KSUBLEVEL"} + else + return 1 + fi + + echo "$rel" +} + +# Check and strip the leading VERSION.PATCHLEVEL.SUBLEVEL of a tag, +# (eg. 5.18.19) and potential prefixes. If the tag doesn't match its corresponding, +# kernel version, return 1. +_check_strip_kernel_majver() { + local tag=$1 rel + local makefile + local _kversion _kpatchlevel _ksublevel + + if rel=$(_do_strip_kernel_majver "$tag"); then + echo "$rel" + return 0 + fi + + # Update VERSION/PATCHLEVEL/SUBLEVEL using target Makefile, because y upstream + # changes them very frequently and may out of sync with previous tag. + if makefile=$(git show "$tag:Makefile" 2>/dev/null); then + _kversion=$(get_makefile_var VERSION <<< "$makefile") + _kpatchlevel=$(get_makefile_var PATCHLEVEL <<< "$makefile") + _ksublevel=$(get_makefile_var SUBLEVEL <<< "$makefile") + fi + + if rel=$(KVERSION=$_kversion KPATCHLEVEL=$_kpatchlevel KSUBLEVEL=$_ksublevel _do_strip_kernel_majver "$tag"); then + echo "$rel" + return 0 + fi + + return 1 +} + +# Get release info from git tag +_get_rel_info_from_tag() { + local tag=$1 rel + + if ! rel=$(_check_strip_kernel_majver "$@"); then + return 1 + fi + rel=${rel//-/.} + rel=${rel#.} + + # If KERNEL_DIST is added as prefix/semi-prefix/suffix, remove it from rel + if [[ $KERNEL_DIST ]]; then + case $rel in + $KERNEL_DIST.*) + rel=${rel#$KERNEL_DIST.} + ;; + $KEXTRAVERSION.$KERNEL_DIST.*) + rel=${rel#$KEXTRAVERSION.$KERNEL_DIST.} + rel=$KEXTRAVERSION.$rel + ;; + *.$KERNEL_DIST) + rel=${rel%.$KERNEL_DIST} + ;; + esac + fi + + # If KEXTRAVERSION is added, remove it + if [[ -z "$KEXTRAVERSION" ]]; then + # If previous KEXTRAVERSION is not empty but now empty, + # still consider it a valid release tag since release candidate mark may get dropped. + # But this really should look at the Makefile corresponding to that tag commit + : + elif _is_num "$KEXTRAVERSION"; then + case $rel in + # Extra version is release number, remove it and add later + $KEXTRAVERSION | "$KEXTRAVERSION."* ) + rel=${rel#$KEXTRAVERSION} + rel=${rel#.} + ;; + * ) return 1; ;; + esac + else + # Remove RC liked tag, append them as suffix later. + case $rel in + # Plain version tag, eg. 5.17-rc3 + $KEXTRAVERSION ) + rel="" + ;; + # Plain version tag plus suffix, eg. 5.17-rc3.* + "$KEXTRAVERSION."* ) + rel=${rel#$KEXTRAVERSION.} + ;; + # Already appended as , eg 5.17-1.rc3* + *".$KEXTRAVERSION" ) + rel=${rel%.$KEXTRAVERSION} + ;; + * ) return 1; ;; + esac + fi + + echo "$rel" +} + +_search_for_release_tag() { + local gitref=$1; shift + local tag + + # Look back for 10 commits for a valid tag + local limit=10 + while [[ $limit -gt 0 ]]; do + # Check if any tag is eligible as a release tag + for tag in $(git "$@" tag --points-at "$gitref"); do + if _get_rel_info_from_tag "$tag" > /dev/null; then + echo "$tag" + return 0 + fi + done + + # Find a previous tagged commit + gitref=$(git "$@" describe --first-parent --tags --abbrev=0 "$gitref^" 2>/dev/null) || break + limit=$((limit - 1)) + done + + warn "No valid tag found that are eligible for versioning, please fix your repo and tag it properly." + return 1 +} + +# Get release info from git tag +# +# We try to parse and verify RPM NVR (Name, Version, Release) info's 'VR' part using git tag or commit info +# N: is always kernel +# V: is kernel's major release version (eg. 5.18, 5.18.0, 5.17.2) +# R: is a tokens seperated with '.' (eg 1[.KDIST], 2[.KDIST], 2.1[.KDIST], 0.rc1[.KDIST]) +# could also be 0.YYYYMMDDgit<commit> for snapshot release. +# But ideally all git tag are for formal release so snapshot tag shouldn't appear in repo. +# +# With a tag that contains valid VR info it's considered a tag release, else it's a snapshot release. +# +# $1: git tag or git commit, defaults to HEAD +# $2: kernel source tree, should be a git repo +# $3: optional upstream branch, remote branch name current HEAD is tracking +get_kernel_git_version() +{ + local gitref=${1:-HEAD} + local repo=${2:-$TOPDIR} + local upstream=${3:-"@{u}"} + + local last_tag release_tag release_info git_desc + local tag tagged + + # Get current commit's snapshot name, format: YYYYMMDDgit<commit>, + # or YYYYMMDD (Only if repo is missing, eg. running this script with tarball) + if ! KGIT_SNAPSHOT=$(git rev-parse --short=12 "$gitref" 2>/dev/null); then + warn "Invalid git reference '$gitref' or git repo is unavailable, versioning it as a dated snapshot" + KGIT_SNAPSHOT=$(date +"%Y%m%d") + KSNAPRELEASE=1 + return + fi + KGIT_SNAPSHOT=$(date +"%Y%m%d")git$KGIT_SNAPSHOT + + # Check if first merge-window, and set KPREMERGEWINDOW, see comment above about KPREMERGEWINDOW + if [[ $KROLLING ]] && _first_merge_window_detection "$@"; then + KPREMERGEWINDOW=1 + fi + + # Get latest git tag of this commit + last_tag=$(_get_last_git_tag_of "$gitref" -C "$repo") + tagged=$? + # Check and get latest release git tag, in case current tag is a test tag + # (eg. current tag is fix_xxxx, rebase_test_xxxx, or user tagged for fun, and previous release tag is 5.18.0-1[.KDIST]) + if _get_rel_info_from_tag "$last_tag" > /dev/null; then + # Latest tag is a release tag, just use it + release_tag=$last_tag + else + warn "Latest git tag '$last_tag' is not a release tag, it does't match Makefile version '$KVERSION.$KPATCHLEVEL.$KSUBLEVEL-$KEXTRAVERSION'" + if release_tag=$(_search_for_release_tag HEAD -C "$repo"); then + warn "Found release tag '$release_tag'." + fi + fi + + if [[ "$release_tag" ]]; then + git_desc=$(_get_git_describe_of "$gitref" -C "$repo") + release_info=$(_get_rel_info_from_tag "$release_tag") + release_info_raw=$(_check_strip_kernel_majver "$release_tag") + + if ! [[ $release_info ]]; then + warn "No extra release info in release tag, might be a upstream tag." \ + "Please make a release commit with 'make dist-release' for a formal release." + release_info=0 + KGIT_RELEASE_NUM=0 + KGIT_SUB_RELEASE_NUM=0 + elif [[ $release_info == 0.* ]]; then + KGIT_RELEASE_NUM=${release_info##*.} + KGIT_SUB_RELEASE_NUM=${release_info%$KGIT_RELEASE_NUM} + KGIT_SUB_RELEASE_NUM=${KGIT_SUB_RELEASE_NUM%.} + KGIT_SUB_RELEASE_NUM=${KGIT_SUB_RELEASE_NUM##*.} + else + KGIT_RELEASE_NUM=${release_info%%.*} + KGIT_SUB_RELEASE_NUM=${release_info#$KGIT_RELEASE_NUM} + KGIT_SUB_RELEASE_NUM=${KGIT_SUB_RELEASE_NUM#.} + KGIT_SUB_RELEASE_NUM=${KGIT_SUB_RELEASE_NUM%%.*} + fi + + KERNEL_PREV_RELREASE_TAG=$release_tag + KGIT_LATEST_TAG_RELEASE_INFO=$release_info + + if [[ "$tagged" -eq 1 ]] && [[ "$release_tag" == "$last_tag" ]]; then + if [[ $release_info ]]; then + # This commit is tagged and it's a valid release tag, juse use it + if [[ "$KGIT_RELEASE_NUM" != '0' ]]; then + KGIT_TAG_RELEASE_INFO=$release_info + KGIT_TAG_RELEASE_INFO_RAW=$release_info_raw + KTAGRELEASE=$release_tag + else + warn "'$release_tag' is not a formal release tag, using snapshot versioning." + KGIT_SNAPSHOT=1 + fi + else + # Tagged but no release info from current tag, could be upstream style tag + KGIT_TAG_RELEASE_INFO=1 + # It's not a valid tag + KTAGRELEASE= + fi + + # If current tag is release tag, previous release tag should be another one + KERNEL_PREV_RELREASE_TAG=$(_search_for_release_tag ${release_tag}^ -C "$repo") + + elif [[ "$last_tag" == "$git_desc" ]]; then + # It's tagged, but the tag is not a release tag + # A dumb assumption here, if it's not in *.* format (v5.4, 4.12.0, etc...) it's a test tag + if [[ $last_tag != v*.* ]] && [[ $last_tag != *.*.* ]]; then + warn "'$last_tag' looks like a test tag, using it as versioning suffix." + warn "Please tag properly for release build, now versioning it as a test build." + KGIT_TESTBUILD_TAG=test.$last_tag + KGIT_TESTBUILD_TAG=${KGIT_TESTBUILD_TAG//-/_} + KTESTRELEASE=1 + else + warn "'$last_tag' looks like a kernel release tag but out-of-sync with Makefile" \ + "ignoring it and versioning as snapshot." + warn "Please tag properly for release build." + KSNAPRELEASE=1 + fi + else + # Just a simple untagged commit, nothing special + KSNAPRELEASE=1 + fi + else + # No tag or no repo info available, use snapshot version + KSNAPRELEASE=1 + KGIT_RELEASE_NUM=0 + KGIT_SUB_RELEASE_NUM=0 + fi + + # Fix release numbers, if it's not a number + if ! _is_num "$KGIT_RELEASE_NUM"; then + warn "Unrecognizable release number: $KGIT_RELEASE_NUM, resetting to 0" + KGIT_RELEASE_NUM=0 + fi + if ! _is_num "$KGIT_SUB_RELEASE_NUM"; then + KGIT_SUB_RELEASE_NUM=0 + fi +} + +_prepare_kernel_ver() { + if ! get_kernel_code_version "$@"; then + return 1 + fi + + if ! get_kernel_git_version "$@"; then + return 1 + fi + + # Disable PRE-merge window detection for tagged commit, + # We want to following user provided tag strictly + if [[ $KPREMERGEWINDOW ]]; then + if [[ ! $KTAGRELEASE ]]; then + KPATCHLEVEL=$(( KPATCHLEVEL + 1 )) + KEXTRAVERSION="rc0" + fi + fi +} + +### Generate a RPM friendly version based on kernel tag and commit info +# +# Examples: +# (Ignoring pre-release window detection, see comments about KPREMERGEWINDOW) +# (Also assume Makefile's kernel version info is all correct) +# +# git describe --tags Generated version (uname -r) Corresponding RPM version +# v5.18 5.18.0-0[.KDIST] kernel[-kdist]-5.18.0-0.rc1 +# v5.18.0 5.18.0-0[.KDIST] kernel[-kdist]-5.18.0-0.rc1 +# v5.18.1 5.18.1-0[.KDIST] kernel[-kdist]-5.18.1-0.rc1 +# v5.18.0-1-gac28df2 5.18.0-0.20220428gitac28df2cd5d0[.KDIST] kernel[-kdist]-5.18.0-0.20220428gitac28df2cd5d0 * +# v5.18.0-3-g16cadc5 5.18.0-0.20220428git16cadc58d50c[.KDIST] kernel[-kdist]-5.18.0-0.20220428git16cadc58d50c * +# v5.18-rc1 5.18.0-0.rc1[.KDIST] kernel[-kdist]-5.18.0-0.rc1 +# v5.18-rc1-1-g380a504 5.18.0-0.20220428git380a504e42d9.rc1[.KDIST] kernel[-kdist]-5.18.0-0.20220428git380a504e42d9.rc1 +# 5.18.0-1[.KDIST] 5.18.0-1[.KDIST] kernel[-kdist]-5.18.0-1 +# 5.18.12-3[.KDIST] 5.18.12-3[.KDIST] kernel[-kdist]-5.18.12-3 +# 5.18.12-3[.KDIST]-5-g9318b03 5.18.12-0.20220428git9318b0349d5c.3[.KDIST] kernel[-kdist]-5.18.12-0.20220428git9318b0349d5c.3 +# 5.18.0-12.rc1[.KDIST] 5.18.0-12.rc1[.KDIST] kernel[-kdist]-5.18.0-12.rc1 +# 5.18.0-12[.KDIST]-2-g551f9cd 5.18.0-0.20220428git551f9cd79ece.12[.KDIST] kernel[-kdist]-5.18.0-0.20220428git551f9cd79ece.12 +# x86-5.4.119-19-0010.prerelease 5.4.119-19-0010.prerelease kernel[-kdist]-5.4.119-19-0010.prerelease ** +# +# * NOTE: random commit snapshot can't be versioning in non-decreasing since one can always amend/rebase, so only the date stamp matters now. +# +# As you may have noticed, release always start with '0' unless a git tag have release >= 1, +# The tag should be generated by other commands that comes later in this script. +prepare_kernel_ver() { + local gitref=$1 localversion=$2 + local krelease + + case $localversion in + +* | '' ) localversion=${localversion#+} ;; + *) die "Unexpected LOCALVERSION '$localversion', run dist-check-configs for more info." + esac + + _prepare_kernel_ver "$gitref" + if [[ $KSNAPRELEASE ]]; then + # For snpashot version, it should start with 0. and + # KEXTRAVERSION will be appended at the tail of git info. + krelease=0.$KGIT_SNAPSHOT + [[ ${KEXTRAVERSION:-0} != "0" ]] && krelease=$krelease.$KEXTRAVERSION + # Release numbers will be appended too if available as a version hint for users. + [[ ${KGIT_RELEASE_NUM:-0} != "0" ]] && krelease=$krelease.$KGIT_RELEASE_NUM + [[ ${KGIT_SUB_RELEASE_NUM:-0} != "0" ]] && krelease=$krelease.$KGIT_SUB_RELEASE_NUM + elif [[ $KTESTRELEASE ]]; then + # For test tag, use the most recent release tag we can find and + # append the test suffix. + krelease=0 + [[ ${KEXTRAVERSION:-0} != "0" ]] && krelease=$krelease.$KEXTRAVERSION + [[ $KGIT_LATEST_TAG_RELEASE_INFO ]] && krelease=$krelease.$KGIT_LATEST_TAG_RELEASE_INFO.$KGIT_TESTBUILD_TAG + else + if [[ $KTAGRELEASE ]]; then + # If the git tag matches all release info, respect it. + krelease=$KGIT_TAG_RELEASE_INFO + else + # Upstream or unknown, set release to start with "0." + # so it can be updated easily later. + # And if it's a rc release, use "0.0" to ensure it have + # lower priority. + if [[ "$KRCRELEASE" ]]; then + krelease=0.0 + else + krelease=0.1 + fi + fi + + # If KEXTRAVERSION is not number it will break the release syntax + # if added as prefix, add as suffix in such case + if [[ $KEXTRAVERSION ]]; then + if _is_num "${KEXTRAVERSION%%.*}"; then + krelease="$KEXTRAVERSION.$krelease" + else + krelease="$krelease.$KEXTRAVERSION" + fi + fi + fi + + case $krelease in + *.* ) + ;; + *) + krelease=0.$krelease + ;; + esac + + KERNEL_NAME="kernel${KDIST:+-$KDIST}" + if [[ $localversion ]]; then + KERNEL_NAME="$KERNEL_NAME-$localversion" + fi + + KERNEL_MAJVER="$KVERSION.$KPATCHLEVEL.$KSUBLEVEL" + KERNEL_RELVER="$krelease" + KERNEL_UNAMER_BASE="$KERNEL_MAJVER-$KERNEL_RELVER${KDIST:+.$KDIST}" + + if [[ $KFORCEUNAMER ]] && [[ $KGIT_TAG_RELEASE_INFO_RAW ]]; then + KERNEL_UNAMER_FORCE="$KERNEL_MAJVER$KGIT_TAG_RELEASE_INFO_RAW" + + if [[ $localversion ]]; then + KERNEL_UNAMER_FORCE="$KERNEL_UNAMER_FORCE+$localversion" + fi + fi +} + +### Generate formal release version based on kernel tag and commit info +# +# Examples: +# (Ignoring pre-release window detection, see comments about KPREMERGEWINDOW) +# (Also assume Makefile's kernel version info is all correct) +# +# git describe --tags Generated Version (uname -r) Corresponding RPM version +# v5.18 5.18.0-1[.KDIST] kernel[-kdist]-5.18.0-1 +# v5.18.0 5.18.0-1[.KDIST] kernel[-kdist]-5.18.0-1 +# v5.18.1 5.18.1-1[.KDIST] kernel[-kdist]-5.18.1-1 +# v5.18.0-1-gac28df2 5.18.0-1[.KDIST] kernel[-kdist]-5.18.0-1 +# v5.18.0-3-g16cadc5 5.18.0-1[.KDIST] kernel[-kdist]-5.18.0-1 +# v5.18-rc1 5.18.0-1.rc1[.KDIST] kernel[-kdist]-5.18.0-1.rc1 +# v5.18-rc1-1-g380a504 5.18.0-1.rc1[.KDIST] kernel[-kdist]-5.18.0-1.rc1 +# 5.18.0-1[.KDIST] 5.18.0-2[.KDIST] kernel[-kdist]-5.18.0-2 +# 5.18.12-3[.KDIST] 5.18.12-4[.KDIST] kernel[-kdist]-5.18.12-4 +# 5.18.12-3[.KDIST]-5-g9318b03 5.18.12-4[.KDIST] kernel[-kdist]-5.18.12-4 +# 5.18.0-12.rc1[.KDIST] 5.18.0-12.rc1[.KDIST] kernel[-kdist]-5.18.0-13.rc1 +# 5.18.0-12[.KDIST]-2-g551f9cd 5.18.0-0.20220428git551f9cd79ece.12[.KDIST] kernel[-kdist]-5.18.0-13 +# x86-5.4.119-19-0010.prerelease 5.4.119-20[.KDIST] kernel[-kdist]-5.4.119-20[.KDIST] +# +# * NOTE: random commit snapshot can't be versioning in non-decreasing since one can always amend/rebase, so only the date stamp matters now. +# ** NOTE: Yes, this script is compatible with TK4 +# +# As you may have noticed, release always start with '0' unless a git tag have release >= 1, +# The tag should be generated by other commands that comes later in this script. +prepare_next_kernel_ver() { + _prepare_kernel_ver "$@" + + if [[ $KPREMERGEWINDOW ]]; then + warn "Upstream is in merge window, forcing a formal release is not recommanded." + fi + + # TK4 left-pads the release number with 0 + KGIT_RELEASE_NUM=$(echo "$KGIT_RELEASE_NUM" | sed 's/^0*//') + krelease=$((KGIT_RELEASE_NUM + 1)) + + if [[ $KEXTRAVERSION ]]; then + if _is_num "${KEXTRAVERSION%%.*}"; then + krelease="$KEXTRAVERSION.$krelease" + else + krelease="$krelease.$KEXTRAVERSION" + fi + fi + + KERNEL_MAJVER="$KVERSION.$KPATCHLEVEL.$KSUBLEVEL" + KERNEL_RELVER="$krelease" + KERNEL_UNAMER="$KERNEL_MAJVER-$KERNEL_RELVER${KDIST:+.$KDIST}" +} + +# Get next formal kernel version based on previous git tag +# Same as prepare_next_kernel_ver, but increase sub version instead. +# eg. instead of 5.18.12-3[.KDIST] -> 5.18.12-4[.KDIST], this generates 5.18.12-3[.KDIST] -> 5.18.12-3.1[.KDIST] +prepare_next_sub_kernel_ver() { + _prepare_kernel_ver "$@" + + if [[ $KPREMERGEWINDOW ]]; then + warn "Upstream is in merge window, forcing a formal release is not recommanded." + fi + + KGIT_RELEASE_NUM=$(echo "$KGIT_RELEASE_NUM" | sed 's/^0*//') + krelease=$KGIT_RELEASE_NUM + krelease=$krelease.$((KGIT_SUB_RELEASE_NUM + 1)) + + if [[ $KEXTRAVERSION ]]; then + if _is_num "${KEXTRAVERSION%%.*}"; then + krelease="$KEXTRAVERSION.$krelease" + else + krelease="$krelease.$KEXTRAVERSION" + fi + fi + + KERNEL_MAJVER="$KVERSION.$KPATCHLEVEL.$KSUBLEVEL" + KERNEL_RELVER="$krelease" + KERNEL_UNAMER="$KERNEL_MAJVER-$KERNEL_RELVER${KDIST:+.$KDIST}" +} diff --git a/dist/scripts/lib.sh b/dist/scripts/lib.sh new file mode 100755 index 000000000000..7261eeb4a4f5 --- /dev/null +++ b/dist/scripts/lib.sh @@ -0,0 +1,198 @@ +#!/bin/bash +# +# Shell helpers +# + +RED="\033[0;31m" +GREEN="\033[0;32m" +YELLOW="\033[1;33m" +NC="\033[0m" + +echo_green() { + echo -en "$GREEN" + echo "$@" + echo -en "$NC" +} + +echo_yellow() { + echo -en "$YELLOW" + echo "$@" + echo -en "$NC" +} + +echo_red() { + echo -en "$RED" + echo "$@" + echo -en "$NC" +} + +info() { + echo_green -n "info: " >&2 + echo "$@" >&2 +} + +warn() { + echo_yellow -n "warn: " >&2 + echo "$@" >&2 +} + +error() { + echo_red -n "error: " >&2 + echo "$@" >&2 +} + +die() { + echo_red -n "fatal: " >&2 + echo "$@" >&2 + exit 1 +} + +# $1: relative dir path +# $2: optional git ref, if not set current worktree is used +# $3: optional git repo +ls_repo_dir() { + local _path=$1 + local _gitref=$2 + local _repo=${3:-$TOPDIR} + local _gitshow + + # If git reference is set and git repo is valid, try use the versioned Makefile + if [[ "$_gitref" ]]; then + if _gitshow=$(git -C "$_repo" show "$_gitref:$_path" 2>/dev/null); then + echo "$_gitshow" | tail -n +3 + return 0 + fi + warn "Failed to ls '$_path' from git reference '$_gitref', using current worktree as build source." + fi + + ls -1ap "$_repo/$_path/" +} + +# $1: relative file path +# $2: optional git ref, if not set current worktree is used +# $3: optional git repo +cat_repo_file() { + local _path=$1 + local _gitref=$2 + local _repo=${3:-$TOPDIR} + + # If git reference is set and git repo is valid, try use the versioned Makefile + if [[ "$_gitref" ]]; then + if git -C "$_repo" show "$_gitref:$_path" 2>/dev/null; then + return 0 + fi + warn "Failed to retrive '$_path' from git reference '$_gitref', using current worktree as build source." + fi + + cat "$_repo"/"$1" +} + +# $1: keyword +# $2: optional git ref, if not set current Makefile is used +# $3: optional git repo +get_makefile_var() { + local _val + local _sedexp="/^${1}[[:space:]]*[:?]?=[[:space:]]*(.*)/{s/^${1}[[:space:]]*[:?]?=[[:space:]]*//;h;};\${x;p;}" + + _val=$(sed -nE -e "$_sedexp") + case $_val in + *\$* ) + die "Can't parse Makefile variable '$1', it references to other variables." + ;; + esac + + echo "$_val" +} + +# $1: keyword +# $2: optional git ref, if not set current Makefile is used +# $3: optional git repo +get_dist_makefile_var() { + local _var=$1 + local _gitref=$2 + + cat_repo_file "dist/Makefile" "$_gitref" | get_makefile_var "$1" +} + +[ "$TOPDIR" ] || TOPDIR=$(git rev-parse --show-toplevel 2>/dev/null) +[ "$TOPDIR" ] || TOPDIR="$(realpath "$(dirname "$(realpath "$0")")/../..")" +[ "$DISTPATH" ] || DISTPATH=$(get_dist_makefile_var DISTPATH) + +[ -s "$DISTPATH/.distenv" ] && source "$DISTPATH/.distenv" +[ "$DISTDIR" ] || DISTDIR=$TOPDIR/$DISTPATH +[ "$SOURCEDIR" ] || SOURCEDIR=$DISTDIR/rpm/SOURCES +[ "$SPEC_ARCH" ] || SPEC_ARCH=$(get_dist_makefile_var SPEC_ARCH) + +# Meta values, if not set read from dist Makefile. (If set to empty, respect the empty value) +[ "${KDIST--}" == - ] && KDIST=$(get_dist_makefile_var KDIST) +[ "${VENDOR--}" == - ] && VENDOR=$(get_dist_makefile_var VENDOR) +[ "${URL--}" == - ] && URL=$(get_dist_makefile_var URL) +if [ "$(echo "$VENDOR_CAPITALIZED" | tr '[:upper:]' '[:lower:]')" != "$(echo "$VENDOR" | tr '[:upper:]' '[:lower:]')" ]; then + VENDOR_CAPITALIZED=$(echo "$VENDOR" | sed 's/./\U&/') + info "Overriding VENDOR_CAPITALIZED to '$VENDOR_CAPITALIZED'" +fi + +if ! [ -s "$TOPDIR/Makefile" ]; then + echo "Dist tools can only be run within a valid Linux Kernel git workspace." >&2 + exit 1 +fi + +if [ -z "$VENDOR" ] || ! [ -s "$DISTDIR/Makefile" ]; then + echo "Dist tools can't work without properly configured dist file." >&2 + exit 1 +fi + +# Just use uname to get native arch +get_native_arch () { + uname -m +} + +# Convert any arch name into linux kernel arch name +# +# There is an inconsistence between Linux kernel's arch naming and +# RPM arch naming. eg. Linux kernel uses arm64 instead of aarch64 +# used by RPM, i686 vs x86, amd64 vs x86_64. Most are just same things +# with different name due to historical reasons. +get_kernel_arch () { + case $1 in + riscv64 ) + echo "riscv" + ;; + loongarch64 ) + echo "loongarch" + ;; + arm64 | aarch64 ) + echo "arm64" + ;; + i386 | i686 | x86 ) + echo "x86" + ;; + amd64 | x86_64 ) + echo "x86_64" + ;; + esac +} + +# Convert any arch name into linux kernel src arch name +# +# Similiar to get_kernel_arch but return the corresponding +# source code base sub path in arch/ +get_kernel_src_arch () { + case $1 in + loongarch64 ) + echo "loongarch" + ;; + riscv64 ) + echo "riscv" + ;; + arm64 | aarch64 ) + echo "arm64" + ;; + i386 | i686 | x86 | amd64 | x86_64 ) + echo "x86" + ;; + esac +} + +type git >/dev/null || die 'git is required' +type make >/dev/null || die 'make is required' diff --git a/dist/scripts/ls-config-files.sh b/dist/scripts/ls-config-files.sh new file mode 100755 index 000000000000..09d76ffee44e --- /dev/null +++ b/dist/scripts/ls-config-files.sh @@ -0,0 +1,17 @@ +#!/bin/bash --norc +# +# List files to be generated for kernel config styles +# +# Params: +# $@: [ <filter>... ] When non-empty, only show kernel configs style matching <filter> + +# shellcheck source=./lib-config.sh +. "$(dirname "$(realpath "$0")")/lib-config.sh" + +_echo_file() { + for arch in "${CONFIG_ARCH[@]}"; do + echo "$CONFIG_OUTDIR/$1.$arch.config" + done +} + +for_each_config_target _echo_file "$@" diff --git a/dist/scripts/ls-config-targets.sh b/dist/scripts/ls-config-targets.sh new file mode 100755 index 000000000000..00d35c18f217 --- /dev/null +++ b/dist/scripts/ls-config-targets.sh @@ -0,0 +1,15 @@ +#!/bin/bash --norc +# +# List available kernel config styles +# +# Params: +# $@: [ <filter>... ] When non-empty, only show kernel configs style matching <filter> + +# shellcheck source=./lib-config.sh +. "$(dirname "$(realpath "$0")")/lib-config.sh" + +_echo() { + echo "$1" 2>/dev/null || exit 0 +} + +for_each_config_target _echo "$@" diff --git a/dist/scripts/make-release.sh b/dist/scripts/make-release.sh new file mode 100755 index 000000000000..73fb92bd9de4 --- /dev/null +++ b/dist/scripts/make-release.sh @@ -0,0 +1,131 @@ +#!/bin/bash --norc +# +# Print out the tkernel version based on git commit and work tree. +# +# shellcheck source=./lib-version.sh +. "$(dirname "$(realpath "$0")")/lib-version.sh" + +COMMIT=HEAD +case $1 in + --sub-release ) + prepare_next_sub_kernel_ver "$COMMIT" "$TOPDIR" || die "Failed preparing next sub release version info" + ;; + --maj-release) + prepare_next_kernel_ver "$COMMIT" "$TOPDIR" || die "Failed preparing next release version info" + ;; + *) + die "Invalid param $1, usage $0 {--maj-release|--sub-release}" + ;; +esac +AUTHOR_NAME=$(git config user.name) || die "Failed getting author name info from git config" +AUTHOR_MAIL=$(git config user.email) || die "Failed getting author email info from git config" +GITLOG=$(git -C "$TOPDIR" log "$KERNEL_PREV_RELREASE_TAG..$COMMIT" --pretty=oneline) || die "Failed getting changelog from git log" + +if [[ "$KTAGRELEASE" ]]; then + warn "You are generating changelog from a tagged release commit, however changelog update" + warn "should be done before tagging a release, please be careful with what you are doing or fix your workflow." + prepare_kernel_ver "$COMMIT" +fi + +if [[ -z "$GITLOG" ]]; then + error "No change found since last tag, using dummy changelog." + GITLOG="- Accumulated bug fix and improvements." +fi + +AUTHOR="$AUTHOR_NAME <$AUTHOR_MAIL>" +RELEASE_VERSION="$KERNEL_MAJVER-$KERNEL_RELVER" +TAG_VERSION="$KERNEL_UNAMER_BASE" +CHANGELOG_HDR="* $(date +"%a %b %e %Y") $AUTHOR - $RELEASE_VERSION" +CHANGELOG="$(echo "$GITLOG" | sed -E "s/^\S+/-/g")" + +print_preview() { + cat << EOF +Please review following info: +Tag: ${TAG_VERSION:-<skipped>} +Release Version: $RELEASE_VERSION +Release Author: $AUTHOR +Changelog: +$CHANGELOG_HDR +$CHANGELOG +EOF +} + +print_info() { + cat << EOF +Please review following info: +!!! DO NOT CHANGE THE FILE FORMAT !!! + +// You can set "Tag:" to empty to skip tagging. +// but it's strongly recommended to tag after changlog update, to make versioning more consistent. +Tag: $TAG_VERSION +Release Version: $RELEASE_VERSION +Release Author: $AUTHOR +Changelog: +* $(date +"%a %b %e %Y") <Author> - <Release Version>" +$CHANGELOG +EOF +} + +dump_info() { + print_info > "$DISTDIR/.release.stash" +} + +update_info() { + ${EDITOR:-vi} "$DISTDIR/.release.stash" >/dev/tty + [[ $? -eq 0 ]] || die "Failed to call editor to edit the release info" +} + +parse_info() { + TAG_VERSION=$(sed -E -ne "s/^Tag:\s*(.*)/\1/p" "$DISTDIR/.release.stash") + RELEASE_VERSION=$(sed -E -ne "s/\s*Release Version:\s*(.*)/\1/p" "$DISTDIR/.release.stash") + AUTHOR=$(sed -E -ne "s/^Release Author:\s*(.*)/\1/p" "$DISTDIR/.release.stash") + CHANGELOG=$(sed -n '/^* /,$p' "$DISTDIR/.release.stash" | tail -n +2) + CHANGELOG_HDR="* $(date +"%a %b %e %Y") $AUTHOR - $RELEASE_VERSION" +} + +while :; do + _res="?" + while :; do + { + print_preview + echo + echo "(Press 'q' to exit preview, Press 'e' to edit above info, Press 'y' to commit.)" + } | less + echo "Is this OK? (y/n/q/e, Y: Do the release, N/Q: quit, E: edit)" + read -r -n1 _res + case $_res in + n|N|q|Q ) + exit 0 + ;; + y|Y ) + info "Updating spec changelog and tagging HEAD... " + echo "$CHANGELOG_HDR" >> "$DISTDIR/templates/changelog.new" + echo "$CHANGELOG" >> "$DISTDIR/templates/changelog.new" + echo "" >> "$DISTDIR/templates/changelog.new" + cat "$DISTDIR/templates/changelog" >> "$DISTDIR/templates/changelog.new" + mv "$DISTDIR/templates/changelog.new" "$DISTDIR/templates/changelog" + git -C "$TOPDIR" add "$DISTPATH/templates/changelog" + git -C "$TOPDIR" commit -m "$DISTPATH: release $RELEASE_VERSION + +Upstream: no + +Signed-off-by: $AUTHOR" + if [[ $TAG_VERSION ]]; then + if ! git -C "$TOPDIR" tag "$TAG_VERSION"; then + error "Failed to tag '$TAG_VERSION', this tag may already exists." + error "Changelog update should be done before tagging a release, so you may either use dist-new-release to tag, or fix the tag later manually." + fi + else + warn "Please ensure a tag corresponding to '$RELEASE_VERSION' is added to repo to make changelog consistent." + fi + + exit 0 + ;; + e|E ) + dump_info + update_info + parse_info + ;; + esac + done +done diff --git a/dist/sources/README b/dist/sources/README new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/dist/sources/check-kabi b/dist/sources/check-kabi new file mode 100755 index 000000000000..0defb4d02157 --- /dev/null +++ b/dist/sources/check-kabi @@ -0,0 +1,156 @@ +#!/usr/bin/python3 +# +# check-kabi - Red Hat kABI reference checking tool +# +# We use this script to check against reference Module.kabi files. +# +# Author: Jon Masters <jcm@redhat.com> +# Copyright (C) 2007-2009 Red Hat, Inc. +# +# This software may be freely redistributed under the terms of the GNU +# General Public License (GPL). + +# Changelog: +# +# 2018/06/01 - Update for python3 by Petr Oros. +# 2009/08/15 - Updated for use in RHEL6. +# 2007/06/13 - Initial rewrite in python by Jon Masters. + +__author__ = "Jon Masters <jcm@redhat.com>" +__version__ = "2.0" +__date__ = "2009/08/15" +__copyright__ = "Copyright (C) 2007-2009 Red Hat, Inc" +__license__ = "GPL" + +import getopt +import string +import sys + +true = 1 +false = 0 + +def load_symvers(symvers, filename): + """Load a Module.symvers file.""" + + symvers_file = open(filename, "r") + + while true: + in_line = symvers_file.readline() + if in_line == "": + break + if in_line == "\n": + continue + try: + checksum, symbol, directory, type = in_line.split() + except ValueError: + # Firmware symbol may have an extra field + checksum, symbol, directory, type, extra = in_line.split() + + symvers[symbol] = " ".join([checksum, symbol, directory, type]) + + +def load_kabi(kabi, filename): + """Load a Module.kabi file.""" + + kabi_file = open(filename, "r") + + while true: + in_line = kabi_file.readline() + if in_line == "": + break + if in_line == "\n": + continue + try: + checksum, symbol, directory, type = in_line.split() + except ValueError: + # Firmware symbol may have an extra field + checksum, symbol, directory, type, extra = in_line.split() + + kabi[symbol] = " ".join([checksum, symbol, directory, type]) + + +def check_kabi(symvers, kabi): + """Check Module.kabi and Module.symvers files.""" + + fail = 0 + warn = 0 + changed_symbols = [] + moved_symbols = [] + + for symbol in kabi: + abi_hash, abi_sym, abi_dir, abi_type = kabi[symbol].split() + if symbol in symvers: + sym_hash, sym_sym, sym_dir, sym_type = symvers[symbol].split() + if abi_hash != sym_hash: + fail = 1 + changed_symbols.append(symbol) + + if abi_dir != sym_dir: + warn = 1 + moved_symbols.append(symbol) + else: + fail = 1 + changed_symbols.append(symbol) + + if fail: + print("*** ERROR - ABI BREAKAGE WAS DETECTED ***") + print("") + print("The following symbols have been changed (this will cause an ABI breakage):") + print("") + for symbol in changed_symbols: + print(symbol) + print("") + + if warn: + print("*** WARNING - ABI SYMBOLS MOVED ***") + print("") + print("The following symbols moved (typically caused by moving a symbol from being") + print("provided by the kernel vmlinux out to a loadable module):") + print("") + for symbol in moved_symbols: + print(symbol) + print("") + + """Halt the build, if we got errors and/or warnings. In either case, + double-checkig is required to avoid introducing / concealing + KABI inconsistencies.""" + if fail or warn: + sys.exit(1) + sys.exit(0) + + +def usage(): + print(""" +check-kabi: check Module.kabi and Module.symvers files. + + check-kabi [ -k Module.kabi ] [ -s Module.symvers ] + +""") + + +if __name__ == "__main__": + + symvers_file = "" + kabi_file = "" + + opts, args = getopt.getopt(sys.argv[1:], 'hk:s:') + + for o, v in opts: + if o == "-s": + symvers_file = v + if o == "-h": + usage() + sys.exit(0) + if o == "-k": + kabi_file = v + + if (symvers_file == "") or (kabi_file == ""): + usage() + sys.exit(1) + + symvers = {} + kabi = {} + + load_symvers(symvers, symvers_file) + load_kabi(kabi, kabi_file) + check_kabi(symvers, kabi) diff --git a/dist/sources/cpupower.config b/dist/sources/cpupower.config new file mode 100644 index 000000000000..8629a4a3ede7 --- /dev/null +++ b/dist/sources/cpupower.config @@ -0,0 +1,3 @@ +# See 'cpupower help' and cpupower(1) for more info +CPUPOWER_START_OPTS="frequency-set -g performance" +CPUPOWER_STOP_OPTS="frequency-set -g ondemand" diff --git a/dist/sources/cpupower.service b/dist/sources/cpupower.service new file mode 100644 index 000000000000..5f10ab7ee39a --- /dev/null +++ b/dist/sources/cpupower.service @@ -0,0 +1,13 @@ +[Unit] +Description=Configure CPU power related settings +After=syslog.target + +[Service] +Type=oneshot +RemainAfterExit=yes +EnvironmentFile=/etc/sysconfig/cpupower +ExecStart=/usr/bin/cpupower $CPUPOWER_START_OPTS +ExecStop=/usr/bin/cpupower $CPUPOWER_STOP_OPTS + +[Install] +WantedBy=multi-user.target diff --git a/dist/sources/filter-modules.sh b/dist/sources/filter-modules.sh new file mode 100755 index 000000000000..1772bdb95ec8 --- /dev/null +++ b/dist/sources/filter-modules.sh @@ -0,0 +1,186 @@ +#!/bin/bash +# +# Used Fedora kernel-ark repo as reference. +# +# Called as filter-modules.sh <depmod base path> <kernel version> <arch> <System.map> +# +# This script collects modules, and filters modules into the kernel-core and kernel-modules +# subpackages. We list out subsystems/subdirs to prune from the installed +# module directory. What is left is put into the kernel-core package. What is +# pruned is contained in the kernel-modules package. +# +# This file contains the default subsys/subdirs to prune from all architectures. +# If an architecture needs to differ, we source a per-arch filter-<arch>.sh file +# that contains the set of override lists to be used instead. If a module or +# subsys should be in kernel-modules on all arches, please change the defaults +# listed here. + +# Set the default dirs and modules to filter out as external modules + +driverdirs="atm auxdisplay bcma bluetooth firewire fmc fpga iio infiniband isdn leds media memstick message mfd mmc mtd nfc ntb pcmcia platform power powercap ssb soundwire staging thermal tty uio w1" + +chardrvs="mwave pcmcia" + +netdrvs="appletalk can dsa hamradio ieee802154 irda ppp slip usb wireless" + +ethdrvs="3com adaptec alteon amd aquantia arc atheros broadcom cadence calxeda chelsio cisco dec dlink emulex icplus marvell mellanox micrel myricom neterion nvidia oki-semi packetengines qlogic rdc renesas sfc silan sis smsc stmicro sun tehuti ti wiznet xircom" + +inputdrvs="gameport tablet touchscreen joystick" + +hiddrvs="surface-hid" + +scsidrvs="aacraid aic7xxx aic94xx be2iscsi bfa bnx2i bnx2fc csiostor cxgbi esas2r fcoe fnic hisi_sas isci libsas lpfc megaraid mpt2sas mpt3sas mvsas pm8001 qla2xxx qla4xxx sym53c8xx_2 ufs qedf" + +usbdrvs="atm image misc serial wusbcore" + +drmdrvs="amd ast bridge gma500 i2c i915 mgag200 nouveau panel radeon via" + +netprots="6lowpan appletalk atm ax25 batman-adv bluetooth can dccp dsa ieee802154 irda l2tp mac80211 mac802154 mpls netrom nfc rds rfkill rose sctp smc wireless" + +fsdrvs="affs befs cifs coda cramfs dlm ecryptfs hfs hfsplus jfs jffs2 minix ncpfs nilfs2 ocfs2 reiserfs romfs squashfs sysv ubifs ufs gfs2" + +# .ko files to be filtered +singlemods="ntb_netdev iscsi_ibft iscsi_boot_sysfs megaraid pmcraid qedi qla1280 9pnet_rdma rpcrdma nvmet-rdma nvme-rdma hid-picolcd hid-prodikeys hwa-hc hwpoison-inject hid-sensor-hub target_core_user sbp_target cxgbit iw_cxgb3 iw_cxgb4 cxgb3i cxgb3i cxgb3i_ddp cxgb4i chcr chtls parport_serial ism regmap-sdw regmap-sdw-mbq arizona-micsupp hid-asus iTCO_wdt rnbd-client rnbd-server mlx5_ib mlx5_vdpa spi-altera-dfl nct6775 hid-playstation hid-nintendo ntc_thermistor configs cifs" + +# Overrides is individual modules which need to remain in kernel-core due to deps. +overrides="cec wmi" + +BASE_DIR=$1 +KERNEL_UNAMER=$2 +ARCH=$3 +SYSTEM_MAP=$(realpath "$4") +MODULEPKG=$5 +MODULE_DIR=lib/modules/$KERNEL_UNAMER + +# Some distro will hide /sbin for non-root user but we need depmod to work. +# depmod can work well without root permission in dry-run mode. +PATH=$PATH:/usr/sbin:/sbin + +error() { + echo "filter-modules.sh: $*" >&2 +} + +if ! cd "$BASE_DIR"; then + error "Invalid base path: '$BASE_DIR'" + exit 1 +fi + +if ! cd "$MODULE_DIR"; then + error "Invalid kernel module path: '$MODULE_DIR'" + exit 1 +fi + +# To be read from build path +core_modules_list= +modules_list= + +# Read all kernel modules in the core modules list at the beginning +# filter them into external modules list step by step +# +# Not filtering internal or vdso so start with kernel/ +core_modules_list=$(find kernel -name '*.ko') + +filter_mods() { + local prefix=$1 mods=$2 suffix=$3 + local mod filter_list + + for mod in $mods; do + if ! filter_list=$(grep "$prefix$mod$suffix" <<< "$core_modules_list"); then + error "$prefix$mod$suffix is marked as non-core module but not built, skipping." + else + core_modules_list=$(grep -v "$prefix$mod$suffix" <<< "$core_modules_list") + modules_list+=$filter_list + modules_list+=$'\n' + fi + done +} + +filter_override() { + local filter_list + + for mod in $1; do + if filter_list=$(grep "/$mod.ko" <<< "$modules_list"); then + modules_list=$(grep -v "/$mod.ko" <<< "$modules_list") + core_modules_list+=$filter_list + core_modules_list+=$'\n' + fi + done +} + +# Check if modules dependency are still sane after splitting these mods out +# args: moduled to be spliited out +check_modules_dependency_after_split() { + # Mask external mods to do a depmod check + for mod in $modules_list; do + mv "$mod" "$mod.bak" + done + + # Run depmod on the resulting module tree and make sure it isn't broken + depmod_err=$(depmod "$KERNEL_UNAMER" -b "$BASE_DIR" -naeF "$SYSTEM_MAP" 2>&1 1>/dev/null) + if [ "$depmod_err" ]; then + error "Failed to filter out external modules, broken depmod:" + error "$depmod_err" + exit 1 + fi + + # Move the mods back + for mod in $modules_list; do + mv "$mod.bak" "$mod" + done +} + +# Modules override for differnet arch +case $ARCH in + aarch64 ) + driverdirs="atm auxdisplay bcma bluetooth firewire fpga infiniband leds media memstick message mmc mtd nfc ntb pcmcia power ssb soundwire staging tty uio w1 ofed_addon" + ethdrvs="3com adaptec arc alteon atheros broadcom cadence calxeda chelsio cisco dec dlink emulex marvell micrel myricom neterion nvidia packetengines qlogic rdc sfc silan sis smsc stmicro sun tehuti ti via wiznet xircom" + drmdrvs="amd arm bridge ast exynos hisilicon i2c imx mgag200 meson msm nouveau panel pl111 radeon rockchip tegra sun4i tiny vc4" + singlemods="ntb_netdev iscsi_ibft iscsi_boot_sysfs megaraid pmcraid qedi qla1280 9pnet_rdma rpcrdma nvmet-rdma nvme-rdma hid-picolcd hid-prodikeys hwpoison-inject target_core_user sbp_target cxgbit chcr rnbd-client rnbd-server mlx5_ib mlx5_core mlx5_vdpa dfl-emif octeontx2-cpt octeontx2-cptvf spi-altera-dfl rvu_cptpf rvu_cptvf regmap-sdw regmap-sdw-mbq hid-playstation hid-nintendo configs cifs" + ;; + riscv64 ) + ;; + loongarch64 ) + ;; + x86_64 ) + ;; + * ) + error "Unknown arch '$ARCH'" + ;; +esac + +# Filter for split and verify +case $MODULEPKG in + non-core-modules ) + filter_mods "drivers/" "$driverdirs" / + filter_mods "drivers/char/" "$chardrvs" / + filter_mods "drivers/net/" "$netdrvs" / + filter_mods "drivers/net/ethernet/" "$ethdrvs" / + filter_mods "drivers/input/" "$inputdrvs" / + filter_mods "drivers/hid/" "$hiddrvs" / + filter_mods "drivers/scsi/" "$scsidrvs" / + filter_mods "drivers/usb"/ "$usbdrvs" / + filter_mods "drivers/gpu/drm/" "$drmdrvs" / + filter_mods "net/" "$netprots" / + filter_mods "fs/" "$fsdrvs" / + # Just kill sound. + filter_mods "" "sound" / + filter_mods "drivers" "soundwire" / + # Filter single modules + filter_mods "" "$singlemods" + # Now process the override list to bring those modules back into core + filter_override "$overrides" + ;; + * ) + error "Invalid module packaging param '$1'" + exit 1 + ;; +esac + +# Ensure this packaging splitting won't break core modules dependency +check_modules_dependency_after_split + +# Print the modules_list after sort, and prepend /lib/modules/<KERNEL_UNAMER>/ to each line +echo "%dir /lib/modules/$KERNEL_UNAMER/" +echo "$modules_list" | sort -n | sed "/^$/d;s/^/\/${MODULE_DIR//\//\\\/}\//" + +exit 0 diff --git a/dist/sources/module-keygen.sh b/dist/sources/module-keygen.sh new file mode 100755 index 000000000000..aee46be94ee5 --- /dev/null +++ b/dist/sources/module-keygen.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# +# Default keygen +# +# We do nothing here, just check if CONFIG_MODULE_SIG_KEY is set to +# "certs/signing_key.pem", this is a special value for kernel config, +# Kbuild will automatically generate keys when this value is set. + +KERNEL_UNAMER=$1 +BUILD_DIR=$2 + +KCONFIG_FILE=$BUILD_DIR/.config + +error() { + echo "module-keygen: error: $*" >&2 + exit 1 +} + +if ! [[ -f $KCONFIG_FILE ]]; then + error "can't find a valid kernel config: $KCONFIG_FILE" +fi + +if ! grep -q '^CONFIG_MODULES=y' "$KCONFIG_FILE"; then + echo "CONFIG_MODULES not enabled, quit. " + exit 0 +fi + +if ! grep -q '^CONFIG_MODULE_SIG=y' "$KCONFIG_FILE"; then + echo "CONFIG_MODULE_SIG not enabled, quit. " + exit 0 +fi + +if ! grep -q '^CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"' "$KCONFIG_FILE"; then + error "CONFIG_MODULE_SIG_KEY=\"certs/signing_key.pem\" is not defined, can't gen keys." +fi + +# Don't use Kbuild's signing, use %%{_module_signer} instead, be compatible with debuginfo and compression +echo "module-keygen: Disabling CONFIG_MODULE_SIG_FORCE, siginig within temporary builtin key." +sed -i -e "s/^CONFIG_MODULE_SIG_FORCE.*/# CONFIG_MODULE_SIG_FORCE is not set/" "$KCONFIG_FILE" + +echo "module-keygen: $KERNEL_UNAMER is using builtin keys." diff --git a/dist/sources/module-signer.sh b/dist/sources/module-signer.sh new file mode 100755 index 000000000000..1a48a394de4d --- /dev/null +++ b/dist/sources/module-signer.sh @@ -0,0 +1,78 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# +# Default key-sign +# +# Just a wrapper for sign-file +# +# We depend on CONFIG_MODULE_SIG_KEY="certs/signing_key.pem" +# for the built-in keys. + +KERNEL_UNAMER=$1 +BUILD_DIR=$2 +BASE_DIR=$3 + +KCONFIG_FILE=$BUILD_DIR/.config +MODULE_DIR=$BASE_DIR/lib/modules/$KERNEL_UNAMER + +error() { + echo "module-signer: error: $*" >&2 +} + +if ! [[ -f $KCONFIG_FILE ]]; then + error "can't find a valid kernel config." + exit 1 +fi + +if ! grep -q '^CONFIG_MODULES=y' "$KCONFIG_FILE"; then + echo "CONFIG_MODULES=y is not defined in .config, skipping signing." + exit 0 +fi + +if ! grep -q '^CONFIG_MODULE_SIG=y' "$KCONFIG_FILE"; then + echo "CONFIG_MODULE_SIG=y is not defined in .config, skipping signing." + exit 0 +fi + +if ! [[ -x $BUILD_DIR/scripts/sign-file ]]; then + error "$BUILD_DIR/scripts/sign-file is not an executable file." + exit 1 +fi + +if ! grep -q '^CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"' "$KCONFIG_FILE"; then + error "CONFIG_MODULE_SIG_KEY is not defined in .config, can't gen keys." + exit 1 +fi + +echo "module-signer: Signing $KERNEL_UNAMER modules with builtin keys..." +PRIKEY="$BUILD_DIR/certs/signing_key.pem" +PUBKEY="$BUILD_DIR/certs/signing_key.x509" + +if ! [[ -s $PRIKEY ]]; then + error "private key file doesn't exist: $PRIKEY" + exit 1 +fi + +if ! [[ -s $PUBKEY ]]; then + error "public key file doesn't exist: $PUBKEY" + exit 1 +fi + +JOB=$(nproc) +JOB=${JOB:-2} + +export BUILD_DIR +export PRIKEY +export PUBKEY +# shellcheck disable=2016 +find "$MODULE_DIR" -type f -name '*.ko' -print0 | xargs -0r -n 1 -P "$JOB" sh -c ' + $BUILD_DIR/scripts/sign-file sha256 "$PRIKEY" "$PUBKEY" "$1" + rm -f $1.sig $1.dig + + if [ "~Module signature appended~" != "$(tail -c 28 "$1")" ]; then + echo "module-signer: error: failed to sign $1." + exit 1 + fi +' _ || exit $? + +echo "module-signer: Signing $KERNEL_UNAMER done." diff --git a/dist/templates/changelog b/dist/templates/changelog new file mode 100644 index 000000000000..e138677f3b45 --- /dev/null +++ b/dist/templates/changelog @@ -0,0 +1,2 @@ +* Mon Mar 14 2022 Kairui Song <kasong@tencent.com> - 5.17.0-0.20220314git47581bb4d9ae.rc7-tks +- Initial release diff --git a/dist/templates/kernel.template.spec b/dist/templates/kernel.template.spec new file mode 100644 index 000000000000..852806e31126 --- /dev/null +++ b/dist/templates/kernel.template.spec @@ -0,0 +1,1423 @@ +# A simplified kernel spec initially based on Tencent Linux Kernels and Fedora/CentOS +# +# By changing a few rpm macros, it's very convenient to build for different archs or +# kernel config styles, and build different components. +### Kenrel version relation macros +# Following variables filled by automation scripts: +# %%{kernel_majver}: Kernel RPM package version, eg. 5.15.0, 5.15.3, 5.16.0 +# %%{kernel_relver}: Kernel RPM package release, eg. 2207.1, 0.20211115git1135ec008ef3.rc0.2207, 0009.11 +# %%{kernel_variant}: Kernel RPM package release, eg. 2207.1, 0.20211115git1135ec008ef3.rc0.2207, 0009.11 +# %%{kernel_unamer_base}: base part of `uname -r` output, used to generate %%kernel_unamer, needed by scriptlets so prepare it early. eg. 5.18.19-2207.2.1.tks, 5.18.19-2207.2.1.tks+debug, 5.4.119-1-0009.1 +# %%{kernel_unamer_force}: force use a unamer, usually for historical reason. +# %%{rpm_name}: Kernel RPM package name, eg. kernel, kernel-tlinux4, kernel-stream kernel-stream-debug +# %%{rpm_vendor}: RPM package vendor +# %%{rpm_url}: RPM url +# TODO: kernel_unamer don't have distro mark +{{VERSIONSPEC}} + +%if "%{kernel_unamer_force}" == "" +%define kernel_unamer %{kernel_unamer_base}%{?dist}.%{_target_cpu}%{kernel_variant} +%else +%define kernel_unamer %{kernel_unamer_force} +%endif + +# TODO: We have a fixed tar name, might be better to include KDIST in tarname +%define kernel_tarname kernel-%{kernel_majver}-%{kernel_relver} + +# This section defines following value: +# %%{kernel_arch} +# Since kernel arch name differs from many other definations, this will insert a script snip +# to handle the convertion, and error out on unsupported arch. +{{ARCHSPEC}} + +# TODO: This is a workaround for kernel userspace tools (eg. perf), which doesn't +# support LTO, and causes FTBFS, need to remove this after LTO is available in +# upstream +%global _lto_cflags %{nil} + +###### Kernel packaging options ################################################# +# Since we need to generate kernel, kernel-subpackages, perf, bpftools, from +# this one single code tree, following build switches are very helpful. +# +# The following build options can be enabled or disabled with --with/--without +# in the rpmbuild command. But may by disabled by later checks# +# +# This section defines following options: +# with_core: kernel core pkg +# with_doc: kernel doc pkg +# with_headers: kernel headers pkg +# with_perf: perf tools pkg +# with_tools: kernel tools pkg +# with_bpftool: bpftool pkg +# with_debuginfo: debuginfo for all packages +# with_modsign: if mod should be signed +# with_kabichk: if kabi check is needed at the end of build +# with_keypkg: package the signing key for user, CAUTION: this package allows +# users to be able to sign their modules using kernel trusted key. +# +# TODO: Remove with_traceevent_dyn +# This is added since some distro pack libtraceevent with kernel, and have to +# stay that way. +# When disabled, dist build system will build and pack it. +# When enabled, dist build system will build using dynamic libtraceevent lib. +# with_traceevent_dyn: build and install libtraceevent +{{PKGPARAMSPEC}} + +# Only use with cross build, don't touch it unless you know what you are doing +%define with_crossbuild %{?_with_crossbuild: 1} %{?!_with_crossbuild: 0} + +###### Kernel signing params ################################################# +### TODO: Currently only module signing, no secureboot +# module-keygen +# Should be an executable accepting two params: +# module-keygen <kernel ver> <kernel objdir> +# <kernel ver>: Kernel's version-release, `uname -r` output of that kernel +# <kernel objdir>: Kernel build dir, where built kernel objs, certs, and vmlinux is stored +# +# This executable should provide required keys for signing, or at least disable builtin keygen +%define use_builtin_module_keygen %{?_module_keygen: 0} %{?!_module_keygen: 1} + +# module-signer +# Should be an executable accepting three params: +# module-signer <buildroot> <kernel ver> <kernel objdir> +# <kernel ver>: Kernel's version-release, `uname -r` output of that kernel +# <kernel objdir>: Kernel build dir, where built kernel objs, certs, and vmlinux is stored +# <buildroot>: RPM's buildroot, where kernel modules are installed into +# +# This executable should sign all kernel modules in <builddir>/lib/modules/<kernel ver> +# based on the info gatherable from <kernel objdir>. +%define use_builtin_module_signer %{?_module_signer: 0} %{?!_module_signer: 1} + +###### Required RPM macros ##################################################### + +### Debuginfo handling +# Following macros controls RPM's builtin debuginfo extracting behaviour, +# tune it into a kernel friendly style. +# +# Kernel package needs its own method to pack the debuginfo files. +# This disables RPM's built-in debuginfo files packaging, we package +# debuginfo files manually use find-debuginfo.sh. +%undefine _debuginfo_subpackages +# This disables RH vendor macro's debuginfo package template generation. +# It only generates debuginfo for the main package, but we only want debuginfo +# for subpackages so disable it and do things manually. +%undefine _enable_debug_packages +# This disable find-debuginfo.sh from appending minimal debuginfo +# to every binary. +%undefine _include_minidebuginfo +# This disables debugsource package which collect source files for debug info, +# we pack the kernel source code manually. +%undefine _debugsource_packages +# TODO: This prevents find-debuginfo.sh from adding unique suffix to .ko.debug files +# that will make .ko.debug file names unrecognizable by `crash` +# We may patch `crash` to fix that or find a better way, since this stops the unique +# debug file renaming for userspace packages too. +%undefine _unique_debug_names +# Pass --reloc-debug-sections to eu-strip, .ko files are ET_REL files. So they have relocation +# sections for debug sections. Those sections will not be relinked. This help create .debug files +# that has cross debug section relocations resolved. +%global _find_debuginfo_opts -r +%global debuginfo_dir /usr/lib/debug + +###### Build time config ####################################################### +# Disable kernel building for non-supported arch, allow building userspace package +%ifarch %nobuildarches noarch +%global with_core 0 +%endif + +# Require cross compiler if cross compiling +%if %{with_crossbuild} +BuildRequires: binutils-%{_build_arch}-linux-gnu, gcc-%{_build_arch}-linux-gnu +%global with_perf 0 +%global with_tools 0 +%global with_bpftool 0 +%global _cross_compile %{!?_cross_compile:%{_build_arch}-linux-gnu-}%{?_cross_compile:%{_cross_compile}} +%endif + +# List the packages used during the kernel build +BuildRequires: kmod, patch, bash, coreutils, tar, git-core, which, gawk +BuildRequires: make, gcc, binutils, system-rpm-config, hmaccalc, bison, flex, gcc-c++ +BuildRequires: bzip2, xz, findutils, gzip, perl-interpreter, perl-Carp, perl-devel +BuildRequires: net-tools, hostname, bc +BuildRequires: dwarves +BuildRequires: openssl-devel, elfutils-devel +# Required by multiple kernel tools +BuildRequires: python3-devel, python3-setuptools +BuildRequires: openssl +BuildRequires: gcc-plugin-devel +# glibc-static is required for a consistent build environment (specifically +# CONFIG_CC_CAN_LINK_STATIC=y). +BuildRequires: glibc-static + +%if %{with_perf} +BuildRequires: zlib-devel binutils-devel newt-devel perl(ExtUtils::Embed) bison flex xz-devel +BuildRequires: audit-libs-devel +BuildRequires: java-devel +BuildRequires: libbabeltrace-devel +%if %{with_traceevent_dyn} +BuildRequires: libtraceevent-devel +%endif +%ifnarch aarch64 +BuildRequires: numactl-devel +%endif +%endif + +%if %{with_tools} +BuildRequires: gettext ncurses-devel +BuildRequires: pciutils-devel libcap-devel libnl3-devel +%endif + +%if %{with_doc} +BuildRequires: xmlto, asciidoc +%endif + +%if %{with_bpftool} +BuildRequires: llvm +# We don't care about this utils's python version, since we only want rst2* commands during build time +BuildRequires: /usr/bin/rst2man +BuildRequires: zlib-devel binutils-devel +%endif + +%if %{with_headers} +BuildRequires: rsync +%endif + +###### Kernel packages sources ################################################# +### Kernel tarball +Source0: %{kernel_tarname}.tar.gz + +### Build time scripts +# Script used to assist kernel building +Source10: filter-modules.sh + +Source20: module-signer.sh +Source21: module-keygen.sh + +Source30: check-kabi + +### Arch speficied kernel configs and kABI +# Start from Source1000 to Source1199, for kernel config +# Start from Source1200 to Source1399, for kabi +{{ARCHSOURCESPEC}} + +### Userspace tools +# Start from Source2000 to Source2999, for userspace tools +Source2000: cpupower.service +Source2001: cpupower.config + +###### Kernel package definations ############################################## +### Main meta package +Summary: %{rpm_vendor} Linux kernel meta package +Name: %{rpm_name} +Version: %{kernel_majver} +Release: %{kernel_relver}%{?dist} +License: GPLv2 +URL: %{rpm_url} + +# We can't let RPM do the dependencies automatic because it'll then pick up +# a correct but undesirable perl dependency from the module headers which +# isn't required for the kernel proper to function +AutoReq: no +AutoProv: yes + +# Kernel requirements +# installonlypkg(kernel) is a hint for RPM that this package shouldn't be auto-cleaned. +Provides: installonlypkg(kernel) +Provides: kernel = %{version}-%{release} +Provides: %{rpm_name} = %{version}-%{release} +Requires: %{rpm_name}-core = %{version}-%{release} +Requires: %{rpm_name}-modules = %{version}-%{release} +Requires: linux-firmware + +%description +This is the meta package of %{?rpm_vendor:%{rpm_vendor} }Linux kernel, the core of operating system. + +%if %{with_core} +### Kernel core package +%package core +Summary: %{rpm_vendor} Linux Kernel +Provides: installonlypkg(kernel) +Provides: kernel-core = %{version}-%{release} +Provides: kernel-core-uname-r = %{kernel_unamer} +Provides: kernel-uname-r = %{kernel_unamer} +Requires(pre): coreutils +Requires(post): coreutils kmod dracut +Requires(preun): coreutils kmod +Requires(post): %{_bindir}/kernel-install +Requires(preun): %{_bindir}/kernel-install +# Kernel install hooks & initramfs +%if 0%{?rhel} == 7 || "%{?dist}" == ".tl2" +Requires(post): systemd +Requires(preun): systemd +%else +Requires(post): systemd-udev +Requires(preun): systemd-udev +%endif + +%description core +The kernel package contains the %{?rpm_vendor:%{rpm_vendor} } Linux kernel (vmlinuz), the core of +operating system. The kernel handles the basic functions +of the operating system: memory allocation, process allocation, device +input and output, etc. + +### Kernel module package +%package modules +Summary: %{rpm_vendor} Kernel modules to match the %{rpm_name}-core kernel +Provides: installonlypkg(kernel-module) +Provides: kernel-modules = %{version}-%{release} +Provides: kernel-modules-extra = %{version}-%{release} +Requires: %{rpm_name}-core = %{version}-%{release} +AutoReq: no +AutoProv: yes +Requires(pre): kmod +Requires(postun): kmod +%description modules +This package provides commonly used kernel modules for the %{?2:%{2}-}core kernel package. + +### Kernel devel package +%package devel +Summary: Development package for building kernel modules to match the %{version}-%{release} kernel +Release: %{release} +Provides: installonlypkg(kernel) +Provides: kernel-devel = %{version}-%{release} +Provides: kernel-devel-%{_target_cpu} = %{version}-%{release} +Provides: kernel-devel-uname-r = %{kernel_unamer} +AutoReqprov: no +%description devel +This package provides kernel headers and makefiles sufficient to build modules +against the %{version}-%{release} kernel package. + +### Kernel module package +%if %{with_keypkg} +%package signing-keys +Summary: %{rpm_vendor} Kernel signing key +Provides: installonlypkg(kernel) +Requires: %{rpm_name}-core = %{version}-%{release} +AutoReq: no +AutoProv: yes +%description signing-keys +This package provides kernel signing key for the %{?2:%{2}-}core kernel package. +%endif + +%if %{with_debuginfo} +### Kernel debuginfo package +%package debuginfo +Summary: Debug information for package %{rpm_name} +Requires: %{rpm_name}-debuginfo-common +Provides: installonlypkg(kernel) +Provides: kernel-debuginfo = %{version}-%{release} +AutoReqProv: no +%description debuginfo +This package provides debug information including +vmlinux, System.map for package %{rpm_name}. +This is required to use SystemTap with %{rpm_name}. +# debuginfo search rule +# If BTF presents, keep it so kernel can use it. +%if 0%{?rhel} != 7 +# Old version of find-debuginfo.sh doesn't support this, so only do it for newer version. Old version of eu-strip seems doesn't strip BTF either, so should be fine. +%global _find_debuginfo_opts %{_find_debuginfo_opts} --keep-section '.BTF' +%endif +# Debuginfo file list for main kernel package +# The (\+.*)? is used to match all variant kernel +%global _find_debuginfo_opts %{_find_debuginfo_opts} -p '.*\/usr\/src\/kernels/.*|XXX' -o ignored-debuginfo.list -p $(echo '.*/%{kernel_unamer}/.*|.*/%{kernel_unamer}(\.debug)?' | sed 's/+/[+]/g') -o debuginfo.list +# with_debuginfo +%endif +# with_core +%endif + +%if %{with_debuginfo} +### Common debuginfo package +%package debuginfo-common +Summary: Kernel source files used by %{rpm_name}-debuginfo packages +Provides: installonlypkg(kernel) +Provides: kernel-debuginfo-common = %{version}-%{release} +%description debuginfo-common +This package is required by %{rpm_name}-debuginfo subpackages. +It provides the kernel source files common to all builds. +# No need to define extra debuginfo search rule here, use debugfiles.list +# with_debuginfo +%endif + +%if %{with_headers} +%package headers +Summary: Header files for the Linux kernel for use by glibc +Obsoletes: glibc-kernheaders < 3.0-46 +Provides: glibc-kernheaders = 3.0-46 +Provides: kernel-headers = %{version}-%{release} +%description headers +Kernel-headers includes the C header files that specify the interface +between the Linux kernel and userspace libraries and programs. The +header files define structures and constants that are needed for +building most standard programs and are also needed for rebuilding the +glibc package. +# with_headers +%endif + +%if %{with_perf} +%package -n perf +Summary: Performance monitoring for the Linux kernel +Requires: bzip2 +License: GPLv2 +%description -n perf +This package contains the perf tool, which enables performance monitoring +of the Linux kernel. + +%package -n perf-debuginfo +Summary: Debug information for package perf +Requires: %{rpm_name}-debuginfo-common = %{version}-%{release} +AutoReqProv: no +%description -n perf-debuginfo +This package provides debug information for the perf package. +# debuginfo search rule +# Note that this pattern only works right to match the .build-id +# symlinks because of the trailing nonmatching alternation and +# the leading .*, because of find-debuginfo.sh's buggy handling +# of matching the pattern against the symlinks file. +%global _find_debuginfo_opts %{_find_debuginfo_opts} -p '.*%{_bindir}/perf(.*\.debug)?|.*%{_libexecdir}/perf-core/.*|.*%{_libdir}/libperf-jvmti.so(.*\.debug)?|.*%{_libdir}/traceevent/(.*\.debug)?|XXX' -o perf-debuginfo.list + +%package -n python3-perf +Summary: Python bindings for apps which will manipulate perf events +%description -n python3-perf +The python3-perf package contains a module that permits applications +written in the Python programming language to use the interface +to manipulate perf events. + +%package -n python3-perf-debuginfo +Summary: Debug information for package perf python bindings +Requires: %{rpm_name}-debuginfo-common = %{version}-%{release} +AutoReqProv: no +%description -n python3-perf-debuginfo +This package provides debug information for the perf python bindings. +# debuginfo search rule +# the python_sitearch macro should already be defined from above +%global _find_debuginfo_opts %{_find_debuginfo_opts} -p '.*%{python3_sitearch}/perf.*\.so(.*\.debug)?|XXX' -o python3-perf-debuginfo.list +# with_perf +%endif + +%if %{with_tools} +%package -n kernel-tools +Summary: Assortment of tools for the Linux kernel +License: GPLv2 +%ifarch %{cpupowerarchs} +Provides: cpupowerutils = 1:009-0.6.p1 +Obsoletes: cpupowerutils < 1:009-0.6.p1 +Provides: cpufreq-utils = 1:009-0.6.p1 +Provides: cpufrequtils = 1:009-0.6.p1 +Obsoletes: cpufreq-utils < 1:009-0.6.p1 +Obsoletes: cpufrequtils < 1:009-0.6.p1 +Obsoletes: cpuspeed < 1:1.5-16 +Requires: kernel-tools-libs = %{version}-%{release} +%endif +%description -n kernel-tools +This package contains the tools/ directory from the kernel source +and the supporting documentation. + +%package -n kernel-tools-libs +Summary: Libraries for the kernels-tools +License: GPLv2 +%description -n kernel-tools-libs +This package contains the libraries built from the tools/ directory +from the kernel source. + +%package -n kernel-tools-libs-devel +Summary: Assortment of tools for the Linux kernel +License: GPLv2 +Requires: kernel-tools = %{version}-%{release} +%ifarch %{cpupowerarchs} +Provides: cpupowerutils-devel = 1:009-0.6.p1 +Obsoletes: cpupowerutils-devel < 1:009-0.6.p1 +%endif +Requires: kernel-tools-libs = %{version}-%{release} +Provides: kernel-tools-devel +%description -n kernel-tools-libs-devel +This package contains the development files for the tools/ directory from +the kernel source. + +%package -n kernel-tools-debuginfo +Summary: Debug information for package kernel-tools +Requires: %{rpm_name}-debuginfo-common = %{version}-%{release} +AutoReqProv: no +%description -n kernel-tools-debuginfo +This package provides debug information for package kernel-tools. +# debuginfo search rule +# Note that this pattern only works right to match the .build-id +# symlinks because of the trailing nonmatching alternation and +# the leading .*, because of find-debuginfo.sh's buggy handling +# of matching the pattern against the symlinks file. +%global _find_debuginfo_opts %{_find_debuginfo_opts} -p '.*%{_bindir}/(cpupower|tmon|gpio-.*|iio_.*|ls.*|centrino-decode|powernow-k8-decode|turbostat|x86_energy_perf_policy|intel-speed-select|page_owner_sort|slabinfo)(.*\.debug)?|.*%{_libdir}/libcpupower.*|XXX' -o kernel-tools-debuginfo.list +# with_tools +%endif + +%if %{with_bpftool} +%package -n bpftool +Summary: Inspection and simple manipulation of eBPF programs and maps +License: GPLv2 +%description -n bpftool +This package contains the bpftool, which allows inspection and simple +manipulation of eBPF programs and maps. + +%package -n bpftool-debuginfo +Summary: Debug information for package bpftool +Requires: %{rpm_name}-debuginfo-common = %{version}-%{release} +AutoReqProv: no +%description -n bpftool-debuginfo +This package provides debug information for the bpftool package. +# debuginfo search rule +%global _find_debuginfo_opts %{_find_debuginfo_opts} -p '.*%{_sbindir}/bpftool(.*\.debug)?|XXX' -o bpftool-debuginfo.list +# with_bpftool +%endif + +###### common macros for build and install ##################################### +### Signing scripts +# If externel module signer and keygen provided, ignore built-in keygen and +# signer, else use builtin keygen and signer. +%if %{use_builtin_module_signer} + # SOURCE20 is just a wrapper for $BUILD_DIR/scripts/sign-file + %define _module_signer %{SOURCE20} +%endif +%if %{use_builtin_module_keygen} + # SOURCE21 is a dummy file, only perform some checks, we depend on Kbuild for builtin keygen + %define _module_keygen %{SOURCE21} +%endif + +### Prepare common build vars to share by %%prep, %%build and %%install section +# _KernSrc: Path to kernel source, located in _buildir +# _KernBuild: Path to the built kernel objects, could be same as $_KernSrc (just like source points to build under /lib/modules/<kver>) +# _KernVmlinuxH: path to vmlinux.h for BTF, located in _buildir +# KernUnameR: Get `uname -r` output of the built kernel +# KernModule: Kernel modules install path, located in %%{buildroot} +# KernDevel: Kernel headers and sources install path, located in %%{buildroot} +%global prepare_buildvar \ + cd %{kernel_tarname} \ + _KernSrc=%{_builddir}/%{rpm_name}-%{kernel_unamer}/%{kernel_tarname} \ + _KernBuild=%{_builddir}/%{rpm_name}-%{kernel_unamer}/%{kernel_unamer}-obj \ + _KernVmlinuxH=%{_builddir}/%{rpm_name}-%{kernel_unamer}/vmlinux.h \ + KernUnameR=%{kernel_unamer} \ + KernModule=%{buildroot}/lib/modules/%{kernel_unamer} \ + KernDevel=%{buildroot}/usr/src/kernels/%{kernel_unamer} \ + +###### Rpmbuild Prep Stage ##################################################### +%prep +%setup -q -c -n %{rpm_name}-%{kernel_unamer} +%{prepare_buildvar} + +# TODO: Apply test patch here +: + +# Mangle /usr/bin/python shebangs to /usr/bin/python3 +# Mangle all Python shebangs to be Python 3 explicitly +# -p preserves timestamps +# -n prevents creating ~backup files +# -i specifies the interpreter for the shebang +# This fixes errors such as +# *** ERROR: ambiguous python shebang in /usr/bin/kvm_stat: #!/usr/bin/python. Change it to python3 (or python2) explicitly. +# We patch all sources below for which we got a report/error. +find scripts/ tools/ Documentation/ \ + -type f -and \( \ + -name "*.py" -or \( -not -name "*.*" -exec grep -Iq '^#!.*python' {} \; \) \ + \) \ + -exec pathfix.py -i "%{__python3} %{py3_shbang_opts}" -p -n {} \+; + +# Make a copy and add suffix for kernel licence to prevent conflict of multi kernel package installation +cp $_KernSrc/COPYING $_KernSrc/COPYING.%{kernel_unamer} + +# Update kernel version and suffix info to make uname consistent with RPM version +# PATCHLEVEL inconsistent only happen on first merge window, but patch them all just in case +sed -i "/^VESION/cVERSION = $(echo %{kernel_majver} | cut -d '.' -f 1)" $_KernSrc/Makefile +sed -i "/^PATCHLEVEL/cPATCHLEVEL = $(echo %{kernel_majver} | cut -d '.' -f 2)" $_KernSrc/Makefile +sed -i "/^SUBLEVEL/cSUBLEVEL = $(echo %{kernel_majver} | cut -d '.' -f 3)" $_KernSrc/Makefile + +# Patch the kernel to apply uname, the reason we use EXTRAVERSION to control uname +# instead of complete use LOCALVERSION is that, we don't want out scm/rpm version info +# get inherited by random kernels built reusing the config file under /boot, which +# will be confusing. +_KVERSION=$(sed -nE "/^VERSION\s*:?=\s*(.*)/{s/^\s*^VERSION\s*:?=\s*//;h};\${x;p}" $_KernSrc/Makefile) +_KPATCHLEVEL=$(sed -nE "/^PATCHLEVEL\s*:?=\s*(.*)/{s/^\s*^PATCHLEVEL\s*:?=\s*//;h};\${x;p}" $_KernSrc/Makefile) +_KSUBLEVEL=$(sed -nE "/^SUBLEVEL\s*:?=\s*(.*)/{s/^\s*^SUBLEVEL\s*:?=\s*//;h};\${x;p}" $_KernSrc/Makefile) +_KUNAMER_PREFIX=${_KVERSION}.${_KPATCHLEVEL}.${_KSUBLEVEL} +_KEXTRAVERSION="" +_KLOCALVERSION="" + +case $KernUnameR in + $_KUNAMER_PREFIX* ) + _KEXTRAVERSION=$(echo "$KernUnameR" | sed -e "s/^$_KUNAMER_PREFIX//") + + # Anything after "+" belongs to LOCALVERSION, eg, +debug/+minimal marker. + _KLOCALVERSION=$(echo "$_KEXTRAVERSION" | sed -ne 's/.*\([+].*\)$/\1/p') + _KEXTRAVERSION=$(echo "$_KEXTRAVERSION" | sed -e 's/[+].*$//') + + # Update Makefile to embed uname + sed -i "/^EXTRAVERSION/cEXTRAVERSION = $_KEXTRAVERSION" $_KernSrc/Makefile + # Save LOCALVERSION in .dist.localversion, it will be set to .config after + # .config is ready in BuildConfig. + echo "$_KLOCALVERSION" > $_KernSrc/.dist.localversion + ;; + * ) + echo "FATAL: error: kernel version doesn't match with kernel spec." >&2 && exit 1 + ;; + esac + +###### Rpmbuild Build Stage #################################################### +%build + +### Make flags +# +# Those defination have to be defined after %%build macro, %%build macro may change +# some build flags, and we have to inherit these changes. +# +# NOTE: kernel's tools build system doesn't playwell with command line variables, some +# `override` statement will stop working after recursive Makefile `include` call. +# So keep these variables as environment variables so they are available globally, +# `make` will transformed env vars into makefile variable in every iteration. + +## Common flags +%global make %{__make} %{_smp_mflags} +%global kernel_make_opts INSTALL_HDR_PATH=%{buildroot}/usr INSTALL_MOD_PATH=%{buildroot} KERNELRELEASE=$KernUnameR +%global tools_make_opts DESTDIR="%{buildroot}" prefix=%{_prefix} lib=%{_lib} PYTHON=%{__python3} INSTALL_ROOT="%{buildroot}" + +## Cross compile flags +%if %{with_crossbuild} +%global kernel_make_opts %{kernel_make_opts} CROSS_COMPILE=%{_cross_compile} ARCH=%{kernel_arch} +# make for host tool, reset arch and flags for native host bulid, also limit to 1 job for better stability +%global host_make CFLAGS= LDFLAGS= ARCH= %{make} -j1 +%global __strip %{_build_arch}-linux-gnu-strip +%else +%global host_make CFLAGS= LDFLAGS= %{make} -j1 +%endif + +# Drop host cflags for crossbuild, arch options from build target will break host compiler +%if !%{with_crossbuild} +%global kernel_make_opts %{kernel_make_opts} HOSTCFLAGS="%{?build_cflags}" HOSTLDFLAGS="%{?build_ldflags}" +%endif + +%if %{with_traceevent_dyn} +%define _libtraceevent_dynamic 1 +%endif + +## make for kernel +%global kernel_make %{make} %{kernel_make_opts} +## make for tools +%global tools_make CFLAGS="${RPM_OPT_FLAGS}" LDFLAGS="%{__global_ldflags}" %{make} %{tools_make_opts} +%global perf_make EXTRA_CFLAGS="${RPM_OPT_FLAGS}" LDFLAGS="%{__global_ldflags}" WERROR=0 NO_LIBUNWIND=1 HAVE_CPLUS_DEMANGLE=1 NO_GTK2=1 NO_STRLCPY=1 NO_BIONIC=1 LIBTRACEEVENT_DYNAMIC=%{?_libtraceevent_dynamic} %{make} %{tools_make_opts} +%global bpftool_make EXTRA_CFLAGS="${RPM_OPT_FLAGS}" EXTRA_LDFLAGS="%{__global_ldflags}" %{make} %{tools_make_opts} $([ -e "$_KernVmlinuxH" ] && echo VMLINUX_H="$_KernVmlinuxH") + +### Real make +%{prepare_buildvar} + +# Prepare Kernel config +BuildConfig() { + mkdir -p $_KernBuild + pushd $_KernBuild + cp $1 .config + + [ "$_KernBuild" != "$_KernSrc" ] && echo "include $_KernSrc/Makefile" > Makefile + [ "$_KernBuild" != "$_KernSrc" ] && cp $_KernSrc/.dist.localversion ./ + + # Respect scripts/setlocalversion, avoid it from potentially mucking with our version numbers. + # Also update LOCALVERSION in .config + cp .dist.localversion .scmversion + "$_KernSrc"/scripts/config --file .config --set-str LOCALVERSION "$(cat .dist.localversion)" + + # Ensures build-ids are unique to allow parallel debuginfo + sed -i -e "s/^CONFIG_BUILD_SALT.*/CONFIG_BUILD_SALT=\"$KernUnameR\"/" .config + + # Call olddefconfig before make all, set all unset config to default value. + # The packager uses CROSS_COMPILE=scripts/dummy-tools for generating .config + # so compiler related config are always unset, let's just use defconfig for them for now + %{kernel_make} olddefconfig + + %if %{with_modsign} + # Don't use Kbuild's signing, use %%{_module_signer} instead, be compatible with debuginfo and compression + sed -i -e "s/^CONFIG_MODULE_SIG_ALL=.*/# CONFIG_MODULE_SIG_ALL is not set/" .config + %else + # Not signing, unset all signing related configs + sed -i -e "s/^CONFIG_MODULE_SIG_ALL=.*/# CONFIG_MODULE_SIG_ALL is not set/" .config + sed -i -e "s/^CONFIG_MODULE_SIG_FORCE=.*/# CONFIG_MODULE_SIG_FORCE is not set/" .config + sed -i -e "s/^CONFIG_MODULE_SIG=.*/# CONFIG_MODULE_SIG is not set/" .config + # Lockdown can't work without module sign + sed -i -e "s/^CONFIG_SECURITY_LOCKDOWN_LSM=.*/# CONFIG_SECURITY_LOCKDOWN_LSM is not set/" .config + sed -i -e "s/^CONFIG_SECURITY_LOCKDOWN_LSM_EARLY=.*/# CONFIG_SECURITY_LOCKDOWN_LSM_EARLY is not set/" .config + %endif + # Don't use kernel's builtin module compression, imcompatible with debuginfo packaging and signing + sed -i -e "s/^\(CONFIG_DECOMPRESS_.*\)=y/# \1 is not set/" .config + popd +} + +## $1: .config file +BuildKernel() { + echo "*** Start building kernel $KernUnameR" + mkdir -p $_KernBuild + pushd $_KernBuild + + %if %{with_modsign} + # Call keygen here, if it generate the module keys, it should come before kbuild, + # so kbuild may avoid regenerate cert keys. + %{_module_keygen} "$KernUnameR" "$_KernBuild" + %endif + + # Build vmlinux + %{kernel_make} all + # Build modules + grep -q "CONFIG_MODULES=y" ".config" && %{kernel_make} modules + # CONFIG_KERNEL_HEADER_TEST generates some extra files in the process of + # testing so just delete + find . -name *.h.s -delete + + popd +} + +BuildPerf() { + %{perf_make} -C tools/perf all + %{perf_make} -C tools/perf man +} + +BuildTools() { + %{tools_make} -C tools/power/cpupower CPUFREQ_BENCH=false DEBUG=false + +%ifarch x86_64 + %{tools_make} -C tools/power/cpupower/debug/x86_64 centrino-decode powernow-k8-decode + %{tools_make} -C tools/power/x86/x86_energy_perf_policy + %{tools_make} -C tools/power/x86/turbostat + %{tools_make} -C tools/power/x86/intel-speed-select +%endif + + %{tools_make} -C tools/thermal/tmon/ + %{tools_make} -C tools/iio/ + %{tools_make} -C tools/gpio/ + %{tools_make} -C tools/vm/ slabinfo page_owner_sort +} + +BuildBpfTool() { + echo "*** Building bootstrap bpftool and extrace vmlinux.h" + if ! [ -s $_KernVmlinuxH ]; then + # Precompile a minimized bpftool without vmlinux.h, use it to extract vmlinux.h + # for bootstraping the full feature bpftool + %{host_make} -C tools/bpf/bpftool/ VMLINUX_BTF= VMLINUX_H= + # Prefer to extract the vmlinux.h from the vmlinux that were just compiled + # fallback to use host's vmlinux + # Skip this if bpftools is too old and doesn't support BTF dump + if tools/bpf/bpftool/bpftool btf help 2>&1 | grep -q "\bdump\b"; then + if grep -q "CONFIG_DEBUG_INFO_BTF=y" "$_KernBuild/.config" && [ -s "$_KernBuild/vmlinux" ]; then + tools/bpf/bpftool/bpftool btf dump file "$_KernBuild/vmlinux" format c > $_KernVmlinuxH + else + tools/bpf/bpftool/bpftool btf dump file /sys/kernel/btf/vmlinux format c > $_KernVmlinuxH + fi + fi + %{host_make} -C tools/bpf/bpftool/ clean + fi + + echo "*** Building bpftool" + %{bpftool_make} -C tools/bpf/bpftool +} + +%if %{with_core} +{{CONFBUILDSPEC}} # `BuildConfig <.config from CONFSOURCESPEC>` +BuildKernel +%endif + +%if %{with_perf} +BuildPerf +%endif + +%if %{with_tools} +BuildTools +%endif + +%if %{with_bpftool} +BuildBpfTool +%endif + +###### Rpmbuild Install Stage ################################################## +%install +%{prepare_buildvar} + +InstKernelBasic() { + ####### Basic environment ################## + # prepare and pushd into the kernel module top dir + mkdir -p $KernModule + pushd $KernModule + + ####### modules_install ################## + pushd $_KernBuild + # Override $(mod-fw) because we don't want it to install any firmware + # we'll get it from the linux-firmware package and we don't want conflicts + grep -q "CONFIG_MODULES=y" ".config" && %{kernel_make} mod-fw= modules_install + # Check again, don't package firmware, use linux-firmware rpm instead + rm -rf %{buildroot}/lib/firmware + popd + + ####### Prepare kernel modules files for packaging ################ + # Don't package depmod files, they should be auto generated by depmod at rpm -i + rm -f modules.{alias,alias.bin,builtin.alias.bin,builtin.bin} \ + modules.{dep,dep.bin,devname,softdep,symbols,symbols.bin} + + # Process kernel modules + find . -name "*.ko" -type f | \ + while read -r _kmodule; do + # Mark it executable so strip and find-debuginfo can see it + chmod u+x "$_kmodule" + + # Detect missing or incorrect license tags + modinfo "$_kmodule" -l | grep -E -qv \ + 'GPL( v2)?$|Dual BSD/GPL$|Dual MPL/GPL$|GPL and additional rights$' && \ + echo "Module $_kmodule has incorrect license." >&2 && exit 1 + + # Collect module symbol reference info for later usage + case "$kmodule" in */drivers/*) nm -upA "$_kmodule" ;; + esac | sed -n 's,^.*/\([^/]*\.ko\): *U \(.*\)$,\1 \2,p' >> drivers.undef + done || exit $? + + # Generate a list of modules for block and networking. + collect_modules_list() { + sed -r -n -e "s/^([^ ]+) \\.?($2)\$/\\1/p" drivers.undef | + LC_ALL=C sort -u > $KernModule/modules.$1 + if [ ! -z "$3" ]; then + sed -r -e "/^($3)\$/d" -i $KernModule/modules.$1 + fi + } + + collect_modules_list networking \ + 'register_netdev|ieee80211_register_hw|usbnet_probe|phy_driver_register|rt(l_|2x00)(pci|usb)_probe|register_netdevice' + collect_modules_list block \ + 'ata_scsi_ioctl|scsi_add_host|scsi_add_host_with_dma|blk_alloc_queue|blk_init_queue|register_mtd_blktrans|scsi_esp_register|scsi_register_device_handler|blk_queue_physical_block_size' \ + 'pktcdvd.ko|dm-mod.ko' + collect_modules_list drm \ + 'drm_open|drm_init' + collect_modules_list modesetting \ + 'drm_crtc_init' + # Finish preparing the kernel module files + + ###### Install kernel core components ############################# + mkdir -p %{buildroot}/boot + install -m 644 $_KernBuild/.config config + install -m 644 $_KernBuild/.config %{buildroot}/boot/config-$KernUnameR + install -m 644 $_KernBuild/System.map System.map + install -m 644 $_KernBuild/System.map %{buildroot}/boot/System.map-$KernUnameR + + # NOTE: If we need to sign the vmlinuz, this is the place to do it. + %ifarch aarch64 + INSTALL_DTB_ARCH_PATH=$_KernBuild/arch/arm64/boot/dts + install -m 644 $_KernBuild/arch/arm64/boot/Image vmlinuz + %endif + + %ifarch riscv64 + INSTALL_DTB_ARCH_PATH=$_KernBuild/arch/riscv/boot/dts + install -m 644 $_KernBuild/arch/riscv/boot/Image vmlinuz + %endif + + %ifarch x86_64 + INSTALL_DTB_ARCH_PATH= + install -m 644 $_KernBuild/arch/x86/boot/bzImage vmlinuz + %endif + + %ifarch loongarch64 + INSTALL_DTB_ARCH_PATH= + install -m 644 $_KernBuild/vmlinuz vmlinuz + %endif + + # Install Arch DTB if exists + if [ -n "$INSTALL_DTB_ARCH_PATH" ]; then + pushd $INSTALL_DTB_ARCH_PATH || : + find . -name "*.dtb" | while read -r dtb; do + mkdir -p %{buildroot}/boot/dtb-$KernUnameR/$(dirname $dtb) + cp $dtb %{buildroot}/boot/dtb-$KernUnameR/$(dirname $dtb) + done + popd + fi + + # Sign the vmlinuz for supporting secure boot feature only when + # external efi secure boot signer provided. + %if 0%{?_sb_signer:1} + %{_sb_signer vmlinuz vmlinuz.signed} + mv vmlinuz.signed vmlinuz + %endif + + # Install Arch vmlinuz + install -m 644 vmlinuz %{buildroot}/boot/vmlinuz-$KernUnameR + + sha512hmac %{buildroot}/boot/vmlinuz-$KernUnameR | sed -e "s,%{buildroot},," > .vmlinuz.hmac + cp .vmlinuz.hmac %{buildroot}/boot/.vmlinuz-$KernUnameR.hmac + + ###### Doc and certs ############################# + mkdir -p %{buildroot}/%{_datadir}/doc/kernel-keys/$KernUnameR + if [ -e $_KernBuild/certs/signing_key.x509 ]; then + install -m 0644 $_KernBuild/certs/signing_key.x509 %{buildroot}/%{_datadir}/doc/kernel-keys/$KernUnameR/kernel-signing-ca.cer +%if %{with_keypkg} + if [ -e $_KernBuild/certs/signing_key.pem ]; then + install -m 0644 $_KernBuild/certs/signing_key.pem %{buildroot}/%{_datadir}/doc/kernel-keys/$KernUnameR/kernel-signing-ca.pem + fi +%endif + fi + + ###### kABI checking and packaging ############################# + # Always create the kABI metadata for use in packaging + echo "**** GENERATING kernel ABI metadata ****" + gzip -c9 < $_KernBuild/Module.symvers > symvers.gz + cp symvers.gz %{buildroot}/boot/symvers-$KernUnameR.gz + + ###### End of installing kernel modules and core + popd +} + +CheckKernelABI() { + echo "**** kABI checking is enabled. ****" + if ! [ -s "$1" ]; then + echo "**** But cannot find reference Module.kabi file. ****" + else + cp $1 %{buildroot}/Module.kabi + %{SOURCE30} -k %{buildroot}/Module.kabi -s $_KernBuild/Module.symvers || exit 1 + rm %{buildroot}/Module.kabi + fi +} + +InstKernelDevel() { + ###### Install kernel-devel package ############################### + ### TODO: need tidy up + ### Save the headers/makefiles etc for building modules against. + # This all looks scary, but the end result is supposed to be: + # * all arch relevant include/ files + # * all Makefile/Kconfig files + # * all script/ files + + # `modules_install` will symlink build to $_KernBuild, and source to $_KernSrc, remove the symlinks first + rm -rf $KernModule/{build,source} + mkdir -p $KernModule/{extra,updates,weak-updates} + + # Symlink $KernDevel to kernel module build path + ln -sf /usr/src/kernels/$KernUnameR $KernModule/build + ln -sf /usr/src/kernels/$KernUnameR $KernModule/source + + # Start installing kernel devel files + mkdir -p $KernDevel + pushd $KernDevel + + # First copy everything + (cd $_KernSrc; cp --parents $(find . -type f -name "Makefile*" -o -name "Kconfig*" -o -name "Kbuild*") $KernDevel/) + # Copy built config and sym files + cp $_KernBuild/Module.symvers . + cp $_KernBuild/System.map . + cp $_KernBuild/.config . + if [ -s $_KernBuild/Module.markers ]; then + cp $_KernBuild/Module.markers . + fi + + # We may want to keep Documentation, I got complain from users of missing Makefile + # of Documentation when building custom module with document. + # rm -rf build/Documentation + # Script files + rm -rf scripts + cp -a $_KernSrc/scripts . + cp -a $_KernBuild/scripts . + + # Include files + rm -rf include + cp -a $_KernSrc/include . + cp -a $_KernBuild/include/config include/ + cp -a $_KernBuild/include/generated include/ + + # SELinux + mkdir -p security/selinux/ + cp -a $_KernSrc/security/selinux/include security/selinux/ + + # Set arch name + Arch=$(head -4 $_KernBuild/.config | sed -ne "s/.*Linux\/\([^\ ]*\).*/\1/p" | sed -e "s/x86_64/x86/" ) + + # Arch include + mkdir -p arch/$Arch + cp -a $_KernSrc/arch/$Arch/include arch/$Arch/ + cp -a $_KernBuild/arch/$Arch/include arch/$Arch/ + +%ifarch loongarch64 + if [ -f $_KernSrc/arch/$Arch/la64/Platform ]; then + mkdir -p arch/$Arch/la64 + cp -a $_KernSrc/arch/$Arch/la64/Platform arch/$Arch/la64 + fi +%endif + + if [ -d $_KernBuild/arch/$Arch/scripts ]; then + cp -a $_KernBuild/arch/$Arch/scripts arch/$Arch/ || : + fi + + # Kernel module build dependency + if [ -f $_KernBuild/tools/objtool/objtool ]; then + cp -a $_KernBuild/tools/objtool/objtool tools/objtool/ || : + fi + + if [ -f $_KernBuild/tools/objtool/fixdep ]; then + cp -a $_KernBuild/tools/objtool/fixdep tools/objtool/ || : + fi + + cp -a $_KernSrc/arch/$Arch/*lds arch/$Arch/ &>/dev/null || : + cp -a $_KernBuild/arch/$Arch/*lds arch/$Arch/ &>/dev/null || : + + mkdir -p arch/$Arch/kernel + if [ -f $_KernSrc/arch/$Arch/kernel/module.lds ]; then + cp -a $_KernSrc/arch/$Arch/kernel/module.lds arch/$Arch/kernel/ + fi + if [ -f $_KernBuild/arch/$Arch/kernel/module.lds ]; then + cp -a $_KernBuild/arch/$Arch/kernel/module.lds arch/$Arch/kernel/ + fi + + # Symlink include/asm-$Arch for better compatibility with some old system + ln -sfr arch/$Arch include/asm-$Arch + + # Make sure the Makefile and version.h have a matching timestamp so that + # external modules can be built + touch -r Makefile include/generated/uapi/linux/version.h + touch -r .config include/linux/autoconf.h + + # If we have with_modsign, the key should be installed under _datadir, make a symlink here: + if [ -e %{buildroot}/%{_datadir}/doc/kernel-keys/$KernUnameR/kernel-signing-ca.cer ]; then + mkdir -p certs + ln -sf %{_datadir}/doc/kernel-keys/$KernUnameR/kernel-signing-ca.cer signing_key.x509 + ln -sf %{_datadir}/doc/kernel-keys/$KernUnameR/kernel-signing-ca.cer certs/signing_key.x509 + ln -sf %{_datadir}/doc/kernel-keys/$KernUnameR/kernel-signing-ca.pem signing_key.pem + ln -sf %{_datadir}/doc/kernel-keys/$KernUnameR/kernel-signing-ca.pem certs/signing_key.pem + fi + + + # Delete obj files + find . -iname "*.o" -o -iname "*.cmd" -delete + + # Done + popd +} + +InstKernelHeaders () { + %{kernel_make} headers_install + find %{buildroot}/usr/include \ + \( -name .install -o -name .check -o \ + -name ..install.cmd -o -name ..check.cmd \) -delete +} + +InstPerf () { +%if %{with_traceevent_dyn} + %{perf_make} -C tools/perf install-bin install-python_ext install-man +%else + %{perf_make} -C tools/perf install-bin install-traceevent-plugins install-python_ext install-man +%endif + + # remove the 'trace' symlink. + rm -f %{buildroot}%{_bindir}/trace + +%if %{with_traceevent_dyn} + # Be just like CentOS: + # remove any tracevent files, eg. its plugins still gets built and installed, + # even if we build against system's libtracevent during perf build (by setting + # LIBTRACEEVENT_DYNAMIC=1 above in perf_make macro). Those files should already + # ship with libtraceevent package. + rm -rf %{buildroot}%{_libdir}/traceevent +%endif +} + +InstTools() { + %{tools_make} -C tools/power/cpupower DESTDIR=%{buildroot} libdir=%{_libdir} mandir=%{_mandir} CPUFREQ_BENCH=false install + rm -f %{buildroot}%{_libdir}/*.{a,la} + %find_lang cpupower + mv cpupower.lang ../ + +%ifarch x86_64 + pushd tools/power/cpupower/debug/x86_64 + install -m755 centrino-decode %{buildroot}%{_bindir}/centrino-decode + install -m755 powernow-k8-decode %{buildroot}%{_bindir}/powernow-k8-decode + popd +%endif + + chmod 0755 %{buildroot}%{_libdir}/libcpupower.so* + mkdir -p %{buildroot}%{_unitdir} %{buildroot}%{_sysconfdir}/sysconfig + install -m644 %{SOURCE2000} %{buildroot}%{_unitdir}/cpupower.service + install -m644 %{SOURCE2001} %{buildroot}%{_sysconfdir}/sysconfig/cpupower + +%ifarch x86_64 + mkdir -p %{buildroot}%{_mandir}/man8 + %{tools_make} -C tools/power/x86/x86_energy_perf_policy DESTDIR=%{buildroot} install + %{tools_make} -C tools/power/x86/turbostat DESTDIR=%{buildroot} install + %{tools_make} -C tools/power/x86/intel-speed-select DESTDIR=%{buildroot} install +%endif + + %{tools_make} -C tools/thermal/tmon install + %{tools_make} -C tools/iio install + %{tools_make} -C tools/gpio install + + pushd tools/vm/ + install -m755 slabinfo %{buildroot}%{_bindir}/slabinfo + install -m755 page_owner_sort %{buildroot}%{_bindir}/page_owner_sort + popd + # with_tools +} + +InstBpfTool () { + %{bpftool_make} -C tools/bpf/bpftool bash_compdir=%{_sysconfdir}/bash_completion.d/ mandir=%{_mandir} install doc-install +} + +CollectKernelFile() { + ###### Collect file list ######################################### + pushd %{buildroot} + + # Collect all module files, dtb files, and dirs + { + # Install certs in core package if found + echo "%%dir %{_datadir}/doc/kernel-keys" + if [ -e "%{buildroot}/%{_datadir}/doc/kernel-keys/%{kernel_unamer}/kernel-signing-ca.cer" ]; then + echo %{_datadir}/doc/kernel-keys/%{kernel_unamer}/kernel-signing-ca.cer + fi + + find lib/modules/$KernUnameR/ boot/dtb-$KernUnameR/ -not -type d -printf '/%%p\n' 2>/dev/null + find lib/modules/$KernUnameR/ boot/dtb-$KernUnameR/ -type d -printf '%%%%dir /%%p\n' 2>/dev/null + } | sort -u > core.list + +%if %{with_keypkg} + # Install private key in cert package if found + # Echo a dir so it don't fail as a empty list if signing is disabled. + echo "%%dir %{_datadir}/doc/kernel-keys" > signing-keys.list + if [ -e "%{buildroot}/%{_datadir}/doc/kernel-keys/%{kernel_unamer}/kernel-signing-ca.pem" ]; then + echo %{_datadir}/doc/kernel-keys/%{kernel_unamer}/kernel-signing-ca.pem >> signing-keys.list + fi +%endif + + # Do module splitting, filter-modules.sh will generate a list of + # modules to be split into external module package + # Rest of the modules stay in core package + %SOURCE10 "%{buildroot}" "$KernUnameR" "%{_target_cpu}" "$_KernBuild/System.map" non-core-modules >> modules.list || exit $? + + comm -23 core.list modules.list > core.list.tmp + mv core.list.tmp core.list + + popd + + # Make these file list usable in rpm build dir + mv %{buildroot}/*.list ../ +} + +###### Start Kernel Install + +%if %{with_core} +InstKernelBasic + +%if %{with_kabichk} +{{KABICHECKSPEC}} # `CheckKernelABI <Module.kabi from KABISOURCESPEC>` +%endif + +InstKernelDevel +%endif + +%if %{with_headers} +InstKernelHeaders +%endif + +%if %{with_perf} +InstPerf +%endif + +%if %{with_tools} +InstTools +%endif + +%if %{with_bpftool} +InstBpfTool +%endif + +%if %{with_core} +CollectKernelFile +%endif + +###### Debuginfo ############################################################### +%if %{with_debuginfo} + +###### Kernel core debuginfo ####### +%if %{with_core} +mkdir -p %{buildroot}%{debuginfo_dir}/lib/modules/$KernUnameR +cp -rpf $_KernBuild/vmlinux %{buildroot}%{debuginfo_dir}/lib/modules/$KernUnameR/vmlinux +ln -sf %{debuginfo_dir}/lib/modules/$KernUnameR/vmlinux %{buildroot}/boot/vmlinux-$KernUnameR +%endif +#with_core + +# All binary installation are done here, so run __debug_install_post, then undefine it. +# This triggers find-debuginfo.sh, undefine prevents it from being triggered again +# in post %%install. we do this here because we need to compress and sign modules +# after the debuginfo extraction. +%__debug_install_post + +# Delete the debuginfo for kernel-devel files +rm -rf %{buildroot}%{debuginfo_dir}/usr/src + +%undefine __debug_install_post + +###### Finally, module sign and compress ###### +%if %{with_modsign} && %{with_core} +### Sign after debuginfo extration, extraction breaks signature +%{_module_signer} "$KernUnameR" "$_KernBuild" "%{buildroot}" || exit $? +%endif + +### Compression after signing, compressed module can't be signed +# Spawn at most 16 workers, at least 2 workers, each worker compress 4 files +NPROC=$(nproc --all) +[ "$NPROC" ] || NPROC=2 +[ "$NPROC" -gt 16 ] && NPROC=16 +find "$KernModule" -type f -name '*.ko' -print0 | xargs -0r -P${NPROC} -n4 xz -T1; + +### Change module path in file lists +for list in ../*.list; do + sed -i -e 's/\.ko$/\.ko.xz/' $list +done + +%endif +#with_debuginfo + +###### RPM scriptslets ######################################################### +### Core package +# Pre +%if %{with_core} +%pre core +# Best effort try to avoid installing with wrong arch +if command -v uname > /dev/null; then + system_arch=$(uname -m) + if [ %{_target_cpu} != $system_arch ]; then + echo "WARN: This kernel is built for %{_target_cpu}. but your system is $system_arch." > /dev/stderr + fi +fi + +%post core +touch %{_localstatedir}/lib/rpm-state/%{name}-%{version}-%{version}%{?dist}.installing_core + +%posttrans core +# Weak modules +if command -v weak-modules > /dev/null; then + weak-modules --add-kernel %{kernel_unamer} || exit $? +fi +# Boot entry and depmod files +if command -v kernel-install > /dev/null; then + kernel-install add %{kernel_unamer} /lib/modules/%{kernel_unamer}/vmlinuz +elif command -v new-kernel-pkg > /dev/null; then + new-kernel-pkg --package kernel --install %{kernel_unamer} --kernel-args="crashkernel=512M-12G:128M,12G-64G:256M,64G-128G:512M,128G-:768M" --make-default || exit $? + new-kernel-pkg --package kernel --mkinitrd --dracut --depmod --update %{kernel_unamer} || exit $? +else + echo "NOTICE: No available kernel install handler found. Please make sure boot loader and initramfs are properly configured after the installation." > /dev/stderr +fi +# Just in case kernel-install didn't depmod +depmod -A %{kernel_unamer} +# Core install done +rm -f %{_localstatedir}/lib/rpm-state/%{name}-%{version}-%{version}%{?dist}.installing_core + +# XXX: Workaround for TLinux 2.x, TLinux 2.x has broken SELinux rule, enabling SELinux will cause boot failure. +%if "%{dist}" == ".tl2" +if command -v grubby > /dev/null; then + grubby --update-kernel /boot/vmlinuz-%{kernel_unamer} --args selinux=0 +else + echo "NOTICE: TL2 detected, but grubby is missing, please set selinux=0 for new installed kernel manually, or it may fail to boot due to broken SELinux rule." > /dev/stderr +fi +%endif + +%preun core +# Boot entry and depmod files +if command -v kernel-install > /dev/null; then + kernel-install remove %{kernel_unamer} /lib/modules/%{kernel_unamer}/vmlinuz || exit $? +elif command -v new-kernel-pkg > /dev/null; then + /sbin/new-kernel-pkg --rminitrd --dracut --remove %{kernel_unamer} +else + echo "NOTICE: No available kernel uninstall handler found. Please make sure boot loader and initramfs are properly cleared after the uninstallation." > /dev/stderr +fi + +# Weak modules +if command -v weak-modules > /dev/null; then + weak-modules --remove-kernel %{kernel_unamer} || exit $? +fi + +### Module package +%post modules +depmod -a %{kernel_unamer} +if [ ! -f %{_localstatedir}/lib/rpm-state/%{name}-%{version}-%{version}%{?dist}.installing_core ]; then + touch %{_localstatedir}/lib/rpm-state/%{name}-%{version}-%{version}%{?dist}.need_to_run_dracut +fi + +%posttrans modules +if [ -f %{_localstatedir}/lib/rpm-state/%{name}-%{version}-%{version}%{?dist}.need_to_run_dracut ]; then\ + dracut -f --kver "%{kernel_unamer}" + rm -f %{_localstatedir}/lib/rpm-state/%{name}-%{version}-%{version}%{?dist}.need_to_run_dracut +fi + +%postun modules +depmod -a %{kernel_unamer} + +### Devel package +%post devel +if [ -f /etc/sysconfig/kernel ]; then + . /etc/sysconfig/kernel || exit $? +fi +# This hardlink merges same devel files across different kernel packages +if [ "$HARDLINK" != "no" -a -x /usr/bin/hardlink -a ! -e /run/ostree-booted ]; then + (cd /usr/src/kernels/%{kernel_unamer} && /usr/bin/find . -type f | while read -r f; do + hardlink /usr/src/kernels/*/$f $f > /dev/null + done) +fi +%endif + +### kernel-tools package +%if %{with_tools} +%post -n kernel-tools-libs +/sbin/ldconfig + +%postun -n kernel-tools-libs +/sbin/ldconfig +%endif + +###### Rpmbuild packaging file list ############################################ +### empty meta-package +%if %{with_core} +%files +%{nil} + +%files core -f core.list +%defattr(-,root,root) +# Mark files as ghost in case rewritten after install (eg. by kernel-install script) +%ghost /boot/vmlinuz-%{kernel_unamer} +%ghost /boot/.vmlinuz-%{kernel_unamer}.hmac +/boot/System.map-%{kernel_unamer} +/boot/config-%{kernel_unamer} +/boot/symvers-%{kernel_unamer}.gz +# Initramfs will be generated after install +%ghost /boot/initramfs-%{kernel_unamer}.img +%ghost /boot/initramfs-%{kernel_unamer}kdump.img +# Make depmod files ghost files of the core package +%dir /lib/modules/%{kernel_unamer} +%ghost /lib/modules/%{kernel_unamer}/modules.alias +%ghost /lib/modules/%{kernel_unamer}/modules.alias.bin +%ghost /lib/modules/%{kernel_unamer}/modules.builtin.bin +%ghost /lib/modules/%{kernel_unamer}/modules.builtin.alias.bin +%ghost /lib/modules/%{kernel_unamer}/modules.dep +%ghost /lib/modules/%{kernel_unamer}/modules.dep.bin +%ghost /lib/modules/%{kernel_unamer}/modules.devname +%ghost /lib/modules/%{kernel_unamer}/modules.softdep +%ghost /lib/modules/%{kernel_unamer}/modules.symbols +%ghost /lib/modules/%{kernel_unamer}/modules.symbols.bin +%{!?_licensedir:%global license %%doc} +%license %{kernel_tarname}/COPYING.%{kernel_unamer} + +%files modules -f modules.list +%defattr(-,root,root) + +%if %{with_keypkg} +%files signing-keys -f signing-keys.list +%defattr(-,root,root) +%endif + +%files devel +%defattr(-,root,root) +/usr/src/kernels/%{kernel_unamer} + +%if %{with_debuginfo} +%files debuginfo -f debuginfo.list +%defattr(-,root,root) +/boot/vmlinux-%{kernel_unamer} +%endif +# with_core +%endif + +%if %{with_debuginfo} +%files debuginfo-common -f debugfiles.list +%defattr(-,root,root) +%endif + +%if %{with_headers} +%files headers +%defattr(-,root,root) +/usr/include/* +%endif + +%if %{with_perf} +%files -n perf +%defattr(-,root,root) +%{_bindir}/perf* +%if !%{with_traceevent_dyn} +%dir %{_libdir}/traceevent/ +%{_libdir}/traceevent/* +%endif +%{_libdir}/libperf-jvmti.so +%dir %{_prefix}/lib/perf +%{_prefix}/lib/perf/* +%dir %{_libexecdir}/perf-core +%{_libexecdir}/perf-core/* +%{_datadir}/perf-core/* +%{_mandir}/man[1-8]/perf* +%{_sysconfdir}/bash_completion.d/perf +%{_docdir}/perf-tip/tips.txt +# TODO: Missing doc? +# %%doc linux-%%{kernel_unamer}/tools/perf/Documentation/examples.txt + +%files -n python3-perf +%defattr(-,root,root) +%{python3_sitearch}/* + +%if %{with_debuginfo} +%files -f perf-debuginfo.list -n perf-debuginfo +%defattr(-,root,root) + +%files -f python3-perf-debuginfo.list -n python3-perf-debuginfo +%defattr(-,root,root) +%endif +# with_perf +%endif + +%if %{with_tools} +%files -n kernel-tools -f cpupower.lang +%defattr(-,root,root) +%{_bindir}/cpupower +%{_datadir}/bash-completion/completions/cpupower +%ifarch x86_64 +%{_bindir}/centrino-decode +%{_bindir}/powernow-k8-decode +%endif +%{_unitdir}/cpupower.service +%{_mandir}/man[1-8]/cpupower* +%config(noreplace) %{_sysconfdir}/sysconfig/cpupower +%ifarch x86_64 +%{_bindir}/x86_energy_perf_policy +%{_mandir}/man8/x86_energy_perf_policy* +%{_bindir}/turbostat +%{_mandir}/man8/turbostat* +%{_bindir}/intel-speed-select +%endif +%{_bindir}/tmon +%{_bindir}/iio_event_monitor +%{_bindir}/iio_generic_buffer +%{_bindir}/lsiio +%{_bindir}/lsgpio +%{_bindir}/gpio-* +%{_bindir}/page_owner_sort +%{_bindir}/slabinfo + +%files -n kernel-tools-libs +%defattr(-,root,root) +%{_libdir}/libcpupower.so.0 +%{_libdir}/libcpupower.so.0.0.1 + +%files -n kernel-tools-libs-devel +%defattr(-,root,root) +%{_libdir}/libcpupower.so +%{_includedir}/cpufreq.h + +%if %{with_debuginfo} +%files -f kernel-tools-debuginfo.list -n kernel-tools-debuginfo +%defattr(-,root,root) +%endif +# with_tools +%endif + +%if %{with_bpftool} +%files -n bpftool +%defattr(-,root,root) +%{_sbindir}/bpftool +%{_sysconfdir}/bash_completion.d/bpftool +%{_mandir}/man8/bpftool.8.gz +%{_mandir}/man8/bpftool-*.8.gz + +%if %{with_debuginfo} +%files -f bpftool-debuginfo.list -n bpftool-debuginfo +%defattr(-,root,root) +%endif +# with_bpftool +%endif + +###### Changelog ############################################################### +%changelog +{{CHANGELOGSPEC}}