From ceb3172ee1be9d87f26b152f2adcc991291d8caf Mon Sep 17 00:00:00 2001 From: Pablo Greco Date: Feb 07 2022 08:35:10 +0000 Subject: Initial 5.15.0 --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..581ba1a --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +BUILD/ +BUILDROOT/ +RPMS/ +SRPMS/ +SOURCES/*.xz +SOURCES/*.gz +SOURCES/*.bz2 +SOURCES/*.rpm +SOURCES/*.orig +SOURCES/*.sign + +#files generated by %prep +SOURCES/filter-aarch64.sh +SOURCES/filter-armv7hl.sh +SOURCES/filter-i686.sh +SOURCES/filter-modules.sh +SOURCES/filter-ppc64le.sh +SOURCES/filter-s390x.sh +SOURCES/filter-x86_64.sh +SOURCES/mod-extra.list +SOURCES/x509.genkey diff --git a/.kernel.metadata b/.kernel.metadata new file mode 100644 index 0000000..55e1999 --- /dev/null +++ b/.kernel.metadata @@ -0,0 +1 @@ +ac61f2459040c09af1d5abd4ed100c3d316b443e SOURCES/linux-5.15.tar.xz diff --git a/SOURCES/0001-Drop-that-for-now.patch b/SOURCES/0001-Drop-that-for-now.patch new file mode 100644 index 0000000..5146b2a --- /dev/null +++ b/SOURCES/0001-Drop-that-for-now.patch @@ -0,0 +1,24 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Laura Abbott +Date: Wed, 23 Jan 2019 14:36:37 +0100 +Subject: [PATCH] Drop that for now + +--- + Makefile | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/Makefile b/Makefile +index b70997f7ddf9..680d906eee35 100644 +--- a/Makefile ++++ b/Makefile +@@ -496,6 +496,7 @@ KBUILD_CFLAGS := -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs \ + -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE \ + -Werror=implicit-function-declaration -Werror=implicit-int \ + -Werror=return-type -Wno-format-security \ ++ -Wno-address-of-packed-member \ + -std=gnu89 + KBUILD_CPPFLAGS := -D__KERNEL__ + KBUILD_AFLAGS_KERNEL := +-- +2.28.0 + diff --git a/SOURCES/0001-Work-around-for-gcc-bug-https-gcc.gnu.org-bugzilla-s.patch b/SOURCES/0001-Work-around-for-gcc-bug-https-gcc.gnu.org-bugzilla-s.patch new file mode 100644 index 0000000..4c2b0a6 --- /dev/null +++ b/SOURCES/0001-Work-around-for-gcc-bug-https-gcc.gnu.org-bugzilla-s.patch @@ -0,0 +1,29 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: "Justin M. Forbes" +Date: Thu, 30 Jul 2020 10:26:11 -0500 +Subject: [PATCH] Work around for gcc bug + https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96377 + +Signed-off-by: Justin M. Forbes +--- + crypto/aegis128-neon-inner.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/crypto/aegis128-neon-inner.c b/crypto/aegis128-neon-inner.c +index 2a660ac1bc3a..fa87ff6a2a71 100644 +--- a/crypto/aegis128-neon-inner.c ++++ b/crypto/aegis128-neon-inner.c +@@ -148,8 +148,8 @@ void crypto_aegis128_init_neon(void *state, const void *key, const void *iv) + kiv, + vld1q_u8(const1), + vld1q_u8(const0), +- k ^ vld1q_u8(const0), +- k ^ vld1q_u8(const1), ++ (uint8x16_t) (k ^ vld1q_u8(const0)), ++ (uint8x16_t) (k ^ vld1q_u8(const1)), + }}; + int i; + +-- +2.28.0 + diff --git a/SOURCES/0001-brcm-rpi4-fix-usb-numeration.patch b/SOURCES/0001-brcm-rpi4-fix-usb-numeration.patch new file mode 100644 index 0000000..810d78d --- /dev/null +++ b/SOURCES/0001-brcm-rpi4-fix-usb-numeration.patch @@ -0,0 +1,25 @@ +From 6e318871fac5533bd4dd82677b08ba7be17df55b Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Tue, 12 Jan 2021 23:14:09 +0000 +Subject: [PATCH] brcm: rpi4: fix usb numeration + +Signed-off-by: Peter Robinson +--- + drivers/pci/controller/pcie-brcmstb.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/pci/controller/pcie-brcmstb.c b/drivers/pci/controller/pcie-brcmstb.c +index 9c3d2982248d..78ed98e9b099 100644 +--- a/drivers/pci/controller/pcie-brcmstb.c ++++ b/drivers/pci/controller/pcie-brcmstb.c +@@ -869,6 +869,7 @@ static int brcm_pcie_setup(struct brcm_pcie *pcie) + + /* Reset the bridge */ + pcie->bridge_sw_init_set(pcie, 1); ++ pcie->perst_set(pcie, 1); + usleep_range(100, 200); + + /* Take the bridge out of reset */ +-- +2.29.2 + diff --git a/SOURCES/0001-drm-sun4i-sun6i_mipi_dsi-fix-horizontal-timing-calcu.patch b/SOURCES/0001-drm-sun4i-sun6i_mipi_dsi-fix-horizontal-timing-calcu.patch new file mode 100644 index 0000000..6a0e428 --- /dev/null +++ b/SOURCES/0001-drm-sun4i-sun6i_mipi_dsi-fix-horizontal-timing-calcu.patch @@ -0,0 +1,59 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Icenowy Zheng +Date: Mon, 16 Mar 2020 21:35:02 +0800 +Subject: [PATCH] drm/sun4i: sun6i_mipi_dsi: fix horizontal timing calculation + +The max() function call in horizontal timing calculation shouldn't pad a +length already subtracted with overhead to overhead, instead it should +only prevent the set timing to underflow. + +Signed-off-by: Icenowy Zheng +--- + drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c +index aa67cb037e9d..52e009dc632b 100644 +--- a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c ++++ b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c +@@ -556,7 +556,7 @@ static void sun6i_dsi_setup_timings(struct sun6i_dsi *dsi, + */ + #define HSA_PACKET_OVERHEAD 10 + hsa = max((unsigned int)HSA_PACKET_OVERHEAD, +- (mode->hsync_end - mode->hsync_start) * Bpp - HSA_PACKET_OVERHEAD); ++ (mode->hsync_end - mode->hsync_start) * Bpp) - HSA_PACKET_OVERHEAD; + + /* + * The backporch is set using a blanking packet (4 +@@ -565,7 +565,7 @@ static void sun6i_dsi_setup_timings(struct sun6i_dsi *dsi, + */ + #define HBP_PACKET_OVERHEAD 6 + hbp = max((unsigned int)HBP_PACKET_OVERHEAD, +- (mode->htotal - mode->hsync_end) * Bpp - HBP_PACKET_OVERHEAD); ++ (mode->htotal - mode->hsync_end) * Bpp) - HBP_PACKET_OVERHEAD; + + /* + * The frontporch is set using a sync event (4 bytes) +@@ -575,7 +575,7 @@ static void sun6i_dsi_setup_timings(struct sun6i_dsi *dsi, + */ + #define HFP_PACKET_OVERHEAD 16 + hfp = max((unsigned int)HFP_PACKET_OVERHEAD, +- (mode->hsync_start - mode->hdisplay) * Bpp - HFP_PACKET_OVERHEAD); ++ (mode->hsync_start - mode->hdisplay) * Bpp) - HFP_PACKET_OVERHEAD; + + /* + * The blanking is set using a sync event (4 bytes) +@@ -584,8 +584,8 @@ static void sun6i_dsi_setup_timings(struct sun6i_dsi *dsi, + */ + #define HBLK_PACKET_OVERHEAD 10 + hblk = max((unsigned int)HBLK_PACKET_OVERHEAD, +- (mode->htotal - (mode->hsync_end - mode->hsync_start)) * Bpp - +- HBLK_PACKET_OVERHEAD); ++ (mode->htotal - (mode->hsync_end - mode->hsync_start)) * Bpp) - ++ HBLK_PACKET_OVERHEAD; + + /* + * And I'm not entirely sure what vblk is about. The driver in +-- +2.28.0 + diff --git a/SOURCES/0001-dt-bindings-panel-add-binding-for-Xingbangda-XBD599-.patch b/SOURCES/0001-dt-bindings-panel-add-binding-for-Xingbangda-XBD599-.patch new file mode 100644 index 0000000..75162e0 --- /dev/null +++ b/SOURCES/0001-dt-bindings-panel-add-binding-for-Xingbangda-XBD599-.patch @@ -0,0 +1,74 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Icenowy Zheng +Date: Mon, 16 Mar 2020 21:35:00 +0800 +Subject: [PATCH] dt-bindings: panel: add binding for Xingbangda XBD599 panel + +Xingbangda XBD599 is a 5.99" 720x1440 MIPI-DSI LCD panel. + +Add its device tree binding. + +Signed-off-by: Icenowy Zheng +--- + .../display/panel/xingbangda,xbd599.yaml | 50 +++++++++++++++++++ + 1 file changed, 50 insertions(+) + create mode 100644 Documentation/devicetree/bindings/display/panel/xingbangda,xbd599.yaml + +diff --git a/Documentation/devicetree/bindings/display/panel/xingbangda,xbd599.yaml b/Documentation/devicetree/bindings/display/panel/xingbangda,xbd599.yaml +new file mode 100644 +index 000000000000..b27bcf11198f +--- /dev/null ++++ b/Documentation/devicetree/bindings/display/panel/xingbangda,xbd599.yaml +@@ -0,0 +1,50 @@ ++# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) ++%YAML 1.2 ++--- ++$id: http://devicetree.org/schemas/display/panel/xingbangda,xbd599.yaml# ++$schema: http://devicetree.org/meta-schemas/core.yaml# ++ ++title: Xingbangda XBD599 5.99in MIPI-DSI LCD panel ++ ++maintainers: ++ - Icenowy Zheng ++ ++allOf: ++ - $ref: panel-common.yaml# ++ ++properties: ++ compatible: ++ const: xingbangda,xbd599 ++ reg: true ++ backlight: true ++ reset-gpios: true ++ vcc-supply: ++ description: regulator that supplies the VCC voltage ++ iovcc-supply: ++ description: regulator that supplies the IOVCC voltage ++ ++required: ++ - compatible ++ - reg ++ - backlight ++ - vcc-supply ++ - iovcc-supply ++ ++additionalProperties: false ++ ++examples: ++ - | ++ dsi { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ panel@0 { ++ compatible = "xingbangda,xbd599"; ++ reg = <0>; ++ backlight = <&backlight>; ++ iovcc-supply = <®_dldo2>; ++ vcc-supply = <®_ldo_io0>; ++ }; ++ }; ++ ++... +-- +2.28.0 + diff --git a/SOURCES/0001-kdump-round-up-the-total-memory-size-to-128M-for-cra.patch b/SOURCES/0001-kdump-round-up-the-total-memory-size-to-128M-for-cra.patch new file mode 100644 index 0000000..6e32c19 --- /dev/null +++ b/SOURCES/0001-kdump-round-up-the-total-memory-size-to-128M-for-cra.patch @@ -0,0 +1,93 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Dave Young +Date: Mon, 4 Jun 2018 01:38:25 -0400 +Subject: [PATCH] kdump: round up the total memory size to 128M for crashkernel + reservation + +Message-id: <20180604013831.523644967@redhat.com> +Patchwork-id: 8165 +O-Subject: [kernel team] [PATCH RHEL8.0 V2 1/2] kdump: round up the total memory size to 128M for crashkernel reservation +Bugzilla: 1507353 +RH-Acked-by: Don Zickus +RH-Acked-by: Baoquan He +RH-Acked-by: Pingfan Liu + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1507353 +Build: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=16534135 +Tested: ppc64le, x86_64 with several memory sizes. + +The total memory size we get in kernel is usually slightly less than 2G with +2G memory module machine. The main reason is bios/firmware reserve some area +it will not export all memory as usable to Linux. + +2G memory X86 kvm guest test result of the total_mem value: +UEFI boot with ovmf: 0x7ef10000 +Legacy boot kvm guest: 0x7ff7cc00 +This is also a problem on arm64 UEFI booted system according to my test. + +Thus for example crashkernel=1G-2G:128M, if we have a 1G memory +machine, we get total size 1023M from firmware then it will not fall +into 1G-2G thus no memory reserved. User will never know that, it is +hard to let user to know the exact total value we get in kernel + +An option is to use dmi/smbios to get physical memory size, but it's not +reliable as well. According to Prarit hardware vendors sometimes screw this up. +Thus round up total size to 128M to workaround this problem. + +Posted below patch in upstream, but no response yet: +http://lists.infradead.org/pipermail/kexec/2018-April/020568.html + +Upstream Status: RHEL only +Signed-off-by: Dave Young +Signed-off-by: Herton R. Krzesinski +--- + kernel/crash_core.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +diff --git a/kernel/crash_core.c b/kernel/crash_core.c +index 18175687133a..e4dfe2a05a31 100644 +--- a/kernel/crash_core.c ++++ b/kernel/crash_core.c +@@ -7,6 +7,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -39,6 +40,15 @@ static int __init parse_crashkernel_mem(char *cmdline, + unsigned long long *crash_base) + { + char *cur = cmdline, *tmp; ++ unsigned long long total_mem = system_ram; ++ ++ /* ++ * Firmware sometimes reserves some memory regions for it's own use. ++ * so we get less than actual system memory size. ++ * Workaround this by round up the total size to 128M which is ++ * enough for most test cases. ++ */ ++ total_mem = roundup(total_mem, SZ_128M); + + /* for each entry of the comma-separated list */ + do { +@@ -83,13 +93,13 @@ static int __init parse_crashkernel_mem(char *cmdline, + return -EINVAL; + } + cur = tmp; +- if (size >= system_ram) { ++ if (size >= total_mem) { + pr_warn("crashkernel: invalid size\n"); + return -EINVAL; + } + + /* match ? */ +- if (system_ram >= start && system_ram < end) { ++ if (total_mem >= start && total_mem < end) { + *crash_size = size; + break; + } +-- +2.28.0 + diff --git a/SOURCES/0001-mm-kmemleak-skip-late_init-if-not-skip-disable.patch b/SOURCES/0001-mm-kmemleak-skip-late_init-if-not-skip-disable.patch new file mode 100644 index 0000000..a8bf98d --- /dev/null +++ b/SOURCES/0001-mm-kmemleak-skip-late_init-if-not-skip-disable.patch @@ -0,0 +1,71 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Murphy Zhou +Date: Sun, 29 Sep 2019 17:56:59 +0800 +Subject: [PATCH] mm/kmemleak: skip late_init if not skip disable + +Now if DEFAULT_OFF set to y, kmemleak_init will start the cleanup_work +workqueue. Then late_init call will set kmemleak_initialized to 1, the +cleaup workqueue will try to do cleanup, triggering: + +[24.738773] ================================================================== +[24.742784] BUG: KASAN: global-out-of-bounds in __kmemleak_do_cleanup+0x166/0x180 +[24.744144] Key type ._fscrypt registered +[24.745680] Read of size 8 at addr ffffffff88746c90 by task kworker/3:1/171 +[24.745687] +[24.745697] CPU: 3 PID: 171 Comm: kworker/3:1 Not tainted 5.3.0-v5.3-12475-gcbafe18 #1 +[24.745701] Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011 +[24.745710] Workqueue: events kmemleak_do_cleanup +[24.745717] Call Trace: +[24.745736] dump_stack+0x7c/0xc0 +[24.745755] print_address_description.constprop.4+0x1f/0x300 +[24.751562] Key type .fscrypt registered +[24.754370] __kasan_report.cold.8+0x76/0xb2 +[24.754388] ? __kmemleak_do_cleanup+0x166/0x180 +[24.754407] kasan_report+0xe/0x20 +[24.778543] __kmemleak_do_cleanup+0x166/0x180 +[24.780795] process_one_work+0x919/0x17d0 +[24.782929] ? pwq_dec_nr_in_flight+0x320/0x320 +[24.785092] worker_thread+0x87/0xb40 +[24.786948] ? __kthread_parkme+0xc3/0x190 +[24.789217] ? process_one_work+0x17d0/0x17d0 +[24.791414] kthread+0x333/0x3f0 +[24.793031] ? kthread_create_worker_on_cpu+0xc0/0xc0 +[24.795473] ret_from_fork+0x3a/0x50 +[24.797303] +[24.798091] The buggy address belongs to the variable: +[24.800634] mem_pool_free_count+0x10/0x40 +[24.802656] +[24.803434] Memory state around the buggy address: +[24.805793] ffffffff88746b80: 04 fa fa fa fa fa fa fa 00 00 00 00 00 00 00 00 +[24.809177] ffffffff88746c00: 00 fa fa fa fa fa fa fa 00 00 fa fa fa fa fa fa +[24.812407] >ffffffff88746c80: 04 fa fa fa fa fa fa fa 00 00 fa fa fa fa fa fa +[24.815638] ^ +[24.817372] ffffffff88746d00: 00 00 fa fa fa fa fa fa 00 00 00 00 00 00 00 00 +[24.820740] ffffffff88746d80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +[24.824021] ================================================================== + +Fixes: c5665868183f ("mm: kmemleak: use the memory pool for early allocations") +Signed-off-by: Murphy Zhou +--- + mm/kmemleak.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/mm/kmemleak.c b/mm/kmemleak.c +index e362dc3d2028..0c3dfb8eef67 100644 +--- a/mm/kmemleak.c ++++ b/mm/kmemleak.c +@@ -1958,6 +1958,11 @@ void __init kmemleak_init(void) + */ + static int __init kmemleak_late_init(void) + { ++ if (!kmemleak_skip_disable) { ++ kmemleak_disable(); ++ return 0; ++ } ++ + kmemleak_initialized = 1; + + debugfs_create_file("kmemleak", 0644, NULL, NULL, &kmemleak_fops); +-- +2.28.0 + diff --git a/SOURCES/0001-scsi-smartpqi-add-inspur-advantech-ids.patch b/SOURCES/0001-scsi-smartpqi-add-inspur-advantech-ids.patch new file mode 100644 index 0000000..e04ebca --- /dev/null +++ b/SOURCES/0001-scsi-smartpqi-add-inspur-advantech-ids.patch @@ -0,0 +1,70 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Don Brace +Date: Mon, 16 Jul 2018 19:20:41 -0400 +Subject: [PATCH] scsi: smartpqi: add inspur advantech ids + +Message-id: <1531768843-2544-4-git-send-email-dbrace@redhat.com> +Patchwork-id: 224988 +O-Subject: [RHEL 8.0 e-stor V2 PATCH 3/5] scsi: smartpqi: add inspur advantech ids +Bugzilla: 1503736 +RH-Acked-by: Ewan Milne +RH-Acked-by: Tomas Henzl + +From: Kevin Barnett + +Add support for these new device IDs: + + Advantech MIC-8312BridgeB + INSPUR PM8204-2GB + INSPUR PM8204-4GB + INSPUR PM8222-SHBA + +Upstream Status: RHEL only +Reviewed-by: Scott Benesh +Signed-off-by: Kevin Barnett +Signed-off-by: Don Brace +Signed-off-by: Martin K. Petersen +(cherry picked from commit 9f8d05fa98442de78d1ab30235b0cc656ed7aff0) +Signed-off-by: Don Brace +Signed-off-by: Herton R. Krzesinski +--- + drivers/scsi/smartpqi/smartpqi_init.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c +index bd38c8cea56e..477eb841d4e5 100644 +--- a/drivers/scsi/smartpqi/smartpqi_init.c ++++ b/drivers/scsi/smartpqi/smartpqi_init.c +@@ -8251,6 +8251,18 @@ static const struct pci_device_id pqi_pci_id_table[] = { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + 0x19e5, 0xd22c) + }, ++ { ++ PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, ++ 0x1bd4, 0x004a) ++ }, ++ { ++ PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, ++ 0x1bd4, 0x004b) ++ }, ++ { ++ PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, ++ 0x1bd4, 0x004c) ++ }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + PCI_VENDOR_ID_ADAPTEC2, 0x0110) +@@ -8387,6 +8399,10 @@ static const struct pci_device_id pqi_pci_id_table[] = { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + PCI_VENDOR_ID_ADVANTECH, 0x8312) + }, ++ { ++ PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, ++ PCI_VENDOR_ID_ADVANTECH, 0x8312) ++ }, + { + PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f, + PCI_VENDOR_ID_DELL, 0x1fe0) +-- +2.28.0 + diff --git a/SOURCES/0001-update-phy-on-pine64-a64-devices.patch b/SOURCES/0001-update-phy-on-pine64-a64-devices.patch new file mode 100644 index 0000000..e3da87c --- /dev/null +++ b/SOURCES/0001-update-phy-on-pine64-a64-devices.patch @@ -0,0 +1,26 @@ +From bb421e23b49e39c117a31f7c07df83cddd0d96dc Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Mon, 26 Oct 2020 17:01:57 +0000 +Subject: [PATCH 1/2] update phy on pine64 a64 devices + +--- + arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts | 2 +- + arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts +index 2165f238af13..9741fb5caa6f 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts +@@ -81,7 +81,7 @@ &ehci1 { + &emac { + pinctrl-names = "default"; + pinctrl-0 = <&rmii_pins>; +- phy-mode = "rmii"; ++ phy-mode = "rmii-txid"; + phy-handle = <&ext_rmii_phy1>; + phy-supply = <®_dc1sw>; + status = "okay"; +-- +2.28.0 + diff --git a/SOURCES/Module.kabi_aarch64 b/SOURCES/Module.kabi_aarch64 new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/SOURCES/Module.kabi_aarch64 diff --git a/SOURCES/Module.kabi_dup_aarch64 b/SOURCES/Module.kabi_dup_aarch64 new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/SOURCES/Module.kabi_dup_aarch64 diff --git a/SOURCES/Module.kabi_dup_ppc64le b/SOURCES/Module.kabi_dup_ppc64le new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/SOURCES/Module.kabi_dup_ppc64le diff --git a/SOURCES/Module.kabi_dup_s390x b/SOURCES/Module.kabi_dup_s390x new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/SOURCES/Module.kabi_dup_s390x diff --git a/SOURCES/Module.kabi_dup_x86_64 b/SOURCES/Module.kabi_dup_x86_64 new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/SOURCES/Module.kabi_dup_x86_64 diff --git a/SOURCES/Module.kabi_ppc64le b/SOURCES/Module.kabi_ppc64le new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/SOURCES/Module.kabi_ppc64le diff --git a/SOURCES/Module.kabi_s390x b/SOURCES/Module.kabi_s390x new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/SOURCES/Module.kabi_s390x diff --git a/SOURCES/Module.kabi_x86_64 b/SOURCES/Module.kabi_x86_64 new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/SOURCES/Module.kabi_x86_64 diff --git a/SOURCES/centos-ca-secureboot.der b/SOURCES/centos-ca-secureboot.der new file mode 100644 index 0000000..44a2563 Binary files /dev/null and b/SOURCES/centos-ca-secureboot.der differ diff --git a/SOURCES/centos.pem b/SOURCES/centos.pem new file mode 100644 index 0000000..82ad817 --- /dev/null +++ b/SOURCES/centos.pem @@ -0,0 +1,42 @@ +-----BEGIN CERTIFICATE----- +MIIDgTCCAmmgAwIBAgIJALYWFXFy+zGAMA0GCSqGSIb3DQEBCwUAMEwxJjAkBgNV +BAMMHUNlbnRPUyBTZWN1cmUgQm9vdCAoQ0Ega2V5IDEpMSIwIAYJKoZIhvcNAQkB +FhNzZWN1cml0eUBjZW50b3Mub3JnMB4XDTE5MDYwMzE0MjA0MFoXDTM4MDEwMTE0 +MjA0MFowVTEvMC0GA1UEAwwmQ2VudE9TIExpbnV4IERyaXZlciB1cGRhdGUgc2ln +bmluZyBrZXkxIjAgBgkqhkiG9w0BCQEWE3NlY3VyaXR5QGNlbnRvcy5vcmcwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD5ECuosQ4HKRRf+Kxfm+BcICBK +PGqB+E/qalqQ3CCM3LWezq0ns/GZTD0CtSAzmOObqJb3gJ9S5gcbaMVBc3JxLlQ+ +RwVy0oNy91uy9TKhYQ3lpHDyujxiFmXPSJLMKOYbOBNObJ7qF6+ptnmDWMu7GWDc +4UGdBdU/evt92LIxsi9ZQCEoZIqdyKBE/Y3V9gBZIZa/4oXMHfW9dWxhy9UszmR9 +hT7ZdgLFpWMFmJW+SS5QEWtp5CpRlcui4QJZl42bMp5JOrVWc+BlKPIsLdY8TqLp +9FdhQ5Ih4auT7zn2V89YgYpq6VMZnPsn/v5piB6i6RK8Falr6SP5SV0cwV/jAgMB +AAGjXTBbMAwGA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgeAMB0GA1UdDgQWBBQpvUwN +BtLpkRBEtdyXMwkTm1HW1TAfBgNVHSMEGDAWgBRU7IGFiT7pGtsI90SIVH6OP3Q6 +8zANBgkqhkiG9w0BAQsFAAOCAQEAK+f4c4aP9TQDiQM4TDyw8iDapr7eBc+Yr0M5 +ELkWEQu55/OwLQrgCA5bdD86diaAXQAlUOXCtFRrbUQHQACEL77/32YdooHfVZZ7 +04CeE+JWxF/cQ3M5hhJnkyxaqFKC+B+bn7Z6eloMnYUPsXwfQEOuyxKaKergAJdq +KnC0pEG3NGgwlwvnD0dwUqbbEUUqL3UQh96hCYDidhCUmuap1E2OGoxGex3ekszf +ErCgwVYb46cv91ba2KqXVWl1FoO3c5MyZcxL46ihQgiY0BI975+HDFjpUZ69n+Um +OhSscRUiKeEQKMVtHzyQUp5t+HCeaZBRPy3rFoIjTEqijKZ6tQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDejCCAmKgAwIBAgIJALYWFXFy+zF/MA0GCSqGSIb3DQEBCwUAMEwxJjAkBgNV +BAMMHUNlbnRPUyBTZWN1cmUgQm9vdCAoQ0Ega2V5IDEpMSIwIAYJKoZIhvcNAQkB +FhNzZWN1cml0eUBjZW50b3Mub3JnMB4XDTE5MDYwMzE0MjAwMloXDTM4MDEwMTE0 +MjAwMlowTjEoMCYGA1UEAwwfQ2VudE9TIExpbnV4IGtwYXRjaCBzaWduaW5nIGtl +eTEiMCAGCSqGSIb3DQEJARYTc2VjdXJpdHlAY2VudG9zLm9yZzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMG+5OclqB0NE5azrGkSitqUFcZjpRk/rS2P +CetB6jwxOn06TrLGzqnhcE9VBKyEs7CXBLy6lfnORcYOybcR2XvrgqGa1txOZggl +hc8zCj9X7ZCMK2UsWglxQCOtbo0m/vdor/VO3SFbrf/W9+PXhvNtcxMP9yjydbP+ +lS1St8uQv952hu7C1TevyOQN3jpvWRD7DSJIU/2uRFcdIo2QCGokuB/xESXeuGJ2 +F2P9w0h74V18AlVTxtGp/RSJqZaQ2Gi5h4Oa7UsRmhmCoLdmdBe7xnYJrJ4GhxKQ +yG0kU1ikEhZW3YjoVPgBJzTsIhCAzFrOUq0d67a1wTVMiyL60fUCAwEAAaNdMFsw +DAYDVR0TAQH/BAIwADALBgNVHQ8EBAMCB4AwHQYDVR0OBBYEFLSfCGIFkJ3E2iz6 +mTdvsZHS8J54MB8GA1UdIwQYMBaAFFTsgYWJPuka2wj3RIhUfo4/dDrzMA0GCSqG +SIb3DQEBCwUAA4IBAQBcDnjWh8Mx6yaS/OvBOYZprYy5Su0tn+YHiN0czpjVw+zl +NUt2YmRSA/g6xks04CYx+UAL/xnvRcxXd17Ni7eWiROxvgQvBo5nScVkFPq2IIP5 +8aj7LoHR1MUeXfiNqf1JoSlgpRV47wv/+jZD0hmbt1rC2NJp0ZU8OHmt2GWk0jmM +MK72D/pyCUfHetBzPpU9M0cNiukjMUdIL+U7+CXDgKsfdFHcQ76ebWyka7vRSXTs +lBMa2g20Atwz2Hj7tEEAZ74ioQ9029RAlUSNipACe31YdT4/BBWIqHPpeDFkp8W0 +9v4jeTX/2kMBXkjzMfKjhpooa+bFFFLogLeX3P4W +-----END CERTIFICATE----- diff --git a/SOURCES/centossecureboot001.der b/SOURCES/centossecureboot001.der new file mode 100644 index 0000000..e8216b1 Binary files /dev/null and b/SOURCES/centossecureboot001.der differ diff --git a/SOURCES/centossecureboot201.der b/SOURCES/centossecureboot201.der new file mode 100644 index 0000000..ca3c134 Binary files /dev/null and b/SOURCES/centossecureboot201.der differ diff --git a/SOURCES/centossecurebootca2.der b/SOURCES/centossecurebootca2.der new file mode 100644 index 0000000..42bdfcf Binary files /dev/null and b/SOURCES/centossecurebootca2.der differ diff --git a/SOURCES/check-kabi b/SOURCES/check-kabi new file mode 100755 index 0000000..f9d4dcb --- /dev/null +++ b/SOURCES/check-kabi @@ -0,0 +1,149 @@ +#!/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 +# 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 " +__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 + checksum, symbol, directory, type = in_line.split() + + symvers[symbol] = in_line[0:-1] + + +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 + checksum, symbol, directory, type = in_line.split() + + kabi[symbol] = in_line[0:-1] + + +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/SOURCES/cpupower.config b/SOURCES/cpupower.config new file mode 100644 index 0000000..8629a4a --- /dev/null +++ b/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/SOURCES/cpupower.service b/SOURCES/cpupower.service new file mode 100644 index 0000000..5f10ab7 --- /dev/null +++ b/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/SOURCES/fedora-v5.15.patch b/SOURCES/fedora-v5.15.patch new file mode 100644 index 0000000..d26c7ff --- /dev/null +++ b/SOURCES/fedora-v5.15.patch @@ -0,0 +1,3050 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Al Stone +Date: Tue, 27 Feb 2018 00:21:23 -0500 +Subject: [PATCH 01/32] ACPI: APEI: arm64: Ignore broken HPE moonshot APEI + support + +Message-id: <20180227002123.21608-1-ahs3@redhat.com> +Patchwork-id: 206052 +O-Subject: [RHEL8 BZ1518076 PATCH] ACPI: APEI: arm64: Ignore broken HPE moonshot APEI support +Bugzilla: 1518076 +RH-Acked-by: Mark Salter +RH-Acked-by: Jeremy McNicoll + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1518076 +Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=15417197 +Tested: compile-only; several other patches are required for full booting + QE has tested limited boot (see comment#12 of BZ) + +This is a re-post of a RHEL-ALT-7.5 patch specific to aarch64 moonshots +that we use in beaker. It is required for these machines to boot. + + commit 8a663a264863efedf8bb4a9d76ac603920fdd739 + Author: Robert Richter + Date: Wed Aug 16 19:49:30 2017 -0400 + + [acpi] APEI: arm64: Ignore broken HPE moonshot APEI support + + From: Mark Salter + Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1344237 + Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=13768971 + Tested: Booted on moonshot with patched 4.11.0-20 kernel + Upstream: RHEL-only + + The aarch64 HP moonshot platforms we have in beaker and elsewhere have + a firmware bug which causes a spurious fatal memory error via APEI at + boot time. This platform is no longer supported and no further firmware + updates are expected. This is a downstream-only hack to avoid the problem + by bailing out of HEST table probing if we detect a moonshot HEST table. + + Signed-off-by: Mark Salter + Signed-off-by: Robert Richter + Signed-off-by: Herton R. Krzesinski + +Upstream Status: RHEL only +Signed-off-by: Al Stone +Signed-off-by: Herton R. Krzesinski +--- + drivers/acpi/apei/hest.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/drivers/acpi/apei/hest.c b/drivers/acpi/apei/hest.c +index 277f00b288d1..adbce15c273d 100644 +--- a/drivers/acpi/apei/hest.c ++++ b/drivers/acpi/apei/hest.c +@@ -94,6 +94,14 @@ int apei_hest_parse(apei_hest_func_t func, void *data) + if (hest_disable || !hest_tab) + return -EINVAL; + ++#ifdef CONFIG_ARM64 ++ /* Ignore broken firmware */ ++ if (!strncmp(hest_tab->header.oem_id, "HPE ", 6) && ++ !strncmp(hest_tab->header.oem_table_id, "ProLiant", 8) && ++ MIDR_IMPLEMENTOR(read_cpuid_id()) == ARM_CPU_IMP_APM) ++ return -EINVAL; ++#endif ++ + hest_hdr = (struct acpi_hest_header *)(hest_tab + 1); + for (i = 0; i < hest_tab->error_source_count; i++) { + len = hest_esrc_len(hest_hdr); +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Mark Salter +Date: Thu, 10 May 2018 17:38:43 -0400 +Subject: [PATCH 02/32] ACPI / irq: Workaround firmware issue on X-Gene based + m400 + +Message-id: <20180510173844.29580-3-msalter@redhat.com> +Patchwork-id: 214383 +O-Subject: [RHEL-8 BZ1519554 2/3] ACPI / irq: Workaround firmware issue on X-Gene based m400 +Bugzilla: 1519554 +RH-Acked-by: Al Stone +RH-Acked-by: Tony Camuso + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1519554 +Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=16144520 + +The ACPI firmware on the xgene-based m400 platorms erroneously +describes its UART interrupt as ACPI_PRODUCER rather than +ACPI_CONSUMER. This leads to the UART driver being unable to +find its interrupt and the kernel unable find a console. +Work around this by avoiding the producer/consumer check +for X-Gene UARTs. + +Upstream Status: RHEL only +Signed-off-by: Mark Salter +Signed-off-by: Herton R. Krzesinski +--- + drivers/acpi/irq.c | 17 +++++++++++++++-- + 1 file changed, 15 insertions(+), 2 deletions(-) + +diff --git a/drivers/acpi/irq.c b/drivers/acpi/irq.c +index c68e694fca26..146cba5ae5bc 100644 +--- a/drivers/acpi/irq.c ++++ b/drivers/acpi/irq.c +@@ -130,6 +130,7 @@ struct acpi_irq_parse_one_ctx { + unsigned int index; + unsigned long *res_flags; + struct irq_fwspec *fwspec; ++ bool skip_producer_check; + }; + + /** +@@ -201,7 +202,8 @@ static acpi_status acpi_irq_parse_one_cb(struct acpi_resource *ares, + return AE_CTRL_TERMINATE; + case ACPI_RESOURCE_TYPE_EXTENDED_IRQ: + eirq = &ares->data.extended_irq; +- if (eirq->producer_consumer == ACPI_PRODUCER) ++ if (!ctx->skip_producer_check && ++ eirq->producer_consumer == ACPI_PRODUCER) + return AE_OK; + if (ctx->index >= eirq->interrupt_count) { + ctx->index -= eirq->interrupt_count; +@@ -236,8 +238,19 @@ static acpi_status acpi_irq_parse_one_cb(struct acpi_resource *ares, + static int acpi_irq_parse_one(acpi_handle handle, unsigned int index, + struct irq_fwspec *fwspec, unsigned long *flags) + { +- struct acpi_irq_parse_one_ctx ctx = { -EINVAL, index, flags, fwspec }; ++ struct acpi_irq_parse_one_ctx ctx = { -EINVAL, index, flags, fwspec, false }; + ++ /* ++ * Firmware on arm64-based HPE m400 platform incorrectly marks ++ * its UART interrupt as ACPI_PRODUCER rather than ACPI_CONSUMER. ++ * Don't do the producer/consumer check for that device. ++ */ ++ if (IS_ENABLED(CONFIG_ARM64)) { ++ struct acpi_device *adev = acpi_bus_get_acpi_device(handle); ++ ++ if (adev && !strcmp(acpi_device_hid(adev), "APMC0D08")) ++ ctx.skip_producer_check = true; ++ } + acpi_walk_resources(handle, METHOD_NAME__CRS, acpi_irq_parse_one_cb, &ctx); + return ctx.rc; + } +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Mark Salter +Date: Thu, 10 May 2018 17:38:44 -0400 +Subject: [PATCH 03/32] aarch64: acpi scan: Fix regression related to X-Gene + UARTs + +Message-id: <20180510173844.29580-4-msalter@redhat.com> +Patchwork-id: 214381 +O-Subject: [RHEL-8 BZ1519554 3/3] aarch64: acpi scan: Fix regression related to X-Gene UARTs +Bugzilla: 1519554 +RH-Acked-by: Al Stone +RH-Acked-by: Tony Camuso + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1519554 +Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=16144520 + +Commit e361d1f85855 ("ACPI / scan: Fix enumeration for special UART +devices") caused a regression with some X-Gene based platforms (Mustang +and M400) with invalid DSDT. The DSDT makes it appear that the UART +device is also a slave device attached to itself. With the above commit +the UART won't be enumerated by ACPI scan (slave serial devices shouldn't +be). So check for X-Gene UART device and skip slace device check on it. + +Upstream Status: RHEL only +Signed-off-by: Mark Salter +Signed-off-by: Herton R. Krzesinski +--- + drivers/acpi/scan.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c +index 5b54c80b9d32..86c314f8d8a0 100644 +--- a/drivers/acpi/scan.c ++++ b/drivers/acpi/scan.c +@@ -1720,6 +1720,15 @@ static bool acpi_device_enumeration_by_parent(struct acpi_device *device) + if (!acpi_match_device_ids(device, i2c_multi_instantiate_ids)) + return false; + ++ /* ++ * Firmware on some arm64 X-Gene platforms will make the UART ++ * device appear as both a UART and a slave of that UART. Just ++ * bail out here for X-Gene UARTs. ++ */ ++ if (IS_ENABLED(CONFIG_ARM64) && ++ !strcmp(acpi_device_hid(device), "APMC0D08")) ++ return false; ++ + INIT_LIST_HEAD(&resource_list); + acpi_dev_get_resources(device, &resource_list, + acpi_check_serial_bus_slave, +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Mark Salter +Date: Fri, 11 May 2018 21:01:17 -0400 +Subject: [PATCH 04/32] acpi: prefer booting with ACPI over DTS + +Message-id: <20180511210117.10457-1-msalter@redhat.com> +Patchwork-id: 214708 +O-Subject: [RHEL-8 BZ1576869] [RHEL only] acpi: prefer booting with ACPI over DTS +Bugzilla: 1576869 +RH-Acked-by: Jonathan Toppins +RH-Acked-by: Tony Camuso +RH-Acked-by: Bhupesh Sharma +RH-Acked-by: Dean Nelson + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1576869 +Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=16208479 +Testing: Verified kernel defaults to ACPI on Mustang + +From: Jonathan Toppins + + This patch forces ACPI boot tables to be preferred over DTS. + + Currently for ACPI to be used a user either has to set acpi=on on the + kernel command line or make sure any device tree passed to the kernel + is empty. If the dtb passed to the kernel is non-empty then device-tree + will be chosen as the boot method of choice. + + RHEL does not wish to support this boot method so change table boot + preferences to use ACPI. In the event ACPI table checks fail the kernel + will fallback to using DTS to boot. + + Signed-off-by: Jonathan Toppins + +Upstream Status: RHEL only +Signed-off-by: Mark Salter +Signed-off-by: Herton R. Krzesinski +--- + arch/arm64/kernel/acpi.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/kernel/acpi.c b/arch/arm64/kernel/acpi.c +index f3851724fe35..cac21da49455 100644 +--- a/arch/arm64/kernel/acpi.c ++++ b/arch/arm64/kernel/acpi.c +@@ -40,7 +40,7 @@ int acpi_pci_disabled = 1; /* skip ACPI PCI scan and IRQ initialization */ + EXPORT_SYMBOL(acpi_pci_disabled); + + static bool param_acpi_off __initdata; +-static bool param_acpi_on __initdata; ++static bool param_acpi_on __initdata = true; + static bool param_acpi_force __initdata; + + static int __init parse_acpi(char *arg) +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jeremy Cline +Date: Tue, 23 Jul 2019 15:26:09 +0000 +Subject: [PATCH 05/32] tags.sh: Ignore redhat/rpm + +Rebased for v5.3-rc1. Commit 95fd3f87bfbe ("kbuild: add a flag to force +absolute path for srctree") changed the context. + + Message-id: <20180529180112.28376-1-prarit@redhat.com> + Patchwork-id: 8101 + O-Subject: [kernel team] [RHEL8.0 BZ 1582586] scripts/tags.sh: Ignore redhat/rpm + Bugzilla: 1582586 + RH-Acked-by: Tony Camuso + RH-Acked-by: Jarod Wilson + RH-Acked-by: Neil Horman + + Bugzilla: http://bugzilla.redhat.com/1582586 + Brew: https://brewweb.devel.redhat.com/taskinfo?taskID=16502319 + + RHEL_only. + + If 'make cscope' is run on a tree which has had 'make rh-rpm', + 'make rh-cross-*', etc., on it, the tags information contains entries + from the redhat/rpm/ directories. + + Ignore the tags search in redhat/rpm. + + Backport of RHEL7 464ad7779507 ("[scripts] tags.sh: ignore redhat/rpm"). + + Signed-off-by: Prarit Bhargava + Signed-off-by: Herton R. Krzesinski + +Upstream Status: RHEL only +Signed-off-by: Jeremy Cline +--- + scripts/tags.sh | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/scripts/tags.sh b/scripts/tags.sh +index db8ba411860a..2294fb0f17a9 100755 +--- a/scripts/tags.sh ++++ b/scripts/tags.sh +@@ -16,6 +16,8 @@ fi + ignore="$(echo "$RCS_FIND_IGNORE" | sed 's|\\||g' )" + # tags and cscope files should also ignore MODVERSION *.mod.c files + ignore="$ignore ( -name *.mod.c ) -prune -o" ++# RHEL tags and cscope should also ignore redhat/rpm ++ignore="$ignore ( -path redhat/rpm ) -prune -o" + + # Use make KBUILD_ABS_SRCTREE=1 {tags|cscope} + # to force full paths for a non-O= build +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Robert Richter +Date: Thu, 7 Jun 2018 22:59:32 -0400 +Subject: [PATCH 06/32] Vulcan: AHCI PCI bar fix for Broadcom Vulcan early + silicon + +Message-id: <1528412373-19128-2-git-send-email-rrichter@redhat.com> +Patchwork-id: 220950 +O-Subject: [RHEL-8.0 BZ 1563590 v2 1/2] PCI: Vulcan: AHCI PCI bar fix for Broadcom Vulcan early silicon +Bugzilla: 1563590 +RH-Acked-by: Dean Nelson +RH-Acked-by: Mark Langsdorf +RH-Acked-by: Mark Salter + +From: Ashok Kumar Sekar + +PCI BAR 5 is not setup correctly for the on-board AHCI +controller on Broadcom's Vulcan processor. Added a quirk to fix BAR 5 +by using BAR 4's resources which are populated correctly but NOT used +by the AHCI controller actually. + +RHEL-only: + +Both patches are in RHEL-7.6 also. Inclusion of the patches into RHEL-8 +was discussed. Since there are partners with Ax system configurations it +was decided to carry them in RHEL8 too. See: + + https://bugzilla.redhat.com/show_bug.cgi?id=1563590#c1 + +Upstream Status: RHEL only +Signed-off-by: Ashok Kumar Sekar +Signed-off-by: Jayachandran C +Signed-off-by: Robert Richter +Signed-off-by: Herton R. Krzesinski +--- + drivers/pci/quirks.c | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c +index 208fa03acdda..88cfaa8ac3b3 100644 +--- a/drivers/pci/quirks.c ++++ b/drivers/pci/quirks.c +@@ -4269,6 +4269,30 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM, 0x9000, + DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM, 0x9084, + quirk_bridge_cavm_thrx2_pcie_root); + ++/* ++ * PCI BAR 5 is not setup correctly for the on-board AHCI controller ++ * on Broadcom's Vulcan processor. Added a quirk to fix BAR 5 by ++ * using BAR 4's resources which are populated correctly and NOT ++ * actually used by the AHCI controller. ++ */ ++static void quirk_fix_vulcan_ahci_bars(struct pci_dev *dev) ++{ ++ struct resource *r = &dev->resource[4]; ++ ++ if (!(r->flags & IORESOURCE_MEM) || (r->start == 0)) ++ return; ++ ++ /* Set BAR5 resource to BAR4 */ ++ dev->resource[5] = *r; ++ ++ /* Update BAR5 in pci config space */ ++ pci_write_config_dword(dev, PCI_BASE_ADDRESS_5, r->start); ++ ++ /* Clear BAR4's resource */ ++ memset(r, 0, sizeof(*r)); ++} ++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM, 0x9027, quirk_fix_vulcan_ahci_bars); ++ + /* + * Intersil/Techwell TW686[4589]-based video capture cards have an empty (zero) + * class code. Fix it. +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Robert Richter +Date: Thu, 7 Jun 2018 22:59:33 -0400 +Subject: [PATCH 07/32] ahci: thunderx2: Fix for errata that affects stop + engine + +Message-id: <1528412373-19128-3-git-send-email-rrichter@redhat.com> +Patchwork-id: 220952 +O-Subject: [RHEL-8.0 BZ 1563590 v2 2/2] ahci: thunderx2: Fix for errata that affects stop engine +Bugzilla: 1563590 +RH-Acked-by: Dean Nelson +RH-Acked-by: Mark Langsdorf +RH-Acked-by: Mark Salter + +From: Jayachandran C + +Apply workaround for this errata: + Synopsis: Resetting PxCMD.ST may hang the SATA device + + Description: An internal ping-pong buffer state is not reset + correctly for an PxCMD.ST=0 command for a SATA channel. This + may cause the SATA interface to hang when a PxCMD.ST=0 command + is received. + + Workaround: A SATA_BIU_CORE_ENABLE.sw_init_bsi must be asserted + by the driver whenever the PxCMD.ST needs to be de-asserted. This + will reset both the ports. So, it may not always work in a 2 + channel SATA system. + + Resolution: Fix in B0. + +Add the code to ahci_stop_engine() to do this. It is not easy to +stop the other "port" since it is associated with a different AHCI +interface. Please note that with this fix, SATA reset does not +hang any more, but it can cause failures on the other interface +if that is in active use. + +Unfortunately, we have nothing other the the CPU ID to check if the +SATA block has this issue. + +RHEL-only: + +Both patches are in RHEL-7.6 also. Inclusion of the patches into RHEL-8 +was discussed. Since there are partners with Ax system configurations it +was decided to carry them in RHEL8 too. See: + + https://bugzilla.redhat.com/show_bug.cgi?id=1563590#c1 + +[v3 with new delays] +Signed-off-by: Jayachandran C + +Upstream Status: RHEL only +Signed-off-by: Robert Richter +Signed-off-by: Herton R. Krzesinski +--- + drivers/ata/libahci.c | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c +index 395772fa3943..35aa1b420262 100644 +--- a/drivers/ata/libahci.c ++++ b/drivers/ata/libahci.c +@@ -672,6 +672,24 @@ int ahci_stop_engine(struct ata_port *ap) + tmp &= ~PORT_CMD_START; + writel(tmp, port_mmio + PORT_CMD); + ++#ifdef CONFIG_ARM64 ++ /* Rev Ax of Cavium CN99XX needs a hack for port stop */ ++ if (dev_is_pci(ap->host->dev) && ++ to_pci_dev(ap->host->dev)->vendor == 0x14e4 && ++ to_pci_dev(ap->host->dev)->device == 0x9027 && ++ midr_is_cpu_model_range(read_cpuid_id(), ++ MIDR_CPU_MODEL(ARM_CPU_IMP_BRCM, BRCM_CPU_PART_VULCAN), ++ MIDR_CPU_VAR_REV(0, 0), ++ MIDR_CPU_VAR_REV(0, MIDR_REVISION_MASK))) { ++ tmp = readl(hpriv->mmio + 0x8000); ++ udelay(100); ++ writel(tmp | (1 << 26), hpriv->mmio + 0x8000); ++ udelay(100); ++ writel(tmp & ~(1 << 26), hpriv->mmio + 0x8000); ++ dev_warn(ap->host->dev, "CN99XX SATA reset workaround applied\n"); ++ } ++#endif ++ + /* wait for engine to stop. This could be as long as 500 msec */ + tmp = ata_wait_register(ap, port_mmio + PORT_CMD, + PORT_CMD_LIST_ON, PORT_CMD_LIST_ON, 1, 500); +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Laura Abbott +Date: Sun, 10 Feb 2019 01:27:54 +0000 +Subject: [PATCH 08/32] ipmi: do not configure ipmi for HPE m400 + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1670017 +Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=20147017 + +Commit 913a89f009d9 ("ipmi: Don't initialize anything in the core until +something uses it") added new locking which broke context. + + Message-id: <20180713142210.15700-1-tcamuso@redhat.com> + Patchwork-id: 224899 + O-Subject: [RHEL8 BZ 1583537 1/1] ipmi: do not configure ipmi for HPE m400 + Bugzilla: 1583537 + RH-Acked-by: Dean Nelson + RH-Acked-by: Al Stone + RH-Acked-by: Mark Salter + + bugzilla:https://bugzilla.redhat.com/show_bug.cgi?id=1583537 + brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=17150528 + + RHEL-only + + The ARM-based HPE m400 reports host-side ipmi as residing in intel + port-io space, which does not exist in ARM processors. Therefore, when + running on an m400, host-side ipmi configuration code must simply return + zero without trying to configure the host-side ipmi. + + This patch prevents panic on boot by averting attempts to configure + host-side ipmi on this platform. + + Though HPE m400 is not certified with RHEL, and HPE has relegated it to + EOL status, the platform is still used extensively in ARM development + and test for RHEL. + + Testing: + Boot without blacklisting ipmi and check to see that no ipmi modules + are loaded. + + Signed-off-by: Tony Camuso + + cc: Prarit Bhargava + cc: Brendan Conoboy + cc: Jeff Bastian + cc: Scott Herold + Signed-off-by: Herton R. Krzesinski + +Upstream Status: RHEL only +Signed-off-by: Laura Abbott +Acked-by: Tony Camuso +Acked-by: Dean Nelson +Acked-by: Jarod Wilson +Acked-by: Mark Salter +--- + drivers/char/ipmi/ipmi_dmi.c | 15 +++++++++++++++ + drivers/char/ipmi/ipmi_msghandler.c | 16 +++++++++++++++- + 2 files changed, 30 insertions(+), 1 deletion(-) + +diff --git a/drivers/char/ipmi/ipmi_dmi.c b/drivers/char/ipmi/ipmi_dmi.c +index bbf7029e224b..cf7faa970dd6 100644 +--- a/drivers/char/ipmi/ipmi_dmi.c ++++ b/drivers/char/ipmi/ipmi_dmi.c +@@ -215,6 +215,21 @@ static int __init scan_for_dmi_ipmi(void) + { + const struct dmi_device *dev = NULL; + ++#ifdef CONFIG_ARM64 ++ /* RHEL-only ++ * If this is ARM-based HPE m400, return now, because that platform ++ * reports the host-side ipmi address as intel port-io space, which ++ * does not exist in the ARM architecture. ++ */ ++ const char *dmistr = dmi_get_system_info(DMI_PRODUCT_NAME); ++ ++ if (dmistr && (strcmp("ProLiant m400 Server", dmistr) == 0)) { ++ pr_debug("%s does not support host ipmi\n", dmistr); ++ return 0; ++ } ++ /* END RHEL-only */ ++#endif ++ + while ((dev = dmi_find_device(DMI_DEV_TYPE_IPMI, NULL, dev))) + dmi_decode_ipmi((const struct dmi_header *) dev->device_data); + +diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c +index b404cc46cbda..c74d611bcb79 100644 +--- a/drivers/char/ipmi/ipmi_msghandler.c ++++ b/drivers/char/ipmi/ipmi_msghandler.c +@@ -35,6 +35,7 @@ + #include + #include + #include ++#include + #include + + #define IPMI_DRIVER_VERSION "39.2" +@@ -5173,8 +5174,21 @@ static int __init ipmi_init_msghandler_mod(void) + { + int rv; + +- pr_info("version " IPMI_DRIVER_VERSION "\n"); ++#ifdef CONFIG_ARM64 ++ /* RHEL-only ++ * If this is ARM-based HPE m400, return now, because that platform ++ * reports the host-side ipmi address as intel port-io space, which ++ * does not exist in the ARM architecture. ++ */ ++ const char *dmistr = dmi_get_system_info(DMI_PRODUCT_NAME); + ++ if (dmistr && (strcmp("ProLiant m400 Server", dmistr) == 0)) { ++ pr_debug("%s does not support host ipmi\n", dmistr); ++ return -ENOSYS; ++ } ++ /* END RHEL-only */ ++#endif ++ pr_info("version " IPMI_DRIVER_VERSION "\n"); + mutex_lock(&ipmi_interfaces_mutex); + rv = ipmi_register_driver(); + mutex_unlock(&ipmi_interfaces_mutex); +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Laura Abbott +Date: Mon, 20 May 2019 22:21:02 -0400 +Subject: [PATCH 09/32] iommu/arm-smmu: workaround DMA mode issues + +Message-id: <20190520222102.19488-1-labbott@redhat.com> +Patchwork-id: 259215 +O-Subject: [ARK INTERNAL PATCH] iommu/arm-smmu: workaround DMA mode issues +Bugzilla: +RH-Acked-by: Mark Langsdorf +RH-Acked-by: Mark Salter + +From: Mark Salter + +Rebased for v5.2-rc1 + + Bugzilla: 1652259 + Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=19244562 + Upstream status: RHEL only. + + rhel8 commit 65feb1ed0ec9a088a63a90d46c0f7563ac96ad0f + Author: Mark Salter + Date: Wed Nov 21 17:15:59 2018 +0100 + + [iommu] iommu/arm-smmu: workaround DMA mode issues + + Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1624077 + Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=18112820 + Testing: Verified iommu.passthrough=1 no longer needed on gigabyte platforms. + Upstream Status: RHEL-only + + In RHEL_ALT 7.5 we carried a RHEL-only patch which forced the arm smmuv2 + into bypass mode due to performance issues on CN88xx. This was intended + to be a temporary hack until the issues were resolved. Another vendor + had issues with the iommu in bypass mode so we reverted the RHEL-only + patch so that iommu is in DMA mode by default (upstream default). + + It turns on that there are remaining SMMU DMA mode issues on Gigabyte + platformws with CN88xx cpus. The problem manifests itself by pcie + card drivers failing to initialize the cards when SMMU is in DMA mode. + The root cause has not been determined yet, but looks likely to be + a hw or firmware issue. This patch forces bypass mode for Gigabyte + platforms. CN88xx isn't officially supported in RHEL but we have a + lot of them being used internally for testing, so I think we want + this to support that use case in RHEL8. + + Signed-off-by: Mark Salter + Signed-off-by: Herton R. Krzesinski + + Acked-by: Mark Salter + Acked-by: Donald Dutile + +Upstream Status: RHEL only +Signed-off-by: Laura Abbott +--- + drivers/iommu/iommu.c | 22 ++++++++++++++++++++++ + 1 file changed, 22 insertions(+) + +diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c +index 3303d707bab4..372edaaafaa1 100644 +--- a/drivers/iommu/iommu.c ++++ b/drivers/iommu/iommu.c +@@ -7,6 +7,7 @@ + #define pr_fmt(fmt) "iommu: " fmt + + #include ++#include + #include + #include + #include +@@ -3118,6 +3119,27 @@ u32 iommu_sva_get_pasid(struct iommu_sva *handle) + } + EXPORT_SYMBOL_GPL(iommu_sva_get_pasid); + ++#ifdef CONFIG_ARM64 ++static int __init iommu_quirks(void) ++{ ++ const char *vendor, *name; ++ ++ vendor = dmi_get_system_info(DMI_SYS_VENDOR); ++ name = dmi_get_system_info(DMI_PRODUCT_NAME); ++ ++ if (vendor && ++ (strncmp(vendor, "GIGABYTE", 8) == 0 && name && ++ (strncmp(name, "R120", 4) == 0 || ++ strncmp(name, "R270", 4) == 0))) { ++ pr_warn("Gigabyte %s detected, force iommu passthrough mode", name); ++ iommu_def_domain_type = IOMMU_DOMAIN_IDENTITY; ++ } ++ ++ return 0; ++} ++arch_initcall(iommu_quirks); ++#endif ++ + /* + * Changes the default domain of an iommu group that has *only* one device + * +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jeremy Cline +Date: Tue, 1 Oct 2019 15:51:23 +0000 +Subject: [PATCH 10/32] arm: aarch64: Drop the EXPERT setting from + ARM64_FORCE_52BIT + +Message-id: <20191001181256.22935-1-jcline@redhat.com> +Patchwork-id: 275498 +O-Subject: [ARK INTERNAL PATCH] [ARK INTERNAL PATCH] [redhat] Add patch + to drop the EXPERT setting from ARM64_FORCE_52BIT +Bugzilla: +RH-Acked-by: Laura Abbott + +We don't turn on EXPERT as there are few settings we actually want to +mess with. Remove the dependency for ARM64_FORCE_52BIT as we do want +that on in debug builds to help find 52-bit bugs. + +Upstream Status: RHEL only +Signed-off-by: Jeremy Cline +--- + arch/arm64/Kconfig | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig +index fee914c716aa..c987f305f429 100644 +--- a/arch/arm64/Kconfig ++++ b/arch/arm64/Kconfig +@@ -911,7 +911,7 @@ endchoice + + config ARM64_FORCE_52BIT + bool "Force 52-bit virtual addresses for userspace" +- depends on ARM64_VA_BITS_52 && EXPERT ++ depends on ARM64_VA_BITS_52 + help + For systems with 52-bit userspace VAs enabled, the kernel will attempt + to maintain compatibility with older software by providing 48-bit VAs +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Mon, 2 Oct 2017 18:22:13 -0400 +Subject: [PATCH 11/32] Add efi_status_to_str() and rework efi_status_to_err(). + +This adds efi_status_to_str() for use when printing efi_status_t +messages, and reworks efi_status_to_err() so that the two use a common +list of errors. + +Upstream Status: RHEL only +Signed-off-by: Peter Jones +--- + drivers/firmware/efi/efi.c | 124 +++++++++++++++++++++++++++---------- + include/linux/efi.h | 3 + + 2 files changed, 96 insertions(+), 31 deletions(-) + +diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c +index 847f33ffc4ae..363037f8eaf8 100644 +--- a/drivers/firmware/efi/efi.c ++++ b/drivers/firmware/efi/efi.c +@@ -31,6 +31,7 @@ + #include + #include + #include ++#include + + #include + +@@ -841,40 +842,101 @@ int efi_mem_type(unsigned long phys_addr) + } + #endif + ++struct efi_error_code { ++ efi_status_t status; ++ int errno; ++ const char *description; ++}; ++ ++static const struct efi_error_code efi_error_codes[] = { ++ { EFI_SUCCESS, 0, "Success"}, ++#if 0 ++ { EFI_LOAD_ERROR, -EPICK_AN_ERRNO, "Load Error"}, ++#endif ++ { EFI_INVALID_PARAMETER, -EINVAL, "Invalid Parameter"}, ++ { EFI_UNSUPPORTED, -ENOSYS, "Unsupported"}, ++ { EFI_BAD_BUFFER_SIZE, -ENOSPC, "Bad Buffer Size"}, ++ { EFI_BUFFER_TOO_SMALL, -ENOSPC, "Buffer Too Small"}, ++ { EFI_NOT_READY, -EAGAIN, "Not Ready"}, ++ { EFI_DEVICE_ERROR, -EIO, "Device Error"}, ++ { EFI_WRITE_PROTECTED, -EROFS, "Write Protected"}, ++ { EFI_OUT_OF_RESOURCES, -ENOMEM, "Out of Resources"}, ++#if 0 ++ { EFI_VOLUME_CORRUPTED, -EPICK_AN_ERRNO, "Volume Corrupt"}, ++ { EFI_VOLUME_FULL, -EPICK_AN_ERRNO, "Volume Full"}, ++ { EFI_NO_MEDIA, -EPICK_AN_ERRNO, "No Media"}, ++ { EFI_MEDIA_CHANGED, -EPICK_AN_ERRNO, "Media changed"}, ++#endif ++ { EFI_NOT_FOUND, -ENOENT, "Not Found"}, ++#if 0 ++ { EFI_ACCESS_DENIED, -EPICK_AN_ERRNO, "Access Denied"}, ++ { EFI_NO_RESPONSE, -EPICK_AN_ERRNO, "No Response"}, ++ { EFI_NO_MAPPING, -EPICK_AN_ERRNO, "No mapping"}, ++ { EFI_TIMEOUT, -EPICK_AN_ERRNO, "Time out"}, ++ { EFI_NOT_STARTED, -EPICK_AN_ERRNO, "Not started"}, ++ { EFI_ALREADY_STARTED, -EPICK_AN_ERRNO, "Already started"}, ++#endif ++ { EFI_ABORTED, -EINTR, "Aborted"}, ++#if 0 ++ { EFI_ICMP_ERROR, -EPICK_AN_ERRNO, "ICMP Error"}, ++ { EFI_TFTP_ERROR, -EPICK_AN_ERRNO, "TFTP Error"}, ++ { EFI_PROTOCOL_ERROR, -EPICK_AN_ERRNO, "Protocol Error"}, ++ { EFI_INCOMPATIBLE_VERSION, -EPICK_AN_ERRNO, "Incompatible Version"}, ++#endif ++ { EFI_SECURITY_VIOLATION, -EACCES, "Security Policy Violation"}, ++#if 0 ++ { EFI_CRC_ERROR, -EPICK_AN_ERRNO, "CRC Error"}, ++ { EFI_END_OF_MEDIA, -EPICK_AN_ERRNO, "End of Media"}, ++ { EFI_END_OF_FILE, -EPICK_AN_ERRNO, "End of File"}, ++ { EFI_INVALID_LANGUAGE, -EPICK_AN_ERRNO, "Invalid Languages"}, ++ { EFI_COMPROMISED_DATA, -EPICK_AN_ERRNO, "Compromised Data"}, ++ ++ // warnings ++ { EFI_WARN_UNKOWN_GLYPH, -EPICK_AN_ERRNO, "Warning Unknown Glyph"}, ++ { EFI_WARN_DELETE_FAILURE, -EPICK_AN_ERRNO, "Warning Delete Failure"}, ++ { EFI_WARN_WRITE_FAILURE, -EPICK_AN_ERRNO, "Warning Write Failure"}, ++ { EFI_WARN_BUFFER_TOO_SMALL, -EPICK_AN_ERRNO, "Warning Buffer Too Small"}, ++#endif ++}; ++ ++static int ++efi_status_cmp_bsearch(const void *key, const void *item) ++{ ++ u64 status = (u64)(uintptr_t)key; ++ struct efi_error_code *code = (struct efi_error_code *)item; ++ ++ if (status < code->status) ++ return -1; ++ if (status > code->status) ++ return 1; ++ return 0; ++} ++ + int efi_status_to_err(efi_status_t status) + { +- int err; +- +- switch (status) { +- case EFI_SUCCESS: +- err = 0; +- break; +- case EFI_INVALID_PARAMETER: +- err = -EINVAL; +- break; +- case EFI_OUT_OF_RESOURCES: +- err = -ENOSPC; +- break; +- case EFI_DEVICE_ERROR: +- err = -EIO; +- break; +- case EFI_WRITE_PROTECTED: +- err = -EROFS; +- break; +- case EFI_SECURITY_VIOLATION: +- err = -EACCES; +- break; +- case EFI_NOT_FOUND: +- err = -ENOENT; +- break; +- case EFI_ABORTED: +- err = -EINTR; +- break; +- default: +- err = -EINVAL; +- } ++ struct efi_error_code *found; ++ size_t num = sizeof(efi_error_codes) / sizeof(struct efi_error_code); + +- return err; ++ found = bsearch((void *)(uintptr_t)status, efi_error_codes, ++ sizeof(struct efi_error_code), num, ++ efi_status_cmp_bsearch); ++ if (!found) ++ return -EINVAL; ++ return found->errno; ++} ++ ++const char * ++efi_status_to_str(efi_status_t status) ++{ ++ struct efi_error_code *found; ++ size_t num = sizeof(efi_error_codes) / sizeof(struct efi_error_code); ++ ++ found = bsearch((void *)(uintptr_t)status, efi_error_codes, ++ sizeof(struct efi_error_code), num, ++ efi_status_cmp_bsearch); ++ if (!found) ++ return "Unknown error code"; ++ return found->description; + } + + static DEFINE_SPINLOCK(efi_mem_reserve_persistent_lock); +diff --git a/include/linux/efi.h b/include/linux/efi.h +index 6b5d36babfcc..cbac8a7db3bd 100644 +--- a/include/linux/efi.h ++++ b/include/linux/efi.h +@@ -43,6 +43,8 @@ + #define EFI_ABORTED (21 | (1UL << (BITS_PER_LONG-1))) + #define EFI_SECURITY_VIOLATION (26 | (1UL << (BITS_PER_LONG-1))) + ++#define EFI_IS_ERROR(x) ((x) & (1UL << (BITS_PER_LONG-1))) ++ + typedef unsigned long efi_status_t; + typedef u8 efi_bool_t; + typedef u16 efi_char16_t; /* UNICODE character */ +@@ -825,6 +827,7 @@ static inline bool efi_rt_services_supported(unsigned int mask) + #endif + + extern int efi_status_to_err(efi_status_t status); ++extern const char *efi_status_to_str(efi_status_t status); + + /* + * Variable Attributes +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Mon, 2 Oct 2017 18:18:30 -0400 +Subject: [PATCH 12/32] Make get_cert_list() use efi_status_to_str() to print + error messages. + +Upstream Status: RHEL only +Signed-off-by: Peter Jones +Signed-off-by: Jeremy Cline +--- + security/integrity/platform_certs/load_uefi.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/security/integrity/platform_certs/load_uefi.c b/security/integrity/platform_certs/load_uefi.c +index f290f78c3f30..d3e7ae04f5be 100644 +--- a/security/integrity/platform_certs/load_uefi.c ++++ b/security/integrity/platform_certs/load_uefi.c +@@ -46,7 +46,8 @@ static __init void *get_cert_list(efi_char16_t *name, efi_guid_t *guid, + return NULL; + + if (*status != EFI_BUFFER_TOO_SMALL) { +- pr_err("Couldn't get size: 0x%lx\n", *status); ++ pr_err("Couldn't get size: %s (0x%lx)\n", ++ efi_status_to_str(*status), *status); + return NULL; + } + +@@ -57,7 +58,8 @@ static __init void *get_cert_list(efi_char16_t *name, efi_guid_t *guid, + *status = efi.get_variable(name, guid, NULL, &lsize, db); + if (*status != EFI_SUCCESS) { + kfree(db); +- pr_err("Error reading db var: 0x%lx\n", *status); ++ pr_err("Error reading db var: %s (0x%lx)\n", ++ efi_status_to_str(*status), *status); + return NULL; + } + +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jeremy Cline +Date: Mon, 30 Sep 2019 21:22:47 +0000 +Subject: [PATCH 13/32] security: lockdown: expose a hook to lock the kernel + down + +In order to automatically lock down kernels running on UEFI machines +booted in Secure Boot mode, expose the lock_kernel_down() hook. + +Upstream Status: RHEL only +Signed-off-by: Jeremy Cline +--- + include/linux/lsm_hook_defs.h | 2 ++ + include/linux/lsm_hooks.h | 6 ++++++ + include/linux/security.h | 5 +++++ + security/lockdown/lockdown.c | 1 + + security/security.c | 6 ++++++ + 5 files changed, 20 insertions(+) + +diff --git a/include/linux/lsm_hook_defs.h b/include/linux/lsm_hook_defs.h +index 61590c1f2d33..4c10750865c2 100644 +--- a/include/linux/lsm_hook_defs.h ++++ b/include/linux/lsm_hook_defs.h +@@ -394,6 +394,8 @@ LSM_HOOK(void, LSM_RET_VOID, bpf_prog_free_security, struct bpf_prog_aux *aux) + #endif /* CONFIG_BPF_SYSCALL */ + + LSM_HOOK(int, 0, locked_down, enum lockdown_reason what) ++LSM_HOOK(int, 0, lock_kernel_down, const char *where, enum lockdown_reason level) ++ + + #ifdef CONFIG_PERF_EVENTS + LSM_HOOK(int, 0, perf_event_open, struct perf_event_attr *attr, int type) +diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h +index 59024618554e..ab9ca4d393da 100644 +--- a/include/linux/lsm_hooks.h ++++ b/include/linux/lsm_hooks.h +@@ -1545,6 +1545,12 @@ + * + * @what: kernel feature being accessed + * ++ * @lock_kernel_down ++ * Put the kernel into lock-down mode. ++ * ++ * @where: Where the lock-down is originating from (e.g. command line option) ++ * @level: The lock-down level (can only increase) ++ * + * Security hooks for perf events + * + * @perf_event_open: +diff --git a/include/linux/security.h b/include/linux/security.h +index 46a02ce34d00..37e991a10d70 100644 +--- a/include/linux/security.h ++++ b/include/linux/security.h +@@ -472,6 +472,7 @@ int security_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen); + int security_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen); + int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen); + int security_locked_down(enum lockdown_reason what); ++int security_lock_kernel_down(const char *where, enum lockdown_reason level); + #else /* CONFIG_SECURITY */ + + static inline int call_blocking_lsm_notifier(enum lsm_event event, void *data) +@@ -1353,6 +1354,10 @@ static inline int security_locked_down(enum lockdown_reason what) + { + return 0; + } ++static inline int security_lock_kernel_down(const char *where, enum lockdown_reason level) ++{ ++ return 0; ++} + #endif /* CONFIG_SECURITY */ + + #if defined(CONFIG_SECURITY) && defined(CONFIG_WATCH_QUEUE) +diff --git a/security/lockdown/lockdown.c b/security/lockdown/lockdown.c +index 87cbdc64d272..18555cf18da7 100644 +--- a/security/lockdown/lockdown.c ++++ b/security/lockdown/lockdown.c +@@ -73,6 +73,7 @@ static int lockdown_is_locked_down(enum lockdown_reason what) + + static struct security_hook_list lockdown_hooks[] __lsm_ro_after_init = { + LSM_HOOK_INIT(locked_down, lockdown_is_locked_down), ++ LSM_HOOK_INIT(lock_kernel_down, lock_kernel_down), + }; + + static int __init lockdown_lsm_init(void) +diff --git a/security/security.c b/security/security.c +index 67264cb08fb3..85a0227bfac1 100644 +--- a/security/security.c ++++ b/security/security.c +@@ -2599,6 +2599,12 @@ int security_locked_down(enum lockdown_reason what) + } + EXPORT_SYMBOL(security_locked_down); + ++int security_lock_kernel_down(const char *where, enum lockdown_reason level) ++{ ++ return call_int_hook(lock_kernel_down, 0, where, level); ++} ++EXPORT_SYMBOL(security_lock_kernel_down); ++ + #ifdef CONFIG_PERF_EVENTS + int security_perf_event_open(struct perf_event_attr *attr, int type) + { +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: David Howells +Date: Tue, 27 Feb 2018 10:04:55 +0000 +Subject: [PATCH 14/32] efi: Add an EFI_SECURE_BOOT flag to indicate secure + boot mode + +UEFI machines can be booted in Secure Boot mode. Add an EFI_SECURE_BOOT +flag that can be passed to efi_enabled() to find out whether secure boot is +enabled. + +Move the switch-statement in x86's setup_arch() that inteprets the +secure_boot boot parameter to generic code and set the bit there. + +Upstream Status: RHEL only +Suggested-by: Ard Biesheuvel +Signed-off-by: David Howells +Reviewed-by: Ard Biesheuvel +cc: linux-efi@vger.kernel.org +[Rebased for context; efi_is_table_address was moved to arch/x86] +Signed-off-by: Jeremy Cline +--- + arch/x86/kernel/setup.c | 14 +----------- + drivers/firmware/efi/Makefile | 1 + + drivers/firmware/efi/secureboot.c | 38 +++++++++++++++++++++++++++++++ + include/linux/efi.h | 19 ++++++++++------ + 4 files changed, 52 insertions(+), 20 deletions(-) + create mode 100644 drivers/firmware/efi/secureboot.c + +diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c +index d71267081153..da9c2e03a179 100644 +--- a/arch/x86/kernel/setup.c ++++ b/arch/x86/kernel/setup.c +@@ -1106,19 +1106,7 @@ void __init setup_arch(char **cmdline_p) + /* Allocate bigger log buffer */ + setup_log_buf(1); + +- if (efi_enabled(EFI_BOOT)) { +- switch (boot_params.secure_boot) { +- case efi_secureboot_mode_disabled: +- pr_info("Secure boot disabled\n"); +- break; +- case efi_secureboot_mode_enabled: +- pr_info("Secure boot enabled\n"); +- break; +- default: +- pr_info("Secure boot could not be determined\n"); +- break; +- } +- } ++ efi_set_secure_boot(boot_params.secure_boot); + + reserve_initrd(); + +diff --git a/drivers/firmware/efi/Makefile b/drivers/firmware/efi/Makefile +index c02ff25dd477..d860f8eb9a81 100644 +--- a/drivers/firmware/efi/Makefile ++++ b/drivers/firmware/efi/Makefile +@@ -28,6 +28,7 @@ obj-$(CONFIG_EFI_FAKE_MEMMAP) += fake_map.o + obj-$(CONFIG_EFI_BOOTLOADER_CONTROL) += efibc.o + obj-$(CONFIG_EFI_TEST) += test/ + obj-$(CONFIG_EFI_DEV_PATH_PARSER) += dev-path-parser.o ++obj-$(CONFIG_EFI) += secureboot.o + obj-$(CONFIG_APPLE_PROPERTIES) += apple-properties.o + obj-$(CONFIG_EFI_RCI2_TABLE) += rci2-table.o + obj-$(CONFIG_EFI_EMBEDDED_FIRMWARE) += embedded-firmware.o +diff --git a/drivers/firmware/efi/secureboot.c b/drivers/firmware/efi/secureboot.c +new file mode 100644 +index 000000000000..de0a3714a5d4 +--- /dev/null ++++ b/drivers/firmware/efi/secureboot.c +@@ -0,0 +1,38 @@ ++/* Core kernel secure boot support. ++ * ++ * Copyright (C) 2017 Red Hat, Inc. All Rights Reserved. ++ * Written by David Howells (dhowells@redhat.com) ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public Licence ++ * as published by the Free Software Foundation; either version ++ * 2 of the Licence, or (at your option) any later version. ++ */ ++ ++#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt ++ ++#include ++#include ++#include ++ ++/* ++ * Decide what to do when UEFI secure boot mode is enabled. ++ */ ++void __init efi_set_secure_boot(enum efi_secureboot_mode mode) ++{ ++ if (efi_enabled(EFI_BOOT)) { ++ switch (mode) { ++ case efi_secureboot_mode_disabled: ++ pr_info("Secure boot disabled\n"); ++ break; ++ case efi_secureboot_mode_enabled: ++ set_bit(EFI_SECURE_BOOT, &efi.flags); ++ pr_info("Secure boot enabled\n"); ++ break; ++ default: ++ pr_warn("Secure boot could not be determined (mode %u)\n", ++ mode); ++ break; ++ } ++ } ++} +diff --git a/include/linux/efi.h b/include/linux/efi.h +index cbac8a7db3bd..fd4a5d66a9d0 100644 +--- a/include/linux/efi.h ++++ b/include/linux/efi.h +@@ -784,6 +784,14 @@ extern int __init efi_setup_pcdp_console(char *); + #define EFI_MEM_ATTR 10 /* Did firmware publish an EFI_MEMORY_ATTRIBUTES table? */ + #define EFI_MEM_NO_SOFT_RESERVE 11 /* Is the kernel configured to ignore soft reservations? */ + #define EFI_PRESERVE_BS_REGIONS 12 /* Are EFI boot-services memory segments available? */ ++#define EFI_SECURE_BOOT 13 /* Are we in Secure Boot mode? */ ++ ++enum efi_secureboot_mode { ++ efi_secureboot_mode_unset, ++ efi_secureboot_mode_unknown, ++ efi_secureboot_mode_disabled, ++ efi_secureboot_mode_enabled, ++}; + + #ifdef CONFIG_EFI + /* +@@ -795,6 +803,8 @@ static inline bool efi_enabled(int feature) + } + extern void efi_reboot(enum reboot_mode reboot_mode, const char *__unused); + ++extern void __init efi_set_secure_boot(enum efi_secureboot_mode mode); ++ + bool __pure __efi_soft_reserve_enabled(void); + + static inline bool __pure efi_soft_reserve_enabled(void) +@@ -815,6 +825,8 @@ static inline bool efi_enabled(int feature) + static inline void + efi_reboot(enum reboot_mode reboot_mode, const char *__unused) {} + ++static inline void efi_set_secure_boot(enum efi_secureboot_mode mode) {} ++ + static inline bool efi_soft_reserve_enabled(void) + { + return false; +@@ -1080,13 +1092,6 @@ static inline bool efi_runtime_disabled(void) { return true; } + extern void efi_call_virt_check_flags(unsigned long flags, const char *call); + extern unsigned long efi_call_virt_save_flags(void); + +-enum efi_secureboot_mode { +- efi_secureboot_mode_unset, +- efi_secureboot_mode_unknown, +- efi_secureboot_mode_disabled, +- efi_secureboot_mode_enabled, +-}; +- + static inline + enum efi_secureboot_mode efi_get_secureboot_mode(efi_get_variable_t *get_var) + { +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: David Howells +Date: Mon, 30 Sep 2019 21:28:16 +0000 +Subject: [PATCH 15/32] efi: Lock down the kernel if booted in secure boot mode + +UEFI Secure Boot provides a mechanism for ensuring that the firmware +will only load signed bootloaders and kernels. Certain use cases may +also require that all kernel modules also be signed. Add a +configuration option that to lock down the kernel - which includes +requiring validly signed modules - if the kernel is secure-booted. + +Upstream Status: RHEL only +Signed-off-by: David Howells +Signed-off-by: Jeremy Cline +--- + arch/x86/kernel/setup.c | 8 ++++++++ + security/lockdown/Kconfig | 13 +++++++++++++ + 2 files changed, 21 insertions(+) + +diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c +index da9c2e03a179..5f7b1c67ddcc 100644 +--- a/arch/x86/kernel/setup.c ++++ b/arch/x86/kernel/setup.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -941,6 +942,13 @@ void __init setup_arch(char **cmdline_p) + if (efi_enabled(EFI_BOOT)) + efi_init(); + ++ efi_set_secure_boot(boot_params.secure_boot); ++ ++#ifdef CONFIG_LOCK_DOWN_IN_EFI_SECURE_BOOT ++ if (efi_enabled(EFI_SECURE_BOOT)) ++ security_lock_kernel_down("EFI Secure Boot mode", LOCKDOWN_INTEGRITY_MAX); ++#endif ++ + dmi_setup(); + + /* +diff --git a/security/lockdown/Kconfig b/security/lockdown/Kconfig +index e84ddf484010..d0501353a4b9 100644 +--- a/security/lockdown/Kconfig ++++ b/security/lockdown/Kconfig +@@ -16,6 +16,19 @@ config SECURITY_LOCKDOWN_LSM_EARLY + subsystem is fully initialised. If enabled, lockdown will + unconditionally be called before any other LSMs. + ++config LOCK_DOWN_IN_EFI_SECURE_BOOT ++ bool "Lock down the kernel in EFI Secure Boot mode" ++ default n ++ depends on EFI && SECURITY_LOCKDOWN_LSM_EARLY ++ help ++ UEFI Secure Boot provides a mechanism for ensuring that the firmware ++ will only load signed bootloaders and kernels. Secure boot mode may ++ be determined from EFI variables provided by the system firmware if ++ not indicated by the boot parameters. ++ ++ Enabling this option results in kernel lockdown being triggered if ++ EFI Secure Boot is set. ++ + choice + prompt "Kernel default lockdown mode" + default LOCK_DOWN_KERNEL_FORCE_NONE +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jeremy Cline +Date: Wed, 30 Oct 2019 14:37:49 +0000 +Subject: [PATCH 16/32] s390: Lock down the kernel when the IPL secure flag is + set + +Automatically lock down the kernel to LOCKDOWN_CONFIDENTIALITY_MAX if +the IPL secure flag is set. + +Upstream Status: RHEL only +Suggested-by: Philipp Rudo +Signed-off-by: Jeremy Cline +--- + arch/s390/include/asm/ipl.h | 1 + + arch/s390/kernel/ipl.c | 5 +++++ + arch/s390/kernel/setup.c | 4 ++++ + 3 files changed, 10 insertions(+) + +diff --git a/arch/s390/include/asm/ipl.h b/arch/s390/include/asm/ipl.h +index 3f8ee257f9aa..3ab92feb6241 100644 +--- a/arch/s390/include/asm/ipl.h ++++ b/arch/s390/include/asm/ipl.h +@@ -128,6 +128,7 @@ int ipl_report_add_component(struct ipl_report *report, struct kexec_buf *kbuf, + unsigned char flags, unsigned short cert); + int ipl_report_add_certificate(struct ipl_report *report, void *key, + unsigned long addr, unsigned long len); ++bool ipl_get_secureboot(void); + + /* + * DIAG 308 support +diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c +index 5ad1dde23dc5..b6192d58eed3 100644 +--- a/arch/s390/kernel/ipl.c ++++ b/arch/s390/kernel/ipl.c +@@ -2216,3 +2216,8 @@ int ipl_report_free(struct ipl_report *report) + } + + #endif ++ ++bool ipl_get_secureboot(void) ++{ ++ return !!ipl_secure_flag; ++} +diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c +index ee67215a678a..931955a9ceca 100644 +--- a/arch/s390/kernel/setup.c ++++ b/arch/s390/kernel/setup.c +@@ -49,6 +49,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -970,6 +971,9 @@ void __init setup_arch(char **cmdline_p) + + log_component_list(); + ++ if (ipl_get_secureboot()) ++ security_lock_kernel_down("Secure IPL mode", LOCKDOWN_INTEGRITY_MAX); ++ + /* Have one command line that is parsed and saved in /proc/cmdline */ + /* boot_command_line has been already set up in early.c */ + *cmdline_p = boot_command_line; +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Wed, 26 Feb 2020 13:38:40 -0500 +Subject: [PATCH 17/32] Add option of 13 for FORCE_MAX_ZONEORDER + +This is a hack, but it's what the other distros currently use +for aarch64 with 4K pages so we'll do the same while upstream +decides what the best outcome is (which isn't this). + +Upstream Status: RHEL only +Signed-off-by: Peter Robinson +[Add a dependency on RHEL_DIFFERENCES] +Signed-off-by: Jeremy Cline +--- + arch/arm64/Kconfig | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig +index c987f305f429..e14e8636574e 100644 +--- a/arch/arm64/Kconfig ++++ b/arch/arm64/Kconfig +@@ -1152,6 +1152,7 @@ config XEN + config FORCE_MAX_ZONEORDER + int + default "14" if ARM64_64K_PAGES ++ default "13" if (ARCH_THUNDER && !ARM64_64K_PAGES && !RHEL_DIFFERENCES) + default "12" if ARM64_16K_PAGES + default "11" + help +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jon Masters +Date: Thu, 18 Jul 2019 15:47:26 -0400 +Subject: [PATCH 18/32] arm: make CONFIG_HIGHPTE optional without CONFIG_EXPERT + +We will use this to force CONFIG_HIGHPTE off on LPAE for now + +Signed-off-by: Jon Masters +--- + arch/arm/Kconfig | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig +index 4ebd512043be..6743668b7b33 100644 +--- a/arch/arm/Kconfig ++++ b/arch/arm/Kconfig +@@ -1471,9 +1471,9 @@ config HIGHMEM + If unsure, say n. + + config HIGHPTE +- bool "Allocate 2nd-level pagetables from highmem" if EXPERT ++ bool "Allocate 2nd-level pagetables from highmem" + depends on HIGHMEM +- default y ++ default n + help + The VM uses one page of physical memory for each page table. + For systems with a lot of processes, this can use a lot of +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Thu, 3 May 2012 20:27:11 +0100 +Subject: [PATCH 19/32] ARM: tegra: usb no reset + +Patch for disconnect issues with storage attached to a + tegra-ehci controller +--- + drivers/usb/core/hub.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c +index 00070a8a6507..e9e0ffa990cd 100644 +--- a/drivers/usb/core/hub.c ++++ b/drivers/usb/core/hub.c +@@ -5666,6 +5666,13 @@ static void hub_event(struct work_struct *work) + (u16) hub->change_bits[0], + (u16) hub->event_bits[0]); + ++ /* Don't disconnect USB-SATA on TrimSlice */ ++ if (strcmp(dev_name(hdev->bus->controller), "tegra-ehci.0") == 0) { ++ if ((hdev->state == 7) && (hub->change_bits[0] == 0) && ++ (hub->event_bits[0] == 0x2)) ++ hub->event_bits[0] = 0; ++ } ++ + /* Lock the device, then check to see if we were + * disconnected while waiting for the lock to succeed. */ + usb_lock_device(hdev); +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Tissoires +Date: Mon, 3 Apr 2017 18:18:21 +0200 +Subject: [PATCH 20/32] Input: rmi4 - remove the need for artificial IRQ in + case of HID + +The IRQ from rmi4 may interfere with the one we currently use on i2c-hid. +Given that there is already a need for an external API from rmi4 to +forward the attention data, we can, in this particular case rely on a +separate workqueue to prevent cursor jumps. + +Reported-by: Cameron Gutman +Reported-by: Thorsten Leemhuis +Reported-by: Jason Ekstrand +Tested-by: Andrew Duggan +Signed-off-by: Benjamin Tissoires +Signed-off-by: Lyude +--- + drivers/hid/hid-rmi.c | 64 ----------------- + drivers/input/rmi4/rmi_driver.c | 124 +++++++++++++++++++------------- + include/linux/rmi.h | 1 + + 3 files changed, 75 insertions(+), 114 deletions(-) + +diff --git a/drivers/hid/hid-rmi.c b/drivers/hid/hid-rmi.c +index 311eee599ce9..2460c6bd46f8 100644 +--- a/drivers/hid/hid-rmi.c ++++ b/drivers/hid/hid-rmi.c +@@ -322,19 +322,12 @@ static int rmi_input_event(struct hid_device *hdev, u8 *data, int size) + { + struct rmi_data *hdata = hid_get_drvdata(hdev); + struct rmi_device *rmi_dev = hdata->xport.rmi_dev; +- unsigned long flags; + + if (!(test_bit(RMI_STARTED, &hdata->flags))) + return 0; + +- local_irq_save(flags); +- + rmi_set_attn_data(rmi_dev, data[1], &data[2], size - 2); + +- generic_handle_irq(hdata->rmi_irq); +- +- local_irq_restore(flags); +- + return 1; + } + +@@ -591,56 +584,6 @@ static const struct rmi_transport_ops hid_rmi_ops = { + .reset = rmi_hid_reset, + }; + +-static void rmi_irq_teardown(void *data) +-{ +- struct rmi_data *hdata = data; +- struct irq_domain *domain = hdata->domain; +- +- if (!domain) +- return; +- +- irq_dispose_mapping(irq_find_mapping(domain, 0)); +- +- irq_domain_remove(domain); +- hdata->domain = NULL; +- hdata->rmi_irq = 0; +-} +- +-static int rmi_irq_map(struct irq_domain *h, unsigned int virq, +- irq_hw_number_t hw_irq_num) +-{ +- irq_set_chip_and_handler(virq, &dummy_irq_chip, handle_simple_irq); +- +- return 0; +-} +- +-static const struct irq_domain_ops rmi_irq_ops = { +- .map = rmi_irq_map, +-}; +- +-static int rmi_setup_irq_domain(struct hid_device *hdev) +-{ +- struct rmi_data *hdata = hid_get_drvdata(hdev); +- int ret; +- +- hdata->domain = irq_domain_create_linear(hdev->dev.fwnode, 1, +- &rmi_irq_ops, hdata); +- if (!hdata->domain) +- return -ENOMEM; +- +- ret = devm_add_action_or_reset(&hdev->dev, &rmi_irq_teardown, hdata); +- if (ret) +- return ret; +- +- hdata->rmi_irq = irq_create_mapping(hdata->domain, 0); +- if (hdata->rmi_irq <= 0) { +- hid_err(hdev, "Can't allocate an IRQ\n"); +- return hdata->rmi_irq < 0 ? hdata->rmi_irq : -ENXIO; +- } +- +- return 0; +-} +- + static int rmi_probe(struct hid_device *hdev, const struct hid_device_id *id) + { + struct rmi_data *data = NULL; +@@ -713,18 +656,11 @@ static int rmi_probe(struct hid_device *hdev, const struct hid_device_id *id) + + mutex_init(&data->page_mutex); + +- ret = rmi_setup_irq_domain(hdev); +- if (ret) { +- hid_err(hdev, "failed to allocate IRQ domain\n"); +- return ret; +- } +- + if (data->device_flags & RMI_DEVICE_HAS_PHYS_BUTTONS) + rmi_hid_pdata.gpio_data.disable = true; + + data->xport.dev = hdev->dev.parent; + data->xport.pdata = rmi_hid_pdata; +- data->xport.pdata.irq = data->rmi_irq; + data->xport.proto_name = "hid"; + data->xport.ops = &hid_rmi_ops; + +diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c +index 258d5fe3d395..f7298e3dc8f3 100644 +--- a/drivers/input/rmi4/rmi_driver.c ++++ b/drivers/input/rmi4/rmi_driver.c +@@ -182,34 +182,47 @@ void rmi_set_attn_data(struct rmi_device *rmi_dev, unsigned long irq_status, + attn_data.data = fifo_data; + + kfifo_put(&drvdata->attn_fifo, attn_data); ++ ++ schedule_work(&drvdata->attn_work); + } + EXPORT_SYMBOL_GPL(rmi_set_attn_data); + +-static irqreturn_t rmi_irq_fn(int irq, void *dev_id) ++static void attn_callback(struct work_struct *work) + { +- struct rmi_device *rmi_dev = dev_id; +- struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev); ++ struct rmi_driver_data *drvdata = container_of(work, ++ struct rmi_driver_data, ++ attn_work); + struct rmi4_attn_data attn_data = {0}; + int ret, count; + + count = kfifo_get(&drvdata->attn_fifo, &attn_data); +- if (count) { +- *(drvdata->irq_status) = attn_data.irq_status; +- drvdata->attn_data = attn_data; +- } ++ if (!count) ++ return; + +- ret = rmi_process_interrupt_requests(rmi_dev); ++ *(drvdata->irq_status) = attn_data.irq_status; ++ drvdata->attn_data = attn_data; ++ ++ ret = rmi_process_interrupt_requests(drvdata->rmi_dev); + if (ret) +- rmi_dbg(RMI_DEBUG_CORE, &rmi_dev->dev, ++ rmi_dbg(RMI_DEBUG_CORE, &drvdata->rmi_dev->dev, + "Failed to process interrupt request: %d\n", ret); + +- if (count) { +- kfree(attn_data.data); +- drvdata->attn_data.data = NULL; +- } ++ kfree(attn_data.data); ++ drvdata->attn_data.data = NULL; + + if (!kfifo_is_empty(&drvdata->attn_fifo)) +- return rmi_irq_fn(irq, dev_id); ++ schedule_work(&drvdata->attn_work); ++} ++ ++static irqreturn_t rmi_irq_fn(int irq, void *dev_id) ++{ ++ struct rmi_device *rmi_dev = dev_id; ++ int ret; ++ ++ ret = rmi_process_interrupt_requests(rmi_dev); ++ if (ret) ++ rmi_dbg(RMI_DEBUG_CORE, &rmi_dev->dev, ++ "Failed to process interrupt request: %d\n", ret); + + return IRQ_HANDLED; + } +@@ -217,7 +230,6 @@ static irqreturn_t rmi_irq_fn(int irq, void *dev_id) + static int rmi_irq_init(struct rmi_device *rmi_dev) + { + struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev); +- struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev); + int irq_flags = irq_get_trigger_type(pdata->irq); + int ret; + +@@ -235,8 +247,6 @@ static int rmi_irq_init(struct rmi_device *rmi_dev) + return ret; + } + +- data->enabled = true; +- + return 0; + } + +@@ -886,23 +896,27 @@ void rmi_enable_irq(struct rmi_device *rmi_dev, bool clear_wake) + if (data->enabled) + goto out; + +- enable_irq(irq); +- data->enabled = true; +- if (clear_wake && device_may_wakeup(rmi_dev->xport->dev)) { +- retval = disable_irq_wake(irq); +- if (retval) +- dev_warn(&rmi_dev->dev, +- "Failed to disable irq for wake: %d\n", +- retval); +- } ++ if (irq) { ++ enable_irq(irq); ++ data->enabled = true; ++ if (clear_wake && device_may_wakeup(rmi_dev->xport->dev)) { ++ retval = disable_irq_wake(irq); ++ if (retval) ++ dev_warn(&rmi_dev->dev, ++ "Failed to disable irq for wake: %d\n", ++ retval); ++ } + +- /* +- * Call rmi_process_interrupt_requests() after enabling irq, +- * otherwise we may lose interrupt on edge-triggered systems. +- */ +- irq_flags = irq_get_trigger_type(pdata->irq); +- if (irq_flags & IRQ_TYPE_EDGE_BOTH) +- rmi_process_interrupt_requests(rmi_dev); ++ /* ++ * Call rmi_process_interrupt_requests() after enabling irq, ++ * otherwise we may lose interrupt on edge-triggered systems. ++ */ ++ irq_flags = irq_get_trigger_type(pdata->irq); ++ if (irq_flags & IRQ_TYPE_EDGE_BOTH) ++ rmi_process_interrupt_requests(rmi_dev); ++ } else { ++ data->enabled = true; ++ } + + out: + mutex_unlock(&data->enabled_mutex); +@@ -922,20 +936,22 @@ void rmi_disable_irq(struct rmi_device *rmi_dev, bool enable_wake) + goto out; + + data->enabled = false; +- disable_irq(irq); +- if (enable_wake && device_may_wakeup(rmi_dev->xport->dev)) { +- retval = enable_irq_wake(irq); +- if (retval) +- dev_warn(&rmi_dev->dev, +- "Failed to enable irq for wake: %d\n", +- retval); +- } +- +- /* make sure the fifo is clean */ +- while (!kfifo_is_empty(&data->attn_fifo)) { +- count = kfifo_get(&data->attn_fifo, &attn_data); +- if (count) +- kfree(attn_data.data); ++ if (irq) { ++ disable_irq(irq); ++ if (enable_wake && device_may_wakeup(rmi_dev->xport->dev)) { ++ retval = enable_irq_wake(irq); ++ if (retval) ++ dev_warn(&rmi_dev->dev, ++ "Failed to enable irq for wake: %d\n", ++ retval); ++ } ++ } else { ++ /* make sure the fifo is clean */ ++ while (!kfifo_is_empty(&data->attn_fifo)) { ++ count = kfifo_get(&data->attn_fifo, &attn_data); ++ if (count) ++ kfree(attn_data.data); ++ } + } + + out: +@@ -981,6 +997,8 @@ static int rmi_driver_remove(struct device *dev) + irq_domain_remove(data->irqdomain); + data->irqdomain = NULL; + ++ cancel_work_sync(&data->attn_work); ++ + rmi_f34_remove_sysfs(rmi_dev); + rmi_free_function_list(rmi_dev); + +@@ -1219,9 +1237,15 @@ static int rmi_driver_probe(struct device *dev) + } + } + +- retval = rmi_irq_init(rmi_dev); +- if (retval < 0) +- goto err_destroy_functions; ++ if (pdata->irq) { ++ retval = rmi_irq_init(rmi_dev); ++ if (retval < 0) ++ goto err_destroy_functions; ++ } ++ ++ data->enabled = true; ++ ++ INIT_WORK(&data->attn_work, attn_callback); + + if (data->f01_container->dev.driver) { + /* Driver already bound, so enable ATTN now. */ +diff --git a/include/linux/rmi.h b/include/linux/rmi.h +index ab7eea01ab42..fff7c5f737fc 100644 +--- a/include/linux/rmi.h ++++ b/include/linux/rmi.h +@@ -364,6 +364,7 @@ struct rmi_driver_data { + + struct rmi4_attn_data attn_data; + DECLARE_KFIFO(attn_fifo, struct rmi4_attn_data, 16); ++ struct work_struct attn_work; + }; + + int rmi_register_transport_device(struct rmi_transport_dev *xport); +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Robert Holmes +Date: Tue, 23 Apr 2019 07:39:29 +0000 +Subject: [PATCH 21/32] KEYS: Make use of platform keyring for module signature + verify + +This patch completes commit 278311e417be ("kexec, KEYS: Make use of +platform keyring for signature verify") which, while adding the +platform keyring for bzImage verification, neglected to also add +this keyring for module verification. + +As such, kernel modules signed with keys from the MokList variable +were not successfully verified. + +Signed-off-by: Robert Holmes +Signed-off-by: Jeremy Cline +--- + kernel/module_signing.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/kernel/module_signing.c b/kernel/module_signing.c +index 8723ae70ea1f..fb2d773498c2 100644 +--- a/kernel/module_signing.c ++++ b/kernel/module_signing.c +@@ -38,8 +38,15 @@ int mod_verify_sig(const void *mod, struct load_info *info) + modlen -= sig_len + sizeof(ms); + info->len = modlen; + +- return verify_pkcs7_signature(mod, modlen, mod + modlen, sig_len, ++ ret = verify_pkcs7_signature(mod, modlen, mod + modlen, sig_len, + VERIFY_USE_SECONDARY_KEYRING, + VERIFYING_MODULE_SIGNATURE, + NULL, NULL); ++ if (ret == -ENOKEY && IS_ENABLED(CONFIG_INTEGRITY_PLATFORM_KEYRING)) { ++ ret = verify_pkcs7_signature(mod, modlen, mod + modlen, sig_len, ++ VERIFY_USE_PLATFORM_KEYRING, ++ VERIFYING_MODULE_SIGNATURE, ++ NULL, NULL); ++ } ++ return ret; + } +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jeremy Linton +Date: Thu, 11 Mar 2021 22:15:13 -0600 +Subject: [PATCH 22/32] REDHAT: coresight: etm4x: Disable coresight on HPE + Apollo 70 + +bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1918888 + +The coresight tables on the latest Apollo 70, appear to be +damaged sufficiently to throw a few hundred lines of back-traces +during boot, lets disable it until we can get a firmware fix. + +Signed-off-by: Jeremy Linton +cc: Peter Robinson +cc: Justin M. Forbes +cc: Al Stone +--- + .../coresight/coresight-etm4x-core.c | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c +index e24252eaf8e4..368d64adeee8 100644 +--- a/drivers/hwtracing/coresight/coresight-etm4x-core.c ++++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c +@@ -9,6 +9,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -2105,6 +2106,16 @@ static const struct amba_id etm4_ids[] = { + {}, + }; + ++static const struct dmi_system_id broken_coresight[] = { ++ { ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "HPE"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "Apollo 70"), ++ }, ++ }, ++ { } /* terminating entry */ ++}; ++ + MODULE_DEVICE_TABLE(amba, etm4_ids); + + static struct amba_driver etm4x_amba_driver = { +@@ -2138,6 +2149,11 @@ static int __init etm4x_init(void) + { + int ret; + ++ if (dmi_check_system(broken_coresight)) { ++ pr_info("ETM4 disabled due to firmware bug\n"); ++ return 0; ++ } ++ + ret = etm4_pm_setup(); + + /* etm4_pm_setup() does its own cleanup - exit on error */ +@@ -2164,6 +2180,9 @@ static int __init etm4x_init(void) + + static void __exit etm4x_exit(void) + { ++ if (dmi_check_system(broken_coresight)) ++ return; ++ + amba_driver_unregister(&etm4x_amba_driver); + platform_driver_unregister(&etm4_platform_driver); + etm4_pm_clear(); +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Mike Snitzer +Date: Tue, 13 Apr 2021 13:09:36 -0400 +Subject: [PATCH 23/32] nvme: Return BLK_STS_TARGET if the DNR bit is set + +BZ: 1948690 +Upstream Status: RHEL-only + +Signed-off-by: Mike Snitzer + +rhel-8.git commit ef4ab90c12db5e0e50800ec323736b95be7a6ff5 +Author: Mike Snitzer +Date: Tue Aug 25 21:52:45 2020 -0400 + + [nvme] nvme: Return BLK_STS_TARGET if the DNR bit is set + + Message-id: <20200825215248.2291-8-snitzer@redhat.com> + Patchwork-id: 325178 + Patchwork-instance: patchwork + O-Subject: [RHEL8.3 PATCH 07/10] nvme: Return BLK_STS_TARGET if the DNR bit is set + Bugzilla: 1843515 + RH-Acked-by: David Milburn + RH-Acked-by: Gopal Tiwari + RH-Acked-by: Ewan Milne + + BZ: 1843515 + Upstream Status: RHEL-only + + If the DNR bit is set we should not retry the command, even if + the standard status evaluation indicates so. + + SUSE is carrying this patch in their kernel: + https://lwn.net/Articles/800370/ + + Based on patch posted for upstream inclusion but rejected: + v1: https://lore.kernel.org/linux-nvme/20190806111036.113233-1-hare@suse.de/ + v2: https://lore.kernel.org/linux-nvme/20190807071208.101882-1-hare@suse.de/ + v2-keith: https://lore.kernel.org/linux-nvme/20190807144725.GB25621@localhost.localdomain/ + v3: https://lore.kernel.org/linux-nvme/20190812075147.79598-1-hare@suse.de/ + v3-keith: https://lore.kernel.org/linux-nvme/20190813141510.GB32686@localhost.localdomain/ + + This commit's change is basically "v3-keith". + + Signed-off-by: Mike Snitzer + Signed-off-by: Frantisek Hrbata +--- + drivers/nvme/host/core.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c +index f8dd664b2eda..8c2d88526b1d 100644 +--- a/drivers/nvme/host/core.c ++++ b/drivers/nvme/host/core.c +@@ -262,6 +262,9 @@ static void nvme_delete_ctrl_sync(struct nvme_ctrl *ctrl) + + static blk_status_t nvme_error_status(u16 status) + { ++ if (unlikely(status & NVME_SC_DNR)) ++ return BLK_STS_TARGET; ++ + switch (status & 0x7ff) { + case NVME_SC_SUCCESS: + return BLK_STS_OK; +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Mike Snitzer +Date: Tue, 13 Apr 2021 13:09:36 -0400 +Subject: [PATCH 24/32] nvme: allow local retry and proper failover for + REQ_FAILFAST_TRANSPORT + +BZ: 1948690 +Upstream Status: RHEL-only + +This commit offers a more minimalist version of these 2 rhel-8.git commits: +f8fb6ea1226e2 [nvme] nvme: update failover handling to work with REQ_FAILFAST_TRANSPORT +7dadadb072515 [nvme] nvme: allow retry for requests with REQ_FAILFAST_TRANSPORT set + +REQ_FAILFAST_TRANSPORT is set by upper layer software that handles +multipathing. Unlike SCSI, NVMe's error handling was specifically +designed to handle local retry for non-path errors. As such, allow +NVMe's local retry mechanism to be used for requests marked with +REQ_FAILFAST_TRANSPORT. + +In this way, the mechanism of NVMe multipath or other multipath are +now equivalent. The mechanism is: non path related error will be +retried locally, path related error is handled by multipath. + +Also, introduce FAILUP handling for REQ_FAILFAST_TRANSPORT. Update +NVMe to allow failover of requests marked with either REQ_NVME_MPATH +or REQ_FAILFAST_TRANSPORT. This allows such requests to be given a +disposition of either FAILOVER or FAILUP respectively. + +nvme_complete_rq() is updated to call nvme_failup_req() if +nvme_decide_disposition() returns FAILUP. nvme_failup_req() ensures +the request is completed with a retryable path error. + +Signed-off-by: Mike Snitzer +--- + drivers/nvme/host/core.c | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c +index 8c2d88526b1d..f68e6d796be1 100644 +--- a/drivers/nvme/host/core.c ++++ b/drivers/nvme/host/core.c +@@ -324,6 +324,7 @@ enum nvme_disposition { + COMPLETE, + RETRY, + FAILOVER, ++ FAILUP, + }; + + static inline enum nvme_disposition nvme_decide_disposition(struct request *req) +@@ -331,15 +332,16 @@ static inline enum nvme_disposition nvme_decide_disposition(struct request *req) + if (likely(nvme_req(req)->status == 0)) + return COMPLETE; + +- if (blk_noretry_request(req) || ++ if ((req->cmd_flags & (REQ_FAILFAST_DEV | REQ_FAILFAST_DRIVER)) || + (nvme_req(req)->status & NVME_SC_DNR) || + nvme_req(req)->retries >= nvme_max_retries) + return COMPLETE; + +- if (req->cmd_flags & REQ_NVME_MPATH) { ++ if (req->cmd_flags & (REQ_NVME_MPATH | REQ_FAILFAST_TRANSPORT)) { + if (nvme_is_path_error(nvme_req(req)->status) || + blk_queue_dying(req->q)) +- return FAILOVER; ++ return (req->cmd_flags & REQ_NVME_MPATH) ? ++ FAILOVER : FAILUP; + } else { + if (blk_queue_dying(req->q)) + return COMPLETE; +@@ -361,6 +363,12 @@ static inline void nvme_end_req(struct request *req) + blk_mq_end_request(req, status); + } + ++static inline void nvme_failup_req(struct request *req) ++{ ++ nvme_req(req)->status = NVME_SC_HOST_PATH_ERROR; ++ nvme_end_req(req); ++} ++ + void nvme_complete_rq(struct request *req) + { + trace_nvme_complete_rq(req); +@@ -379,6 +387,9 @@ void nvme_complete_rq(struct request *req) + case FAILOVER: + nvme_failover_req(req); + return; ++ case FAILUP: ++ nvme_failup_req(req); ++ return; + } + } + EXPORT_SYMBOL_GPL(nvme_complete_rq); +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Mike Snitzer +Date: Tue, 13 Apr 2021 13:09:37 -0400 +Subject: [PATCH 25/32] nvme: decouple basic ANA log page re-read support from + native multipathing + +BZ: 1948690 +Upstream Status: RHEL-only + +This commit offers a more refined version of this rhel-8.git commit: +b904f4b8e0f90 [nvme] nvme: decouple basic ANA log page re-read support from native multipathing + +Whether or not ANA is present is a choice of the target implementation; +the host (and whether it supports multipathing) has _zero_ influence on +this. If the target declares a path as 'inaccessible' the path _is_ +inaccessible to the host. As such, ANA support should be functional +even if native multipathing is not. + +Introduce ability to always re-read ANA log page as required due to ANA +error and make current ANA state available via sysfs -- even if native +multipathing is disabled on the host (e.g. nvme_core.multipath=N). +This is achieved by factoring out nvme_update_ana() and calling it in +nvme_complete_rq() for all FAILOVER requests. + +This affords userspace access to the current ANA state independent of +which layer might be doing multipathing. This makes 'nvme list-subsys' +show ANA state for all NVMe subsystems with multiple controllers. It +also allows userspace multipath-tools to rely on the NVMe driver for +ANA support while dm-multipath takes care of multipathing. + +And as always, if embedded NVMe users do not want any performance +overhead associated with ANA or native NVMe multipathing they can +disable CONFIG_NVME_MULTIPATH. + +Signed-off-by: Mike Snitzer +--- + drivers/nvme/host/core.c | 2 ++ + drivers/nvme/host/multipath.c | 16 +++++++++++----- + drivers/nvme/host/nvme.h | 4 ++++ + 3 files changed, 17 insertions(+), 5 deletions(-) + +diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c +index f68e6d796be1..0ff9ea8340e4 100644 +--- a/drivers/nvme/host/core.c ++++ b/drivers/nvme/host/core.c +@@ -365,6 +365,8 @@ static inline void nvme_end_req(struct request *req) + + static inline void nvme_failup_req(struct request *req) + { ++ nvme_update_ana(req); ++ + nvme_req(req)->status = NVME_SC_HOST_PATH_ERROR; + nvme_end_req(req); + } +diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c +index 2f76969408b2..4c7d12e2fe70 100644 +--- a/drivers/nvme/host/multipath.c ++++ b/drivers/nvme/host/multipath.c +@@ -65,14 +65,10 @@ bool nvme_mpath_set_disk_name(struct nvme_ns *ns, char *disk_name, int *flags) + return true; + } + +-void nvme_failover_req(struct request *req) ++void nvme_update_ana(struct request *req) + { + struct nvme_ns *ns = req->q->queuedata; + u16 status = nvme_req(req)->status & 0x7ff; +- unsigned long flags; +- struct bio *bio; +- +- nvme_mpath_clear_current_path(ns); + + /* + * If we got back an ANA error, we know the controller is alive but not +@@ -83,6 +79,16 @@ void nvme_failover_req(struct request *req) + set_bit(NVME_NS_ANA_PENDING, &ns->flags); + queue_work(nvme_wq, &ns->ctrl->ana_work); + } ++} ++ ++void nvme_failover_req(struct request *req) ++{ ++ struct nvme_ns *ns = req->q->queuedata; ++ unsigned long flags; ++ struct bio *bio; ++ ++ nvme_mpath_clear_current_path(ns); ++ nvme_update_ana(req); + + spin_lock_irqsave(&ns->head->requeue_lock, flags); + for (bio = req->bio; bio; bio = bio->bi_next) +diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h +index ed79a6c7e804..961dc67d7261 100644 +--- a/drivers/nvme/host/nvme.h ++++ b/drivers/nvme/host/nvme.h +@@ -746,6 +746,7 @@ void nvme_mpath_wait_freeze(struct nvme_subsystem *subsys); + void nvme_mpath_start_freeze(struct nvme_subsystem *subsys); + bool nvme_mpath_set_disk_name(struct nvme_ns *ns, char *disk_name, int *flags); + void nvme_failover_req(struct request *req); ++void nvme_update_ana(struct request *req); + void nvme_kick_requeue_lists(struct nvme_ctrl *ctrl); + int nvme_mpath_alloc_disk(struct nvme_ctrl *ctrl,struct nvme_ns_head *head); + void nvme_mpath_add_disk(struct nvme_ns *ns, struct nvme_id_ns *id); +@@ -784,6 +785,9 @@ static inline bool nvme_mpath_set_disk_name(struct nvme_ns *ns, char *disk_name, + static inline void nvme_failover_req(struct request *req) + { + } ++static inline void nvme_update_ana(struct request *req) ++{ ++} + static inline void nvme_kick_requeue_lists(struct nvme_ctrl *ctrl) + { + } +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Mike Snitzer +Date: Tue, 25 May 2021 12:36:06 -0400 +Subject: [PATCH 26/32] nvme: nvme_mpath_init remove multipath check + +BZ: 1948690 +Upstream Status: RHEL-only + +Signed-off-by: Mike Snitzer + +rhel-8.git commit f027c2e4045d02d103c7a545181b6df0b6162ee7 +Author: David Milburn +Date: Wed Jan 29 15:29:37 2020 -0500 + + [nvme] nvme: nvme_mpath_init remove multipath check + + Message-id: <1580311777-9193-1-git-send-email-dmilburn@redhat.com> + Patchwork-id: 294254 + Patchwork-instance: patchwork + O-Subject: [RHEL8.2 PATCH] nvme: nvme_mpath_init remove multipath check + Bugzilla: 1790958 + RH-Acked-by: Gopal Tiwari + RH-Acked-by: Ewan Milne + + Marco Patalano found missing NVMe optimized/inaccessible paths when + executing "nvme list-subsys" command with native multipathing disabled. + He was able to git bisect this back to 6d0f426e ("nvme: fix multipath + crash when ANA is deactivated"). The problem is the check for multipath, + removing this is similar to RHEL commit 158eef2e ("nvme: allow ANA support + to be independent of native multipathing"), I did leave the existing + comment in place for future back ports and as a reminder to watch for + these changes in the future. + + Bugzilla: 1790958 + Build info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=26061480 + Upstream: RHEL only + Test: QE verified "nvme list-subsys" command and did sanity check with native + multipathing disabled. + + Fixes: 6d0f426e ("nvme: fix multipath crash when ANA is deactivated") + Signed-off-by: David Milburn + Signed-off-by: Bruno Meneguele +--- + drivers/nvme/host/multipath.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c +index 4c7d12e2fe70..021a4176b321 100644 +--- a/drivers/nvme/host/multipath.c ++++ b/drivers/nvme/host/multipath.c +@@ -819,8 +819,7 @@ int nvme_mpath_init_identify(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id) + int error = 0; + + /* check if multipath is enabled and we have the capability */ +- if (!multipath || !ctrl->subsys || +- !(ctrl->subsys->cmic & NVME_CTRL_CMIC_ANA)) ++ if (!ctrl->subsys || !(ctrl->subsys->cmic & NVME_CTRL_CMIC_ANA)) + return 0; + + if (!ctrl->max_namespaces || +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Herbert Xu +Date: Tue, 10 Aug 2021 17:54:28 +0800 +Subject: [PATCH 27/32] random: Add hook to override device reads and + getrandom(2) + +Upstream: RHEL only +Bugzilla: 1984784 + +This patch introduces a hook mechanism to drivers/char/random +to allow the reads on /dev/*random as well as getrandom(2) to +be overridden by an external RNG. + +This will be used to override drivers/char/random with a FIPS +RNG in a subsequent patch. + +Signed-off-by: Herbert Xu +--- + drivers/char/random.c | 115 +++++++++++++++++++++++++++++++++++++++++ + include/linux/random.h | 7 +++ + 2 files changed, 122 insertions(+) + +diff --git a/drivers/char/random.c b/drivers/char/random.c +index 605969ed0f96..4d51f1c67675 100644 +--- a/drivers/char/random.c ++++ b/drivers/char/random.c +@@ -335,6 +335,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -349,6 +350,11 @@ + + /* #define ADD_INTERRUPT_BENCH */ + ++/* ++ * Hook for external RNG. ++ */ ++static const struct random_extrng __rcu *extrng; ++ + /* + * Configuration information + */ +@@ -481,6 +487,9 @@ static int ratelimit_disable __read_mostly; + module_param_named(ratelimit_disable, ratelimit_disable, int, 0644); + MODULE_PARM_DESC(ratelimit_disable, "Disable random ratelimit suppression"); + ++static const struct file_operations extrng_random_fops; ++static const struct file_operations extrng_urandom_fops; ++ + /********************************************************************** + * + * OS independent entropy store. Here are the functions which handle +@@ -1858,6 +1867,13 @@ random_poll(struct file *file, poll_table * wait) + return mask; + } + ++static __poll_t ++extrng_poll(struct file *file, poll_table * wait) ++{ ++ /* extrng pool is always full, always read, no writes */ ++ return EPOLLIN | EPOLLRDNORM; ++} ++ + static int + write_pool(struct entropy_store *r, const char __user *buffer, size_t count) + { +@@ -1961,7 +1977,58 @@ static int random_fasync(int fd, struct file *filp, int on) + return fasync_helper(fd, filp, on, &fasync); + } + ++static int random_open(struct inode *inode, struct file *filp) ++{ ++ const struct random_extrng *rng; ++ ++ rcu_read_lock(); ++ rng = rcu_dereference(extrng); ++ if (rng && !try_module_get(rng->owner)) ++ rng = NULL; ++ rcu_read_unlock(); ++ ++ if (!rng) ++ return 0; ++ ++ filp->f_op = &extrng_random_fops; ++ filp->private_data = rng->owner; ++ ++ return 0; ++} ++ ++static int urandom_open(struct inode *inode, struct file *filp) ++{ ++ const struct random_extrng *rng; ++ ++ rcu_read_lock(); ++ rng = rcu_dereference(extrng); ++ if (rng && !try_module_get(rng->owner)) ++ rng = NULL; ++ rcu_read_unlock(); ++ ++ if (!rng) ++ return 0; ++ ++ filp->f_op = &extrng_urandom_fops; ++ filp->private_data = rng->owner; ++ ++ return 0; ++} ++ ++static int extrng_release(struct inode *inode, struct file *filp) ++{ ++ module_put(filp->private_data); ++ return 0; ++} ++ ++static ssize_t ++extrng_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) ++{ ++ return rcu_dereference_raw(extrng)->extrng_read(buf, nbytes); ++} ++ + const struct file_operations random_fops = { ++ .open = random_open, + .read = random_read, + .write = random_write, + .poll = random_poll, +@@ -1972,6 +2039,7 @@ const struct file_operations random_fops = { + }; + + const struct file_operations urandom_fops = { ++ .open = urandom_open, + .read = urandom_read, + .write = random_write, + .unlocked_ioctl = random_ioctl, +@@ -1980,9 +2048,31 @@ const struct file_operations urandom_fops = { + .llseek = noop_llseek, + }; + ++static const struct file_operations extrng_random_fops = { ++ .open = random_open, ++ .read = extrng_read, ++ .write = random_write, ++ .poll = extrng_poll, ++ .unlocked_ioctl = random_ioctl, ++ .fasync = random_fasync, ++ .llseek = noop_llseek, ++ .release = extrng_release, ++}; ++ ++static const struct file_operations extrng_urandom_fops = { ++ .open = urandom_open, ++ .read = extrng_read, ++ .write = random_write, ++ .unlocked_ioctl = random_ioctl, ++ .fasync = random_fasync, ++ .llseek = noop_llseek, ++ .release = extrng_release, ++}; ++ + SYSCALL_DEFINE3(getrandom, char __user *, buf, size_t, count, + unsigned int, flags) + { ++ const struct random_extrng *rng; + int ret; + + if (flags & ~(GRND_NONBLOCK|GRND_RANDOM|GRND_INSECURE)) +@@ -1998,6 +2088,18 @@ SYSCALL_DEFINE3(getrandom, char __user *, buf, size_t, count, + if (count > INT_MAX) + count = INT_MAX; + ++ rcu_read_lock(); ++ rng = rcu_dereference(extrng); ++ if (rng && !try_module_get(rng->owner)) ++ rng = NULL; ++ rcu_read_unlock(); ++ ++ if (rng) { ++ ret = rng->extrng_read(buf, count); ++ module_put(rng->owner); ++ return ret; ++ } ++ + if (!(flags & GRND_INSECURE) && !crng_ready()) { + if (flags & GRND_NONBLOCK) + return -EAGAIN; +@@ -2303,3 +2405,16 @@ void add_bootloader_randomness(const void *buf, unsigned int size) + add_device_randomness(buf, size); + } + EXPORT_SYMBOL_GPL(add_bootloader_randomness); ++ ++void random_register_extrng(const struct random_extrng *rng) ++{ ++ rcu_assign_pointer(extrng, rng); ++} ++EXPORT_SYMBOL_GPL(random_register_extrng); ++ ++void random_unregister_extrng(void) ++{ ++ RCU_INIT_POINTER(extrng, NULL); ++ synchronize_rcu(); ++} ++EXPORT_SYMBOL_GPL(random_unregister_extrng); +diff --git a/include/linux/random.h b/include/linux/random.h +index f45b8be3e3c4..7ccdec68b789 100644 +--- a/include/linux/random.h ++++ b/include/linux/random.h +@@ -14,6 +14,11 @@ + + #include + ++struct random_extrng { ++ ssize_t (*extrng_read)(void __user *buf, size_t buflen); ++ struct module *owner; ++}; ++ + struct random_ready_callback { + struct list_head list; + void (*func)(struct random_ready_callback *rdy); +@@ -44,6 +49,8 @@ extern bool rng_is_initialized(void); + extern int add_random_ready_callback(struct random_ready_callback *rdy); + extern void del_random_ready_callback(struct random_ready_callback *rdy); + extern int __must_check get_random_bytes_arch(void *buf, int nbytes); ++void random_register_extrng(const struct random_extrng *rng); ++void random_unregister_extrng(void); + + #ifndef MODULE + extern const struct file_operations random_fops, urandom_fops; +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Herbert Xu +Date: Tue, 10 Aug 2021 17:56:42 +0800 +Subject: [PATCH 28/32] crypto: rng - Override drivers/char/random in FIPS mode + +Upstream: RHEL only +Bugzilla: 1984784 + +This patch overrides the drivers/char/random RNGs with the FIPS +RNG from Crypto API when FIPS mode is enabled. + +Signed-off-by: Herbert Xu +--- + crypto/rng.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 72 insertions(+), 1 deletion(-) + +diff --git a/crypto/rng.c b/crypto/rng.c +index fea082b25fe4..50a9d040bed1 100644 +--- a/crypto/rng.c ++++ b/crypto/rng.c +@@ -11,14 +11,17 @@ + #include + #include + #include ++#include ++#include + #include + #include + #include + #include ++#include ++#include + #include + #include + #include +-#include + #include + + #include "internal.h" +@@ -224,5 +227,73 @@ void crypto_unregister_rngs(struct rng_alg *algs, int count) + } + EXPORT_SYMBOL_GPL(crypto_unregister_rngs); + ++static ssize_t crypto_devrandom_read(void __user *buf, size_t buflen) ++{ ++ u8 tmp[256]; ++ ssize_t ret; ++ ++ if (!buflen) ++ return 0; ++ ++ ret = crypto_get_default_rng(); ++ if (ret) ++ return ret; ++ ++ for (;;) { ++ int err; ++ int i; ++ ++ i = min_t(int, buflen, sizeof(tmp)); ++ err = crypto_rng_get_bytes(crypto_default_rng, tmp, i); ++ if (err) { ++ ret = err; ++ break; ++ } ++ ++ if (copy_to_user(buf, tmp, i)) { ++ ret = -EFAULT; ++ break; ++ } ++ ++ buflen -= i; ++ buf += i; ++ ret += i; ++ ++ if (!buflen) ++ break; ++ ++ if (need_resched()) { ++ if (signal_pending(current)) ++ break; ++ schedule(); ++ } ++ } ++ ++ crypto_put_default_rng(); ++ memzero_explicit(tmp, sizeof(tmp)); ++ ++ return ret; ++} ++ ++static const struct random_extrng crypto_devrandom_rng = { ++ .extrng_read = crypto_devrandom_read, ++ .owner = THIS_MODULE, ++}; ++ ++static int __init crypto_rng_init(void) ++{ ++ if (fips_enabled) ++ random_register_extrng(&crypto_devrandom_rng); ++ return 0; ++} ++ ++static void __exit crypto_rng_exit(void) ++{ ++ random_unregister_extrng(); ++} ++ ++late_initcall(crypto_rng_init); ++module_exit(crypto_rng_exit); ++ + MODULE_LICENSE("GPL"); + MODULE_DESCRIPTION("Random Number Generator"); +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Dan Johansen +Date: Fri, 6 Aug 2021 00:04:27 +0200 +Subject: [PATCH 29/32] arm64: dts: rockchip: Setup USB typec port as datarole + on + +Some chargers try to put the charged device into device data +role. Before this commit this condition caused the tcpm state machine to +issue a hard reset due to a capability missmatch. + +Signed-off-by: Dan Johansen +--- + arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts b/arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts +index 9e5d07f5712e..dae8c252bc2b 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts +@@ -707,7 +707,7 @@ fusb0: fusb30x@22 { + + connector { + compatible = "usb-c-connector"; +- data-role = "host"; ++ data-role = "dual"; + label = "USB-C"; + op-sink-microwatt = <1000000>; + power-role = "dual"; +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Thu, 14 Oct 2021 20:39:42 +0200 +Subject: [PATCH 30/32] x86/PCI: Ignore E820 reservations for bridge windows on + newer systems +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Some BIOS-es contain a bug where they add addresses which map to system +RAM in the PCI host bridge window returned by the ACPI _CRS method, see +commit 4dc2287c1805 ("x86: avoid E820 regions when allocating address +space"). + +To work around this bug Linux excludes E820 reserved addresses when +allocating addresses from the PCI host bridge window since 2010. + +Recently (2020) some systems have shown-up with E820 reservations which +cover the entire _CRS returned PCI bridge memory window, causing all +attempts to assign memory to PCI BARs which have not been setup by the +BIOS to fail. For example here are the relevant dmesg bits from a +Lenovo IdeaPad 3 15IIL 81WE: + + [mem 0x000000004bc50000-0x00000000cfffffff] reserved + pci_bus 0000:00: root bus resource [mem 0x65400000-0xbfffffff window] + +The ACPI specifications appear to allow this new behavior: + +The relationship between E820 and ACPI _CRS is not really very clear. +ACPI v6.3, sec 15, table 15-374, says AddressRangeReserved means: + + This range of addresses is in use or reserved by the system and is + not to be included in the allocatable memory pool of the operating + system's memory manager. + +and it may be used when: + + The address range is in use by a memory-mapped system device. + +Furthermore, sec 15.2 says: + + Address ranges defined for baseboard memory-mapped I/O devices, such + as APICs, are returned as reserved. + +A PCI host bridge qualifies as a baseboard memory-mapped I/O device, +and its apertures are in use and certainly should not be included in +the general allocatable pool, so the fact that some BIOS-es reports +the PCI aperture as "reserved" in E820 doesn't seem like a BIOS bug. + +So it seems that the excluding of E820 reserved addresses is a mistake. + +Ideally Linux would fully stop excluding E820 reserved addresses, +but then the old systems this was added for will regress. +Instead keep the old behavior for old systems, while ignoring +the E820 reservations for any systems from now on. + +Old systems are defined here as BIOS year < 2018, this was chosen to +make sure that pci_use_e820 will not be set on the currently affected +systems, while at the same time also taking into account that the +systems for which the E820 checking was originally added may have +received BIOS updates for quite a while (esp. CVE related ones), +giving them a more recent BIOS year then 2010. + +Also add pci=no_e820 and pci=use_e820 options to allow overriding +the BIOS year heuristic. + +BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=206459 +BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1868899 +BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1871793 +BugLink: https://bugs.launchpad.net/bugs/1878279 +BugLink: https://bugs.launchpad.net/bugs/1931715 +BugLink: https://bugs.launchpad.net/bugs/1932069 +BugLink: https://bugs.launchpad.net/bugs/1921649 +Cc: Benoit Grégoire +Cc: Hui Wang +Cc: stable@vger.kernel.org +Reviewed-by: Mika Westerberg +Acked-by: Rafael J. Wysocki +Signed-off-by: Hans de Goede +Acked-by: Bjorn Helgaas +--- + .../admin-guide/kernel-parameters.txt | 9 ++++++ + arch/x86/include/asm/pci_x86.h | 10 +++++++ + arch/x86/kernel/resource.c | 4 +++ + arch/x86/pci/acpi.c | 28 +++++++++++++++++++ + arch/x86/pci/common.c | 6 ++++ + 5 files changed, 57 insertions(+) + +diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt +index 1396fd2d9031..4bc97128cee8 100644 +--- a/Documentation/admin-guide/kernel-parameters.txt ++++ b/Documentation/admin-guide/kernel-parameters.txt +@@ -3949,6 +3949,15 @@ + please report a bug. + nocrs [X86] Ignore PCI host bridge windows from ACPI. + If you need to use this, please report a bug. ++ use_e820 [X86] Use E820 reservations to exclude parts of ++ PCI host bridge windows. This is a workaround ++ for BIOS defects in host bridge _CRS methods. ++ If you need to use this, please report a bug to ++ . ++ no_e820 [X86] Ignore E820 reservations for PCI host ++ bridge windows. This is the default on modern ++ hardware. If you need to use this, please report ++ a bug to . + routeirq Do IRQ routing for all PCI devices. + This is normally done in pci_enable_device(), + so this option is a temporary workaround +diff --git a/arch/x86/include/asm/pci_x86.h b/arch/x86/include/asm/pci_x86.h +index 490411dba438..0bb4e7dd0ffc 100644 +--- a/arch/x86/include/asm/pci_x86.h ++++ b/arch/x86/include/asm/pci_x86.h +@@ -39,6 +39,8 @@ do { \ + #define PCI_ROOT_NO_CRS 0x100000 + #define PCI_NOASSIGN_BARS 0x200000 + #define PCI_BIG_ROOT_WINDOW 0x400000 ++#define PCI_USE_E820 0x800000 ++#define PCI_NO_E820 0x1000000 + + extern unsigned int pci_probe; + extern unsigned long pirq_table_addr; +@@ -64,6 +66,8 @@ void pcibios_scan_specific_bus(int busn); + + /* pci-irq.c */ + ++struct pci_dev; ++ + struct irq_info { + u8 bus, devfn; /* Bus, device and function */ + struct { +@@ -232,3 +236,9 @@ static inline void mmio_config_writel(void __iomem *pos, u32 val) + # define x86_default_pci_init_irq NULL + # define x86_default_pci_fixup_irqs NULL + #endif ++ ++#if defined(CONFIG_PCI) && defined(CONFIG_ACPI) ++extern bool pci_use_e820; ++#else ++#define pci_use_e820 false ++#endif +diff --git a/arch/x86/kernel/resource.c b/arch/x86/kernel/resource.c +index 9b9fb7882c20..e8dc9bc327bd 100644 +--- a/arch/x86/kernel/resource.c ++++ b/arch/x86/kernel/resource.c +@@ -1,6 +1,7 @@ + // SPDX-License-Identifier: GPL-2.0 + #include + #include ++#include + + static void resource_clip(struct resource *res, resource_size_t start, + resource_size_t end) +@@ -28,6 +29,9 @@ static void remove_e820_regions(struct resource *avail) + int i; + struct e820_entry *entry; + ++ if (!pci_use_e820) ++ return; ++ + for (i = 0; i < e820_table->nr_entries; i++) { + entry = &e820_table->entries[i]; + +diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c +index 948656069cdd..72d473054262 100644 +--- a/arch/x86/pci/acpi.c ++++ b/arch/x86/pci/acpi.c +@@ -21,6 +21,8 @@ struct pci_root_info { + + static bool pci_use_crs = true; + static bool pci_ignore_seg = false; ++/* Consumed in arch/x86/kernel/resource.c */ ++bool pci_use_e820 = false; + + static int __init set_use_crs(const struct dmi_system_id *id) + { +@@ -160,6 +162,32 @@ void __init pci_acpi_crs_quirks(void) + "if necessary, use \"pci=%s\" and report a bug\n", + pci_use_crs ? "Using" : "Ignoring", + pci_use_crs ? "nocrs" : "use_crs"); ++ ++ /* ++ * Some BIOS-es contain a bug where they add addresses which map to ++ * system RAM in the PCI host bridge window returned by the ACPI _CRS ++ * method, see commit 4dc2287c1805 ("x86: avoid E820 regions when ++ * allocating address space"). To avoid this Linux by default excludes ++ * E820 reservations when allocating addresses since 2010. ++ * In 2020 some systems have shown-up with E820 reservations which cover ++ * the entire _CRS returned PCI host bridge window, causing all attempts ++ * to assign memory to PCI BARs to fail if Linux uses E820 reservations. ++ * ++ * Ideally Linux would fully stop using E820 reservations, but then ++ * the old systems this was added for will regress. ++ * Instead keep the old behavior for old systems, while ignoring the ++ * E820 reservations for any systems from now on. ++ */ ++ if (year >= 0 && year < 2018) ++ pci_use_e820 = true; ++ ++ if (pci_probe & PCI_NO_E820) ++ pci_use_e820 = false; ++ else if (pci_probe & PCI_USE_E820) ++ pci_use_e820 = true; ++ ++ printk(KERN_INFO "PCI: %s E820 reservations for host bridge windows\n", ++ pci_use_e820 ? "Using" : "Ignoring"); + } + + #ifdef CONFIG_PCI_MMCONFIG +diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c +index 3507f456fcd0..091ec7e94fcb 100644 +--- a/arch/x86/pci/common.c ++++ b/arch/x86/pci/common.c +@@ -595,6 +595,12 @@ char *__init pcibios_setup(char *str) + } else if (!strcmp(str, "nocrs")) { + pci_probe |= PCI_ROOT_NO_CRS; + return NULL; ++ } else if (!strcmp(str, "use_e820")) { ++ pci_probe |= PCI_USE_E820; ++ return NULL; ++ } else if (!strcmp(str, "no_e820")) { ++ pci_probe |= PCI_NO_E820; ++ return NULL; + #ifdef CONFIG_PHYS_ADDR_T_64BIT + } else if (!strcmp(str, "big_root_window")) { + pci_probe |= PCI_BIG_ROOT_WINDOW; +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Thu, 14 Oct 2021 20:39:43 +0200 +Subject: [PATCH 31/32] x86/PCI/ACPI: Replace printk calls with pr_info/pr_warn + calls + +The direct use of printk is deprecated, replace the printk calls +in arch/x86/pci/acpi.c with pr_info/pr_warn calls. + +Acked-by: Rafael J. Wysocki +Signed-off-by: Hans de Goede +--- + arch/x86/pci/acpi.c | 25 +++++++++++++------------ + 1 file changed, 13 insertions(+), 12 deletions(-) + +diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c +index 72d473054262..f357dac92610 100644 +--- a/arch/x86/pci/acpi.c ++++ b/arch/x86/pci/acpi.c +@@ -1,4 +1,7 @@ + // SPDX-License-Identifier: GPL-2.0 ++ ++#define pr_fmt(fmt) "PCI: " fmt ++ + #include + #include + #include +@@ -38,7 +41,7 @@ static int __init set_nouse_crs(const struct dmi_system_id *id) + + static int __init set_ignore_seg(const struct dmi_system_id *id) + { +- printk(KERN_INFO "PCI: %s detected: ignoring ACPI _SEG\n", id->ident); ++ pr_info("%s detected: ignoring ACPI _SEG\n", id->ident); + pci_ignore_seg = true; + return 0; + } +@@ -158,10 +161,9 @@ void __init pci_acpi_crs_quirks(void) + else if (pci_probe & PCI_USE__CRS) + pci_use_crs = true; + +- printk(KERN_INFO "PCI: %s host bridge windows from ACPI; " +- "if necessary, use \"pci=%s\" and report a bug\n", +- pci_use_crs ? "Using" : "Ignoring", +- pci_use_crs ? "nocrs" : "use_crs"); ++ pr_info("%s host bridge windows from ACPI; if necessary, use \"pci=%s\" and report a bug\n", ++ pci_use_crs ? "Using" : "Ignoring", ++ pci_use_crs ? "nocrs" : "use_crs"); + + /* + * Some BIOS-es contain a bug where they add addresses which map to +@@ -186,8 +188,8 @@ void __init pci_acpi_crs_quirks(void) + else if (pci_probe & PCI_USE_E820) + pci_use_e820 = true; + +- printk(KERN_INFO "PCI: %s E820 reservations for host bridge windows\n", +- pci_use_e820 ? "Using" : "Ignoring"); ++ pr_info("%s E820 reservations for host bridge windows\n", ++ pci_use_e820 ? "Using" : "Ignoring"); + } + + #ifdef CONFIG_PCI_MMCONFIG +@@ -362,9 +364,8 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root) + root->segment = domain = 0; + + if (domain && !pci_domains_supported) { +- printk(KERN_WARNING "pci_bus %04x:%02x: " +- "ignored (multiple domains not supported)\n", +- domain, busnum); ++ pr_warn("pci_bus %04x:%02x: ignored (multiple domains not supported)\n", ++ domain, busnum); + return NULL; + } + +@@ -432,7 +433,7 @@ int __init pci_acpi_init(void) + if (acpi_noirq) + return -ENODEV; + +- printk(KERN_INFO "PCI: Using ACPI for IRQ routing\n"); ++ pr_info("Using ACPI for IRQ routing\n"); + acpi_irq_penalty_init(); + pcibios_enable_irq = acpi_pci_irq_enable; + pcibios_disable_irq = acpi_pci_irq_disable; +@@ -444,7 +445,7 @@ int __init pci_acpi_init(void) + * also do it here in case there are still broken drivers that + * don't use pci_enable_device(). + */ +- printk(KERN_INFO "PCI: Routing PCI interrupts for all devices because \"pci=routeirq\" specified\n"); ++ pr_info("Routing PCI interrupts for all devices because \"pci=routeirq\" specified\n"); + for_each_pci_dev(dev) + acpi_pci_irq_enable(dev); + } +-- +2.31.1 + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Zekun Shen +Date: Sat, 30 Oct 2021 22:42:50 -0400 +Subject: [PATCH 32/32] mwifiex_usb: Fix skb_over_panic in mwifiex_usb_recv + +Currently, with an unknown recv_type, mwifiex_usb_recv +just return -1 without restoring the skb. Next time +mwifiex_usb_rx_complete is invoked with the same skb, +calling skb_put causes skb_over_panic. + +The bug is triggerable with a compromised/malfunctioning +usb device. After applying the patch, skb_over_panic +no longer shows up with the same input. + +Attached is the panic report from fuzzing. +skbuff: skb_over_panic: text:000000003bf1b5fa + len:2048 put:4 head:00000000dd6a115b data:000000000a9445d8 + tail:0x844 end:0x840 dev: +kernel BUG at net/core/skbuff.c:109! +invalid opcode: 0000 [#1] SMP KASAN NOPTI +CPU: 0 PID: 198 Comm: in:imklog Not tainted 5.6.0 #60 +RIP: 0010:skb_panic+0x15f/0x161 +Call Trace: + + ? mwifiex_usb_rx_complete+0x26b/0xfcd [mwifiex_usb] + skb_put.cold+0x24/0x24 + mwifiex_usb_rx_complete+0x26b/0xfcd [mwifiex_usb] + __usb_hcd_giveback_urb+0x1e4/0x380 + usb_giveback_urb_bh+0x241/0x4f0 + ? __hrtimer_run_queues+0x316/0x740 + ? __usb_hcd_giveback_urb+0x380/0x380 + tasklet_action_common.isra.0+0x135/0x330 + __do_softirq+0x18c/0x634 + irq_exit+0x114/0x140 + smp_apic_timer_interrupt+0xde/0x380 + apic_timer_interrupt+0xf/0x20 + + +Reported-by: Zekun Shen +Reported-by: Brendan Dolan-Gavitt +Signed-off-by: Zekun Shen +--- + drivers/net/wireless/marvell/mwifiex/usb.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/marvell/mwifiex/usb.c b/drivers/net/wireless/marvell/mwifiex/usb.c +index 9736aa0ab7fd..8f01fcbe9396 100644 +--- a/drivers/net/wireless/marvell/mwifiex/usb.c ++++ b/drivers/net/wireless/marvell/mwifiex/usb.c +@@ -130,7 +130,8 @@ static int mwifiex_usb_recv(struct mwifiex_adapter *adapter, + default: + mwifiex_dbg(adapter, ERROR, + "unknown recv_type %#x\n", recv_type); +- return -1; ++ ret = -1; ++ goto exit_restore_skb; + } + break; + case MWIFIEX_USB_EP_DATA: +-- +2.31.1 + diff --git a/SOURCES/filter-aarch64.sh.fedora b/SOURCES/filter-aarch64.sh.fedora new file mode 100644 index 0000000..6a5065c --- /dev/null +++ b/SOURCES/filter-aarch64.sh.fedora @@ -0,0 +1,18 @@ +#! /bin/bash + +# This is the aarch64 override file for the core/drivers package split. The +# module directories listed here and in the generic list in filter-modules.sh +# will be moved to the resulting kernel-modules package for this arch. +# Anything not listed in those files will be in the kernel-core package. +# +# Please review the default list in filter-modules.sh before making +# modifications to the overrides below. If something should be removed across +# all arches, remove it in the default instead of per-arch. + +driverdirs="atm auxdisplay bcma bluetooth firewire fpga infiniband leds media memstick message mmc mtd nfc ntb pcmcia power ssb soundwire staging tty uio w1" + +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_vdpa dfl-emif octeontx2-cpt octeontx2-cptvf spi-altera-dfl rvu_cptpf rvu_cptvf regmap-sdw regmap-sdw-mbq" diff --git a/SOURCES/filter-aarch64.sh.rhel b/SOURCES/filter-aarch64.sh.rhel new file mode 100644 index 0000000..e088c8e --- /dev/null +++ b/SOURCES/filter-aarch64.sh.rhel @@ -0,0 +1,18 @@ +#! /bin/bash + +# This is the aarch64 override file for the core/drivers package split. The +# module directories listed here and in the generic list in filter-modules.sh +# will be moved to the resulting kernel-modules package for this arch. +# Anything not listed in those files will be in the kernel-core package. +# +# Please review the default list in filter-modules.sh before making +# modifications to the overrides below. If something should be removed across +# all arches, remove it in the default instead of per-arch. + +driverdirs="atm auxdisplay bcma bluetooth firewire fmc infiniband isdn leds media memstick message mmc mtd mwave nfc ntb pcmcia platform power ssb staging tty uio uwb w1" + +ethdrvs="3com adaptec arc alteon atheros broadcom cadence calxeda chelsio cisco dec dlink emulex icplus marvell micrel myricom neterion nvidia oki-semi packetengines qlogic rdc renesas 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 radeon rockchip tegra sun4i tinydrm vc4" + +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 target_core_user sbp_target cxgbit iw_cxgb3 iw_cxgb4 cxgb3i cxgb3i cxgb3i_ddp cxgb4i chcr chtls" diff --git a/SOURCES/filter-armv7hl.sh.fedora b/SOURCES/filter-armv7hl.sh.fedora new file mode 100644 index 0000000..1231ab0 --- /dev/null +++ b/SOURCES/filter-armv7hl.sh.fedora @@ -0,0 +1,18 @@ +#! /bin/bash + +# This is the armv7hl override file for the core/drivers package split. The +# module directories listed here and in the generic list in filter-modules.sh +# will be moved to the resulting kernel-modules package for this arch. +# Anything not listed in those files will be in the kernel-core package. +# +# Please review the default list in filter-modules.sh before making +# modifications to the overrides below. If something should be removed across +# all arches, remove it in the default instead of per-arch. + +driverdirs="atm auxdisplay bcma bluetooth firewire fpga infiniband media memstick message nfc ntb pcmcia ssb soundwire staging tty uio w1" + +ethdrvs="3com adaptec alteon altera amd atheros broadcom cadence chelsio cisco dec dlink emulex mellanox micrel myricom natsemi neterion nvidia packetengines qlogic rdc sfc silan sis sun tehuti via wiznet xircom" + +drmdrvs="amd arm armada bridge ast exynos etnaviv hisilicon i2c imx meson mgag200 msm nouveau omapdrm panel pl111 radeon rockchip sti stm sun4i tegra tilcdc 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 bq27xxx_battery_hdq mlx5_vdpa dfl-emif spi-altera-dfl" diff --git a/SOURCES/filter-armv7hl.sh.rhel b/SOURCES/filter-armv7hl.sh.rhel new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/SOURCES/filter-armv7hl.sh.rhel diff --git a/SOURCES/filter-i686.sh.fedora b/SOURCES/filter-i686.sh.fedora new file mode 100644 index 0000000..3ab2f63 --- /dev/null +++ b/SOURCES/filter-i686.sh.fedora @@ -0,0 +1,14 @@ +#! /bin/bash + +# This is the i686 override file for the core/drivers package split. The +# module directories listed here and in the generic list in filter-modules.sh +# will be moved to the resulting kernel-modules package for this arch. +# Anything not listed in those files will be in the kernel-core package. +# +# Please review the default list in filter-modules.sh before making +# modifications to the overrides below. If something should be removed across +# all arches, remove it in the default instead of per-arch. + +driverdirs="atm auxdisplay bcma bluetooth firewire fpga infiniband leds media memstick mfd mmc mtd nfc ntb pcmcia platform power ssb soundwire staging tty uio w1" + +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 hid-sensor-hub hid-sensor-magn-3d hid-sensor-incl-3d hid-sensor-gyro-3d hid-sensor-iio-common hid-sensor-accel-3d hid-sensor-trigger hid-sensor-als hid-sensor-rotation hid-sensor-temperature hid-sensor-humidity target_core_user sbp_target cxgbit chcr parport_serial regmap-sdw hid-asus" diff --git a/SOURCES/filter-i686.sh.rhel b/SOURCES/filter-i686.sh.rhel new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/SOURCES/filter-i686.sh.rhel diff --git a/SOURCES/filter-modules.sh.fedora b/SOURCES/filter-modules.sh.fedora new file mode 100755 index 0000000..65f745c --- /dev/null +++ b/SOURCES/filter-modules.sh.fedora @@ -0,0 +1,177 @@ +#! /bin/bash +# +# Called as filter-modules.sh list-of-modules Arch + +# This script filters the 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-.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. + +# Overrides is individual modules which need to remain in kernel-core due to deps. +overrides="cec" + +# Set the default dirs/modules to filter out +driverdirs="atm auxdisplay bcma bluetooth firewire fpga infiniband leds media memstick mfd mmc mtd nfc ntb pcmcia platform power ssb soundwire staging tty uio w1" + +chardrvs="mwave pcmcia" + +netdrvs="appletalk can dsa hamradio ieee802154 ppp slip usb wireless" + +ethdrvs="3com adaptec alteon amd aquantia atheros broadcom cadence calxeda chelsio cisco dec dlink emulex marvell mellanox neterion nvidia packetengines qlogic rdc sfc silan sis smsc stmicro sun tehuti ti wiznet xircom" + +inputdrvs="gameport tablet touchscreen" + +hiddrvs="surface-hid" + +scsidrvs="aacraid aic7xxx be2iscsi bfa bnx2i bnx2fc csiostor cxgbi esas2r fcoe fnic isci libsas lpfc megaraid mpt3sas mvsas pm8001 qla2xxx qla4xxx sym53c8xx_2 ufs qedf" + +usbdrvs="atm image misc serial" + +fsdrvs="affs befs cifs coda cramfs dlm ecryptfs hfs hfsplus jfs jffs2 minix nilfs2 ocfs2 reiserfs romfs squashfs sysv ubifs ufs" + +netprots="6lowpan appletalk atm ax25 batman-adv bluetooth can dsa ieee802154 l2tp mac80211 mac802154 mpls netrom nfc rds rfkill rose sctp smc wireless" + +drmdrvs="amd ast bridge gma500 i2c i915 mgag200 nouveau panel radeon" + +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 parport_serial regmap-sdw regmap-sdw-mbq arizona-micsupp hid-asus iTCO_wdt rnbd-client rnbd-server mlx5_vdpa spi-altera-dfl" + +# Grab the arch-specific filter list overrides +source ./filter-$2.sh + +filter_dir() { + filelist=$1 + dir=$2 + + grep -v -e "${dir}/" ${filelist} > ${filelist}.tmp + + if [ $? -ne 0 ] + then + echo "Couldn't remove ${dir}. Skipping." + else + grep -e "${dir}/" ${filelist} >> k-d.list + mv ${filelist}.tmp $filelist + fi + + return 0 +} + +filter_ko() { + filelist=$1 + mod=$2 + + grep -v -e "${mod}.ko" ${filelist} > ${filelist}.tmp + + if [ $? -ne 0 ] + then + echo "Couldn't remove ${mod}.ko Skipping." + else + grep -e "${mod}.ko" ${filelist} >> k-d.list + mv ${filelist}.tmp $filelist + fi + + return 0 +} + +# Filter the drivers/ subsystems +for subsys in ${driverdirs} +do + filter_dir $1 drivers/${subsys} +done + +# Filter the networking drivers +for netdrv in ${netdrvs} +do + filter_dir $1 drivers/net/${netdrv} +done + +# Filter the char drivers +for char in ${chardrvs} +do + filter_dir $1 drivers/char/${char} +done + +# Filter the ethernet drivers +for eth in ${ethdrvs} +do + filter_dir $1 drivers/net/ethernet/${eth} +done + +# SCSI +for scsi in ${scsidrvs} +do + filter_dir $1 drivers/scsi/${scsi} +done + +# Input +for input in ${inputdrvs} +do + filter_dir $1 drivers/input/${input} +done + +# hid +for hid in ${hiddrvs} +do + filter_dir $1 drivers/hid/${hid} +done + +# USB +for usb in ${usbdrvs} +do + filter_dir $1 drivers/usb/${usb} +done + +# Filesystems +for fs in ${fsdrvs} +do + filter_dir $1 fs/${fs} +done + +# Network protocols +for prot in ${netprots} +do + filter_dir $1 kernel/net/${prot} +done + +# DRM +for drm in ${drmdrvs} +do + filter_dir $1 drivers/gpu/drm/${drm} +done + +# Just kill sound. +filter_dir $1 kernel/sound +filter_dir $1 kernel/drivers/soundwire + +# Now go through and filter any single .ko files that might have deps on the +# things we filtered above +for mod in ${singlemods} +do + filter_ko $1 ${mod} +done + +# Now process the override list to bring those modules back into core +for mod in ${overrides} +do + grep -v -e "/${mod}.ko" k-d.list > k-d.list.tmp + if [ $? -ne 0 ] + then + echo "Couldn't save ${mod}.ko Skipping." + else + grep -e "/${mod}.ko" k-d.list >> $filelist + mv k-d.list.tmp k-d.list + fi + +done + +# Go through our generated drivers list and remove the .ko files. We'll +# restore them later. +for mod in `cat k-d.list` +do + rm -rf $mod +done diff --git a/SOURCES/filter-modules.sh.rhel b/SOURCES/filter-modules.sh.rhel new file mode 100755 index 0000000..c4a8e59 --- /dev/null +++ b/SOURCES/filter-modules.sh.rhel @@ -0,0 +1,169 @@ +#! /bin/bash +# +# Called as filter-modules.sh list-of-modules Arch + +# This script filters the 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-.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. + +# Overrides is individual modules which need to remain in kernel-core due to deps. +overrides="cec" + +# Set the default dirs/modules to filter out +driverdirs="atm auxdisplay bcma bluetooth firewire fmc iio infiniband isdn leds media memstick mfd mmc mtd nfc ntb pcmcia platform power ssb staging tty uio uwb w1" + +chardrvs="mwave pcmcia" + +netdrvs="appletalk can dsa hamradio ieee802154 irda ppp slip usb wireless" + +ethdrvs="3com adaptec alteon amd aquantia atheros broadcom cadence calxeda chelsio cisco dec dlink emulex icplus marvell neterion nvidia oki-semi packetengines qlogic rdc renesas sfc silan sis smsc stmicro sun tehuti ti wiznet xircom" + +inputdrvs="gameport tablet touchscreen" + +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" + +fsdrvs="affs befs coda cramfs ecryptfs hfs hfsplus jfs minix ncpfs nilfs2 ocfs2 reiserfs romfs squashfs sysv ubifs ufs" + +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" + +drmdrvs="amd ast gma500 i2c i915 mgag200 nouveau radeon via " + +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" + +# Grab the arch-specific filter list overrides +source ./filter-$2.sh + +filter_dir() { + filelist=$1 + dir=$2 + + grep -v -e "${dir}/" ${filelist} > ${filelist}.tmp + + if [ $? -ne 0 ] + then + echo "Couldn't remove ${dir}. Skipping." + else + grep -e "${dir}/" ${filelist} >> k-d.list + mv ${filelist}.tmp $filelist + fi + + return 0 +} + +filter_ko() { + filelist=$1 + mod=$2 + + grep -v -e "${mod}.ko" ${filelist} > ${filelist}.tmp + + if [ $? -ne 0 ] + then + echo "Couldn't remove ${mod}.ko Skipping." + else + grep -e "${mod}.ko" ${filelist} >> k-d.list + mv ${filelist}.tmp $filelist + fi + + return 0 +} + +# Filter the drivers/ subsystems +for subsys in ${driverdirs} +do + filter_dir $1 drivers/${subsys} +done + +# Filter the networking drivers +for netdrv in ${netdrvs} +do + filter_dir $1 drivers/net/${netdrv} +done + +# Filter the char drivers +for char in ${chardrvs} +do + filter_dir $1 drivers/char/${char} +done + +# Filter the ethernet drivers +for eth in ${ethdrvs} +do + filter_dir $1 drivers/net/ethernet/${eth} +done + +# SCSI +for scsi in ${scsidrvs} +do + filter_dir $1 drivers/scsi/${scsi} +done + +# Input +for input in ${inputdrvs} +do + filter_dir $1 drivers/input/${input} +done + +# USB +for usb in ${usbdrvs} +do + filter_dir $1 drivers/usb/${usb} +done + +# Filesystems +for fs in ${fsdrvs} +do + filter_dir $1 fs/${fs} +done + +# Network protocols +for prot in ${netprots} +do + filter_dir $1 kernel/net/${prot} +done + +# DRM +for drm in ${drmdrvs} +do + filter_dir $1 drivers/gpu/drm/${drm} +done + +# Just kill sound. +filter_dir $1 kernel/sound +filter_dir $1 kernel/drivers/soundwire + +# Now go through and filter any single .ko files that might have deps on the +# things we filtered above +for mod in ${singlemods} +do + filter_ko $1 ${mod} +done + +# Now process the override list to bring those modules back into core +for mod in ${overrides} +do + grep -v -e "/${mod}.ko" k-d.list > k-d.list.tmp + if [ $? -ne 0 ] + then + echo "Couldn't save ${mod}.ko Skipping." + else + grep -e "/${mod}.ko" k-d.list >> $filelist + mv k-d.list.tmp k-d.list + fi + +done + +# Go through our generated drivers list and remove the .ko files. We'll +# restore them later. +for mod in `cat k-d.list` +do + rm -rf $mod +done diff --git a/SOURCES/filter-ppc64le.sh.fedora b/SOURCES/filter-ppc64le.sh.fedora new file mode 100644 index 0000000..972298e --- /dev/null +++ b/SOURCES/filter-ppc64le.sh.fedora @@ -0,0 +1,14 @@ +#! /bin/bash + +# This is the ppc64le override file for the core/drivers package split. The +# module directories listed here and in the generic list in filter-modules.sh +# will be moved to the resulting kernel-modules package for this arch. +# Anything not listed in those files will be in the kernel-core package. +# +# Please review the default list in filter-modules.sh before making +# modifications to the overrides below. If something should be removed across +# all arches, remove it in the default instead of per-arch. + +driverdirs="atm auxdisplay bcma bluetooth firewire fpga infiniband leds media memstick message mmc mtd nfc ntb pcmcia platform power ssb staging tty uio w1" + +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_vdpa" diff --git a/SOURCES/filter-ppc64le.sh.rhel b/SOURCES/filter-ppc64le.sh.rhel new file mode 100644 index 0000000..d80956d --- /dev/null +++ b/SOURCES/filter-ppc64le.sh.rhel @@ -0,0 +1,14 @@ +#! /bin/bash + +# This is the ppc64le override file for the core/drivers package split. The +# module directories listed here and in the generic list in filter-modules.sh +# will be moved to the resulting kernel-modules package for this arch. +# Anything not listed in those files will be in the kernel-core package. +# +# Please review the default list in filter-modules.sh before making +# modifications to the overrides below. If something should be removed across +# all arches, remove it in the default instead of per-arch. + +driverdirs="atm auxdisplay bcma bluetooth firewire fmc infiniband isdn leds media memstick message mmc mtd mwave nfc ntb pcmcia platform power ssb staging tty uio uwb w1" + +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 target_core_user sbp_target cxgbit iw_cxgb3 iw_cxgb4 cxgb3i cxgb3i cxgb3i_ddp cxgb4i chcr chtls" diff --git a/SOURCES/filter-s390x.sh.fedora b/SOURCES/filter-s390x.sh.fedora new file mode 100644 index 0000000..04f7110 --- /dev/null +++ b/SOURCES/filter-s390x.sh.fedora @@ -0,0 +1,12 @@ +#! /bin/bash + +# This is the s390x override file for the core/drivers package split. The +# module directories listed here and in the generic list in filter-modules.sh +# will be moved to the resulting kernel-modules package for this arch. +# Anything not listed in those files will be in the kernel-core package. +# +# Please review the default list in filter-modules.sh before making +# modifications to the overrides below. If something should be removed across +# all arches, remove it in the default instead of per-arch. + +# Defaults work so no need to override diff --git a/SOURCES/filter-s390x.sh.rhel b/SOURCES/filter-s390x.sh.rhel new file mode 100644 index 0000000..04f7110 --- /dev/null +++ b/SOURCES/filter-s390x.sh.rhel @@ -0,0 +1,12 @@ +#! /bin/bash + +# This is the s390x override file for the core/drivers package split. The +# module directories listed here and in the generic list in filter-modules.sh +# will be moved to the resulting kernel-modules package for this arch. +# Anything not listed in those files will be in the kernel-core package. +# +# Please review the default list in filter-modules.sh before making +# modifications to the overrides below. If something should be removed across +# all arches, remove it in the default instead of per-arch. + +# Defaults work so no need to override diff --git a/SOURCES/filter-x86_64.sh.fedora b/SOURCES/filter-x86_64.sh.fedora new file mode 100644 index 0000000..1aa80f2 --- /dev/null +++ b/SOURCES/filter-x86_64.sh.fedora @@ -0,0 +1,12 @@ +#! /bin/bash + +# This is the x86_64 override file for the core/drivers package split. The +# module directories listed here and in the generic list in filter-modules.sh +# will be moved to the resulting kernel-modules package for this arch. +# Anything not listed in those files will be in the kernel-core package. +# +# Please review the default list in filter-modules.sh before making +# modifications to the overrides below. If something should be removed across +# all arches, remove it in the default instead of per-arch. + +# Defaults work so no need to override diff --git a/SOURCES/filter-x86_64.sh.rhel b/SOURCES/filter-x86_64.sh.rhel new file mode 100644 index 0000000..1aa80f2 --- /dev/null +++ b/SOURCES/filter-x86_64.sh.rhel @@ -0,0 +1,12 @@ +#! /bin/bash + +# This is the x86_64 override file for the core/drivers package split. The +# module directories listed here and in the generic list in filter-modules.sh +# will be moved to the resulting kernel-modules package for this arch. +# Anything not listed in those files will be in the kernel-core package. +# +# Please review the default list in filter-modules.sh before making +# modifications to the overrides below. If something should be removed across +# all arches, remove it in the default instead of per-arch. + +# Defaults work so no need to override diff --git a/SOURCES/generate_all_configs.sh b/SOURCES/generate_all_configs.sh new file mode 100755 index 0000000..14f0f3a --- /dev/null +++ b/SOURCES/generate_all_configs.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +# Adjusts the configuration options to build the variants correctly +# +# arg1: configuration to go in the primary variant +# arg2: are we only generating debug configs + + +PRIMARY=$1 +DEBUGBUILDSENABLED=$2 + +if [ -z $2 ]; then + exit 1 +fi + +if [ $PRIMARY == "fedora" ]; then + SECONDARY=rhel +else + SECONDARY=fedora +fi + +for i in kernel-*-$PRIMARY.config; do + NEW=kernel-$VERSION-`echo $i | cut -d - -f2- | sed s/-$PRIMARY//` + #echo $NEW + mv $i $NEW +done + +rm kernel-*-$SECONDARY.config + +if [ $DEBUGBUILDSENABLED -eq 0 ]; then + for i in kernel-*debug*.config; do + base=`echo $i | sed -r s/-?debug//g` + NEW=kernel-`echo $base | cut -d - -f2-` + mv $i $NEW + done +fi diff --git a/SOURCES/generate_bls_conf.sh b/SOURCES/generate_bls_conf.sh new file mode 100755 index 0000000..0bac44c --- /dev/null +++ b/SOURCES/generate_bls_conf.sh @@ -0,0 +1,30 @@ +#!/bin/bash +set -e + +. /etc/os-release + +kernelver=$1 && shift +rootfs=$1 && shift +variant=$1 && shift + +output="${rootfs}/lib/modules/${kernelver}/bls_sample.conf" +date=$(date -u +%Y%m%d%H%M%S) + +if [ "${variant:-5}" = "debug" ]; then + debugname=" with debugging" + debugid="-debug" +else + debugname="" + debugid="" +fi + +cat >${output} <) { + my $str = $_; + my $configname; + + if (/\# ([\w]+) is not set/) { + $configname = $1; + } elsif (/^\#/) { + # fall through on comments like 'avoid CONFIG_FOO=y' + ; + } elsif (/([\w]+)=/) { + $configname = $1; + } + + if (defined($configname) && !exists($configvalues{$configname})) { + $configvalues{$configname} = $str; + $configoptions[$configcounter] = $configname; + $configcounter ++; + } +}; + +# now, read and output the entire configfile, except for the overridden +# parts... for those the new value is printed. + +open (FILE2,"$args[1]") || die "Could not open $args[1]"; +while () { + my $configname; + + if (/\# ([\w]+) is not set/) { + $configname = $1; + } elsif (/^\#/) { + # fall through on comments like 'avoid CONFIG_FOO=y' + ; + } elsif (/([\w]+)=/) { + $configname = $1; + } + + if (defined($configname) && exists($configvalues{$configname})) { + print "$configvalues{$configname}"; + delete($configvalues{$configname}); + } else { + print "$_"; + } +} + +# now print the new values from the overridden configfile +my $counter = 0; + +while ($counter < $configcounter) { + my $configname = $configoptions[$counter]; + if (exists($configvalues{$configname})) { + print "$configvalues{$configname}"; + } + $counter++; +} + +1; diff --git a/SOURCES/mod-extra-blacklist.sh b/SOURCES/mod-extra-blacklist.sh new file mode 100755 index 0000000..c4c4f8f --- /dev/null +++ b/SOURCES/mod-extra-blacklist.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +buildroot="$1" +kernel_base="$2" + +blacklist() +{ + cat > "$buildroot/etc/modprobe.d/$1-blacklist.conf" <<-__EOF__ + # This kernel module can be automatically loaded by non-root users. To + # enhance system security, the module is blacklisted by default to ensure + # system administrators make the module available for use as needed. + # See https://access.redhat.com/articles/3760101 for more details. + # + # Remove the blacklist by adding a comment # at the start of the line. + blacklist $1 +__EOF__ +} + +check_blacklist() +{ + if modinfo "$1" | grep -q '^alias:\s\+net-'; then + mod="${1##*/}" + mod="${mod%.ko*}" + echo "$mod has an alias that allows auto-loading. Blacklisting." + blacklist "$mod" + fi +} + +foreachp() +{ + P=$(nproc) + bgcount=0 + while read mod; do + $1 "$mod" & + + bgcount=$((bgcount + 1)) + if [ $bgcount -eq $P ]; then + wait -n + bgcount=$((bgcount - 1)) + fi + done + + wait +} + +[ -d "$buildroot/etc/modprobe.d/" ] || mkdir -p "$buildroot/etc/modprobe.d/" +find "$buildroot/$kernel_base/extra" -name "*.ko*" | \ + foreachp check_blacklist + +# Many BIOS-es export a PNP-id which causes the floppy driver to autoload +# even though most modern systems don't have a 3.5" floppy driver anymore +# this replaces the old die_floppy_die.patch which removed the PNP-id from +# the module +if [ -f $buildroot/$kernel_base/extra/drivers/block/floppy.ko* ]; then + blacklist "floppy" +fi diff --git a/SOURCES/mod-extra.list.fedora b/SOURCES/mod-extra.list.fedora new file mode 100644 index 0000000..8140f5c --- /dev/null +++ b/SOURCES/mod-extra.list.fedora @@ -0,0 +1,196 @@ +6pack.ko +a3d.ko +act200l-sir.ko +actisys-sir.ko +adi.ko +aer_inject.ko +af_802154.ko +affs.ko +ali-ircc.ko +analog.ko +appletalk.ko +atm.ko +avma1_cs.ko +avm_cs.ko +avmfritz.ko +ax25.ko +b1.ko +bas_gigaset.ko +batman-adv.ko +baycom_par.ko +baycom_ser_fdx.ko +baycom_ser_hdx.ko +befs.ko +bpqether.ko +br2684.ko +capi.ko +c_can.ko +c_can_platform.ko +clip.ko +cobra.ko +coda.ko +cuse.ko +db9.ko +dccp_diag.ko +dccp_ipv4.ko +dccp_ipv6.ko +dccp.ko +dccp_probe.ko +diva_idi.ko +divas.ko +dlm.ko +ds1wm.ko +ds2482.ko +ds2490.ko +dss1_divert.ko +elsa_cs.ko +ems_pci.ko +ems_usb.ko +esd_usb2.ko +esi-sir.ko +floppy.ko +gamecon.ko +gf2k.ko +gfs2.ko +gigaset.ko +girbil-sir.ko +grip.ko +grip_mp.ko +guillemot.ko +hdlcdrv.ko +hfc4s8s_l1.ko +hfcmulti.ko +hfcpci.ko +hisax.ko +hwa-rc.ko +hysdn.ko +i2400m.ko +i2400m-sdio.ko +i2400m-usb.ko +ieee802154.ko +iforce.ko +interact.ko +ipddp.ko +ipx.ko +isdn.ko +joydump.ko +kingsun-sir.ko +ks959-sir.ko +ksdazzle-sir.ko +kvaser_pci.ko +l2tp_core.ko +l2tp_debugfs.ko +l2tp_eth.ko +l2tp_ip.ko +l2tp_netlink.ko +l2tp_ppp.ko +lec.ko +ma600-sir.ko +magellan.ko +mcp2120-sir.ko +mISDN_core.ko +mISDN_dsp.ko +mkiss.ko +mptbase.ko +mptctl.ko +mptfc.ko +nci.ko +ncpfs.ko +netjet.ko +netrom.ko +nfc.ko +nilfs2.ko +ocfs2_dlmfs.ko +ocfs2_dlm.ko +ocfs2.ko +ocfs2_nodemanager.ko +ocfs2_stackglue.ko +ocfs2_stack_o2cb.ko +ocfs2_stack_user.ko +old_belkin-sir.ko +orinoco_cs.ko +orinoco.ko +orinoco_nortel.ko +orinoco_pci.ko +orinoco_plx.ko +orinoco_usb.ko +pcspkr.ko +plx_pci.ko +pn_pep.ko +pppoatm.ko +rds.ko +rds_rdma.ko +rds_tcp.ko +rose.ko +sch_atm.ko +sch_cbq.ko +sch_choke.ko +sch_drr.ko +sch_dsmark.ko +sch_etf.ko +sch_gred.ko +sch_mqprio.ko +sch_multiq.ko +sch_netem.ko +sch_qfq.ko +sch_red.ko +sch_sfb.ko +sch_teql.ko +sctp.ko +sctp_probe.ko +sidewinder.ko +sja1000.ko +sja1000_platform.ko +slcan.ko +slip.ko +softing_cs.ko +softing.ko +spaceball.ko +spaceorb.ko +stinger.ko +sysv.ko +tcp_bic.ko +tcp_highspeed.ko +tcp_htcp.ko +tcp_hybla.ko +tcp_illinois.ko +tcp_lp.ko +tcp_scalable.ko +tcp_vegas.ko +tcp_veno.ko +tcp_westwood.ko +tcp_yeah.ko +tekram-sir.ko +tmdc.ko +toim3232-sir.ko +trancevibrator.ko +turbografx.ko +twidjoy.ko +ubifs.ko +ufs.ko +umc.ko +usbip-core.ko +usbip-host.ko +uwb.ko +vcan.ko +vhci-hcd.ko +w1_bq27000.ko +w1_ds2408.ko +w1_ds2423.ko +w1_ds2431.ko +w1_ds2433.ko +w1_ds2760.ko +w1_ds2780.ko +w1_ds2781.ko +w1_ds28e04.ko +w1_smem.ko +w1_therm.ko +w6692.ko +walkera0701.ko +wanrouter.ko +warrior.ko +whci.ko +wire.ko +xpad.ko +yam.ko +zhenhua.ko diff --git a/SOURCES/mod-extra.list.rhel b/SOURCES/mod-extra.list.rhel new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/SOURCES/mod-extra.list.rhel diff --git a/SOURCES/mod-extra.sh b/SOURCES/mod-extra.sh new file mode 100755 index 0000000..7dc075b --- /dev/null +++ b/SOURCES/mod-extra.sh @@ -0,0 +1,86 @@ +#! /bin/bash + +Dir=$1 +List=$2 +Dest="extra" + +# Destination was specified on the command line +test -n "$3" && Dest="$3" + +pushd $Dir +rm -rf modnames +find . -name "*.ko" -type f > modnames +# Look through all of the modules, and throw any that have a dependency in +# our list into the list as well. +rm -rf dep.list dep2.list +rm -rf req.list req2.list +touch dep.list req.list +cp "$List" . + +# This variable needs to be exported because it is used in sub-script +# executed by xargs +export ListName=$(basename "$List") + +# NB: this loop runs 2000+ iterations. Try to be fast. +NPROC=`nproc` +[ -z "$NPROC" ] && NPROC=1 +cat modnames | xargs -r -n1 -P $NPROC sh -c ' + dep=$1 + depends=`modinfo $dep | sed -n -e "/^depends/ s/^depends:[ \t]*//p"` + [ -z "$depends" ] && exit + for mod in ${depends//,/ } + do + match=$(grep "^$mod.ko" "$ListName") + [ -z "$match" ] && continue + # check if the module we are looking at is in mod-extra too. + # if so we do not need to mark the dep as required. + mod2=${dep##*/} # same as `basename $dep`, but faster + match2=$(grep "^$mod2" "$ListName") + if [ -n "$match2" ] + then + #echo $mod2 >> notreq.list + continue + fi + echo $mod.ko >> req.list + done +' DUMMYARG0 # xargs appends MODNAME, which becomes $dep in the script above + +sort -u req.list > req2.list +sort -u "$ListName" > modules2.list +join -v 1 modules2.list req2.list > modules3.list + +for mod in $(cat modules3.list) +do + # get the path for the module + modpath=`grep /$mod modnames` + [ -z "$modpath" ] && continue + echo $modpath >> dep.list +done + +sort -u dep.list > dep2.list + +# now move the modules into the extra/ directory +for mod in `cat dep2.list` +do + newpath=`dirname $mod | sed -e "s/kernel\\//$Dest\//"` + mkdir -p $newpath + mv $mod $newpath +done + +popd + +# If we're signing modules, we can't leave the .mod files for the .ko files +# we've moved in .tmp_versions/. Remove them so the Kbuild 'modules_sign' +# target doesn't try to sign a non-existent file. This is kinda ugly, but +# so is modules-extra. + +for mod in `cat ${Dir}/dep2.list` +do + modfile=`basename $mod | sed -e 's/.ko/.mod/'` + rm .tmp_versions/$modfile +done + +pushd $Dir +rm modnames dep.list dep2.list req.list req2.list +rm "$ListName" modules2.list modules3.list +popd diff --git a/SOURCES/mod-internal.list b/SOURCES/mod-internal.list new file mode 100644 index 0000000..9270dcc --- /dev/null +++ b/SOURCES/mod-internal.list @@ -0,0 +1,4 @@ +mac80211_hwsim +netdevsim +pktgen +rocker diff --git a/SOURCES/mod-sign.sh b/SOURCES/mod-sign.sh new file mode 100755 index 0000000..ed2bd62 --- /dev/null +++ b/SOURCES/mod-sign.sh @@ -0,0 +1,37 @@ +#! /bin/bash + +# The modules_sign target checks for corresponding .o files for every .ko that +# is signed. This doesn't work for package builds which re-use the same build +# directory for every flavour, and the .config may change between flavours. +# So instead of using this script to just sign lib/modules/$KernelVer/extra, +# sign all .ko in the buildroot. + +# This essentially duplicates the 'modules_sign' Kbuild target and runs the +# same commands for those modules. + +MODSECKEY=$1 +MODPUBKEY=$2 +moddir=$3 + +modules=`find $moddir -type f -name '*.ko'` + +NPROC=`nproc` +[ -z "$NPROC" ] && NPROC=1 + +# NB: this loop runs 2000+ iterations. Try to be fast. +echo "$modules" | xargs -r -n16 -P $NPROC sh -c " +for mod; do + ./scripts/sign-file sha256 $MODSECKEY $MODPUBKEY \$mod + rm -f \$mod.sig \$mod.dig +done +" DUMMYARG0 # xargs appends ARG1 ARG2..., which go into $mod in for loop. + +RANDOMMOD=$(echo "$modules" | sort -R | head -n 1) +if [ "~Module signature appended~" != "$(tail -c 28 $RANDOMMOD)" ]; then + echo "*****************************" + echo "*** Modules are unsigned! ***" + echo "*****************************" + exit 1 +fi + +exit 0 diff --git a/SOURCES/parallel_xz.sh b/SOURCES/parallel_xz.sh new file mode 100755 index 0000000..0d98ead --- /dev/null +++ b/SOURCES/parallel_xz.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# Reads filenames on stdin, xz-compresses each in place. +# Not optimal for "compress relatively few, large files" scenario! + +# How many xz's to run in parallel: +procgroup="" +while test "$#" != 0; do + # Get it from -jNUM + N="${1#-j}" + if test "$N" = "$1"; then + # Not -j - warn and ignore + echo "parallel_xz: warning: unrecognized argument: '$1'" + else + procgroup="$N" + fi + shift +done + +#This seems to cause problems with large numbers +if (( $procgroup > 6 )); then + procgroup=6 +fi + +# If told to use only one cpu: +test "$procgroup" || exec xargs -r xz +test "$procgroup" = 1 && exec xargs -r xz + +# xz has some startup cost. If files are really small, +# this cost might be significant. To combat this, +# process several files (in sequence) by each xz process via -n 16: +exec xargs -r -n 16 -P $procgroup xz diff --git a/SOURCES/process_configs.sh b/SOURCES/process_configs.sh new file mode 100755 index 0000000..14773fe --- /dev/null +++ b/SOURCES/process_configs.sh @@ -0,0 +1,325 @@ +#!/bin/bash +# +# This script takes the merged config files and processes them through oldconfig +# and listnewconfig +# + +usage() +{ + # alphabetical order please + echo "process_configs.sh [ options ] package_name kernel_version" + echo " -a: report all errors, equivalent to [-c -n -w -i]" + echo " -c: error on mismatched config options" + echo " -i: continue on error" + echo " -n: error on unset config options" + echo " -t: test run, do not overwrite original config" + echo " -w: error on misconfigured config options" + echo " -z: commit new configs to pending directory" + exit 1 +} + +die() +{ + echo "$1" + exit 1 +} + +# stupid function to find top of tree to do kernel make configs +switch_to_toplevel() +{ + path="$(pwd)" + while test -n "$path" + do + test -e $path/MAINTAINERS && \ + test -d $path/drivers && \ + break + + path="$(dirname $path)" + done + + test -n "$path" || die "Can't find toplevel" + echo "$path" +} + +checkoptions() +{ + /usr/bin/awk ' + + /is not set/ { + split ($0, a, "#"); + split(a[2], b); + if (NR==FNR) { + configs[b[1]]="is not set"; + } else { + if (configs[b[1]] != "" && configs[b[1]] != "is not set") + print "Found # "b[1] " is not set, after generation, had " b[1] " " configs[b[1]] " in Source tree"; + } + } + + /=/ { + split ($0, a, "="); + if (NR==FNR) { + configs[a[1]]=a[2]; + } else { + if (configs[a[1]] != "" && configs[a[1]] != a[2]) + print "Found "a[1]"="a[2]" after generation, had " a[1]"="configs[a[1]]" in Source tree"; + } + } + ' $1 $2 > .mismatches + + if test -s .mismatches + then + echo "Error: Mismatches found in configuration files" + cat .mismatches + RETURNCODE=1 + [ "$CONTINUEONERROR" ] || exit 1 + fi +} + +parsenewconfigs() +{ + tmpdir=$(mktemp -d) + + # This awk script reads the output of make listnewconfig + # and puts it into CONFIG_FOO files. Using the output of + # listnewconfig is much easier to ensure we get the default + # output. + /usr/bin/awk -v BASE=$tmpdir ' + /is not set/ { + split ($0, a, "#"); + split(a[2], b); + OUT_FILE=BASE"/"b[1]; + print $0 >> OUT_FILE; + } + + /=/ { + split ($0, a, "="); + OUT_FILE=BASE"/"a[1]; + if (a[2] == "n") + print "# " a[1] " is not set" >> OUT_FILE; + else + print $0 >> OUT_FILE; + } + + ' .newoptions + + # This awk script parses the output of helpnewconfig. + # Each option is separated between ----- markers + # The goal is to put all the help text as a comment in + # each CONFIG_FOO file. Because of how awk works + # there's a lot of moving files around and catting to + # get what we need. + /usr/bin/awk -v BASE=$tmpdir ' + BEGIN { inpatch=0; + outfile="none"; + symbol="none"; } + /^CONFIG_.*:$/ { + split($0, a, ":"); + symbol=a[1]; + outfile=BASE "/fake_"symbol + } + /-----/ { + if (inpatch == 0) { + inpatch = 1; + } + else { + if (symbol != "none") { + system("cat " outfile " " BASE "/" symbol " > " BASE "/tmpf"); + system("mv " BASE "/tmpf " BASE "/" symbol); + symbol="none" + } + outfile="none" + inpatch = 0; + } + } + !/-----/ { + if (inpatch == 1 && outfile != "none") { + print "# "$0 >> outfile; + } + } + + + ' .helpnewconfig + + pushd $tmpdir &> /dev/null + rm fake_* + popd &> /dev/null + for f in `ls $tmpdir`; do + [[ -e "$tmpdir/$f" ]] || break + cp $tmpdir/$f $SCRIPT_DIR/pending"$FLAVOR"/generic/ + done + + rm -rf $tmpdir +} + +function commit_new_configs() +{ + # assume we are in $source_tree/configs, need to get to top level + pushd $(switch_to_toplevel) &>/dev/null + + for cfg in $SCRIPT_DIR/${PACKAGE_NAME}${KVERREL}${SUBARCH}*.config + do + arch=$(head -1 $cfg | cut -b 3-) + cfgtmp="${cfg}.tmp" + cfgorig="${cfg}.orig" + cat $cfg > $cfgorig + + if [ "$arch" = "EMPTY" ] + then + # This arch is intentionally left blank + continue + fi + echo -n "Checking for new configs in $cfg ... " + + make ARCH=$arch KCONFIG_CONFIG=$cfgorig listnewconfig >& .listnewconfig + grep -E 'CONFIG_' .listnewconfig > .newoptions + if test -s .newoptions + then + make ARCH=$arch KCONFIG_CONFIG=$cfgorig helpnewconfig >& .helpnewconfig + parsenewconfigs + fi + rm .newoptions + echo "done" + done + + git add $SCRIPT_DIR/pending"$FLAVOR" + git commit -m "[redhat] AUTOMATIC: New configs" +} + +function process_configs() +{ + # assume we are in $source_tree/configs, need to get to top level + pushd $(switch_to_toplevel) &>/dev/null + + for cfg in $SCRIPT_DIR/${PACKAGE_NAME}${KVERREL}${SUBARCH}*.config + do + arch=$(head -1 $cfg | cut -b 3-) + cfgtmp="${cfg}.tmp" + cfgorig="${cfg}.orig" + cat $cfg > $cfgorig + + if [ "$arch" = "EMPTY" ] + then + # This arch is intentionally left blank + continue + fi + echo -n "Processing $cfg ... " + + make ARCH=$arch KCONFIG_CONFIG=$cfgorig listnewconfig >& .listnewconfig + grep -E 'CONFIG_' .listnewconfig > .newoptions + if test -n "$NEWOPTIONS" && test -s .newoptions + then + echo "Found unset config items, please set them to an appropriate value" + cat .newoptions + rm .newoptions + RETURNCODE=1 + [ "$CONTINUEONERROR" ] || exit 1 + fi + rm .newoptions + + grep -E 'config.*warning' .listnewconfig > .warnings + if test -n "$CHECKWARNINGS" && test -s .warnings + then + echo "Found misconfigured config items, please set them to an appropriate value" + cat .warnings + rm .warnings + RETURNCODE=1 + [ "$CONTINUEONERROR" ] || exit 1 + fi + rm .warnings + + rm .listnewconfig + + make ARCH=$arch KCONFIG_CONFIG=$cfgorig olddefconfig > /dev/null || exit 1 + echo "# $arch" > ${cfgtmp} + cat "${cfgorig}" >> ${cfgtmp} + if test -n "$CHECKOPTIONS" + then + checkoptions $cfg $cfgtmp + fi + # if test run, don't overwrite original + if test -n "$TESTRUN" + then + rm ${cfgtmp} + else + mv ${cfgtmp} ${cfg} + fi + rm ${cfgorig} + echo "done" + done + rm "$SCRIPT_DIR"/*.config*.old + popd > /dev/null + + echo "Processed config files are in $SCRIPT_DIR" +} + +CHECKOPTIONS="" +CONTINUEONERROR="" +NEWOPTIONS="" +TESTRUN="" +CHECKWARNINGS="" + +RETURNCODE=0 + +while [[ $# -gt 0 ]] +do + key="$1" + case $key in + -a) + CHECKOPTIONS="x" + CONTINUEONERROR="x" + NEWOPTIONS="x" + CHECKWARNINGS="x" + ;; + -c) + CHECKOPTIONS="x" + ;; + -h) + usage + ;; + -i) + CONTINUEONERROR="x" + ;; + -n) + NEWOPTIONS="x" + ;; + -t) + TESTRUN="x" + ;; + -w) + CHECKWARNINGS="x" + ;; + -z) + COMMITNEWCONFIGS="x" + ;; + *) + break;; + esac + shift +done + +PACKAGE_NAME="${1:-kernel}" # defines the package name used +KVERREL="$(test -n "$2" && echo "-$2" || echo "")" +SUBARCH="$(test -n "$3" && echo "-$3" || echo "")" +FLAVOR="$(test -n "$4" && echo "-$4" || echo "-common")" +SCRIPT="$(readlink -f $0)" +OUTPUT_DIR="$PWD" +SCRIPT_DIR="$(dirname $SCRIPT)" + +# Most RHEL options are options we want in Fedora so RHEL pending settings head +# to common/ +if [ "$FLAVOR" = "-rhel" ] +then + FLAVOR="-common" +fi + +# to handle this script being a symlink +cd $SCRIPT_DIR + +if test -n "$COMMITNEWCONFIGS"; then + commit_new_configs +else + process_configs +fi + +exit $RETURNCODE diff --git a/SOURCES/secureboot_ppc.cer b/SOURCES/secureboot_ppc.cer new file mode 100644 index 0000000..2c0087d Binary files /dev/null and b/SOURCES/secureboot_ppc.cer differ diff --git a/SOURCES/secureboot_s390.cer b/SOURCES/secureboot_s390.cer new file mode 100644 index 0000000..137d385 Binary files /dev/null and b/SOURCES/secureboot_s390.cer differ diff --git a/SOURCES/update_scripts.sh b/SOURCES/update_scripts.sh new file mode 100755 index 0000000..5c3dbae --- /dev/null +++ b/SOURCES/update_scripts.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +if [ -z $1 ]; then + exit 1 +fi + +TARGET=$1 + +for i in $RPM_SOURCE_DIR/*.$TARGET; do + NEW=${i%.$TARGET} + cp $i $NEW +done diff --git a/SOURCES/x509.genkey.fedora b/SOURCES/x509.genkey.fedora new file mode 100644 index 0000000..dbfe9a7 --- /dev/null +++ b/SOURCES/x509.genkey.fedora @@ -0,0 +1,16 @@ +[ req ] +default_bits = 3072 +distinguished_name = req_distinguished_name +prompt = no +x509_extensions = myexts + +[ req_distinguished_name ] +O = CentOS +CN = CentOS kernel signing key +emailAddress = security@centos.org + +[ myexts ] +basicConstraints=critical,CA:FALSE +keyUsage=digitalSignature +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid diff --git a/SOURCES/x509.genkey.rhel b/SOURCES/x509.genkey.rhel new file mode 100644 index 0000000..b1bbe38 --- /dev/null +++ b/SOURCES/x509.genkey.rhel @@ -0,0 +1,16 @@ +[ req ] +default_bits = 3072 +distinguished_name = req_distinguished_name +prompt = no +x509_extensions = myexts + +[ req_distinguished_name ] +O = Red Hat +CN = Red Hat Enterprise Linux kernel signing key +emailAddress = secalert@redhat.com + +[ myexts ] +basicConstraints=critical,CA:FALSE +keyUsage=digitalSignature +subjectKeyIdentifier=hash +authorityKeyIdentifier=keyid diff --git a/SPECS/kernel.spec b/SPECS/kernel.spec new file mode 100644 index 0000000..e22c0c3 --- /dev/null +++ b/SPECS/kernel.spec @@ -0,0 +1,3016 @@ +# Disable LTO in userspace packages. +%global _lto_cflags %{nil} + +# We have to override the new %%install behavior because, well... the kernel is special. +%global __spec_install_pre %{___build_pre} + +# this should go away soon +%define _legacy_common_support 1 + +# At the time of this writing (2019-03), RHEL8 packages use w2.xzdio +# compression for rpms (xz, level 2). +# Kernel has several large (hundreds of mbytes) rpms, they take ~5 mins +# to compress by single-threaded xz. Switch to threaded compression, +# and from level 2 to 3 to keep compressed sizes close to "w2" results. +# +# NB: if default compression in /usr/lib/rpm/redhat/macros ever changes, +# this one might need tweaking (e.g. if default changes to w3.xzdio, +# change below to w4T.xzdio): +# +# This is disabled on i686 as it triggers oom errors + +%ifnarch i686 +%define _binary_payload w3T.xzdio +%endif + +Summary: The Linux kernel + +# For a kernel released for public testing, released_kernel should be 1. +# For internal testing builds during development, it should be 0. +# For rawhide and/or a kernel built from an rc or git snapshot, +# released_kernel should be 0. +# For a stable, released kernel, released_kernel should be 1. +%global released_kernel 1 + +%if 0%{?fedora} +%define secure_boot_arch x86_64 +%else +%define secure_boot_arch x86_64 aarch64 +%endif + +# Signing for secure boot authentication +%ifarch %{secure_boot_arch} +%global signkernel 1 +%else +%global signkernel 0 +%endif + +# Sign modules on all arches +%global signmodules 1 + +# Compress modules only for architectures that build modules +%ifarch noarch +%global zipmodules 0 +%else +%global zipmodules 1 +%endif + +%if %{zipmodules} +%global zipsed -e 's/\.ko$/\.ko.xz/' +# for parallel xz processes, replace with 1 to go back to single process +%global zcpu `nproc --all` +%endif + +# define buildid .local + +%if 0%{?fedora}%{?centos} +%define primary_target fedora +%else +%define primary_target rhel +%endif + +# baserelease defines which build revision of this kernel version we're +# building. We used to call this fedora_build, but the magical name +# baserelease is matched by the rpmdev-bumpspec tool, which you should use. +# +# We used to have some extra magic weirdness to bump this automatically, +# but now we don't. Just use: rpmdev-bumpspec -c 'comment for changelog' +# When changing base_sublevel below or going from rc to a final kernel, +# reset this by hand to 1 (or to 0 and then use rpmdev-bumpspec). +# scripts/rebase.sh should be made to do that for you, actually. +# +# NOTE: baserelease must be > 0 or bad things will happen if you switch +# to a released kernel (released version will be < rc version) +# +# For non-released -rc kernels, this will be appended after the rcX and +# gitX tags, so a 3 here would become part of release "0.rcX.gitX.3" +# +%global baserelease 200 +%global fedora_build %{baserelease} + +# base_sublevel is the kernel version we're starting with and patching +# on top of -- for example, 3.1-rc7-git1 starts with a 3.0 base, +# which yields a base_sublevel of 0. +%define base_sublevel 15 + +## If this is a released kernel ## +%if 0%{?released_kernel} + +# Do we have a -stable update to apply? +%define stable_update 0 +# Set rpm version accordingly +%if 0%{?stable_update} +%define stablerev %{stable_update} +%define stable_base %{stable_update} +%endif +%define rpmversion 5.%{base_sublevel}.%{stable_update} + +## The not-released-kernel case ## +%else +# The next upstream release sublevel (base_sublevel+1) +%define upstream_sublevel %(echo $((%{base_sublevel} + 1))) +# The rc snapshot level +%global rcrev 0 +# The git snapshot level +%define gitrev 0 +# Set rpm version accordingly +%define rpmversion 5.%{upstream_sublevel}.0 +%endif +# Nb: The above rcrev and gitrev values automagically define Patch00 and Patch01 below. + +# What parts do we want to build? We must build at least one kernel. +# These are the kernels that are built IF the architecture allows it. +# All should default to 1 (enabled) and be flipped to 0 (disabled) +# by later arch-specific checks. + +# The following build options are enabled by default. +# Use either --without in your rpmbuild command or force values +# to 0 in here to disable them. +# +# standard kernel +%define with_up %{?_without_up: 0} %{?!_without_up: 1} +# kernel PAE (only valid for ARM (lpae)) +%define with_pae %{?_without_pae: 0} %{?!_without_pae: 1} +# kernel-debug +%define with_debug %{?_without_debug: 0} %{?!_without_debug: 1} +# kernel-zfcpdump (s390 specific kernel for zfcpdump) +%define with_zfcpdump %{?_without_zfcpdump: 0} %{?!_without_zfcpdump: 1} +# kernel-doc +%define with_doc %{?_without_doc: 0} %{?!_without_doc: 1} +# kernel-headers +%define with_headers %{?_without_headers: 0} %{?!_without_headers: 1} +%define with_cross_headers %{?_without_cross_headers: 0} %{?!_without_cross_headers: 1} +# perf +%define with_perf %{?_without_perf: 0} %{?!_without_perf: 1} +# tools +%define with_tools %{?_without_tools: 0} %{?!_without_tools: 1} +# bpf tool +%define with_bpftool %{?_without_bpftool: 0} %{?!_without_bpftool: 1} +# kernel-debuginfo +%define with_debuginfo %{?_without_debuginfo: 0} %{?!_without_debuginfo: 1} +# kernel-abi-stablelists +%define with_kernel_abi_stablelists %{?_without_kernel_abi_stablelists: 0} %{?!_without_kernel_abi_stablelists: 1} +# internal samples and selftests +%define with_selftests %{?_without_selftests: 0} %{?!_without_selftests: 1} +# +# Additional options for user-friendly one-off kernel building: +# +# Only build the base kernel (--with baseonly): +%define with_baseonly %{?_with_baseonly: 1} %{?!_with_baseonly: 0} +# Only build the pae kernel (--with paeonly): +%define with_paeonly %{?_with_paeonly: 1} %{?!_with_paeonly: 0} +# Only build the debug kernel (--with dbgonly): +%define with_dbgonly %{?_with_dbgonly: 1} %{?!_with_dbgonly: 0} +# Control whether we perform a compat. check against published ABI. +%define with_kabichk %{?_without_kabichk: 0} %{?!_without_kabichk: 1} +# Temporarily disable kabi checks until RC. +%define with_kabichk 0 +# Control whether we perform a compat. check against DUP ABI. +%define with_kabidupchk %{?_with_kabidupchk: 1} %{?!_with_kabidupchk: 0} +# +# Control whether to run an extensive DWARF based kABI check. +# Note that this option needs to have baseline setup in SOURCE300. +%define with_kabidwchk %{?_without_kabidwchk: 0} %{?!_without_kabidwchk: 1} +%define with_kabidw_base %{?_with_kabidw_base: 1} %{?!_with_kabidw_base: 0} +# +# Control whether to install the vdso directories. +%define with_vdso_install %{?_without_vdso_install: 0} %{?!_without_vdso_install: 1} +# +# should we do C=1 builds with sparse +%define with_sparse %{?_with_sparse: 1} %{?!_with_sparse: 0} +# +# Cross compile requested? +%define with_cross %{?_with_cross: 1} %{?!_with_cross: 0} +# +# build a release kernel on rawhide +%define with_release %{?_with_release: 1} %{?!_with_release: 0} + +# verbose build, i.e. no silent rules and V=1 +%define with_verbose %{?_with_verbose: 1} %{?!_with_verbose: 0} + +# +# check for mismatched config options +%define with_configchecks %{?_without_configchecks: 0} %{?!_without_configchecks: 1} + +# +# gcov support +%define with_gcov %{?_with_gcov:1}%{?!_with_gcov:0} + +# +# ipa_clone support +%define with_ipaclones %{?_without_ipaclones: 0} %{?!_without_ipaclones: 1} + +# Want to build a vanilla kernel build without any non-upstream patches? +%define with_vanilla %{?_with_vanilla: 1} %{?!_with_vanilla: 0} + +# Set debugbuildsenabled to 1 for production (build separate debug kernels) +# and 0 for rawhide (all kernels are debug kernels). +# See also 'make debug' and 'make release'. +%define debugbuildsenabled 1 + +%if 0%{?fedora} +# Kernel headers are being split out into a separate package +%define with_headers 0 +%define with_cross_headers 0 +# no selftests for now +%define with_selftests 0 +# no ipa_clone for now +%define with_ipaclones 0 +# no stablelist +%define with_kernel_abi_stablelists 0 +# Fedora builds these separately +%define with_perf 0 +%define with_tools 0 +%define with_bpftool 0 +%endif + +%if 0%{?centos} +# no selftests for now +%define with_selftests 0 +# no ipa_clone for now +%define with_ipaclones 0 +# no stablelist +%define with_kernel_abi_stablelists 0 +%define with_kabidw_base 0 +%define with_kabidwchk 0 +%endif + +%if %{with_verbose} +%define make_opts V=1 +%else +%define make_opts -s +%endif + +# pkg_release is what we'll fill in for the rpm Release: field +%if 0%{?released_kernel} + +%define pkg_release %{fedora_build}%{?buildid}%{?dist} + +%else + +# non-released_kernel +%if 0%{?rcrev} +%define rctag .rc%rcrev +%else +%define rctag .rc0 +%endif +%if 0%{?gitrev} +%define gittag .git%gitrev +%else +%define gittag .git0 +%endif +%define pkg_release 0%{?rctag}%{?gittag}.%{fedora_build}%{?buildid}%{?dist} + +%endif + +# The kernel tarball/base version +%define kversion 5.%{base_sublevel} + + +# turn off debug kernel and kabichk for gcov builds +%if %{with_gcov} +%define with_debug 0 +%define with_kabichk 0 +%define with_kabidupchk 0 +%define with_kabidwchk 0 +%endif + +# turn off kABI DWARF-based check if we're generating the base dataset +%if %{with_kabidw_base} +%define with_kabidwchk 0 +%endif + +# kpatch_kcflags are extra compiler flags applied to base kernel +# -fdump-ipa-clones is enabled only for base kernels on selected arches +%if %{with_ipaclones} +%ifarch x86_64 ppc64le +%define kpatch_kcflags -fdump-ipa-clones +%else +%define with_ipaclones 0 +%endif +%endif + +%define make_target bzImage +%define image_install_path boot + +%define KVERREL %{version}-%{release}.%{_target_cpu} +%define KVERREL_RE %(echo %KVERREL | sed 's/+/[+]/g') +%define hdrarch %_target_cpu +%define asmarch %_target_cpu + +%if 0%{!?nopatches:1} +%define nopatches 0 +%endif + +%if %{with_vanilla} +%define nopatches 1 +%endif + +%if %{nopatches} +%define variant -vanilla +%endif + +%if !%{debugbuildsenabled} +%define with_debug 0 +%endif + +%if !%{with_debuginfo} +%define _enable_debug_packages 0 +%endif +%define debuginfodir /usr/lib/debug +# Needed because we override almost everything involving build-ids +# and debuginfo generation. Currently we rely on the old alldebug setting. +%global _build_id_links alldebug + +# kernel PAE is only built on ARMv7 +%ifnarch armv7hl +%define with_pae 0 +%endif + +# if requested, only build base kernel +%if %{with_baseonly} +%define with_pae 0 +%define with_debug 0 +%endif + +# if requested, only build pae kernel +%if %{with_paeonly} +%define with_up 0 +%define with_debug 0 +%endif + +# if requested, only build debug kernel +%if %{with_dbgonly} +%if %{debugbuildsenabled} +%define with_up 0 +%endif +%define with_pae 0 +%define with_tools 0 +%define with_perf 0 +%define with_bpftool 0 +%endif + +# turn off kABI DUP check and DWARF-based check if kABI check is disabled +%if !%{with_kabichk} +%define with_kabidupchk 0 +%define with_kabidwchk 0 +%endif + +%if %{with_vdso_install} +%define use_vdso 1 +%endif + + +%ifnarch noarch +%define with_kernel_abi_stablelists 0 +%endif + +# Overrides for generic default options + +# only package docs noarch +%ifnarch noarch +%define with_doc 0 +%define doc_build_fail true +%endif + +%if 0%{?fedora}%{?centos} +# don't do debug builds on anything but i686 and x86_64 +%ifnarch i686 x86_64 +%define with_debug 0 +%endif +%endif + +# don't build noarch kernels or headers (duh) +%ifarch noarch +%define with_up 0 +%define with_headers 0 +%define with_cross_headers 0 +%define with_tools 0 +%define with_perf 0 +%define with_bpftool 0 +%define with_selftests 0 +%define with_debug 0 +%define all_arch_configs kernel-%{version}-*.config +%endif + +# sparse blows up on ppc +%ifnarch ppc64le +%define with_sparse 0 +%endif + +# zfcpdump mechanism is s390 only +%ifnarch s390x +%define with_zfcpdump 0 +%endif + +%if 0%{?fedora} +# This is not for Fedora +%define with_zfcpdump 0 +%endif + +# Per-arch tweaks + +%ifarch i686 +%define asmarch x86 +%define hdrarch i386 +%define all_arch_configs kernel-%{version}-i?86*.config +%define kernel_image arch/x86/boot/bzImage +%endif + +%ifarch x86_64 +%define asmarch x86 +%define all_arch_configs kernel-%{version}-x86_64*.config +%define kernel_image arch/x86/boot/bzImage +%endif + +%ifarch ppc64le +%define asmarch powerpc +%define hdrarch powerpc +%define make_target vmlinux +%define kernel_image vmlinux +%define kernel_image_elf 1 +%define all_arch_configs kernel-%{version}-ppc64le*.config +%define kcflags -O3 +%endif + +%ifarch s390x +%define asmarch s390 +%define hdrarch s390 +%define all_arch_configs kernel-%{version}-s390x.config +%define kernel_image arch/s390/boot/bzImage +%endif + +%ifarch %{arm} +%define all_arch_configs kernel-%{version}-arm*.config +%define skip_nonpae_vdso 1 +%define asmarch arm +%define hdrarch arm +%define make_target bzImage +%define kernel_image arch/arm/boot/zImage +# http://lists.infradead.org/pipermail/linux-arm-kernel/2012-March/091404.html +%define kernel_mflags KALLSYMS_EXTRA_PASS=1 +# we only build headers/perf/tools on the base arm arches +# just like we used to only build them on i386 for x86 +%ifnarch armv7hl +%define with_headers 0 +%define with_cross_headers 0 +%endif +# These currently don't compile on armv7 +%define with_selftests 0 +%endif + +%ifarch aarch64 +%define all_arch_configs kernel-%{version}-aarch64*.config +%define asmarch arm64 +%define hdrarch arm64 +%define make_target Image.gz +%define kernel_image arch/arm64/boot/Image.gz +%endif + +# Should make listnewconfig fail if there's config options +# printed out? +%if %{nopatches} +%define with_configchecks 0 +%endif + +# To temporarily exclude an architecture from being built, add it to +# %%nobuildarches. Do _NOT_ use the ExclusiveArch: line, because if we +# don't build kernel-headers then the new build system will no longer let +# us use the previous build of that package -- it'll just be completely AWOL. +# Which is a BadThing(tm). + +# We only build kernel-headers on the following... +%if 0%{?fedora}%{?centos} +%define nobuildarches i386 +%else +%define nobuildarches i386 i686 +%endif + +%ifarch %nobuildarches +%define with_up 0 +%define with_debug 0 +%define with_debuginfo 0 +%define with_perf 0 +%define with_tools 0 +%define with_bpftool 0 +%define with_selftests 0 +%define with_pae 0 +%define _enable_debug_packages 0 +%endif + +# Architectures we build tools/cpupower on +%if 0%{?fedora}%{?centos} +%define cpupowerarchs %{ix86} x86_64 ppc64le %{arm} aarch64 +%else +%define cpupowerarchs i686 x86_64 ppc64le aarch64 +%endif + +%if %{use_vdso} + +%if 0%{?skip_nonpae_vdso} +%define _use_vdso 0 +%else +%define _use_vdso 1 +%endif + +%else +%define _use_vdso 0 +%endif + +# +# Packages that need to be installed before the kernel is, because the %%post +# scripts use them. +# +%define kernel_prereq coreutils, systemd >= 203-2, /usr/bin/kernel-install +%define initrd_prereq dracut >= 027 + + +Name: kernel%{?variant} +License: GPLv2 and Redistributable, no modification permitted +URL: https://www.kernel.org/ +Version: %{rpmversion} +Release: %{pkg_release} +# DO NOT CHANGE THE 'ExclusiveArch' LINE TO TEMPORARILY EXCLUDE AN ARCHITECTURE BUILD. +# SET %%nobuildarches (ABOVE) INSTEAD +%if 0%{?fedora} +ExclusiveArch: x86_64 s390x %{arm} aarch64 ppc64le +%else +ExclusiveArch: noarch i386 i686 x86_64 s390x %{arm} aarch64 ppc64le +%endif +ExclusiveOS: Linux +%ifnarch %{nobuildarches} +Requires: kernel-core-uname-r = %{KVERREL}%{?variant} +Requires: kernel-modules-uname-r = %{KVERREL}%{?variant} +%endif + + +# +# List the packages used during the kernel build +# +BuildRequires: kmod, patch, bash, coreutils, tar, git-core, which +BuildRequires: bzip2, xz, findutils, gzip, m4, perl-interpreter, perl-Carp, perl-devel, perl-generators, make, diffutils, gawk +BuildRequires: gcc, binutils, redhat-rpm-config, hmaccalc, bison, flex, gcc-c++ +BuildRequires: net-tools, hostname, bc, elfutils-devel +%if 0%{?rhel} == 7 +BuildRequires: devtoolset-9-build +BuildRequires: devtoolset-9-binutils +BuildRequires: devtoolset-9-gcc +BuildRequires: devtoolset-9-gcc-c++ +BuildRequires: devtoolset-9-make +BuildRequires: python3-rpm-macros +%endif +%if 0%{?fedora} || 0%{?rhel} >= 8 +BuildRequires: dwarves +%endif +# Used to mangle unversioned shebangs to be Python 3 +BuildRequires: python3-devel +%if %{with_headers} +BuildRequires: rsync +%endif +%if %{with_doc} +BuildRequires: xmlto, asciidoc, python3-sphinx +%endif +%if %{with_sparse} +BuildRequires: sparse +%endif +%if %{with_perf} +BuildRequires: zlib-devel binutils-devel newt-devel perl(ExtUtils::Embed) bison flex xz-devel +BuildRequires: audit-libs-devel +BuildRequires: java-devel +%ifnarch %{arm} s390x +BuildRequires: numactl-devel +%endif +%endif +%if %{with_tools} +BuildRequires: gettext ncurses-devel +%ifnarch s390x +BuildRequires: pciutils-devel +%endif +%endif +%if %{with_bpftool} +%if 0%{?rhel} == 7 +BuildRequires: python-docutils +%else +BuildRequires: python3-docutils +%endif +BuildRequires: zlib-devel binutils-devel +%endif +%if %{with_selftests} +%if 0%{?fedora} +BuildRequires: clang llvm +%else +%if 0%{?rhel} == 7 +BuildRequires: llvm-toolset-7.0 +%else +BuildRequires: llvm-toolset +%endif +%endif +%ifnarch %{arm} +BuildRequires: numactl-devel +%endif +BuildRequires: libcap-devel libcap-ng-devel rsync +%endif +BuildConflicts: rhbuildsys(DiskFree) < 500Mb +%if %{with_debuginfo} +BuildRequires: rpm-build, elfutils +BuildConflicts: rpm < 4.13.0.1-19 +%if 0%{?fedora} +BuildConflicts: dwarves < 1.13 +%endif +# Most of these should be enabled after more investigation +%undefine _include_minidebuginfo +%undefine _find_debuginfo_dwz_opts +%undefine _unique_build_ids +%undefine _unique_debug_names +%undefine _unique_debug_srcs +%undefine _debugsource_packages +%undefine _debuginfo_subpackages +%global _find_debuginfo_opts -r +%global _missing_build_ids_terminate_build 1 +%global _no_recompute_build_ids 1 +%endif +%if %{with_kabidwchk} || %{with_kabidw_base} +BuildRequires: kabi-dw +%endif + +%if %{signkernel}%{signmodules} +BuildRequires: openssl openssl-devel +%if %{signkernel} +%ifarch x86_64 aarch64 +BuildRequires: nss-tools +BuildRequires: pesign >= 0.10-4 +%endif +%endif +%endif + +%if %{with_cross} +BuildRequires: binutils-%{_build_arch}-linux-gnu, gcc-%{_build_arch}-linux-gnu +%define cross_opts CROSS_COMPILE=%{_build_arch}-linux-gnu- +%endif + +# These below are required to build man pages +%if %{with_perf} +BuildRequires: xmlto +%endif +%if %{with_perf} || %{with_tools} +BuildRequires: asciidoc +%endif +%if %{with_tools} +BuildRequires: libcap-devel +%endif + +Source0: https://www.kernel.org/pub/linux/kernel/v5.x/linux-%{kversion}.tar.xz + +# Name of the packaged file containing signing key +%ifarch ppc64le +%define signing_key_filename kernel-signing-ppc.cer +%endif +%ifarch s390x +%define signing_key_filename kernel-signing-s390.cer +%endif + +Source10: x509.genkey.rhel +Source11: x509.genkey.fedora +%if %{?released_kernel} + +Source12: centossecurebootca2.der +Source13: centos-ca-secureboot.der +Source14: centossecureboot201.der +Source15: centossecureboot001.der +Source16: secureboot_s390.cer +Source17: secureboot_ppc.cer + +%define secureboot_ca_1 %{SOURCE12} +%define secureboot_ca_0 %{SOURCE13} +%ifarch x86_64 aarch64 +%define secureboot_key_1 %{SOURCE14} +%define pesign_name_1 centossecureboot201 +%define secureboot_key_0 %{SOURCE15} +%define pesign_name_0 centossecureboot001 +%endif + +# released_kernel +%else + +Source12: centossecurebootca2.der +Source13: centos-ca-secureboot.der +Source14: centossecureboot201.der +Source15: centossecureboot001.der + +%define secureboot_ca_1 %{SOURCE12} +%define secureboot_ca_0 %{SOURCE13} +%define secureboot_key_1 %{SOURCE14} +%define pesign_name_1 centossecureboot201 +%define secureboot_key_0 %{SOURCE15} +%define pesign_name_0 centossecureboot001 + +# released_kernel +%endif + +Source22: mod-extra.list.rhel +Source23: mod-extra.list.fedora +Source24: mod-extra.sh +Source18: mod-sign.sh +Source19: mod-extra-blacklist.sh +Source79: parallel_xz.sh + +Source80: filter-x86_64.sh.fedora +Source81: filter-armv7hl.sh.fedora +Source82: filter-i686.sh.fedora +Source83: filter-aarch64.sh.fedora +Source86: filter-ppc64le.sh.fedora +Source87: filter-s390x.sh.fedora +Source89: filter-modules.sh.fedora + +Source90: filter-x86_64.sh.rhel +Source91: filter-armv7hl.sh.rhel +Source92: filter-i686.sh.rhel +Source93: filter-aarch64.sh.rhel +Source96: filter-ppc64le.sh.rhel +Source97: filter-s390x.sh.rhel +Source99: filter-modules.sh.rhel +%define modsign_cmd %{SOURCE18} + +Source20: kernel-aarch64-rhel.config +Source21: kernel-aarch64-debug-rhel.config +Source30: kernel-ppc64le-rhel.config +Source31: kernel-ppc64le-debug-rhel.config +Source32: kernel-s390x-rhel.config +Source33: kernel-s390x-debug-rhel.config +Source34: kernel-s390x-zfcpdump-rhel.config +Source35: kernel-x86_64-rhel.config +Source36: kernel-x86_64-debug-rhel.config + +Source37: kernel-aarch64-fedora.config +Source38: kernel-aarch64-debug-fedora.config +Source39: kernel-armv7hl-fedora.config +Source40: kernel-armv7hl-debug-fedora.config +Source41: kernel-armv7hl-lpae-fedora.config +Source42: kernel-armv7hl-lpae-debug-fedora.config +Source43: kernel-i686-fedora.config +Source44: kernel-i686-debug-fedora.config +Source45: kernel-ppc64le-fedora.config +Source46: kernel-ppc64le-debug-fedora.config +Source47: kernel-s390x-fedora.config +Source48: kernel-s390x-debug-fedora.config +Source49: kernel-x86_64-fedora.config +Source50: kernel-x86_64-debug-fedora.config + + + +Source51: generate_all_configs.sh + +Source52: process_configs.sh +Source53: generate_bls_conf.sh +Source56: update_scripts.sh + +Source54: mod-internal.list +Source55: merge.pl + +Source200: check-kabi + +Source201: Module.kabi_aarch64 +Source202: Module.kabi_ppc64le +Source203: Module.kabi_s390x +Source204: Module.kabi_x86_64 + +Source210: Module.kabi_dup_aarch64 +Source211: Module.kabi_dup_ppc64le +Source212: Module.kabi_dup_s390x +Source213: Module.kabi_dup_x86_64 + +# Source300: kernel-abi-stablelists-%{rpmversion}-%{distro_build}.tar.bz2 +# Source301: kernel-kabi-dw-%{rpmversion}-%{distro_build}.tar.bz2 + +# Sources for kernel-tools +Source2000: cpupower.service +Source2001: cpupower.config + +Source9000: centos.pem + +## Patches needed for building this package + +# Patch1: patch-%{rpmversion}-redhat.patch + +# empty final patch to facilitate testing of kernel patches +# Patch999999: linux-kernel-test.patch + +# This file is intentionally left empty in the stock kernel. Its a nicety +# added for those wanting to do custom rebuilds with altered config opts. +Source1000: kernel-local + +# Here should be only the patches up to the upstream canonical Linus tree. + +# For a stable release kernel +%if 0%{?stable_update} +%if 0%{?stable_base} +%define stable_patch_00 https://cdn.kernel.org/pub/linux/kernel/v5.x/patch-5.%{base_sublevel}.%{stable_base}.xz +Source5000: %{stable_patch_00} +%endif + +# non-released_kernel case +# These are automagically defined by the rcrev and gitrev values set up +# near the top of this spec file. +%else +%if 0%{?rcrev} +Source5000: patch-5.%{upstream_sublevel}-rc%{rcrev}.xz +%if 0%{?gitrev} +Source5001: patch-5.%{upstream_sublevel}-rc%{rcrev}-git%{gitrev}.xz +%endif +%else +# pre-{base_sublevel+1}-rc1 case +%if 0%{?gitrev} +Source5000: patch-5.%{base_sublevel}-git%{gitrev}.xz +%endif +%endif +%endif + +## Patches needed for building this package + +## compile fixes + +%if !%{nopatches} + +Patch6: fedora-v5.15.patch +Patch11: 0001-kdump-round-up-the-total-memory-size-to-128M-for-cra.patch +#Patch12: 0001-kdump-add-support-for-crashkernel-auto.patch +#Patch15: 0001-kdump-fix-a-grammar-issue-in-a-kernel-message.patch +Patch24: 0001-scsi-smartpqi-add-inspur-advantech-ids.patch +Patch62: 0001-Drop-that-for-now.patch +Patch64: 0001-mm-kmemleak-skip-late_init-if-not-skip-disable.patch +Patch66: 0001-dt-bindings-panel-add-binding-for-Xingbangda-XBD599-.patch +#Patch67: 0001-drm-panel-add-Xingbangda-XBD599-panel.patch +Patch68: 0001-drm-sun4i-sun6i_mipi_dsi-fix-horizontal-timing-calcu.patch +Patch72: 0001-Work-around-for-gcc-bug-https-gcc.gnu.org-bugzilla-s.patch + +# A patch to fix some undocumented things broke a bunch of Allwinner networks due to wrong assumptions +Patch102: 0001-update-phy-on-pine64-a64-devices.patch + +# OMAP Pandaboard fix +#Patch103: arm-pandaboard-fix-add-bluetooth.patch + +# Fix for USB on some newer RPi4 / firmware combinations +Patch104: 0001-brcm-rpi4-fix-usb-numeration.patch + +# RPi-4 and wifi issues +#Patch105: arm-dts-rpi-4-disable-wifi-frequencies.patch + +# END OF PATCH DEFINITIONS + +%endif + + +%description +The kernel meta package + +# +# This macro does requires, provides, conflicts, obsoletes for a kernel package. +# %%kernel_reqprovconf +# It uses any kernel__conflicts and kernel__obsoletes +# macros defined above. +# +%define kernel_reqprovconf \ +Provides: kernel = %{rpmversion}-%{pkg_release}\ +Provides: kernel-%{_target_cpu} = %{rpmversion}-%{pkg_release}%{?1:+%{1}}\ +Provides: kernel-drm-nouveau = 16\ +Provides: kernel-uname-r = %{KVERREL}%{?variant}%{?1:+%{1}}\ +Requires(pre): %{kernel_prereq}\ +Requires(pre): %{initrd_prereq}\ +Requires(pre): linux-firmware >= 20150904-56.git6ebf5d57\ +Requires(preun): systemd >= 200\ +Conflicts: xfsprogs < 4.3.0-1\ +Conflicts: xorg-x11-drv-vmmouse < 13.0.99\ +%{expand:%%{?kernel%{?1:_%{1}}_conflicts:Conflicts: %%{kernel%{?1:_%{1}}_conflicts}}}\ +%{expand:%%{?kernel%{?1:_%{1}}_obsoletes:Obsoletes: %%{kernel%{?1:_%{1}}_obsoletes}}}\ +%{expand:%%{?kernel%{?1:_%{1}}_provides:Provides: %%{kernel%{?1:_%{1}}_provides}}}\ +# 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\ +%{nil} + + +%package doc +Summary: Various documentation bits found in the kernel source +Group: Documentation +%description doc +This package contains documentation files from the kernel +source. Various bits of information about the Linux kernel and the +device drivers shipped with it are documented in these files. + +You'll want to install this package if you need a reference to the +options that can be passed to Linux kernel modules at load time. + + +%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 +%if "0%{?variant}" +Obsoletes: kernel-headers < %{rpmversion}-%{pkg_release} +Provides: kernel-headers = %{rpmversion}-%{pkg_release} +%endif +%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. + +%package cross-headers +Summary: Header files for the Linux kernel for use by cross-glibc +%description cross-headers +Kernel-cross-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 +cross-glibc package. + + +%package debuginfo-common-%{_target_cpu} +Summary: Kernel source files used by %{name}-debuginfo packages +Provides: installonlypkg(kernel) +%description debuginfo-common-%{_target_cpu} +This package is required by %{name}-debuginfo subpackages. +It provides the kernel source files common to all builds. + +%if %{with_perf} +%package -n perf +Summary: Performance monitoring for the Linux kernel +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: %{name}-debuginfo-common-%{_target_cpu} = %{version}-%{release} +AutoReqProv: no +%description -n perf-debuginfo +This package provides debug information for the perf package. + +# 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. +%{expand:%%global _find_debuginfo_opts %{?_find_debuginfo_opts} -p '.*%%{_bindir}/perf(\.debug)?|.*%%{_libexecdir}/perf-core/.*|.*%%{_libdir}/traceevent/plugins/.*|.*%%{_libdir}/libperf-jvmti.so(\.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: %{name}-debuginfo-common-%{_target_cpu} = %{version}-%{release} +AutoReqProv: no +%description -n python3-perf-debuginfo +This package provides debug information for the perf python bindings. + +# the python_sitearch macro should already be defined from above +%{expand:%%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 +%define __requires_exclude ^%{_bindir}/python +%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: %{name}-debuginfo-common-%{_target_cpu} = %{version}-%{release} +AutoReqProv: no +%description -n kernel-tools-debuginfo +This package provides debug information for package kernel-tools. + +# 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. +%{expand:%%global _find_debuginfo_opts %{?_find_debuginfo_opts} -p '.*%%{_bindir}/centrino-decode(\.debug)?|.*%%{_bindir}/powernow-k8-decode(\.debug)?|.*%%{_bindir}/cpupower(\.debug)?|.*%%{_libdir}/libcpupower.*|.*%%{_bindir}/turbostat(\.debug)?|.*%%{_bindir}/x86_energy_perf_policy(\.debug)?|.*%%{_bindir}/tmon(\.debug)?|.*%%{_bindir}/lsgpio(\.debug)?|.*%%{_bindir}/gpio-hammer(\.debug)?|.*%%{_bindir}/gpio-event-mon(\.debug)?|.*%%{_bindir}/iio_event_monitor(\.debug)?|.*%%{_bindir}/iio_generic_buffer(\.debug)?|.*%%{_bindir}/lsiio(\.debug)?|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 +Group: Development/Debug +Requires: %{name}-debuginfo-common-%{_target_cpu} = %{version}-%{release} +AutoReqProv: no +%description -n bpftool-debuginfo +This package provides debug information for the bpftool package. + +%{expand:%%global _find_debuginfo_opts %{?_find_debuginfo_opts} -p '.*%%{_sbindir}/bpftool(\.debug)?|XXX' -o bpftool-debuginfo.list} + +# with_bpftool +%endif + +%if %{with_selftests} + +%package selftests-internal +Summary: Kernel samples and selftests +License: GPLv2 +Requires: binutils, bpftool, iproute-tc, nmap-ncat +Requires: kernel-modules-internal = %{version}-%{release} +%description selftests-internal +Kernel sample programs and selftests. + +# 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. +%{expand:%%global _find_debuginfo_opts %{?_find_debuginfo_opts} -p '.*%%{_libexecdir}/(ksamples|kselftests)/.*|XXX' -o selftests-debuginfo.list} + +# with_selftests +%endif + +%if %{with_gcov} +%package gcov +Summary: gcov graph and source files for coverage data collection. +%description gcov +kernel-gcov includes the gcov graph and source files for gcov coverage collection. +%endif + +%package -n kernel-abi-stablelists +Summary: The Red Hat Enterprise Linux kernel ABI symbol stablelists +AutoReqProv: no +%description -n kernel-abi-stablelists +The kABI package contains information pertaining to the Red Hat Enterprise +Linux kernel ABI, including lists of kernel symbols that are needed by +external Linux kernel modules, and a yum plugin to aid enforcement. + +%if %{with_kabidw_base} +%package kabidw-base +Summary: The baseline dataset for kABI verification using DWARF data +Group: System Environment/Kernel +AutoReqProv: no +%description kabidw-base +The kabidw-base package contains data describing the current ABI of the Red Hat +Enterprise Linux kernel, suitable for the kabi-dw tool. +%endif + +# +# This macro creates a kernel--debuginfo package. +# %%kernel_debuginfo_package +# +# Explanation of the find_debuginfo_opts: We build multiple kernels (debug +# pae etc.) so the regex filters those kernels appropriately. We also +# have to package several binaries as part of kernel-devel but getting +# unique build-ids is tricky for these userspace binaries. We don't really +# care about debugging those so we just filter those out and remove it. +%define kernel_debuginfo_package() \ +%package %{?1:%{1}-}debuginfo\ +Summary: Debug information for package %{name}%{?1:-%{1}}\ +Requires: %{name}-debuginfo-common-%{_target_cpu} = %{version}-%{release}\ +Provides: %{name}%{?1:-%{1}}-debuginfo-%{_target_cpu} = %{version}-%{release}\ +Provides: installonlypkg(kernel)\ +AutoReqProv: no\ +%description %{?1:%{1}-}debuginfo\ +This package provides debug information for package %{name}%{?1:-%{1}}.\ +This is required to use SystemTap with %{name}%{?1:-%{1}}-%{KVERREL}.\ +%{expand:%%global _find_debuginfo_opts %{?_find_debuginfo_opts} -p '.*\/usr\/src\/kernels/.*|XXX' -o ignored-debuginfo.list -p '/.*/%%{KVERREL_RE}%{?1:[+]%{1}}/.*|/.*%%{KVERREL_RE}%{?1:\+%{1}}(\.debug)?' -o debuginfo%{?1}.list}\ + + +%{nil} + +# +# This macro creates a kernel--devel package. +# %%kernel_devel_package +# +%define kernel_devel_package() \ +%package %{?1:%{1}-}devel\ +Summary: Development package for building kernel modules to match the %{?2:%{2} }kernel\ +Provides: kernel%{?1:-%{1}}-devel-%{_target_cpu} = %{version}-%{release}\ +Provides: kernel-devel-%{_target_cpu} = %{version}-%{release}%{?1:+%{1}}\ +Provides: kernel-devel-uname-r = %{KVERREL}%{?variant}%{?1:+%{1}}\ +Provides: installonlypkg(kernel)\ +AutoReqProv: no\ +Requires(pre): findutils\ +Requires: findutils\ +Requires: perl-interpreter\ +%description %{?1:%{1}-}devel\ +This package provides kernel headers and makefiles sufficient to build modules\ +against the %{?2:%{2} }kernel package.\ +%{nil} + +# +# kernel--ipaclones-internal package +# +%define kernel_ipaclones_package() \ +%package %{?1:%{1}-}ipaclones-internal\ +Summary: *.ipa-clones files generated by -fdump-ipa-clones for kernel%{?1:-%{1}}\ +Group: System Environment/Kernel\ +AutoReqProv: no\ +%description %{?1:%{1}-}ipaclones-internal\ +This package provides *.ipa-clones files.\ +%{nil} + +# +# This macro creates a kernel--modules-internal package. +# %%kernel_modules_internal_package +# +%define kernel_modules_internal_package() \ +%package %{?1:%{1}-}modules-internal\ +Summary: Extra kernel modules to match the %{?2:%{2} }kernel\ +Group: System Environment/Kernel\ +Provides: kernel%{?1:-%{1}}-modules-internal-%{_target_cpu} = %{version}-%{release}\ +Provides: kernel%{?1:-%{1}}-modules-internal-%{_target_cpu} = %{version}-%{release}%{?1:+%{1}}\ +Provides: kernel%{?1:-%{1}}-modules-internal = %{version}-%{release}%{?1:+%{1}}\ +Provides: installonlypkg(kernel-module)\ +Provides: kernel%{?1:-%{1}}-modules-internal-uname-r = %{KVERREL}%{?variant}%{?1:+%{1}}\ +Requires: kernel-uname-r = %{KVERREL}%{?variant}%{?1:+%{1}}\ +Requires: kernel%{?1:-%{1}}-modules-uname-r = %{KVERREL}%{?variant}%{?1:+%{1}}\ +AutoReq: no\ +AutoProv: yes\ +%description %{?1:%{1}-}modules-internal\ +This package provides kernel modules for the %{?2:%{2} }kernel package for Red Hat internal usage.\ +%{nil} + +# +# This macro creates a kernel--modules-extra package. +# %%kernel_modules_extra_package +# +%define kernel_modules_extra_package() \ +%package %{?1:%{1}-}modules-extra\ +Summary: Extra kernel modules to match the %{?2:%{2} }kernel\ +Provides: kernel%{?1:-%{1}}-modules-extra-%{_target_cpu} = %{version}-%{release}\ +Provides: kernel%{?1:-%{1}}-modules-extra-%{_target_cpu} = %{version}-%{release}%{?1:+%{1}}\ +Provides: kernel%{?1:-%{1}}-modules-extra = %{version}-%{release}%{?1:+%{1}}\ +Provides: installonlypkg(kernel-module)\ +Provides: kernel%{?1:-%{1}}-modules-extra-uname-r = %{KVERREL}%{?variant}%{?1:+%{1}}\ +Requires: kernel-uname-r = %{KVERREL}%{?variant}%{?1:+%{1}}\ +Requires: kernel%{?1:-%{1}}-modules-uname-r = %{KVERREL}%{?variant}%{?1:+%{1}}\ +AutoReq: no\ +AutoProv: yes\ +%description %{?1:%{1}-}modules-extra\ +This package provides less commonly used kernel modules for the %{?2:%{2} }kernel package.\ +%{nil} + +# +# This macro creates a kernel--modules package. +# %%kernel_modules_package +# +%define kernel_modules_package() \ +%package %{?1:%{1}-}modules\ +Summary: kernel modules to match the %{?2:%{2}-}core kernel\ +Provides: kernel%{?1:-%{1}}-modules-%{_target_cpu} = %{version}-%{release}\ +Provides: kernel-modules-%{_target_cpu} = %{version}-%{release}%{?1:+%{1}}\ +Provides: kernel-modules = %{version}-%{release}%{?1:+%{1}}\ +Provides: installonlypkg(kernel-module)\ +Provides: kernel%{?1:-%{1}}-modules-uname-r = %{KVERREL}%{?variant}%{?1:+%{1}}\ +Requires: kernel-uname-r = %{KVERREL}%{?variant}%{?1:+%{1}}\ +AutoReq: no\ +AutoProv: yes\ +%description %{?1:%{1}-}modules\ +This package provides commonly used kernel modules for the %{?2:%{2}-}core kernel package.\ +%{nil} + +# +# this macro creates a kernel- meta package. +# %%kernel_meta_package +# +%define kernel_meta_package() \ +%package %{1}\ +summary: kernel meta-package for the %{1} kernel\ +Requires: kernel-%{1}-core-uname-r = %{KVERREL}%{?variant}+%{1}\ +Requires: kernel-%{1}-modules-uname-r = %{KVERREL}%{?variant}+%{1}\ +Provides: installonlypkg(kernel)\ +%description %{1}\ +The meta-package for the %{1} kernel\ +%{nil} + +# +# This macro creates a kernel- and its -devel and -debuginfo too. +# %%define variant_summary The Linux kernel compiled for +# %%kernel_variant_package [-n ] +# +%define kernel_variant_package(n:) \ +%package %{?1:%{1}-}core\ +Summary: %{variant_summary}\ +Provides: kernel-%{?1:%{1}-}core-uname-r = %{KVERREL}%{?variant}%{?1:+%{1}}\ +Provides: installonlypkg(kernel)\ +%ifarch ppc64le\ +Obsoletes: kernel-bootwrapper\ +%endif\ +%{expand:%%kernel_reqprovconf}\ +%if %{?1:1} %{!?1:0} \ +%{expand:%%kernel_meta_package %{?1:%{1}}}\ +%endif\ +%{expand:%%kernel_devel_package %{?1:%{1}} %{!?{-n}:%{1}}%{?{-n}:%{-n*}}}\ +%{expand:%%kernel_modules_package %{?1:%{1}} %{!?{-n}:%{1}}%{?{-n}:%{-n*}}}\ +%{expand:%%kernel_modules_extra_package %{?1:%{1}} %{!?{-n}:%{1}}%{?{-n}:%{-n*}}}\ +%{expand:%%kernel_modules_internal_package %{?1:%{1}} %{!?{-n}:%{1}}%{?{-n}:%{-n*}}}\ +%{expand:%%kernel_debuginfo_package %{?1:%{1}}}\ +%{nil} + +# Now, each variant package. + +%if %{with_pae} +%define variant_summary The Linux kernel compiled for Cortex-A15 +%kernel_variant_package lpae +%description lpae-core +This package includes a version of the Linux kernel with support for +Cortex-A15 devices with LPAE and HW virtualisation support +%endif + +%if %{with_zfcpdump} +%define variant_summary The Linux kernel compiled for zfcpdump usage +%kernel_variant_package zfcpdump +%description zfcpdump-core +The kernel package contains the Linux kernel (vmlinuz) for use by the +zfcpdump infrastructure. +# with_zfcpdump +%endif + +%define variant_summary The Linux kernel compiled with extra debugging enabled +%kernel_variant_package debug +%description debug-core +The kernel package contains the Linux kernel (vmlinuz), the core of any +Linux operating system. The kernel handles the basic functions +of the operating system: memory allocation, process allocation, device +input and output, etc. + +This variant of the kernel has numerous debugging options enabled. +It should only be installed when trying to gather additional information +on kernel bugs, as some of these options impact performance noticably. + +# And finally the main -core package + +%define variant_summary The Linux kernel +%kernel_variant_package +%description core +The kernel package contains the Linux kernel (vmlinuz), the core of any +Linux operating system. The kernel handles the basic functions +of the operating system: memory allocation, process allocation, device +input and output, etc. + +%if %{with_ipaclones} +%kernel_ipaclones_package +%endif + +%prep +%if 0%{?rhel} == 7 +source scl_source enable devtoolset-9 || : +source scl_source enable llvm-toolset-7.0 || : +%endif +# do a few sanity-checks for --with *only builds +%if %{with_baseonly} +%if !%{with_up}%{with_pae} +echo "Cannot build --with baseonly, up build is disabled" +exit 1 +%endif +%endif + +%if "%{baserelease}" == "0" +echo "baserelease must be greater than zero" +exit 1 +%endif + +# more sanity checking; do it quietly +if [ "%{patches}" != "%%{patches}" ] ; then + for patch in %{patches} ; do + if [ ! -f $patch ] ; then + echo "ERROR: Patch ${patch##/*/} listed in specfile but is missing" + exit 1 + fi + done +fi 2>/dev/null + +patch_command='patch -p1 -F1 -s' +ApplyPatch() +{ + local patch=$1 + shift + if [ ! -f $RPM_SOURCE_DIR/$patch ]; then + exit 1 + fi + if ! grep -E "^Patch[0-9]+: $patch\$" %{_specdir}/${RPM_PACKAGE_NAME%%%%%{?variant}}.spec ; then + if [ "${patch:0:8}" != "patch-5." ] ; then + echo "ERROR: Patch $patch not listed as a source patch in specfile" + exit 1 + fi + fi 2>/dev/null + case "$patch" in + *.bz2) bunzip2 < "$RPM_SOURCE_DIR/$patch" | $patch_command ${1+"$@"} ;; + *.gz) gunzip < "$RPM_SOURCE_DIR/$patch" | $patch_command ${1+"$@"} ;; + *.xz) unxz < "$RPM_SOURCE_DIR/$patch" | $patch_command ${1+"$@"} ;; + *) $patch_command ${1+"$@"} < "$RPM_SOURCE_DIR/$patch" ;; + esac +} + +# don't apply patch if it's empty +ApplyOptionalPatch() +{ + local patch=$1 + shift + if [ ! -f $RPM_SOURCE_DIR/$patch ]; then + exit 1 + fi + local C=$(wc -l $RPM_SOURCE_DIR/$patch | awk '{print $1}') + if [ "$C" -gt 9 ]; then + ApplyPatch $patch ${1+"$@"} + fi +} + +# First we unpack the kernel tarball. +# If this isn't the first make prep, we use links to the existing clean tarball +# which speeds things up quite a bit. + +# Update to latest upstream. +%if 0%{?released_kernel} +%define vanillaversion 5.%{base_sublevel} +# non-released_kernel case +%else +%if 0%{?rcrev} +%define vanillaversion 5.%{upstream_sublevel}-rc%{rcrev} +%if 0%{?gitrev} +%define vanillaversion 5.%{upstream_sublevel}-rc%{rcrev}-git%{gitrev} +%endif +%else +# pre-{base_sublevel+1}-rc1 case +%if 0%{?gitrev} +%define vanillaversion 5.%{base_sublevel}-git%{gitrev} +%else +%define vanillaversion 5.%{base_sublevel} +%endif +%endif +%endif + +# %%{vanillaversion} : the full version name, e.g. 2.6.35-rc6-git3 +# %%{kversion} : the base version, e.g. 2.6.34 + +# Use kernel-%%{kversion}%%{?dist} as the top-level directory name +# so we can prep different trees within a single git directory. + +# Build a list of the other top-level kernel tree directories. +# This will be used to hardlink identical vanilla subdirs. +sharedirs=$(find "$PWD" -maxdepth 1 -type d -name 'kernel-5.*' \ + | grep -x -v "$PWD"/kernel-%{kversion}%{?dist}) ||: + +# Delete all old stale trees. +if [ -d kernel-%{kversion}%{?dist} ]; then + cd kernel-%{kversion}%{?dist} + for i in linux-* + do + if [ -d $i ]; then + # Just in case we ctrl-c'd a prep already + rm -rf deleteme.%{_target_cpu} + # Move away the stale away, and delete in background. + mv $i deleteme-$i + rm -rf deleteme* & + fi + done + cd .. +fi + +# Generate new tree +if [ ! -d kernel-%{kversion}%{?dist}/vanilla-%{vanillaversion} ]; then + + if [ -d kernel-%{kversion}%{?dist}/vanilla-%{kversion} ]; then + + # The base vanilla version already exists. + cd kernel-%{kversion}%{?dist} + + # Any vanilla-* directories other than the base one are stale. + for dir in vanilla-*; do + [ "$dir" = vanilla-%{kversion} ] || rm -rf $dir & + done + + else + + rm -f pax_global_header + # Look for an identical base vanilla dir that can be hardlinked. + for sharedir in $sharedirs ; do + if [[ ! -z $sharedir && -d $sharedir/vanilla-%{kversion} ]] ; then + break + fi + done + if [[ ! -z $sharedir && -d $sharedir/vanilla-%{kversion} ]] ; then +%setup -q -n kernel-%{kversion}%{?dist} -c -T + cp -al $sharedir/vanilla-%{kversion} . + else +%setup -q -n kernel-%{kversion}%{?dist} -c + mv linux-%{kversion} vanilla-%{kversion} + fi + + fi + +%if "%{kversion}" != "%{vanillaversion}" + + for sharedir in $sharedirs ; do + if [[ ! -z $sharedir && -d $sharedir/vanilla-%{vanillaversion} ]] ; then + break + fi + done + if [[ ! -z $sharedir && -d $sharedir/vanilla-%{vanillaversion} ]] ; then + + cp -al $sharedir/vanilla-%{vanillaversion} . + + else + + # Need to apply patches to the base vanilla version. + cp -al vanilla-%{kversion} vanilla-%{vanillaversion} + cd vanilla-%{vanillaversion} + +cp %{SOURCE12} . + +# Update vanilla to the latest upstream. +# (non-released_kernel case only) +%if 0%{?rcrev} + xzcat %{SOURCE5000} | patch -p1 -F1 -s +%if 0%{?gitrev} + xzcat %{SOURCE5001} | patch -p1 -F1 -s +%endif +%else +# pre-{base_sublevel+1}-rc1 case +%if 0%{?gitrev} + xzcat %{SOURCE5000} | patch -p1 -F1 -s +%endif +%endif + git init + git config user.email "kernel-team@fedoraproject.org" + git config user.name "Fedora Kernel Team" + git config gc.auto 0 + git add . + git commit -a -q -m "baseline" + + cd .. + + fi + +%endif + +else + + # We already have all vanilla dirs, just change to the top-level directory. + cd kernel-%{kversion}%{?dist} + +fi + +# Now build the fedora kernel tree. +cp -al vanilla-%{vanillaversion} linux-%{KVERREL} +cp -v %{SOURCE9000} linux-%{KVERREL}/certs/rhel.pem + +cd linux-%{KVERREL} +if [ ! -d .git ]; then + git init + git config user.email "kernel-team@fedoraproject.org" + git config user.name "Fedora Kernel Team" + git config gc.auto 0 + git add . + git commit -a -q -m "baseline" +fi + + +# released_kernel with possible stable updates +%if 0%{?stable_base} +# This is special because the kernel spec is hell and nothing is consistent +xzcat %{SOURCE5000} | patch -p1 -F1 -s +git commit -a -m "Stable update" +%endif + +# Note: Even in the "nopatches" path some patches (build tweaks and compile +# fixes) will always get applied; see patch defition above for details + +git am %{patches} + +# END OF PATCH APPLICATIONS + +# Any further pre-build tree manipulations happen here. + +chmod +x scripts/checkpatch.pl +mv COPYING COPYING-%{version}-%{release} + +# This Prevents scripts/setlocalversion from mucking with our version numbers. +touch .scmversion + +# 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. +pathfix.py -i "%{__python3} %{py3_shbang_opts}" -p -n \ + tools/kvm/kvm_stat/kvm_stat \ + scripts/show_delta \ + scripts/diffconfig \ + scripts/bloat-o-meter \ + scripts/jobserver-exec \ + tools \ + Documentation \ + scripts/clang-tools + +# only deal with configs if we are going to build for the arch +%ifnarch %nobuildarches + +if [ -L configs ]; then + rm -f configs +fi +# Deal with configs stuff +mkdir configs +cd configs + +# Drop some necessary files from the source dir into the buildroot +cp $RPM_SOURCE_DIR/kernel-*.config . +cp %{SOURCE1000} . +cp %{SOURCE55} . +cp %{SOURCE51} . +VERSION=%{version} ./generate_all_configs.sh %{primary_target} %{debugbuildsenabled} + + +# Merge in any user-provided local config option changes +%ifnarch %nobuildarches +for i in %{all_arch_configs} +do + mv $i $i.tmp + ./merge.pl %{SOURCE1000} $i.tmp > $i + rm $i.tmp +done +%endif + +%if !%{debugbuildsenabled} +rm -f kernel-%{version}-*debug.config +%endif + +# enable GCOV kernel config options if gcov is on +%if %{with_gcov} +for i in *.config +do + sed -i 's/# CONFIG_GCOV_KERNEL is not set/CONFIG_GCOV_KERNEL=y\nCONFIG_GCOV_PROFILE_ALL=y\n/' $i +done +%endif + +cp %{SOURCE52} . +OPTS="" +%if %{with_configchecks} + OPTS="$OPTS -w -n -c" +%endif +./process_configs.sh $OPTS kernel %{rpmversion} + +cp %{SOURCE56} . +RPM_SOURCE_DIR=$RPM_SOURCE_DIR ./update_scripts.sh %{primary_target} + +# end of kernel config +%endif + +cd .. +# # End of Configs stuff + +# get rid of unwanted files resulting from patch fuzz +find . \( -name "*.orig" -o -name "*~" \) -delete >/dev/null + +# remove unnecessary SCM files +find . -name .gitignore -delete >/dev/null + +cd .. + +### +### build +### +%build +%if 0%{?rhel} == 7 +source scl_source enable devtoolset-9 || : +source scl_source enable llvm-toolset-7.0 || : +%endif + +%if %{with_sparse} +%define sparse_mflags C=1 +%endif + +cp_vmlinux() +{ + eu-strip --remove-comment -o "$2" "$1" +} + +# These are for host programs that get built as part of the kernel and +# are required to be packaged in kernel-devel for building external modules. +# Since they are userspace binaries, they are required to pickup the hardening +# flags defined in the macros. The --build-id=uuid is a trick to get around +# debuginfo limitations: Typically, find-debuginfo.sh will update the build +# id of all binaries to allow for parllel debuginfo installs. The kernel +# can't use this because it breaks debuginfo for the vDSO so we have to +# use a special mechanism for kernel and modules to be unique. Unfortunately, +# we still have userspace binaries which need unique debuginfo and because +# they come from the kernel package, we can't just use find-debuginfo.sh to +# rewrite only those binaries. The easiest option right now is just to have +# the build id be a uuid for the host programs. +# +# Note we need to disable these flags for cross builds because the flags +# from redhat-rpm-config assume that host == target so target arch +# flags cause issues with the host compiler. +%if !%{with_cross} +%define build_hostcflags %{?build_cflags} +%define build_hostldflags %{?build_ldflags} +%endif + +%define make %{__make} %{?cross_opts} %{?make_opts} HOSTCFLAGS="%{?build_hostcflags}" HOSTLDFLAGS="%{?build_hostldflags}" + +BuildKernel() { + MakeTarget=$1 + KernelImage=$2 + Flavour=$4 + DoVDSO=$3 + Flav=${Flavour:++${Flavour}} + InstallName=${5:-vmlinuz} + + DoModules=1 + if [ "$Flavour" = "zfcpdump" ]; then + DoModules=0 + fi + + # Pick the right config file for the kernel we're building + Config=kernel-%{version}-%{_target_cpu}${Flavour:+-${Flavour}}.config + DevelDir=/usr/src/kernels/%{KVERREL}${Flav} + + # When the bootable image is just the ELF kernel, strip it. + # We already copy the unstripped file into the debuginfo package. + if [ "$KernelImage" = vmlinux ]; then + CopyKernel=cp_vmlinux + else + CopyKernel=cp + fi + + KernelVer=%{version}-%{release}.%{_target_cpu}${Flav} + echo BUILDING A KERNEL FOR ${Flavour} %{_target_cpu}... + + %if 0%{?stable_update} + # make sure SUBLEVEL is incremented on a stable release. Sigh 3.x. + perl -p -i -e "s/^SUBLEVEL.*/SUBLEVEL = %{?stablerev}/" Makefile + %endif + + # make sure EXTRAVERSION says what we want it to say + perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION = -%{release}.%{_target_cpu}${Flav}/" Makefile + + # if pre-rc1 devel kernel, must fix up PATCHLEVEL for our versioning scheme + %if !0%{?rcrev} + %if 0%{?gitrev} + perl -p -i -e 's/^PATCHLEVEL.*/PATCHLEVEL = %{upstream_sublevel}/' Makefile + %endif + %endif + + # and now to start the build process + + %{make} %{?_smp_mflags} mrproper + cp configs/$Config .config + + %if %{signkernel}%{signmodules} + cp $RPM_SOURCE_DIR/x509.genkey certs/. + %endif + + Arch=`head -1 .config | cut -b 3-` + echo USING ARCH=$Arch + + KCFLAGS="%{?kcflags}" + + # add kpatch flags for base kernel + if [ "$Flavour" == "" ]; then + KCFLAGS="$KCFLAGS %{?kpatch_kcflags}" + fi + + %{make} ARCH=$Arch olddefconfig >/dev/null + + # This ensures build-ids are unique to allow parallel debuginfo + perl -p -i -e "s/^CONFIG_BUILD_SALT.*/CONFIG_BUILD_SALT=\"%{KVERREL}\"/" .config + %{make} ARCH=$Arch KCFLAGS="$KCFLAGS" WITH_GCOV="%{?with_gcov}" %{?_smp_mflags} $MakeTarget %{?sparse_mflags} %{?kernel_mflags} + if [ $DoModules -eq 1 ]; then + %{make} ARCH=$Arch KCFLAGS="$KCFLAGS" WITH_GCOV="%{?with_gcov}" %{?_smp_mflags} modules %{?sparse_mflags} || exit 1 + fi + + mkdir -p $RPM_BUILD_ROOT/%{image_install_path} + mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer +%if %{with_debuginfo} + mkdir -p $RPM_BUILD_ROOT%{debuginfodir}/%{image_install_path} +%endif + +%ifarch %{arm} aarch64 + %{make} ARCH=$Arch dtbs INSTALL_DTBS_PATH=$RPM_BUILD_ROOT/%{image_install_path}/dtb-$KernelVer + %{make} ARCH=$Arch dtbs_install INSTALL_DTBS_PATH=$RPM_BUILD_ROOT/%{image_install_path}/dtb-$KernelVer + cp -r $RPM_BUILD_ROOT/%{image_install_path}/dtb-$KernelVer $RPM_BUILD_ROOT/lib/modules/$KernelVer/dtb + find arch/$Arch/boot/dts -name '*.dtb' -type f -delete +%endif + + # Start installing the results + install -m 644 .config $RPM_BUILD_ROOT/boot/config-$KernelVer + install -m 644 .config $RPM_BUILD_ROOT/lib/modules/$KernelVer/config + install -m 644 System.map $RPM_BUILD_ROOT/boot/System.map-$KernelVer + install -m 644 System.map $RPM_BUILD_ROOT/lib/modules/$KernelVer/System.map + + # We estimate the size of the initramfs because rpm needs to take this size + # into consideration when performing disk space calculations. (See bz #530778) + dd if=/dev/zero of=$RPM_BUILD_ROOT/boot/initramfs-$KernelVer.img bs=1M count=20 + + if [ -f arch/$Arch/boot/zImage.stub ]; then + cp arch/$Arch/boot/zImage.stub $RPM_BUILD_ROOT/%{image_install_path}/zImage.stub-$KernelVer || : + cp arch/$Arch/boot/zImage.stub $RPM_BUILD_ROOT/lib/modules/$KernelVer/zImage.stub-$KernelVer || : + fi + + %if %{signkernel} + if [ "$KernelImage" = vmlinux ]; then + # We can't strip and sign $KernelImage in place, because + # we need to preserve original vmlinux for debuginfo. + # Use a copy for signing. + $CopyKernel $KernelImage $KernelImage.tosign + KernelImage=$KernelImage.tosign + CopyKernel=cp + fi + + # Sign the image if we're using EFI + # aarch64 kernels are gziped EFI images + KernelExtension=${KernelImage##*.} + if [ "$KernelExtension" == "gz" ]; then + SignImage=${KernelImage%.*} + else + SignImage=$KernelImage + fi + + %ifarch x86_64 aarch64 + %pesign -s -i $SignImage -o vmlinuz.tmp -a %{secureboot_ca_0} -c %{secureboot_key_0} -n %{pesign_name_0} + %pesign -s -i vmlinuz.tmp -o vmlinuz.signed -a %{secureboot_ca_1} -c %{secureboot_key_1} -n %{pesign_name_1} + rm vmlinuz.tmp + %endif + %ifarch s390x ppc64le + if [ -x /usr/bin/rpm-sign ]; then + rpm-sign --key "%{pesign_name_0}" --lkmsign $SignImage --output vmlinuz.signed + elif [ $DoModules -eq 1 ]; then + chmod +x scripts/sign-file + ./scripts/sign-file -p sha256 certs/signing_key.pem certs/signing_key.x509 $SignImage vmlinuz.signed + else + mv $SignImage vmlinuz.signed + fi + %endif + + if [ ! -s vmlinuz.signed ]; then + echo "pesigning failed" + exit 1 + fi + mv vmlinuz.signed $SignImage + if [ "$KernelExtension" == "gz" ]; then + gzip -f9 $SignImage + fi + # signkernel + %endif + + $CopyKernel $KernelImage \ + $RPM_BUILD_ROOT/%{image_install_path}/$InstallName-$KernelVer + chmod 755 $RPM_BUILD_ROOT/%{image_install_path}/$InstallName-$KernelVer + cp $RPM_BUILD_ROOT/%{image_install_path}/$InstallName-$KernelVer $RPM_BUILD_ROOT/lib/modules/$KernelVer/$InstallName + + # hmac sign the kernel for FIPS + echo "Creating hmac file: $RPM_BUILD_ROOT/%{image_install_path}/.vmlinuz-$KernelVer.hmac" + ls -l $RPM_BUILD_ROOT/%{image_install_path}/$InstallName-$KernelVer + sha512hmac $RPM_BUILD_ROOT/%{image_install_path}/$InstallName-$KernelVer | sed -e "s,$RPM_BUILD_ROOT,," > $RPM_BUILD_ROOT/%{image_install_path}/.vmlinuz-$KernelVer.hmac; + cp $RPM_BUILD_ROOT/%{image_install_path}/.vmlinuz-$KernelVer.hmac $RPM_BUILD_ROOT/lib/modules/$KernelVer/.vmlinuz.hmac + + if [ $DoModules -eq 1 ]; then + # 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 + %{make} %{?_smp_mflags} ARCH=$Arch INSTALL_MOD_PATH=$RPM_BUILD_ROOT %{?_smp_mflags} modules_install KERNELRELEASE=$KernelVer mod-fw= + fi + +%if %{with_gcov} + # install gcov-needed files to $BUILDROOT/$BUILD/...: + # gcov_info->filename is absolute path + # gcno references to sources can use absolute paths (e.g. in out-of-tree builds) + # sysfs symlink targets (set up at compile time) use absolute paths to BUILD dir + find . \( -name '*.gcno' -o -name '*.[chS]' \) -exec install -D '{}' "$RPM_BUILD_ROOT/$(pwd)/{}" \; +%endif + + # add an a noop %%defattr statement 'cause rpm doesn't like empty file list files + echo '%%defattr(-,-,-)' > ../kernel${Flavour:+-${Flavour}}-ldsoconf.list + if [ $DoVDSO -ne 0 ]; then + %{make} ARCH=$Arch INSTALL_MOD_PATH=$RPM_BUILD_ROOT vdso_install KERNELRELEASE=$KernelVer + if [ -s ldconfig-kernel.conf ]; then + install -D -m 444 ldconfig-kernel.conf \ + $RPM_BUILD_ROOT/etc/ld.so.conf.d/kernel-$KernelVer.conf + echo /etc/ld.so.conf.d/kernel-$KernelVer.conf >> ../kernel${Flavour:+-${Flavour}}-ldsoconf.list + fi + + rm -rf $RPM_BUILD_ROOT/lib/modules/$KernelVer/vdso/.build-id + fi + + # And 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 + + rm -f $RPM_BUILD_ROOT/lib/modules/$KernelVer/build + rm -f $RPM_BUILD_ROOT/lib/modules/$KernelVer/source + mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer/build + (cd $RPM_BUILD_ROOT/lib/modules/$KernelVer ; ln -s build source) + # dirs for additional modules per module-init-tools, kbuild/modules.txt + mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer/extra + mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer/internal + mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer/updates +%if 0%{!?fedora:1} + mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer/weak-updates +%endif + # CONFIG_KERNEL_HEADER_TEST generates some extra files in the process of + # testing so just delete + find . -name *.h.s -delete + # first copy everything + cp --parents `find -type f -name "Makefile*" -o -name "Kconfig*"` $RPM_BUILD_ROOT/lib/modules/$KernelVer/build + cp Module.symvers $RPM_BUILD_ROOT/lib/modules/$KernelVer/build + cp System.map $RPM_BUILD_ROOT/lib/modules/$KernelVer/build + if [ -s Module.markers ]; then + cp Module.markers $RPM_BUILD_ROOT/lib/modules/$KernelVer/build + fi + + # create the kABI metadata for use in packaging + # NOTENOTE: the name symvers is used by the rpm backend + # NOTENOTE: to discover and run the /usr/lib/rpm/fileattrs/kabi.attr + # NOTENOTE: script which dynamically adds exported kernel symbol + # NOTENOTE: checksums to the rpm metadata provides list. + # NOTENOTE: if you change the symvers name, update the backend too + echo "**** GENERATING kernel ABI metadata ****" + gzip -c9 < Module.symvers > $RPM_BUILD_ROOT/boot/symvers-$KernelVer.gz + cp $RPM_BUILD_ROOT/boot/symvers-$KernelVer.gz $RPM_BUILD_ROOT/lib/modules/$KernelVer/symvers.gz + +%if %{with_kabichk} + echo "**** kABI checking is enabled in kernel SPEC file. ****" + chmod 0755 $RPM_SOURCE_DIR/check-kabi + if [ -e $RPM_SOURCE_DIR/Module.kabi_%{_target_cpu}$Flavour ]; then + cp $RPM_SOURCE_DIR/Module.kabi_%{_target_cpu}$Flavour $RPM_BUILD_ROOT/Module.kabi + $RPM_SOURCE_DIR/check-kabi -k $RPM_BUILD_ROOT/Module.kabi -s Module.symvers || exit 1 + # for now, don't keep it around. + rm $RPM_BUILD_ROOT/Module.kabi + else + echo "**** NOTE: Cannot find reference Module.kabi file. ****" + fi +%endif + +%if %{with_kabidupchk} + echo "**** kABI DUP checking is enabled in kernel SPEC file. ****" + if [ -e $RPM_SOURCE_DIR/Module.kabi_dup_%{_target_cpu}$Flavour ]; then + cp $RPM_SOURCE_DIR/Module.kabi_dup_%{_target_cpu}$Flavour $RPM_BUILD_ROOT/Module.kabi + $RPM_SOURCE_DIR/check-kabi -k $RPM_BUILD_ROOT/Module.kabi -s Module.symvers || exit 1 + # for now, don't keep it around. + rm $RPM_BUILD_ROOT/Module.kabi + else + echo "**** NOTE: Cannot find DUP reference Module.kabi file. ****" + fi +%endif + +%if %{with_kabidw_base} + # Don't build kabi base for debug kernels + if [ "$Flavour" != "kdump" -a "$Flavour" != "debug" ]; then + mkdir -p $RPM_BUILD_ROOT/kabi-dwarf + tar xjvf %{SOURCE301} -C $RPM_BUILD_ROOT/kabi-dwarf + + mkdir -p $RPM_BUILD_ROOT/kabi-dwarf/stablelists + tar xjvf %{SOURCE300} -C $RPM_BUILD_ROOT/kabi-dwarf/stablelists + + echo "**** GENERATING DWARF-based kABI baseline dataset ****" + chmod 0755 $RPM_BUILD_ROOT/kabi-dwarf/run_kabi-dw.sh + $RPM_BUILD_ROOT/kabi-dwarf/run_kabi-dw.sh generate \ + "$RPM_BUILD_ROOT/kabi-dwarf/stablelists/kabi-current/kabi_stablelist_%{_target_cpu}" \ + "$(pwd)" \ + "$RPM_BUILD_ROOT/kabidw-base/%{_target_cpu}${Flavour:+.${Flavour}}" || : + + rm -rf $RPM_BUILD_ROOT/kabi-dwarf + fi +%endif + +%if %{with_kabidwchk} + if [ "$Flavour" != "kdump" ]; then + mkdir -p $RPM_BUILD_ROOT/kabi-dwarf + tar xjvf %{SOURCE301} -C $RPM_BUILD_ROOT/kabi-dwarf + if [ -d "$RPM_BUILD_ROOT/kabi-dwarf/base/%{_target_cpu}${Flavour:+.${Flavour}}" ]; then + mkdir -p $RPM_BUILD_ROOT/kabi-dwarf/stablelists + tar xjvf %{SOURCE300} -C $RPM_BUILD_ROOT/kabi-dwarf/stablelists + + echo "**** GENERATING DWARF-based kABI dataset ****" + chmod 0755 $RPM_BUILD_ROOT/kabi-dwarf/run_kabi-dw.sh + $RPM_BUILD_ROOT/kabi-dwarf/run_kabi-dw.sh generate \ + "$RPM_BUILD_ROOT/kabi-dwarf/stablelists/kabi-current/kabi_stablelist_%{_target_cpu}" \ + "$(pwd)" \ + "$RPM_BUILD_ROOT/kabi-dwarf/base/%{_target_cpu}${Flavour:+.${Flavour}}.tmp" || : + + echo "**** kABI DWARF-based comparison report ****" + $RPM_BUILD_ROOT/kabi-dwarf/run_kabi-dw.sh compare \ + "$RPM_BUILD_ROOT/kabi-dwarf/base/%{_target_cpu}${Flavour:+.${Flavour}}" \ + "$RPM_BUILD_ROOT/kabi-dwarf/base/%{_target_cpu}${Flavour:+.${Flavour}}.tmp" || : + echo "**** End of kABI DWARF-based comparison report ****" + else + echo "**** Baseline dataset for kABI DWARF-BASED comparison report not found ****" + fi + + rm -rf $RPM_BUILD_ROOT/kabi-dwarf + fi +%endif + + # then drop all but the needed Makefiles/Kconfig files + rm -rf $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/scripts + rm -rf $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/include + cp .config $RPM_BUILD_ROOT/lib/modules/$KernelVer/build + cp -a scripts $RPM_BUILD_ROOT/lib/modules/$KernelVer/build + rm -rf $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/scripts/tracing + rm -f $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/scripts/spdxcheck.py + + # Files for 'make scripts' to succeed with kernel-devel. + mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/security/selinux/include + cp -a --parents security/selinux/include/classmap.h $RPM_BUILD_ROOT/lib/modules/$KernelVer/build + cp -a --parents security/selinux/include/initial_sid_to_string.h $RPM_BUILD_ROOT/lib/modules/$KernelVer/build + mkdir -p $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/tools/include/tools + cp -a --parents tools/include/tools/be_byteshift.h $RPM_BUILD_ROOT/lib/modules/$KernelVer/build + cp -a --parents tools/include/tools/le_byteshift.h $RPM_BUILD_ROOT/lib/modules/$KernelVer/build + + if [ -f tools/objtool/objtool ]; then + cp -a tools/objtool/objtool $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/tools/objtool/ || : + fi + if [ -f tools/objtool/fixdep ]; then + cp -a tools/objtool/fixdep $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/tools/objtool/ || : + fi + if [ -d arch/$Arch/scripts ]; then + cp -a arch/$Arch/scripts $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/arch/%{_arch} || : + fi + if [ -f arch/$Arch/*lds ]; then + cp -a arch/$Arch/*lds $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/arch/%{_arch}/ || : + fi + if [ -f arch/%{asmarch}/kernel/module.lds ]; then + cp -a --parents arch/%{asmarch}/kernel/module.lds $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + fi + find $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/scripts \( -iname "*.o" -o -iname "*.cmd" \) -exec rm -f {} + +%ifarch ppc64le + cp -a --parents arch/powerpc/lib/crtsavres.[So] $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ +%endif + if [ -d arch/%{asmarch}/include ]; then + cp -a --parents arch/%{asmarch}/include $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + fi +%ifarch aarch64 + # arch/arm64/include/asm/xen references arch/arm + cp -a --parents arch/arm/include/asm/xen $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + # arch/arm64/include/asm/opcodes.h references arch/arm + cp -a --parents arch/arm/include/asm/opcodes.h $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ +%endif + # include the machine specific headers for ARM variants, if available. +%ifarch %{arm} + if [ -d arch/%{asmarch}/mach-${Flavour}/include ]; then + cp -a --parents arch/%{asmarch}/mach-${Flavour}/include $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + fi + # include a few files for 'make prepare' + cp -a --parents arch/arm/tools/gen-mach-types $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + cp -a --parents arch/arm/tools/mach-types $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + +%endif + cp -a include $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/include +%ifarch i686 x86_64 + # files for 'make prepare' to succeed with kernel-devel + cp -a --parents arch/x86/entry/syscalls/syscall_32.tbl $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + cp -a --parents arch/x86/entry/syscalls/syscall_64.tbl $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + cp -a --parents arch/x86/tools/relocs_32.c $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + cp -a --parents arch/x86/tools/relocs_64.c $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + cp -a --parents arch/x86/tools/relocs.c $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + cp -a --parents arch/x86/tools/relocs_common.c $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + cp -a --parents arch/x86/tools/relocs.h $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + cp -a --parents arch/x86/purgatory/purgatory.c $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + cp -a --parents arch/x86/purgatory/stack.S $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + cp -a --parents arch/x86/purgatory/setup-x86_64.S $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + cp -a --parents arch/x86/purgatory/entry64.S $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + cp -a --parents arch/x86/boot/string.h $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + cp -a --parents arch/x86/boot/string.c $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + cp -a --parents arch/x86/boot/ctype.h $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + cp -a --parents scripts/syscalltbl.sh $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + cp -a --parents scripts/syscallhdr.sh $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/ + + cp -a --parents tools/arch/x86/include/asm $RPM_BUILD_ROOT/lib/modules/$KernelVer/build + cp -a --parents tools/arch/x86/include/uapi/asm $RPM_BUILD_ROOT/lib/modules/$KernelVer/build + cp -a --parents tools/objtool/arch/x86/lib $RPM_BUILD_ROOT/lib/modules/$KernelVer/build + cp -a --parents tools/arch/x86/lib/ $RPM_BUILD_ROOT/lib/modules/$KernelVer/build + cp -a --parents tools/arch/x86/tools/gen-insn-attr-x86.awk $RPM_BUILD_ROOT/lib/modules/$KernelVer/build + cp -a --parents tools/objtool/arch/x86/ $RPM_BUILD_ROOT/lib/modules/$KernelVer/build + +%endif + # Clean up intermediate tools files + find $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/tools \( -iname "*.o" -o -iname "*.cmd" \) -exec rm -f {} + + + # Make sure the Makefile and version.h have a matching timestamp so that + # external modules can be built + touch -r $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/Makefile $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/include/generated/uapi/linux/version.h + + # Copy .config to include/config/auto.conf so "make prepare" is unnecessary. + cp $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/.config $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/include/config/auto.conf + +%if %{with_debuginfo} + eu-readelf -n vmlinux | grep "Build ID" | awk '{print $NF}' > vmlinux.id + cp vmlinux.id $RPM_BUILD_ROOT/lib/modules/$KernelVer/build/vmlinux.id + + # + # save the vmlinux file for kernel debugging into the kernel-debuginfo rpm + # + mkdir -p $RPM_BUILD_ROOT%{debuginfodir}/lib/modules/$KernelVer + cp vmlinux $RPM_BUILD_ROOT%{debuginfodir}/lib/modules/$KernelVer +%endif + + find $RPM_BUILD_ROOT/lib/modules/$KernelVer -name "*.ko" -type f >modnames + + # mark modules executable so that strip-to-file can strip them + xargs --no-run-if-empty chmod u+x < modnames + + # Generate a list of modules for block and networking. + + grep -F /drivers/ modnames | xargs --no-run-if-empty nm -upA | + sed -n 's,^.*/\([^/]*\.ko\): *U \(.*\)$,\1 \2,p' > drivers.undef + + collect_modules_list() + { + sed -r -n -e "s/^([^ ]+) \\.?($2)\$/\\1/p" drivers.undef | + LC_ALL=C sort -u > $RPM_BUILD_ROOT/lib/modules/$KernelVer/modules.$1 + if [ ! -z "$3" ]; then + sed -r -e "/^($3)\$/d" -i $RPM_BUILD_ROOT/lib/modules/$KernelVer/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' + + # detect missing or incorrect license tags + ( find $RPM_BUILD_ROOT/lib/modules/$KernelVer -name '*.ko' | xargs /sbin/modinfo -l | \ + grep -E -v 'GPL( v2)?$|Dual BSD/GPL$|Dual MPL/GPL$|GPL and additional rights$' ) && exit 1 + + remove_depmod_files() + { + # remove files that will be auto generated by depmod at rpm -i time + pushd $RPM_BUILD_ROOT/lib/modules/$KernelVer/ + rm -f modules.{alias,alias.bin,builtin.alias.bin,builtin.bin} \ + modules.{dep,dep.bin,devname,softdep,symbols,symbols.bin} + popd + } + + remove_depmod_files + + # Call the modules-extra script to move things around + %{SOURCE24} $RPM_BUILD_ROOT/lib/modules/$KernelVer $RPM_SOURCE_DIR/mod-extra.list + # Blacklist net autoloadable modules in modules-extra + %{SOURCE19} $RPM_BUILD_ROOT lib/modules/$KernelVer + # Call the modules-extra script for internal modules + %{SOURCE24} $RPM_BUILD_ROOT/lib/modules/$KernelVer %{SOURCE54} internal + + # + # Generate the kernel-core and kernel-modules files lists + # + + # Copy the System.map file for depmod to use, and create a backup of the + # full module tree so we can restore it after we're done filtering + cp System.map $RPM_BUILD_ROOT/. + pushd $RPM_BUILD_ROOT + mkdir restore + cp -r lib/modules/$KernelVer/* restore/. + + # don't include anything going into k-m-e and k-m-i in the file lists + rm -rf lib/modules/$KernelVer/{extra,internal} + + if [ $DoModules -eq 1 ]; then + # Find all the module files and filter them out into the core and + # modules lists. This actually removes anything going into -modules + # from the dir. + find lib/modules/$KernelVer/kernel -name *.ko | sort -n > modules.list + cp $RPM_SOURCE_DIR/filter-*.sh . + ./filter-modules.sh modules.list %{_target_cpu} + rm filter-*.sh + + # Run depmod on the resulting module tree and make sure it isn't broken + depmod -b . -aeF ./System.map $KernelVer &> depmod.out + if [ -s depmod.out ]; then + echo "Depmod failure" + cat depmod.out + exit 1 + else + rm depmod.out + fi + else + # Ensure important files/directories exist to let the packaging succeed + echo '%%defattr(-,-,-)' > modules.list + echo '%%defattr(-,-,-)' > k-d.list + mkdir -p lib/modules/$KernelVer/kernel + # Add files usually created by make modules, needed to prevent errors + # thrown by depmod during package installation + touch lib/modules/$KernelVer/modules.order + touch lib/modules/$KernelVer/modules.builtin + fi + + remove_depmod_files + + # Go back and find all of the various directories in the tree. We use this + # for the dir lists in kernel-core + find lib/modules/$KernelVer/kernel -mindepth 1 -type d | sort -n > module-dirs.list + + # Cleanup + rm System.map + cp -r restore/* lib/modules/$KernelVer/. + rm -rf restore + popd + + # Make sure the files lists start with absolute paths or rpmbuild fails. + # Also add in the dir entries + sed -e 's/^lib*/\/lib/' %{?zipsed} $RPM_BUILD_ROOT/k-d.list > ../kernel${Flavour:+-${Flavour}}-modules.list + sed -e 's/^lib*/%dir \/lib/' %{?zipsed} $RPM_BUILD_ROOT/module-dirs.list > ../kernel${Flavour:+-${Flavour}}-core.list + sed -e 's/^lib*/\/lib/' %{?zipsed} $RPM_BUILD_ROOT/modules.list >> ../kernel${Flavour:+-${Flavour}}-core.list + + # Cleanup + rm -f $RPM_BUILD_ROOT/k-d.list + rm -f $RPM_BUILD_ROOT/modules.list + rm -f $RPM_BUILD_ROOT/module-dirs.list + +%if %{signmodules} + if [ $DoModules -eq 1 ]; then + # Save the signing keys so we can sign the modules in __modsign_install_post + cp certs/signing_key.pem certs/signing_key.pem.sign${Flav} + cp certs/signing_key.x509 certs/signing_key.x509.sign${Flav} + fi +%endif + + # Move the devel headers out of the root file system + mkdir -p $RPM_BUILD_ROOT/usr/src/kernels + mv $RPM_BUILD_ROOT/lib/modules/$KernelVer/build $RPM_BUILD_ROOT/$DevelDir + + # This is going to create a broken link during the build, but we don't use + # it after this point. We need the link to actually point to something + # when kernel-devel is installed, and a relative link doesn't work across + # the F17 UsrMove feature. + ln -sf $DevelDir $RPM_BUILD_ROOT/lib/modules/$KernelVer/build + + # prune junk from kernel-devel + find $RPM_BUILD_ROOT/usr/src/kernels -name ".*.cmd" -delete + + # build a BLS config for this kernel + %{SOURCE53} "$KernelVer" "$RPM_BUILD_ROOT" "%{?variant}" + + # Red Hat UEFI Secure Boot CA cert, which can be used to authenticate the kernel + mkdir -p $RPM_BUILD_ROOT%{_datadir}/doc/kernel-keys/$KernelVer + %ifarch x86_64 aarch64 + install -m 0644 %{secureboot_ca_0} $RPM_BUILD_ROOT%{_datadir}/doc/kernel-keys/$KernelVer/kernel-signing-ca-20200609.cer + install -m 0644 %{secureboot_ca_1} $RPM_BUILD_ROOT%{_datadir}/doc/kernel-keys/$KernelVer/kernel-signing-ca-20140212.cer + ln -s kernel-signing-ca-20200609.cer $RPM_BUILD_ROOT%{_datadir}/doc/kernel-keys/$KernelVer/kernel-signing-ca.cer + %else + install -m 0644 %{secureboot_ca_0} $RPM_BUILD_ROOT%{_datadir}/doc/kernel-keys/$KernelVer/kernel-signing-ca.cer + %endif + %ifarch s390x ppc64le + if [ $DoModules -eq 1 ]; then + if [ -x /usr/bin/rpm-sign ]; then + install -m 0644 %{secureboot_key_0} $RPM_BUILD_ROOT%{_datadir}/doc/kernel-keys/$KernelVer/%{signing_key_filename} + else + install -m 0644 certs/signing_key.x509.sign${Flav} $RPM_BUILD_ROOT%{_datadir}/doc/kernel-keys/$KernelVer/kernel-signing-ca.cer + openssl x509 -in certs/signing_key.pem.sign${Flav} -outform der -out $RPM_BUILD_ROOT%{_datadir}/doc/kernel-keys/$KernelVer/%{signing_key_filename} + chmod 0644 $RPM_BUILD_ROOT%{_datadir}/doc/kernel-keys/$KernelVer/%{signing_key_filename} + fi + fi + %endif + +%if %{with_ipaclones} + MAXPROCS=$(echo %{?_smp_mflags} | sed -n 's/-j\s*\([0-9]\+\)/\1/p') + if [ -z "$MAXPROCS" ]; then + MAXPROCS=1 + fi + if [ "$Flavour" == "" ]; then + mkdir -p $RPM_BUILD_ROOT/$DevelDir-ipaclones + find . -name '*.ipa-clones' | xargs -i{} -r -n 1 -P $MAXPROCS install -m 644 -D "{}" "$RPM_BUILD_ROOT/$DevelDir-ipaclones/{}" + fi +%endif + +} + +### +# DO it... +### + +# prepare directories +rm -rf $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT/boot +mkdir -p $RPM_BUILD_ROOT%{_libexecdir} + +cd linux-%{KVERREL} + + +%if %{with_debug} +BuildKernel %make_target %kernel_image %{_use_vdso} debug +%endif + +%if %{with_zfcpdump} +BuildKernel %make_target %kernel_image %{_use_vdso} zfcpdump +%endif + +%if %{with_pae} +BuildKernel %make_target %kernel_image %{use_vdso} lpae +%endif + +%if %{with_up} +BuildKernel %make_target %kernel_image %{_use_vdso} +%endif + +%global perf_make \ + %{__make} -s EXTRA_CFLAGS="${RPM_OPT_FLAGS}" LDFLAGS="%{__global_ldflags}" %{?cross_opts} -C tools/perf V=1 NO_PERF_READ_VDSO32=1 NO_PERF_READ_VDSOX32=1 WERROR=0 NO_LIBUNWIND=1 HAVE_CPLUS_DEMANGLE=1 NO_GTK2=1 NO_STRLCPY=1 NO_BIONIC=1 prefix=%{_prefix} PYTHON=%{__python3} +%if %{with_perf} +# perf +# make sure check-headers.sh is executable +chmod +x tools/perf/check-headers.sh +%{perf_make} DESTDIR=$RPM_BUILD_ROOT all +%endif + +%global tools_make \ + %{make} CFLAGS="${RPM_OPT_FLAGS}" LDFLAGS="%{__global_ldflags}" V=1 + +%if %{with_tools} +%ifarch %{cpupowerarchs} +# cpupower +# make sure version-gen.sh is executable. +chmod +x tools/power/cpupower/utils/version-gen.sh +%{tools_make} %{?_smp_mflags} -C tools/power/cpupower CPUFREQ_BENCH=false +%ifarch x86_64 + pushd tools/power/cpupower/debug/x86_64 + %{tools_make} %{?_smp_mflags} centrino-decode powernow-k8-decode + popd +%endif +%ifarch x86_64 + pushd tools/power/x86/x86_energy_perf_policy/ + %{tools_make} + popd + pushd tools/power/x86/turbostat + %{tools_make} + popd + pushd tools/power/x86/intel-speed-select + %{make} + popd +%endif +%endif +pushd tools/thermal/tmon/ +%{tools_make} +popd +pushd tools/iio/ +%{make} +popd +pushd tools/gpio/ +%{make} +popd +%endif + +%global bpftool_make \ + %{__make} EXTRA_CFLAGS="${RPM_OPT_FLAGS}" EXTRA_LDFLAGS="%{__global_ldflags}" DESTDIR=$RPM_BUILD_ROOT V=1 +%if %{with_bpftool} +pushd tools/bpf/bpftool +%{bpftool_make} +popd +%endif + +%if %{with_selftests} +%{make} -s ARCH=$Arch V=1 samples/bpf/ +pushd tools/testing/selftests +# We need to install here because we need to call make with ARCH set which +# doesn't seem possible to do in the install section. +%{make} -s ARCH=$Arch V=1 TARGETS="bpf livepatch net" INSTALL_PATH=%{buildroot}%{_libexecdir}/kselftests install +popd +%endif + +%if %{with_doc} +# Make the HTML pages. +%{__make} PYTHON=/usr/bin/python3 htmldocs || %{doc_build_fail} + +# sometimes non-world-readable files sneak into the kernel source tree +chmod -R a=rX Documentation +find Documentation -type d | xargs chmod u+w +%endif + +# In the modsign case, we do 3 things. 1) We check the "flavour" and hard +# code the value in the following invocations. This is somewhat sub-optimal +# but we're doing this inside of an RPM macro and it isn't as easy as it +# could be because of that. 2) We restore the .tmp_versions/ directory from +# the one we saved off in BuildKernel above. This is to make sure we're +# signing the modules we actually built/installed in that flavour. 3) We +# grab the arch and invoke mod-sign.sh command to actually sign the modules. +# +# We have to do all of those things _after_ find-debuginfo runs, otherwise +# that will strip the signature off of the modules. +# +# Don't sign modules for the zfcpdump flavour as it is monolithic. + +%define __modsign_install_post \ + if [ "%{signmodules}" -eq "1" ]; then \ + if [ "%{with_pae}" -ne "0" ]; then \ + %{modsign_cmd} certs/signing_key.pem.sign+lpae certs/signing_key.x509.sign+lpae $RPM_BUILD_ROOT/lib/modules/%{KVERREL}+lpae/ \ + fi \ + if [ "%{with_debug}" -ne "0" ]; then \ + %{modsign_cmd} certs/signing_key.pem.sign+debug certs/signing_key.x509.sign+debug $RPM_BUILD_ROOT/lib/modules/%{KVERREL}+debug/ \ + fi \ + if [ "%{with_up}" -ne "0" ]; then \ + %{modsign_cmd} certs/signing_key.pem.sign certs/signing_key.x509.sign $RPM_BUILD_ROOT/lib/modules/%{KVERREL}/ \ + fi \ + fi \ + if [ "%{zipmodules}" -eq "1" ]; then \ + find $RPM_BUILD_ROOT/lib/modules/ -type f -name '*.ko' | xargs -P%{zcpu} xz; \ + fi \ +%{nil} + +### +### Special hacks for debuginfo subpackages. +### + +# This macro is used by %%install, so we must redefine it before that. +%define debug_package %{nil} + +%if %{with_debuginfo} + +%ifnarch noarch +%global __debug_package 1 +%files -f debugfiles.list debuginfo-common-%{_target_cpu} +%endif + +%endif + +# We don't want to package debuginfo for self-tests and samples but +# we have to delete them to avoid an error messages about unpackaged +# files. +# Delete the debuginfo for kernel-devel files +%define __remove_unwanted_dbginfo_install_post \ + if [ "%{with_selftests}" -ne "0" ]; then \ + rm -rf $RPM_BUILD_ROOT/usr/lib/debug/usr/libexec/ksamples; \ + rm -rf $RPM_BUILD_ROOT/usr/lib/debug/usr/libexec/kselftests; \ + fi \ + rm -rf $RPM_BUILD_ROOT/usr/lib/debug/usr/src; \ +%{nil} + +# +# Disgusting hack alert! We need to ensure we sign modules *after* all +# invocations of strip occur, which is in __debug_install_post if +# find-debuginfo.sh runs, and __os_install_post if not. +# +%define __spec_install_post \ + %{?__debug_package:%{__debug_install_post}}\ + %{__arch_install_post}\ + %{__os_install_post}\ + %{__remove_unwanted_dbginfo_install_post}\ + %{__modsign_install_post} + +### +### install +### + +%install +%if 0%{?rhel} == 7 +source scl_source enable devtoolset-9 || : +source scl_source enable llvm-toolset-7.0 || : +%endif + +cd linux-%{KVERREL} + +%if %{with_doc} +docdir=$RPM_BUILD_ROOT%{_datadir}/doc/kernel-doc-%{rpmversion} + +# copy the source over +mkdir -p $docdir +tar -h -f - --exclude=man --exclude='.*' -c Documentation | tar xf - -C $docdir + +# with_doc +%endif + +# We have to do the headers install before the tools install because the +# kernel headers_install will remove any header files in /usr/include that +# it doesn't install itself. + +%if %{with_headers} +# Install kernel headers +%{__make} ARCH=%{hdrarch} INSTALL_HDR_PATH=$RPM_BUILD_ROOT/usr headers_install + +find $RPM_BUILD_ROOT/usr/include \ + \( -name .install -o -name .check -o \ + -name ..install.cmd -o -name ..check.cmd \) -delete + +%endif + +%if %{with_cross_headers} +%if 0%{?fedora} +HDR_ARCH_LIST='arm arm64 powerpc s390 x86' +%else +HDR_ARCH_LIST='arm64 powerpc s390 x86' +%endif +mkdir -p $RPM_BUILD_ROOT/usr/tmp-headers + +for arch in $HDR_ARCH_LIST; do + mkdir $RPM_BUILD_ROOT/usr/tmp-headers/arch-${arch} + %{__make} ARCH=${arch} INSTALL_HDR_PATH=$RPM_BUILD_ROOT/usr/tmp-headers/arch-${arch} headers_install +done + +find $RPM_BUILD_ROOT/usr/tmp-headers \ + \( -name .install -o -name .check -o \ + -name ..install.cmd -o -name ..check.cmd \) -delete + +# Copy all the architectures we care about to their respective asm directories +for arch in $HDR_ARCH_LIST ; do + mkdir -p $RPM_BUILD_ROOT/usr/${arch}-linux-gnu/include + mv $RPM_BUILD_ROOT/usr/tmp-headers/arch-${arch}/include/* $RPM_BUILD_ROOT/usr/${arch}-linux-gnu/include/ +done + +rm -rf $RPM_BUILD_ROOT/usr/tmp-headers +%endif + +%if %{with_kernel_abi_stablelists} +# kabi directory +INSTALL_KABI_PATH=$RPM_BUILD_ROOT/lib/modules/ +mkdir -p $INSTALL_KABI_PATH + +# install kabi releases directories +tar xjvf %{SOURCE300} -C $INSTALL_KABI_PATH +# with_kernel_abi_stablelists +%endif + +%if %{with_perf} +# perf tool binary and supporting scripts/binaries +%{perf_make} DESTDIR=$RPM_BUILD_ROOT lib=%{_lib} install-bin install-traceevent-plugins +# remove the 'trace' symlink. +rm -f %{buildroot}%{_bindir}/trace + +# For both of the below, yes, this should be using a macro but right now +# it's hard coded and we don't actually want it anyway right now. +# Whoever wants examples can fix it up! + +# remove examples +rm -rf %{buildroot}/usr/lib/perf/examples +# remove the stray files that somehow got packaged +rm -rf %{buildroot}/usr/lib/perf/include/bpf/bpf.h +rm -rf %{buildroot}/usr/lib/perf/include/bpf/stdio.h +rm -rf %{buildroot}/usr/lib/perf/include/bpf/linux/socket.h +rm -rf %{buildroot}/usr/lib/perf/include/bpf/pid_filter.h +rm -rf %{buildroot}/usr/lib/perf/include/bpf/unistd.h + +# python-perf extension +%{perf_make} DESTDIR=$RPM_BUILD_ROOT install-python_ext + +# perf man pages (note: implicit rpm magic compresses them later) +mkdir -p %{buildroot}/%{_mandir}/man1 +%{perf_make} DESTDIR=$RPM_BUILD_ROOT install-man +%endif + +%if %{with_tools} +%ifarch %{cpupowerarchs} +%{make} -C tools/power/cpupower DESTDIR=$RPM_BUILD_ROOT 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 +%endif +%ifarch x86_64 + mkdir -p %{buildroot}%{_mandir}/man8 + pushd tools/power/x86/x86_energy_perf_policy + %{tools_make} DESTDIR=%{buildroot} install + popd + pushd tools/power/x86/turbostat + %{tools_make} DESTDIR=%{buildroot} install + popd + pushd tools/power/x86/intel-speed-select + %{tools_make} CFLAGS+="-D_GNU_SOURCE -Iinclude" DESTDIR=%{buildroot} install + popd +%endif +pushd tools/thermal/tmon +%{tools_make} INSTALL_ROOT=%{buildroot} install +popd +pushd tools/iio +make DESTDIR=%{buildroot} install +popd +pushd tools/gpio +make DESTDIR=%{buildroot} install +popd +pushd tools/kvm/kvm_stat +%{__make} INSTALL_ROOT=%{buildroot} install-tools +%{__make} INSTALL_ROOT=%{buildroot} install-man +popd +%endif + +%if %{with_bpftool} +pushd tools/bpf/bpftool +%{bpftool_make} prefix=%{_prefix} bash_compdir=%{_sysconfdir}/bash_completion.d/ mandir=%{_mandir} install doc-install +popd +%endif + +%if %{with_selftests} +pushd samples +install -d %{buildroot}%{_libexecdir}/ksamples +# install bpf samples +pushd bpf +install -d %{buildroot}%{_libexecdir}/ksamples/bpf +find -type f -executable -exec install -m755 {} %{buildroot}%{_libexecdir}/ksamples/bpf \; +install -m755 *.sh %{buildroot}%{_libexecdir}/ksamples/bpf +# test_lwt_bpf.sh compiles test_lwt_bpf.c when run; this works only from the +# kernel tree. Just remove it. +rm %{buildroot}%{_libexecdir}/ksamples/bpf/test_lwt_bpf.sh +install -m644 tcp_bpf.readme %{buildroot}%{_libexecdir}/ksamples/bpf +popd +# install pktgen samples +pushd pktgen +install -d %{buildroot}%{_libexecdir}/ksamples/pktgen +find . -type f -executable -exec install -m755 {} %{buildroot}%{_libexecdir}/ksamples/pktgen/{} \; +find . -type f ! -executable -exec install -m644 {} %{buildroot}%{_libexecdir}/ksamples/pktgen/{} \; +popd +popd +# install drivers/net/mlxsw selftests +pushd tools/testing/selftests/drivers/net/mlxsw +find -type d -exec install -d %{buildroot}%{_libexecdir}/kselftests/drivers/net/mlxsw/{} \; +find -type f -executable -exec install -D -m755 {} %{buildroot}%{_libexecdir}/kselftests/drivers/net/mlxsw/{} \; +find -type f ! -executable -exec install -D -m644 {} %{buildroot}%{_libexecdir}/kselftests/drivers/net/mlxsw/{} \; +popd +# install net/forwarding selftests +pushd tools/testing/selftests/net/forwarding +find -type d -exec install -d %{buildroot}%{_libexecdir}/kselftests/net/forwarding/{} \; +find -type f -executable -exec install -D -m755 {} %{buildroot}%{_libexecdir}/kselftests/net/forwarding/{} \; +find -type f ! -executable -exec install -D -m644 {} %{buildroot}%{_libexecdir}/kselftests/net/forwarding/{} \; +popd +# install tc-testing selftests +pushd tools/testing/selftests/tc-testing +find -type d -exec install -d %{buildroot}%{_libexecdir}/kselftests/tc-testing/{} \; +find -type f -executable -exec install -D -m755 {} %{buildroot}%{_libexecdir}/kselftests/tc-testing/{} \; +find -type f ! -executable -exec install -D -m644 {} %{buildroot}%{_libexecdir}/kselftests/tc-testing/{} \; +popd +# install livepatch selftests +pushd tools/testing/selftests/livepatch +find -type d -exec install -d %{buildroot}%{_libexecdir}/kselftests/livepatch/{} \; +find -type f -executable -exec install -D -m755 {} %{buildroot}%{_libexecdir}/kselftests/livepatch/{} \; +find -type f ! -executable -exec install -D -m644 {} %{buildroot}%{_libexecdir}/kselftests/livepatch/{} \; +popd +%endif + +# We have to do the headers checksum calculation after the tools install because +# these might end up installing their own set of headers on top of kernel's +%if %{with_headers} +# compute a content hash to export as Provides: kernel-headers-checksum +HEADERS_CHKSUM=$(export LC_ALL=C; find $RPM_BUILD_ROOT/usr/include -type f -name "*.h" \ + ! -path $RPM_BUILD_ROOT/usr/include/linux/version.h | \ + sort | xargs cat | sha1sum - | cut -f 1 -d ' '); +# export the checksum via usr/include/linux/version.h, so the dynamic +# find-provides can grab the hash to update it accordingly +echo "#define KERNEL_HEADERS_CHECKSUM \"$HEADERS_CHKSUM\"" >> $RPM_BUILD_ROOT/usr/include/linux/version.h +%endif + +### +### clean +### + +### +### scripts +### + +%if %{with_tools} +%post -n kernel-tools-libs +/sbin/ldconfig + +%postun -n kernel-tools-libs +/sbin/ldconfig +%endif + +# +# This macro defines a %%post script for a kernel*-devel package. +# %%kernel_devel_post [] +# Note we don't run hardlink if ostree is in use, as ostree is +# a far more sophisticated hardlink implementation. +# https://github.com/projectatomic/rpm-ostree/commit/58a79056a889be8814aa51f507b2c7a4dccee526 +# +%define kernel_devel_post() \ +%{expand:%%post %{?1:%{1}-}devel}\ +if [ -f /etc/sysconfig/kernel ]\ +then\ + . /etc/sysconfig/kernel || exit $?\ +fi\ +if [ "$HARDLINK" != "no" -a -x /usr/sbin/hardlink -a ! -e /run/ostree-booted ] \ +then\ + (cd /usr/src/kernels/%{KVERREL}%{?1:+%{1}} &&\ + /usr/bin/find . -type f | while read f; do\ + hardlink -c /usr/src/kernels/*%{?dist}.*/$f $f\ + done)\ +fi\ +%{nil} + +# +# This macro defines a %%post script for a kernel*-modules-extra package. +# It also defines a %%postun script that does the same thing. +# %%kernel_modules_extra_post [] +# +%define kernel_modules_extra_post() \ +%{expand:%%post %{?1:%{1}-}modules-extra}\ +/sbin/depmod -a %{KVERREL}%{?1:+%{1}}\ +%{nil}\ +%{expand:%%postun %{?1:%{1}-}modules-extra}\ +/sbin/depmod -a %{KVERREL}%{?1:+%{1}}\ +%{nil} + +# +# This macro defines a %%post script for a kernel*-modules-internal package. +# It also defines a %%postun script that does the same thing. +# %%kernel_modules_internal_post [] +# +%define kernel_modules_internal_post() \ +%{expand:%%post %{?1:%{1}-}modules-internal}\ +/sbin/depmod -a %{KVERREL}%{?1:+%{1}}\ +%{nil}\ +%{expand:%%postun %{?1:%{1}-}modules-internal}\ +/sbin/depmod -a %{KVERREL}%{?1:+%{1}}\ +%{nil} + +# +# This macro defines a %%post script for a kernel*-modules package. +# It also defines a %%postun script that does the same thing. +# %%kernel_modules_post [] +# +%define kernel_modules_post() \ +%{expand:%%post %{?1:%{1}-}modules}\ +/sbin/depmod -a %{KVERREL}%{?1:+%{1}}\ +%{nil}\ +%{expand:%%postun %{?1:%{1}-}modules}\ +/sbin/depmod -a %{KVERREL}%{?1:+%{1}}\ +%{nil} + +# This macro defines a %%posttrans script for a kernel package. +# %%kernel_variant_posttrans [] +# More text can follow to go at the end of this variant's %%post. +# +%define kernel_variant_posttrans() \ +%{expand:%%posttrans %{?1:%{1}-}core}\ +%if 0%{!?fedora:1}\ +if [ -x %{_sbindir}/weak-modules ]\ +then\ + %{_sbindir}/weak-modules --add-kernel %{KVERREL}%{?1:+%{1}} || exit $?\ +fi\ +%endif\ +/bin/kernel-install add %{KVERREL}%{?1:+%{1}} /lib/modules/%{KVERREL}%{?1:+%{1}}/vmlinuz || exit $?\ +%{nil} + +# +# This macro defines a %%post script for a kernel package and its devel package. +# %%kernel_variant_post [-v ] [-r ] +# More text can follow to go at the end of this variant's %%post. +# +%define kernel_variant_post(v:r:) \ +%{expand:%%kernel_devel_post %{?-v*}}\ +%{expand:%%kernel_modules_post %{?-v*}}\ +%{expand:%%kernel_modules_extra_post %{?-v*}}\ +%{expand:%%kernel_modules_internal_post %{?-v*}}\ +%{expand:%%kernel_variant_posttrans %{?-v*}}\ +%{expand:%%post %{?-v*:%{-v*}-}core}\ +%{-r:\ +if [ `uname -i` == "x86_64" -o `uname -i` == "i386" ] &&\ + [ -f /etc/sysconfig/kernel ]; then\ + /bin/sed -r -i -e 's/^DEFAULTKERNEL=%{-r*}$/DEFAULTKERNEL=kernel%{?-v:-%{-v*}}/' /etc/sysconfig/kernel || exit $?\ +fi}\ +%{nil} + +# +# This macro defines a %%preun script for a kernel package. +# %%kernel_variant_preun +# +%define kernel_variant_preun() \ +%{expand:%%preun %{?1:%{1}-}core}\ +/bin/kernel-install remove %{KVERREL}%{?1:+%{1}} /lib/modules/%{KVERREL}%{?1:+%{1}}/vmlinuz || exit $?\ +%if 0%{!?fedora:1}\ +if [ -x %{_sbindir}/weak-modules ]\ +then\ + %{_sbindir}/weak-modules --remove-kernel %{KVERREL}%{?1:+%{1}} || exit $?\ +fi\ +%endif\ +%{nil} + +%kernel_variant_preun +%kernel_variant_post -r kernel-smp + +%if %{with_pae} +%kernel_variant_preun lpae +%kernel_variant_post -v lpae -r (kernel|kernel-smp) +%endif + +%if %{with_debug} +%kernel_variant_preun debug +%kernel_variant_post -v debug +%endif + +%if %{with_zfcpdump} +%kernel_variant_preun zfcpdump +%kernel_variant_post -v zfcpdump +%endif + +if [ -x /sbin/ldconfig ] +then + /sbin/ldconfig -X || exit $? +fi + +### +### file lists +### + +%if %{with_headers} +%files headers +/usr/include/* +%endif + +%if %{with_cross_headers} +%files cross-headers +/usr/*-linux-gnu/include/* +%endif + +%if %{with_kernel_abi_stablelists} +%files -n kernel-abi-stablelists +/lib/modules/kabi-* +%endif + +%if %{with_kabidw_base} +%ifarch x86_64 s390x ppc64 ppc64le aarch64 +%files kabidw-base +%defattr(-,root,root) +/kabidw-base/%{_target_cpu}/* +%endif +%endif + +# only some architecture builds need kernel-doc +%if %{with_doc} +%files doc +%defattr(-,root,root) +%{_datadir}/doc/kernel-doc-%{rpmversion}/Documentation/* +%dir %{_datadir}/doc/kernel-doc-%{rpmversion}/Documentation +%dir %{_datadir}/doc/kernel-doc-%{rpmversion} +%endif + +%if %{with_perf} +%files -n perf +%{_bindir}/perf +%{_libdir}/libperf-jvmti.so +%dir %{_libdir}/traceevent/plugins +%{_libdir}/traceevent/plugins/* +%dir %{_libexecdir}/perf-core +%{_libexecdir}/perf-core/* +%{_datadir}/perf-core/* +%{_mandir}/man[1-8]/perf* +%{_sysconfdir}/bash_completion.d/perf +%doc linux-%{KVERREL}/tools/perf/Documentation/examples.txt +%{_docdir}/perf-tip/tips.txt + +%files -n python3-perf +%{python3_sitearch}/* + +%if %{with_debuginfo} +%files -f perf-debuginfo.list -n perf-debuginfo + +%files -f python3-perf-debuginfo.list -n python3-perf-debuginfo +%endif +# with_perf +%endif + +%if %{with_tools} +%ifnarch %{cpupowerarchs} +%files -n kernel-tools +%else +%files -n kernel-tools -f cpupower.lang +%{_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 +# cpupowerarchs +%endif +%{_bindir}/tmon +%{_bindir}/iio_event_monitor +%{_bindir}/iio_generic_buffer +%{_bindir}/lsiio +%{_bindir}/lsgpio +%{_bindir}/gpio-hammer +%{_bindir}/gpio-event-mon +%{_bindir}/gpio-watch +%{_mandir}/man1/kvm_stat* +%{_bindir}/kvm_stat + +%if %{with_debuginfo} +%files -f kernel-tools-debuginfo.list -n kernel-tools-debuginfo +%endif + +%ifarch %{cpupowerarchs} +%files -n kernel-tools-libs +%{_libdir}/libcpupower.so.0 +%{_libdir}/libcpupower.so.0.0.1 + +%files -n kernel-tools-libs-devel +%{_libdir}/libcpupower.so +%{_includedir}/cpufreq.h +%endif +# with_tools +%endif + +%if %{with_bpftool} +%files -n bpftool +%{_sbindir}/bpftool +%{_sysconfdir}/bash_completion.d/bpftool +%{_mandir}/man8/bpftool-cgroup.8.gz +%{_mandir}/man8/bpftool-gen.8.gz +%{_mandir}/man8/bpftool-iter.8.gz +%{_mandir}/man8/bpftool-link.8.gz +%{_mandir}/man8/bpftool-map.8.gz +%{_mandir}/man8/bpftool-prog.8.gz +%{_mandir}/man8/bpftool-perf.8.gz +%{_mandir}/man8/bpftool.8.gz +%{_mandir}/man8/bpftool-net.8.gz +%{_mandir}/man8/bpftool-feature.8.gz +%{_mandir}/man8/bpftool-btf.8.gz +%{_mandir}/man8/bpftool-struct_ops.8.gz + +%if %{with_debuginfo} +%files -f bpftool-debuginfo.list -n bpftool-debuginfo +%defattr(-,root,root) +%endif +%endif + +%if %{with_selftests} +%files selftests-internal +%{_libexecdir}/ksamples +%{_libexecdir}/kselftests +%endif + +# empty meta-package +%ifnarch %nobuildarches noarch +%files +%endif + +%if %{with_gcov} +%ifarch x86_64 s390x ppc64le aarch64 +%files gcov +%{_builddir} +%endif +%endif + +# This is %%{image_install_path} on an arch where that includes ELF files, +# or empty otherwise. +%define elf_image_install_path %{?kernel_image_elf:%{image_install_path}} + +# +# This macro defines the %%files sections for a kernel package +# and its devel and debuginfo packages. +# %%kernel_variant_files [-k vmlinux] +# +%define kernel_variant_files(k:) \ +%if %{2}\ +%{expand:%%files -f kernel-%{?3:%{3}-}core.list %{?1:-f kernel-%{?3:%{3}-}ldsoconf.list} %{?3:%{3}-}core}\ +%{!?_licensedir:%global license %%doc}\ +%license linux-%{KVERREL}/COPYING-%{version}-%{release}\ +/lib/modules/%{KVERREL}%{?3:+%{3}}/%{?-k:%{-k*}}%{!?-k:vmlinuz}\ +%ghost /%{image_install_path}/%{?-k:%{-k*}}%{!?-k:vmlinuz}-%{KVERREL}%{?3:+%{3}}\ +/lib/modules/%{KVERREL}%{?3:+%{3}}/.vmlinuz.hmac \ +%ghost /%{image_install_path}/.vmlinuz-%{KVERREL}%{?3:+%{3}}.hmac \ +%ifarch %{arm} aarch64\ +/lib/modules/%{KVERREL}%{?3:+%{3}}/dtb \ +%ghost /%{image_install_path}/dtb-%{KVERREL}%{?3:+%{3}} \ +%endif\ +%attr(0600,root,root) /lib/modules/%{KVERREL}%{?3:+%{3}}/System.map\ +%ghost /boot/System.map-%{KVERREL}%{?3:+%{3}}\ +/lib/modules/%{KVERREL}%{?3:+%{3}}/symvers.gz\ +/lib/modules/%{KVERREL}%{?3:+%{3}}/config\ +%if 0%{?rhel} == 7\ +/boot/symvers-%{KVERREL}%{?3:+%{3}}.gz\ +%else\ +%ghost /boot/symvers-%{KVERREL}%{?3:+%{3}}.gz\ +%endif\ +%ghost /boot/config-%{KVERREL}%{?3:+%{3}}\ +%ghost /boot/initramfs-%{KVERREL}%{?3:+%{3}}.img\ +%dir /lib/modules\ +%dir /lib/modules/%{KVERREL}%{?3:+%{3}}\ +%dir /lib/modules/%{KVERREL}%{?3:+%{3}}/kernel\ +/lib/modules/%{KVERREL}%{?3:+%{3}}/build\ +/lib/modules/%{KVERREL}%{?3:+%{3}}/source\ +/lib/modules/%{KVERREL}%{?3:+%{3}}/updates\ +/lib/modules/%{KVERREL}%{?3:+%{3}}/bls_sample.conf\ +%if 0%{!?fedora:1}\ +/lib/modules/%{KVERREL}%{?3:+%{3}}/weak-updates\ +%endif\ +%{_datadir}/doc/kernel-keys/%{KVERREL}%{?3:+%{3}}/kernel-signing-ca*.cer\ +%ifarch s390x ppc64le\ +%if 0%{!?4:1}\ +%{_datadir}/doc/kernel-keys/%{KVERREL}%{?3:+%{3}}/%{signing_key_filename} \ +%endif\ +%endif\ +%if %{1}\ +/lib/modules/%{KVERREL}%{?3:+%{3}}/vdso\ +%endif\ +/lib/modules/%{KVERREL}%{?3:+%{3}}/modules.*\ +%{expand:%%files -f kernel-%{?3:%{3}-}modules.list %{?3:%{3}-}modules}\ +%{expand:%%files %{?3:%{3}-}devel}\ +%defverify(not mtime)\ +/usr/src/kernels/%{KVERREL}%{?3:+%{3}}\ +%{expand:%%files %{?3:%{3}-}modules-extra}\ +%config(noreplace) /etc/modprobe.d/*-blacklist.conf\ +/lib/modules/%{KVERREL}%{?3:+%{3}}/extra\ +%{expand:%%files %{?3:%{3}-}modules-internal}\ +/lib/modules/%{KVERREL}%{?3:+%{3}}/internal\ +%if %{with_debuginfo}\ +%ifnarch noarch\ +%{expand:%%files -f debuginfo%{?3}.list %{?3:%{3}-}debuginfo}\ +%endif\ +%endif\ +%if %{?3:1} %{!?3:0}\ +%{expand:%%files %{3}}\ +%endif\ +%endif\ +%{nil} + +%kernel_variant_files %{_use_vdso} %{with_up} +%kernel_variant_files %{_use_vdso} %{with_debug} debug +%kernel_variant_files %{use_vdso} %{with_pae} lpae +%kernel_variant_files %{_use_vdso} %{with_zfcpdump} zfcpdump 1 + +%define kernel_variant_ipaclones(k:) \ +%if %{1}\ +%if %{with_ipaclones}\ +%{expand:%%files %{?2:%{2}-}ipaclones-internal}\ +%defattr(-,root,root)\ +%defverify(not mtime)\ +/usr/src/kernels/%{KVERREL}%{?2:+%{2}}-ipaclones\ +%endif\ +%endif\ +%{nil} + +%kernel_variant_ipaclones %{with_up} + +# plz don't put in a version string unless you're going to tag +# and build. +# +# +%changelog +* Sat Nov 6 2021 Pablo Greco - 5.15.0-200 +- Linux v5.15.0 (Initial version) + +# The following bit is important for automation so please do not remove +# END OF CHANGELOG + +### +# The following Emacs magic makes C-c C-e use UTC dates. +# Local Variables: +# rpm-change-log-uses-utc: t +# End: +###