1{ pkgs
2, linuxKernel
3, config
4, buildPackages
5, callPackage
6, makeOverridable
7, recurseIntoAttrs
8, dontRecurseIntoAttrs
9, stdenv
10, stdenvNoCC
11, newScope
12, lib
13, fetchurl
14}:
15
16# When adding a kernel:
17 # - Update packageAliases.linux_latest to the latest version
18 # - Update the rev in ../os-specific/linux/kernel/linux-libre.nix to the latest one.
19 # - Update linux_latest_hardened when the patches become available
20
21with linuxKernel;
22
23let
24 deblobKernel = kernel: callPackage ../os-specific/linux/kernel/linux-libre.nix {
25 linux = kernel;
26 };
27
28 # Hardened Linux
29 hardenedKernelFor = kernel': overrides:
30 let
31 kernel = kernel'.override overrides;
32 version = kernelPatches.hardened.${kernel.meta.branch}.version;
33 major = lib.versions.major version;
34 sha256 = kernelPatches.hardened.${kernel.meta.branch}.sha256;
35 modDirVersion' = builtins.replaceStrings [ kernel.version ] [ version ] kernel.modDirVersion;
36 in kernel.override {
37 structuredExtraConfig = import ../os-specific/linux/kernel/hardened/config.nix {
38 inherit lib version;
39 };
40 argsOverride = {
41 inherit version;
42 src = fetchurl {
43 url = "mirror://kernel/linux/kernel/v${major}.x/linux-${version}.tar.xz";
44 inherit sha256;
45 };
46 };
47 kernelPatches = kernel.kernelPatches ++ [
48 kernelPatches.hardened.${kernel.meta.branch}
49 ];
50 modDirVersionArg = modDirVersion' + (kernelPatches.hardened.${kernel.meta.branch}).extra;
51 isHardened = true;
52 };
53in {
54 kernelPatches = callPackage ../os-specific/linux/kernel/patches.nix { };
55
56 kernels = recurseIntoAttrs (lib.makeExtensible (self: with self;
57 let callPackage = newScope self; in {
58
59 linux_mptcp_95 = callPackage ../os-specific/linux/kernel/linux-mptcp-95.nix {
60 kernelPatches = linux_4_19.kernelPatches;
61 };
62
63 linux_rpi1 = callPackage ../os-specific/linux/kernel/linux-rpi.nix {
64 kernelPatches = with kernelPatches; [
65 bridge_stp_helper
66 request_key_helper
67 ];
68 rpiVersion = 1;
69 };
70
71 linux_rpi2 = callPackage ../os-specific/linux/kernel/linux-rpi.nix {
72 kernelPatches = with kernelPatches; [
73 bridge_stp_helper
74 request_key_helper
75 ];
76 rpiVersion = 2;
77 };
78
79 linux_rpi3 = callPackage ../os-specific/linux/kernel/linux-rpi.nix {
80 kernelPatches = with kernelPatches; [
81 bridge_stp_helper
82 request_key_helper
83 ];
84 rpiVersion = 3;
85 };
86
87 linux_rpi4 = callPackage ../os-specific/linux/kernel/linux-rpi.nix {
88 kernelPatches = with kernelPatches; [
89 bridge_stp_helper
90 request_key_helper
91 ];
92 rpiVersion = 4;
93 };
94
95 linux_4_4 = callPackage ../os-specific/linux/kernel/linux-4.4.nix {
96 kernelPatches =
97 [ kernelPatches.bridge_stp_helper
98 kernelPatches.request_key_helper_updated
99 kernelPatches.cpu-cgroup-v2."4.4"
100 kernelPatches.modinst_arg_list_too_long
101 ];
102 };
103
104 linux_4_9 = callPackage ../os-specific/linux/kernel/linux-4.9.nix {
105 kernelPatches =
106 [ kernelPatches.bridge_stp_helper
107 kernelPatches.request_key_helper_updated
108 kernelPatches.cpu-cgroup-v2."4.9"
109 kernelPatches.modinst_arg_list_too_long
110 ];
111 };
112
113 linux_4_14 = callPackage ../os-specific/linux/kernel/linux-4.14.nix {
114 kernelPatches =
115 [ kernelPatches.bridge_stp_helper
116 kernelPatches.request_key_helper
117 # See pkgs/os-specific/linux/kernel/cpu-cgroup-v2-patches/README.md
118 # when adding a new linux version
119 kernelPatches.cpu-cgroup-v2."4.11"
120 kernelPatches.modinst_arg_list_too_long
121 ];
122 };
123
124 linux_4_19 = callPackage ../os-specific/linux/kernel/linux-4.19.nix {
125 kernelPatches =
126 [ kernelPatches.bridge_stp_helper
127 kernelPatches.request_key_helper
128 kernelPatches.modinst_arg_list_too_long
129 ];
130 };
131
132 linux_5_4 = callPackage ../os-specific/linux/kernel/linux-5.4.nix {
133 kernelPatches = [
134 kernelPatches.bridge_stp_helper
135 kernelPatches.request_key_helper
136 kernelPatches.rtl8761b_support
137 ];
138 };
139
140 linux_rt_5_4 = callPackage ../os-specific/linux/kernel/linux-rt-5.4.nix {
141 kernelPatches = [
142 kernelPatches.bridge_stp_helper
143 kernelPatches.request_key_helper
144 ];
145 };
146
147 linux_5_10 = callPackage ../os-specific/linux/kernel/linux-5.10.nix {
148 kernelPatches = [
149 kernelPatches.bridge_stp_helper
150 kernelPatches.request_key_helper
151 ];
152 };
153
154 linux_rt_5_10 = callPackage ../os-specific/linux/kernel/linux-rt-5.10.nix {
155 kernelPatches = [
156 kernelPatches.bridge_stp_helper
157 kernelPatches.request_key_helper
158 kernelPatches.export-rt-sched-migrate
159 ];
160 };
161
162 linux_5_14 = callPackage ../os-specific/linux/kernel/linux-5.14.nix {
163 kernelPatches = [
164 kernelPatches.bridge_stp_helper
165 kernelPatches.request_key_helper
166 ];
167 };
168
169 linux_5_15 = callPackage ../os-specific/linux/kernel/linux-5.15.nix {
170 kernelPatches = [
171 kernelPatches.bridge_stp_helper
172 kernelPatches.request_key_helper
173 ];
174 };
175
176 linux_testing = let
177 testing = callPackage ../os-specific/linux/kernel/linux-testing.nix {
178 kernelPatches = [
179 kernelPatches.bridge_stp_helper
180 kernelPatches.request_key_helper
181 ];
182 };
183 latest = packageAliases.linux_latest.kernel;
184 in if latest.kernelAtLeast testing.baseVersion
185 then latest
186 else testing;
187
188 linux_testing_bcachefs = callPackage ../os-specific/linux/kernel/linux-testing-bcachefs.nix rec {
189 kernel = linux_5_15;
190 kernelPatches = kernel.kernelPatches;
191 };
192
193 linux_hardkernel_4_14 = callPackage ../os-specific/linux/kernel/linux-hardkernel-4.14.nix {
194 kernelPatches = [
195 kernelPatches.bridge_stp_helper
196 kernelPatches.request_key_helper
197 kernelPatches.modinst_arg_list_too_long
198 ];
199 };
200
201 linux_zen = callPackage ../os-specific/linux/kernel/linux-zen.nix {
202 kernelPatches = [
203 kernelPatches.bridge_stp_helper
204 kernelPatches.request_key_helper
205 ];
206 };
207
208 linux_lqx = callPackage ../os-specific/linux/kernel/linux-lqx.nix {
209 kernelPatches = [
210 kernelPatches.bridge_stp_helper
211 kernelPatches.request_key_helper
212 ];
213 };
214
215 linux_xanmod = callPackage ../os-specific/linux/kernel/linux-xanmod.nix {
216 kernelPatches = [
217 kernelPatches.bridge_stp_helper
218 kernelPatches.request_key_helper
219 ];
220 };
221
222 linux_libre = deblobKernel packageAliases.linux_default.kernel;
223
224 linux_latest_libre = deblobKernel packageAliases.linux_latest.kernel;
225
226 linux_hardened = hardenedKernelFor packageAliases.linux_default.kernel { };
227
228 linux_4_14_hardened = hardenedKernelFor kernels.linux_4_14 { };
229 linux_4_19_hardened = hardenedKernelFor kernels.linux_4_19 { };
230 linux_5_4_hardened = hardenedKernelFor kernels.linux_5_4 { };
231 linux_5_10_hardened = hardenedKernelFor kernels.linux_5_10 { };
232 linux_5_14_hardened = hardenedKernelFor kernels.linux_5_14 { };
233 linux_5_15_hardened = hardenedKernelFor kernels.linux_5_15 { };
234
235 }));
236 /* Linux kernel modules are inherently tied to a specific kernel. So
237 rather than provide specific instances of those packages for a
238 specific kernel, we have a function that builds those packages
239 for a specific kernel. This function can then be called for
240 whatever kernel you're using. */
241
242 packagesFor = kernel_: lib.makeExtensible (self: with self;
243 let callPackage = newScope self; in {
244 inherit callPackage;
245 kernel = kernel_;
246 inherit (kernel) stdenv; # in particular, use the same compiler by default
247
248 # to help determine module compatibility
249 inherit (kernel) isZen isHardened isLibre;
250 inherit (kernel) kernelOlder kernelAtLeast;
251 # Obsolete aliases (these packages do not depend on the kernel).
252 inherit (pkgs) odp-dpdk pktgen; # added 2018-05
253
254 acpi_call = callPackage ../os-specific/linux/acpi-call {};
255
256 akvcam = callPackage ../os-specific/linux/akvcam { };
257
258 amdgpu-pro = callPackage ../os-specific/linux/amdgpu-pro { };
259
260 anbox = callPackage ../os-specific/linux/anbox/kmod.nix { };
261
262 apfs = callPackage ../os-specific/linux/apfs { };
263
264 batman_adv = callPackage ../os-specific/linux/batman-adv {};
265
266 bcc = callPackage ../os-specific/linux/bcc {
267 python = pkgs.python3;
268 };
269
270 bpftrace = callPackage ../os-specific/linux/bpftrace { };
271
272 bbswitch = callPackage ../os-specific/linux/bbswitch {};
273
274 chipsec = callPackage ../tools/security/chipsec {
275 inherit kernel;
276 withDriver = true;
277 };
278
279 cryptodev = callPackage ../os-specific/linux/cryptodev { };
280
281 cpupower = callPackage ../os-specific/linux/cpupower { };
282
283 ddcci-driver = callPackage ../os-specific/linux/ddcci { };
284
285 digimend = callPackage ../os-specific/linux/digimend { };
286
287 dpdk-kmods = callPackage ../os-specific/linux/dpdk-kmods { };
288
289 exfat-nofuse = callPackage ../os-specific/linux/exfat { };
290
291 evdi = callPackage ../os-specific/linux/evdi { };
292
293 fwts-efi-runtime = callPackage ../os-specific/linux/fwts/module.nix { };
294
295 gcadapter-oc-kmod = callPackage ../os-specific/linux/gcadapter-oc-kmod { };
296 hid-nintendo = callPackage ../os-specific/linux/hid-nintendo { };
297
298 hyperv-daemons = callPackage ../os-specific/linux/hyperv-daemons { };
299
300 e1000e = if lib.versionOlder kernel.version "4.10" then callPackage ../os-specific/linux/e1000e {} else null;
301
302 intel-speed-select = if lib.versionAtLeast kernel.version "5.3" then callPackage ../os-specific/linux/intel-speed-select { } else null;
303
304 ixgbevf = callPackage ../os-specific/linux/ixgbevf {};
305
306 it87 = callPackage ../os-specific/linux/it87 {};
307
308 asus-wmi-sensors = callPackage ../os-specific/linux/asus-wmi-sensors {};
309
310 ena = callPackage ../os-specific/linux/ena {};
311
312 v4l2loopback = callPackage ../os-specific/linux/v4l2loopback { };
313
314 lttng-modules = callPackage ../os-specific/linux/lttng-modules { };
315
316 broadcom_sta = callPackage ../os-specific/linux/broadcom-sta { };
317
318 tbs = callPackage ../os-specific/linux/tbs { };
319
320 mbp2018-bridge-drv = callPackage ../os-specific/linux/mbp-modules/mbp2018-bridge-drv { };
321
322 nvidiabl = callPackage ../os-specific/linux/nvidiabl { };
323
324 nvidiaPackages = dontRecurseIntoAttrs (callPackage ../os-specific/linux/nvidia-x11 { });
325
326 nvidia_x11_legacy340 = nvidiaPackages.legacy_340;
327 nvidia_x11_legacy390 = nvidiaPackages.legacy_390;
328 nvidia_x11_legacy470 = nvidiaPackages.legacy_470;
329 nvidia_x11_beta = nvidiaPackages.beta;
330 nvidia_x11_vulkan_beta = nvidiaPackages.vulkan_beta;
331 nvidia_x11 = nvidiaPackages.stable;
332
333 openrazer = callPackage ../os-specific/linux/openrazer/driver.nix { };
334
335 ply = callPackage ../os-specific/linux/ply { };
336
337 r8125 = callPackage ../os-specific/linux/r8125 { };
338
339 r8168 = callPackage ../os-specific/linux/r8168 { };
340
341 rtl8188eus-aircrack = callPackage ../os-specific/linux/rtl8188eus-aircrack { };
342
343 rtl8192eu = callPackage ../os-specific/linux/rtl8192eu { };
344
345 rtl8723bs = callPackage ../os-specific/linux/rtl8723bs { };
346
347 rtl8812au = callPackage ../os-specific/linux/rtl8812au { };
348
349 rtl8814au = callPackage ../os-specific/linux/rtl8814au { };
350
351 rtl88xxau-aircrack = callPackage ../os-specific/linux/rtl88xxau-aircrack {};
352
353 rtl8821au = callPackage ../os-specific/linux/rtl8821au { };
354
355 rtl8821ce = callPackage ../os-specific/linux/rtl8821ce { };
356
357 rtl88x2bu = callPackage ../os-specific/linux/rtl88x2bu { };
358
359 rtl8821cu = callPackage ../os-specific/linux/rtl8821cu { };
360
361 rtw88 = callPackage ../os-specific/linux/rtw88 { };
362 rtlwifi_new = rtw88;
363
364 rtw89 = callPackage ../os-specific/linux/rtw89 { };
365
366 openafs_1_8 = callPackage ../servers/openafs/1.8/module.nix { };
367 openafs_1_9 = callPackage ../servers/openafs/1.9/module.nix { };
368 # Current stable release; don't backport release updates!
369 openafs = openafs_1_8;
370
371 facetimehd = callPackage ../os-specific/linux/facetimehd { };
372
373 tuxedo-keyboard = if lib.versionAtLeast kernel.version "4.14" then callPackage ../os-specific/linux/tuxedo-keyboard { } else null;
374
375 jool = callPackage ../os-specific/linux/jool { };
376
377 kvmfr = callPackage ../os-specific/linux/kvmfr { };
378
379 mba6x_bl = callPackage ../os-specific/linux/mba6x_bl { };
380
381 mwprocapture = callPackage ../os-specific/linux/mwprocapture { };
382
383 mxu11x0 = callPackage ../os-specific/linux/mxu11x0 { };
384
385 # compiles but has to be integrated into the kernel somehow
386 # Let's have it uncommented and finish it..
387 ndiswrapper = callPackage ../os-specific/linux/ndiswrapper { };
388
389 netatop = callPackage ../os-specific/linux/netatop { };
390
391 oci-seccomp-bpf-hook = if lib.versionAtLeast kernel.version "5.4" then callPackage ../os-specific/linux/oci-seccomp-bpf-hook { } else null;
392
393 perf = if lib.versionAtLeast kernel.version "3.12" then callPackage ../os-specific/linux/kernel/perf.nix { } else null;
394
395 phc-intel = if lib.versionAtLeast kernel.version "4.10" then callPackage ../os-specific/linux/phc-intel { } else null;
396
397 # Disable for kernels 4.15 and above due to compatibility issues
398 prl-tools = if lib.versionOlder kernel.version "4.15" then callPackage ../os-specific/linux/prl-tools { } else null;
399
400 sch_cake = callPackage ../os-specific/linux/sch_cake { };
401
402 isgx = callPackage ../os-specific/linux/isgx { };
403
404 rr-zen_workaround = callPackage ../development/tools/analysis/rr/zen_workaround.nix { };
405
406 sysdig = callPackage ../os-specific/linux/sysdig {};
407
408 systemtap = callPackage ../development/tools/profiling/systemtap { };
409
410 system76 = callPackage ../os-specific/linux/system76 { };
411
412 system76-acpi = callPackage ../os-specific/linux/system76-acpi { };
413
414 system76-power = callPackage ../os-specific/linux/system76-power { };
415
416 system76-io = callPackage ../os-specific/linux/system76-io { };
417
418 tmon = callPackage ../os-specific/linux/tmon { };
419
420 tp_smapi = callPackage ../os-specific/linux/tp_smapi { };
421
422 turbostat = callPackage ../os-specific/linux/turbostat { };
423
424 usbip = callPackage ../os-specific/linux/usbip { };
425
426 v86d = callPackage ../os-specific/linux/v86d { };
427
428 veikk-linux-driver = callPackage ../os-specific/linux/veikk-linux-driver { };
429 vendor-reset = callPackage ../os-specific/linux/vendor-reset { };
430
431 vhba = callPackage ../misc/emulators/cdemu/vhba.nix { };
432
433 virtualbox = callPackage ../os-specific/linux/virtualbox {
434 virtualbox = pkgs.virtualboxHardened;
435 };
436
437 virtualboxGuestAdditions = callPackage ../applications/virtualization/virtualbox/guest-additions {
438 virtualbox = pkgs.virtualboxHardened;
439 };
440
441 vm-tools = callPackage ../os-specific/linux/vm-tools { };
442
443 wireguard = if lib.versionOlder kernel.version "5.6" then callPackage ../os-specific/linux/wireguard { } else null;
444
445 x86_energy_perf_policy = callPackage ../os-specific/linux/x86_energy_perf_policy { };
446
447 xmm7360-pci = callPackage ../os-specific/linux/xmm7360-pci { };
448
449 xpadneo = callPackage ../os-specific/linux/xpadneo { };
450
451 zenpower = callPackage ../os-specific/linux/zenpower { };
452
453 inherit (callPackage ../os-specific/linux/zfs {
454 configFile = "kernel";
455 inherit pkgs kernel;
456 }) zfsStable zfsUnstable;
457 zfs = zfsStable;
458
459 can-isotp = callPackage ../os-specific/linux/can-isotp { };
460
461 } // lib.optionalAttrs (config.allowAliases or false) {
462 ati_drivers_x11 = throw "ati drivers are no longer supported by any kernel >=4.1"; # added 2021-05-18;
463 });
464
465 hardenedPackagesFor = kernel: overrides: packagesFor (hardenedKernelFor kernel overrides);
466
467 vanillaPackages = {
468 # recurse to build modules for the kernels
469 linux_4_4 = recurseIntoAttrs (packagesFor kernels.linux_4_4);
470 linux_4_9 = recurseIntoAttrs (packagesFor kernels.linux_4_9);
471 linux_4_14 = recurseIntoAttrs (packagesFor kernels.linux_4_14);
472 linux_4_19 = recurseIntoAttrs (packagesFor kernels.linux_4_19);
473 linux_5_4 = recurseIntoAttrs (packagesFor kernels.linux_5_4);
474 linux_5_10 = recurseIntoAttrs (packagesFor kernels.linux_5_10);
475 linux_5_14 = recurseIntoAttrs (packagesFor kernels.linux_5_14);
476 linux_5_15 = recurseIntoAttrs (packagesFor kernels.linux_5_15);
477 };
478
479 rtPackages = {
480 # realtime kernel packages
481 linux_rt_5_4 = packagesFor kernels.linux_rt_5_4;
482 linux_rt_5_10 = packagesFor kernels.linux_rt_5_10;
483 };
484
485 rpiPackages = {
486 linux_rpi1 = packagesFor kernels.linux_rpi1;
487 linux_rpi2 = packagesFor kernels.linux_rpi2;
488 linux_rpi3 = packagesFor kernels.linux_rpi3;
489 linux_rpi4 = packagesFor kernels.linux_rpi4;
490 };
491
492 packages = recurseIntoAttrs (vanillaPackages // rtPackages // rpiPackages // {
493 linux_mptcp_95 = packagesFor kernels.linux_mptcp_95;
494
495 # Intentionally lacks recurseIntoAttrs, as -rc kernels will quite likely break out-of-tree modules and cause failed Hydra builds.
496 linux_testing = packagesFor kernels.linux_testing;
497 linux_testing_bcachefs = recurseIntoAttrs (packagesFor kernels.linux_testing_bcachefs);
498
499 linux_hardened = recurseIntoAttrs (hardenedPackagesFor packageAliases.linux_default.kernel { });
500
501 linux_4_14_hardened = recurseIntoAttrs (hardenedPackagesFor kernels.linux_4_14 { });
502 linux_4_19_hardened = recurseIntoAttrs (hardenedPackagesFor kernels.linux_4_19 { });
503 linux_5_4_hardened = recurseIntoAttrs (hardenedPackagesFor kernels.linux_5_4 { });
504 linux_5_10_hardened = recurseIntoAttrs (hardenedPackagesFor kernels.linux_5_10 { });
505 linux_5_14_hardened = recurseIntoAttrs (hardenedPackagesFor kernels.linux_5_14 { });
506 linux_5_15_hardened = recurseIntoAttrs (hardenedPackagesFor kernels.linux_5_15 { });
507
508 linux_zen = recurseIntoAttrs (packagesFor kernels.linux_zen);
509 linux_lqx = recurseIntoAttrs (packagesFor kernels.linux_lqx);
510 linux_xanmod = recurseIntoAttrs (packagesFor kernels.linux_xanmod);
511
512 hardkernel_4_14 = recurseIntoAttrs (packagesFor kernels.linux_hardkernel_4_14);
513
514 linux_libre = recurseIntoAttrs (packagesFor kernels.linux_libre);
515
516 linux_latest_libre = recurseIntoAttrs (packagesFor kernels.linux_latest_libre);
517 });
518
519 packageAliases = {
520 linux_default = packages.linux_5_10;
521 # Update this when adding the newest kernel major version!
522 linux_latest = packages.linux_5_15;
523 linux_mptcp = packages.linux_mptcp_95;
524 linux_rt_default = packages.linux_rt_5_4;
525 linux_rt_latest = packages.linux_rt_5_10;
526 linux_hardkernel_latest = packages.hardkernel_4_14;
527 };
528
529 manualConfig = makeOverridable (callPackage ../os-specific/linux/kernel/manual-config.nix {});
530
531 customPackage = { version, src, configfile, allowImportFromDerivation ? true }:
532 recurseIntoAttrs (packagesFor (manualConfig {
533 inherit version src configfile lib stdenv allowImportFromDerivation;
534 }));
535
536 # Derive one of the default .config files
537 linuxConfig = {
538 src,
539 version ? (builtins.parseDrvName src.name).version,
540 makeTarget ? "defconfig",
541 name ? "kernel.config",
542 }: stdenvNoCC.mkDerivation {
543 inherit name src;
544 depsBuildBuild = [ buildPackages.stdenv.cc ]
545 ++ lib.optionals (lib.versionAtLeast version "4.16") [ buildPackages.bison buildPackages.flex ];
546 postPatch = ''
547 patchShebangs scripts/
548 '';
549 buildPhase = ''
550 set -x
551 make \
552 ARCH=${stdenv.hostPlatform.linuxArch} \
553 HOSTCC=${buildPackages.stdenv.cc.targetPrefix}gcc \
554 ${makeTarget}
555 '';
556 installPhase = ''
557 cp .config $out
558 '';
559 };
560
561 buildLinux = attrs: callPackage ../os-specific/linux/kernel/generic.nix attrs;
562
563}