Unverified Commit fa533ecb authored by Elliot Berman's avatar Elliot Berman
Browse files

nixos: tests: kernel-generic: Add kernelPackagesExtensions test

Extend kernelPackages using kernelPackagesExtensions by adding a simple
"hello world" kernel module. Ensure it is loaded and the "Hello world!"
printk appears in dmesg.
parent b1fa8068
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -777,7 +777,7 @@ in
  keepalived = runTest ./keepalived.nix;
  keepassxc = runTest ./keepassxc.nix;
  kerberos = handleTest ./kerberos/default.nix { };
  kernel-generic = handleTest ./kernel-generic.nix { };
  kernel-generic = handleTest ./kernel-generic { };
  kernel-latest-ath-user-regd = runTest ./kernel-latest-ath-user-regd.nix;
  kernel-rust = handleTest ./kernel-rust.nix { };
  keter = runTest ./keter.nix;
+98 −0
Original line number Diff line number Diff line
@@ -7,9 +7,40 @@
with pkgs.lib;

let
  patchedPkgs = pkgs.extend (
    final: prev: {
      kernelPackagesExtensions = prev.kernelPackagesExtensions ++ [
        (
          finalKernelPackages: _:
          let
            finalKernel = finalKernelPackages.kernel;
          in
          {
            hello-world = final.stdenv.mkDerivation {
              name = "hello-module";

              nativeBuildInputs = finalKernel.moduleBuildDependencies;
              makeFlags = finalKernel.commonMakeFlags ++ [
                # Variable refers to the local Makefile.
                "KDIR=${finalKernel.dev}/lib/modules/${finalKernel.modDirVersion}/build"
                # Variable of the Linux src tree's main Makefile.
                "INSTALL_MOD_PATH=$(out)"
              ];

              buildFlags = [ "modules" ];
              installTargets = [ "modules_install" ];

              src = ./hello-world-src;
            };
          }
        )
      ];
    }
  );

  testsForLinuxPackages =
    linuxPackages:
    (import ./make-test-python.nix (
    (import ../make-test-python.nix (
      { pkgs, ... }:
      {
        name = "kernel-${linuxPackages.kernel.version}";
@@ -22,19 +53,25 @@ let
        };

        nodes.machine =
          { ... }:
          { config, ... }:
          {
            boot.kernelPackages = linuxPackages;

            boot.extraModulePackages = [ config.boot.kernelPackages.hello-world ];

            boot.kernelModules = [ "hello" ];
          };

        testScript = ''
          assert "Linux" in machine.succeed("uname -s")
          assert "${linuxPackages.kernel.modDirVersion}" in machine.succeed("uname -a")

          assert "Hello world!" in machine.succeed("dmesg")
        '';
      }
    ) args);
  kernels = pkgs.linuxKernel.vanillaPackages // {
    inherit (pkgs.linuxKernel.packages)
  kernels = patchedPkgs.linuxKernel.vanillaPackages // {
    inherit (patchedPkgs.linuxKernel.packages)
      linux_6_12_hardened
      linux_rt_5_4
      linux_rt_5_10
+15 −0
Original line number Diff line number Diff line
ifneq ($(KERNELRELEASE),)
# kbuild part of makefile
obj-m := hello.o
else
# normal makefile
KDIR ?= /lib/modules/`uname -r`/build

.PHONY: modules
modules:
	$(MAKE) -C $(KDIR) M=$$PWD modules

.PHONY: modules_install
modules_install:
	$(MAKE) -C $(KDIR) M=$$PWD modules_install
endif
+18 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: MIT
#include <linux/module.h>
#include <linux/printk.h>

static int hello(void)
{
	pr_info("Hello world!");
	return 0;
}
module_init(hello);

static void goodbye(void)
{
	pr_info("Goodbye");
}
module_exit(goodbye);

MODULE_LICENSE("MIT");