From 2894de6b457342e760c669b20462c017620b5f90 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Fri, 28 Mar 2025 18:58:21 +0100
Subject: [PATCH 01/25] WIP: feat(linux-firmware): initial packaging of linux
 firmware

---
 flake.nix                           | 151 ++++++++++++++++++++++------
 foo.sh                              |  22 ++++
 pkgs/linux-firmware/default.nix     |  38 +++++++
 pkgs/linux-firmware/post-install.sh |  59 +++++++++++
 4 files changed, 241 insertions(+), 29 deletions(-)
 create mode 100755 foo.sh
 create mode 100644 pkgs/linux-firmware/default.nix
 create mode 100755 pkgs/linux-firmware/post-install.sh

diff --git a/flake.nix b/flake.nix
index 99fce5b..15a9152 100644
--- a/flake.nix
+++ b/flake.nix
@@ -25,10 +25,19 @@
       {
         packages = {
           default = patosPkgs.image;
-          image = pkgs.callPackage ./pkgs/image { inherit patosPkgs version updateUrl cpuArch secureBoot; };
+          image = pkgs.callPackage ./pkgs/image {
+            inherit
+              patosPkgs
+              version
+              updateUrl
+              cpuArch
+              secureBoot
+              ;
+          };
           rootfs = pkgs.callPackage ./pkgs/rootfs/mkrootfs.nix { inherit patosPkgs version; };
           initrd = pkgs.callPackage ./pkgs/rootfs/mkinitrd.nix { inherit patosPkgs version; };
           kernel = pkgs.callPackage ./pkgs/kernel { };
+          linux-firmware = pkgs.callPackage ./pkgs/linux-firmware { };
           glibc = pkgs.callPackage ./pkgs/glibc { };
           busybox = pkgs.callPackage ./pkgs/busybox { };
           openssl = pkgs.callPackage ./pkgs/openssl { };
@@ -46,38 +55,122 @@
             name = "debug-tools";
             version = "0.0.1";
             packages = [
-              { drv = pkgs.curl; path = "bin/curl"; }
-              { drv = pkgs.bash; path = "bin/bash"; }
-              { drv = patosPkgs.glibc; path = "bin/ldd"; }
-              { drv = pkgs.keyutils; path = "bin/keyctl"; }
-              { drv = pkgs.gnutar; path = "bin/tar"; }
-              { drv = pkgs.binutils-unwrapped; path = "bin/strings"; }
-              { drv = pkgs.strace; path = "bin/strace"; }
-              { drv = patosPkgs.tpm2-tools; path = "bin/tpm2"; }
-              { drv = patosPkgs.openssl; path = "bin/openssl"; }
-              { drv = pkgs.cryptsetup; path = "bin/cryptsetup"; }
-              { drv = pkgs.cryptsetup; path = "bin/veritysetup"; }
-              { drv = pkgs.erofs-utils; path = "bin/mkfs.erofs"; }
+              {
+                drv = pkgs.curl;
+                path = "bin/curl";
+              }
+              {
+                drv = pkgs.bash;
+                path = "bin/bash";
+              }
+              {
+                drv = patosPkgs.glibc;
+                path = "bin/ldd";
+              }
+              {
+                drv = pkgs.keyutils;
+                path = "bin/keyctl";
+              }
+              {
+                drv = pkgs.gnutar;
+                path = "bin/tar";
+              }
+              {
+                drv = pkgs.binutils-unwrapped;
+                path = "bin/strings";
+              }
+              {
+                drv = pkgs.strace;
+                path = "bin/strace";
+              }
+              {
+                drv = patosPkgs.tpm2-tools;
+                path = "bin/tpm2";
+              }
+              {
+                drv = patosPkgs.openssl;
+                path = "bin/openssl";
+              }
+              {
+                drv = pkgs.cryptsetup;
+                path = "bin/cryptsetup";
+              }
+              {
+                drv = pkgs.cryptsetup;
+                path = "bin/veritysetup";
+              }
+              {
+                drv = pkgs.erofs-utils;
+                path = "bin/mkfs.erofs";
+              }
               # shared lib required for cryptsetup
-              { drv = pkgs.popt; path = "lib/libpopt.so.0.0.2"; }
-              { drv = pkgs.popt; path = "lib/libpopt.so.0"; }
-              { drv = pkgs.popt; path = "lib/libpopt.so"; }
+              {
+                drv = pkgs.popt;
+                path = "lib/libpopt.so.0.0.2";
+              }
+              {
+                drv = pkgs.popt;
+                path = "lib/libpopt.so.0";
+              }
+              {
+                drv = pkgs.popt;
+                path = "lib/libpopt.so";
+              }
               # shared lib required for mkfs.erofs
-              { drv = pkgs.lz4.lib; path = "lib/liblz4.so.1.10.0"; }
-              { drv = pkgs.lz4.lib; path = "lib/liblz4.so.1"; }
-              { drv = pkgs.lz4.lib; path = "lib/liblz4.so"; }
+              {
+                drv = pkgs.lz4.lib;
+                path = "lib/liblz4.so.1.10.0";
+              }
+              {
+                drv = pkgs.lz4.lib;
+                path = "lib/liblz4.so.1";
+              }
+              {
+                drv = pkgs.lz4.lib;
+                path = "lib/liblz4.so";
+              }
               # shared lib required for binutils
-              { drv = pkgs.binutils-unwrapped.lib; path = "lib/libsframe.so.1.0.0"; }
-              { drv = pkgs.binutils-unwrapped.lib; path = "lib/libsframe.so.1"; }
-              { drv = pkgs.binutils-unwrapped.lib; path = "lib/libbfd-2.43.1.so"; }
-              { drv = pkgs.binutils-unwrapped.lib; path = "lib/libbfd.so"; }
+              {
+                drv = pkgs.binutils-unwrapped.lib;
+                path = "lib/libsframe.so.1.0.0";
+              }
+              {
+                drv = pkgs.binutils-unwrapped.lib;
+                path = "lib/libsframe.so.1";
+              }
+              {
+                drv = pkgs.binutils-unwrapped.lib;
+                path = "lib/libbfd-2.43.1.so";
+              }
+              {
+                drv = pkgs.binutils-unwrapped.lib;
+                path = "lib/libbfd.so";
+              }
               # shared lib required for strace
-              { drv = pkgs.elfutils.out; path = "lib/libdw-0.192.so"; }
-              { drv = pkgs.elfutils.out; path = "lib/libdw.so.1"; }
-              { drv = pkgs.elfutils.out; path = "lib/libdw.so"; }
-              { drv = pkgs.elfutils.out; path = "lib/libelf-0.192.so"; }
-              { drv = pkgs.elfutils.out; path = "lib/libelf.so.1"; }
-              { drv = pkgs.elfutils.out; path = "lib/libelf.so"; }
+              {
+                drv = pkgs.elfutils.out;
+                path = "lib/libdw-0.192.so";
+              }
+              {
+                drv = pkgs.elfutils.out;
+                path = "lib/libdw.so.1";
+              }
+              {
+                drv = pkgs.elfutils.out;
+                path = "lib/libdw.so";
+              }
+              {
+                drv = pkgs.elfutils.out;
+                path = "lib/libelf-0.192.so";
+              }
+              {
+                drv = pkgs.elfutils.out;
+                path = "lib/libelf.so.1";
+              }
+              {
+                drv = pkgs.elfutils.out;
+                path = "lib/libelf.so";
+              }
             ];
           };
         };
diff --git a/foo.sh b/foo.sh
new file mode 100755
index 0000000..aefb5d5
--- /dev/null
+++ b/foo.sh
@@ -0,0 +1,22 @@
+#!/usr/bin/env bash
+out=/tmp/build
+_pick() {
+  local p="$1" f d; shift
+  for f; do
+    d="$out/$p/${f#$out/}"
+    echo mkdir -p "$(dirname "$d")"
+    echo mv "$f" "$d"
+    echo rm -rf "$f"
+
+    echo mkfs.erofs --all-root -Efragments,dedupe,ztailpacking $out/$p.raw $p
+    echo veritysetup format --root-hash-file $out/$p.roothash $out/$p.raw $out/$p.verity
+  done
+}
+
+# _pick amd-ucode usr/lib/firmware/amd-ucode
+
+# _pick linux-firmware-nfp usr/lib/firmware/netronome
+# _pick linux-firmware-marvell usr/lib/firmware/{libertas,mwl8k,mwlwifi,mrvl}
+_pick linux-firmware-qlogic usr/lib/firmware/{qlogic,qed,ql2???_*,c{b,t,t2}fw-*}
+
+# _pick linux-firmware-base usr/lib/firmware
diff --git a/pkgs/linux-firmware/default.nix b/pkgs/linux-firmware/default.nix
new file mode 100644
index 0000000..161b2e4
--- /dev/null
+++ b/pkgs/linux-firmware/default.nix
@@ -0,0 +1,38 @@
+{
+  stdenv,
+  pkgs,
+}:
+
+stdenv.mkDerivation {
+  pname = pkgs.linux-firmware.name;
+  version = pkgs.linux-firmware.version;
+  src = pkgs.linux-firmware.src;
+
+  buildInputs = with pkgs; [
+    erofs-utils
+    cryptsetup
+  ];
+
+  nativeBuildInputs = with pkgs; [
+    python3
+    rdfind
+    which
+    zstd
+  ];
+
+  noBrokenSymlinks = true;
+
+  installTargets = [
+    "install-zst"
+    "dedup"
+  ];
+
+  # inspo: https://gitlab.archlinux.org/archlinux/packaging/packages/linux-firmware/-/blob/main/PKGBUILD?ref_type=heads#L93
+  makeFlags = [
+    "DESTDIR=$(out)"
+    "ZSTD_CLEVEL=19"
+    "FIRMWAREDIR=/usr/lib/firmware"
+  ];
+
+  postInstall = ./post-install.sh;
+}
diff --git a/pkgs/linux-firmware/post-install.sh b/pkgs/linux-firmware/post-install.sh
new file mode 100755
index 0000000..2dbe3ca
--- /dev/null
+++ b/pkgs/linux-firmware/post-install.sh
@@ -0,0 +1,59 @@
+set -ex -uo pipefail
+
+_pick() {
+  local p="$1" f d; shift
+  for f; do
+    d="$out/$p/${f#$out/}"
+    mkdir -p "$(dirname "$d")"
+    mv $out/"$f" "$d"
+    rm -rf $out/"$f"
+  done
+}
+
+_package() {
+  local p="$1"
+  mkdir -p $out/$p/usr/lib/extension-release.d
+  cat << EOF > $out/$p/usr/lib/extension-release.d/extension-release.$p
+ID=patos
+IMAGE_ID=$p
+IMAGE_VERSION=$version
+VERSION_ID=patos
+EOF
+
+  mkfs.erofs --all-root -Efragments,dedupe,ztailpacking $out/$p.raw $out/$p
+  veritysetup format --root-hash-file $out/$p.roothash $out/$p.raw $out/$p.verity
+}
+
+# remove arm64 firmware https://bugs.archlinux.org/task/76583
+rm $out/usr/lib/firmware/mrvl/prestera/mvsw_prestera_fw_arm64-v4.1.img.zst
+
+_pick amd-ucode usr/lib/firmware/amd-ucode
+_package amd-ucode
+
+_pick linux-firmware-nfp usr/lib/firmware/netronome
+_package linux-firmware-nfp
+
+_pick linux-firmware-mellanox usr/lib/firmware/mellanox
+_package linux-firmware-mellanox
+
+_pick linux-firmware-marvell usr/lib/firmware/{libertas,mwl8k,mwlwifi,mrvl}
+_package linux-firmware-marvell
+
+_pick linux-firmware-qcom usr/lib/firmware/qcom
+_package linux-firmware-qcom
+
+_pick linux-firmware-liquidio usr/lib/firmware/liquidio
+_package linux-firmware-liquidio
+
+# _pick linux-firmware-qlogic usr/lib/firmware/{qlogic,qed,ql2???_*,c{b,t,t2}fw-*}
+# _package linux-firmware-qlogic
+
+# _pick linux-firmware-bnx2x usr/lib/firmware/bnx2x*
+# _package linux-firmware-bnx2x
+
+# and the rest is base firmware
+_pick linux-firmware usr/lib/firmware
+_package linux-firmware
+
+# clean up
+# rm -rf $out/usr

From 58861e6de6c80d6b93609185048f2a98e515b444 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Thu, 17 Apr 2025 19:06:37 +0200
Subject: [PATCH 02/25] chore: upgrade systemd

---
 pkgs/systemd/default.nix | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pkgs/systemd/default.nix b/pkgs/systemd/default.nix
index a1cb314..a93fd76 100644
--- a/pkgs/systemd/default.nix
+++ b/pkgs/systemd/default.nix
@@ -7,7 +7,7 @@
   ...
 }:
 let
-  version = "257.4";
+  version = "257.5";
 
   # Use the command below to update `releaseTimestamp` on every (major) version
   # change. More details in the commentary at mesonFlags.

From 92c204231b7cfaa9f3b880e8d3b27af2ad6474d5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Sat, 19 Apr 2025 22:56:00 +0200
Subject: [PATCH 03/25] chore: nix flake update

---
 flake.lock | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/flake.lock b/flake.lock
index 2272d3d..3725da4 100644
--- a/flake.lock
+++ b/flake.lock
@@ -20,11 +20,11 @@
     },
     "nixpkgs": {
       "locked": {
-        "lastModified": 1742669843,
-        "narHash": "sha256-G5n+FOXLXcRx+3hCJ6Rt6ZQyF1zqQ0DL0sWAMn2Nk0w=",
+        "lastModified": 1744932701,
+        "narHash": "sha256-fusHbZCyv126cyArUwwKrLdCkgVAIaa/fQJYFlCEqiU=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "1e5b653dff12029333a6546c11e108ede13052eb",
+        "rev": "b024ced1aac25639f8ca8fdfc2f8c4fbd66c48ef",
         "type": "github"
       },
       "original": {

From 15227256ecf0e8aea67d3ebb21e2122a7b6a0f46 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Sat, 19 Apr 2025 23:06:44 +0200
Subject: [PATCH 04/25] chore: kernel upgrade

---
 pkgs/kernel/default.nix | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pkgs/kernel/default.nix b/pkgs/kernel/default.nix
index 51a05bf..1297825 100644
--- a/pkgs/kernel/default.nix
+++ b/pkgs/kernel/default.nix
@@ -1,7 +1,7 @@
 { pkgs }:
 let
-  version = "6.13.8";
-  hash = "sha256-JZr6Wdc9Z2vsKuib6s2UngjVTT9wp/iwp0IxUJV1Grs=";
+  version = "6.14.2";
+  hash = "sha256-xcaCo1TqMZATk1elfTSnnlw3IhrOgjqTjhARa1d6Lhs=";
 in
 (pkgs.callPackage ./manual-config.nix { }) {
   version = "${version}-patos1";

From b7e526454b66c1aca7875fcab107cc3fbb780099 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Tue, 6 May 2025 18:12:03 +0200
Subject: [PATCH 05/25] chore: nix update

---
 flake.lock               | 6 +++---
 pkgs/kernel/default.nix  | 4 ++--
 pkgs/systemd/default.nix | 2 +-
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/flake.lock b/flake.lock
index 3725da4..bb33fd6 100644
--- a/flake.lock
+++ b/flake.lock
@@ -20,11 +20,11 @@
     },
     "nixpkgs": {
       "locked": {
-        "lastModified": 1744932701,
-        "narHash": "sha256-fusHbZCyv126cyArUwwKrLdCkgVAIaa/fQJYFlCEqiU=",
+        "lastModified": 1746328495,
+        "narHash": "sha256-uKCfuDs7ZM3QpCE/jnfubTg459CnKnJG/LwqEVEdEiw=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "b024ced1aac25639f8ca8fdfc2f8c4fbd66c48ef",
+        "rev": "979daf34c8cacebcd917d540070b52a3c2b9b16e",
         "type": "github"
       },
       "original": {
diff --git a/pkgs/kernel/default.nix b/pkgs/kernel/default.nix
index 1297825..dcd382d 100644
--- a/pkgs/kernel/default.nix
+++ b/pkgs/kernel/default.nix
@@ -1,7 +1,7 @@
 { pkgs }:
 let
-  version = "6.14.2";
-  hash = "sha256-xcaCo1TqMZATk1elfTSnnlw3IhrOgjqTjhARa1d6Lhs=";
+  version = "6.14.4";
+  hash = "sha256-lFLyjXoAUfukiGcSOVtITEx/z5+FlEpi/T2X3JI/Uzk=";
 in
 (pkgs.callPackage ./manual-config.nix { }) {
   version = "${version}-patos1";
diff --git a/pkgs/systemd/default.nix b/pkgs/systemd/default.nix
index a93fd76..db0b64c 100644
--- a/pkgs/systemd/default.nix
+++ b/pkgs/systemd/default.nix
@@ -27,7 +27,7 @@ stdenv.mkDerivation (finalAttrs: {
     owner = "systemd";
     repo = "systemd";
     rev = "v${version}";
-    hash = "sha256-6rxJUYRq785U6aik5VhQRqG+Ss67lBB6T3eQF+tkyhk=";
+    hash = "sha256-mn/JB/nrOz2TOobu2d+XBH2dVH3vn/HPvWN4Zz6s+SM=";
   };
 
   patches = [ ./skip-verify-esp.patch ];

From af2a063ff2dfed7b8270f72e1d4c6f856b8be7ba Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 7 May 2025 06:26:16 +0200
Subject: [PATCH 06/25] chore: kernel upgrade

---
 pkgs/kernel/default.nix | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pkgs/kernel/default.nix b/pkgs/kernel/default.nix
index dcd382d..703b612 100644
--- a/pkgs/kernel/default.nix
+++ b/pkgs/kernel/default.nix
@@ -1,7 +1,7 @@
 { pkgs }:
 let
-  version = "6.14.4";
-  hash = "sha256-lFLyjXoAUfukiGcSOVtITEx/z5+FlEpi/T2X3JI/Uzk=";
+  version = "6.14.5";
+  hash = "sha256-KCB+xSu+qjUHAQrv+UT0QvfZ8isoa3nK9F7G3xsk9Ak=";
 in
 (pkgs.callPackage ./manual-config.nix { }) {
   version = "${version}-patos1";

From 8ee40679fc722db4cce24f7f0eb4a1bb159c2a0f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Mon, 12 May 2025 19:40:51 +0200
Subject: [PATCH 07/25] chore: os update

---
 flake.lock              | 6 +++---
 pkgs/kernel/default.nix | 4 ++--
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/flake.lock b/flake.lock
index bb33fd6..affeabc 100644
--- a/flake.lock
+++ b/flake.lock
@@ -20,11 +20,11 @@
     },
     "nixpkgs": {
       "locked": {
-        "lastModified": 1746328495,
-        "narHash": "sha256-uKCfuDs7ZM3QpCE/jnfubTg459CnKnJG/LwqEVEdEiw=",
+        "lastModified": 1746904237,
+        "narHash": "sha256-3e+AVBczosP5dCLQmMoMEogM57gmZ2qrVSrmq9aResQ=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "979daf34c8cacebcd917d540070b52a3c2b9b16e",
+        "rev": "d89fc19e405cb2d55ce7cc114356846a0ee5e956",
         "type": "github"
       },
       "original": {
diff --git a/pkgs/kernel/default.nix b/pkgs/kernel/default.nix
index 703b612..6b8bb21 100644
--- a/pkgs/kernel/default.nix
+++ b/pkgs/kernel/default.nix
@@ -1,7 +1,7 @@
 { pkgs }:
 let
-  version = "6.14.5";
-  hash = "sha256-KCB+xSu+qjUHAQrv+UT0QvfZ8isoa3nK9F7G3xsk9Ak=";
+  version = "6.14.6";
+  hash = "sha256-IYF/GZjiIw+B9+T2Bfpv3LBA4U+ifZnCfdsWznSXl6k=";
 in
 (pkgs.callPackage ./manual-config.nix { }) {
   version = "${version}-patos1";

From 7c0d0a099dda8d253b0cefc031a6774fa3877301 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Tue, 20 May 2025 21:05:10 +0200
Subject: [PATCH 08/25] chore: nix flake update

---
 flake.lock                   | 6 +++---
 pkgs/kernel/default.nix      | 4 ++--
 pkgs/kexec-tools/default.nix | 4 ++--
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/flake.lock b/flake.lock
index affeabc..bac1c51 100644
--- a/flake.lock
+++ b/flake.lock
@@ -20,11 +20,11 @@
     },
     "nixpkgs": {
       "locked": {
-        "lastModified": 1746904237,
-        "narHash": "sha256-3e+AVBczosP5dCLQmMoMEogM57gmZ2qrVSrmq9aResQ=",
+        "lastModified": 1747542820,
+        "narHash": "sha256-GaOZntlJ6gPPbbkTLjbd8BMWaDYafhuuYRNrxCGnPJw=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "d89fc19e405cb2d55ce7cc114356846a0ee5e956",
+        "rev": "292fa7d4f6519c074f0a50394dbbe69859bb6043",
         "type": "github"
       },
       "original": {
diff --git a/pkgs/kernel/default.nix b/pkgs/kernel/default.nix
index 6b8bb21..fcc8066 100644
--- a/pkgs/kernel/default.nix
+++ b/pkgs/kernel/default.nix
@@ -1,7 +1,7 @@
 { pkgs }:
 let
-  version = "6.14.6";
-  hash = "sha256-IYF/GZjiIw+B9+T2Bfpv3LBA4U+ifZnCfdsWznSXl6k=";
+  version = "6.14.7";
+  hash = "sha256-gRIgK8JtCGlXqU0hCabc1EeMW6GNDwpeHF3+6gH1SXI=";
 in
 (pkgs.callPackage ./manual-config.nix { }) {
   version = "${version}-patos1";
diff --git a/pkgs/kexec-tools/default.nix b/pkgs/kexec-tools/default.nix
index 4ba15ba..7454821 100644
--- a/pkgs/kexec-tools/default.nix
+++ b/pkgs/kexec-tools/default.nix
@@ -14,8 +14,8 @@ stdenv.mkDerivation {
   src = fetchFromGitHub {
     owner = "horms";
     repo = "kexec-tools";
-    rev = "a7fcd424c4c80dea5a2fd5ffa274ffeb8129c790";
-    hash = "sha256-QKE+KCkueA21zNunTMidP9OuZaw0IG5tFDF4UJITTTQ=";
+    rev = "v2.0.31";
+    hash = "sha256-Tgmc8mFlmzzRj7tEaBes7Udw4fRl6cSfe76iPNa3Ffs=";
   };
 
   dontPatchShebangs = true;

From d42406c6dc611a0618c3eb5089ed72c1dfd94a63 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 21 May 2025 12:43:41 +0200
Subject: [PATCH 09/25] fix: sysupdate wont work with out systemd.volatile set
 to overlay

---
 flake.nix              | 9 ++++++++-
 pkgs/image/default.nix | 2 +-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/flake.nix b/flake.nix
index 99fce5b..3567477 100644
--- a/flake.nix
+++ b/flake.nix
@@ -49,6 +49,13 @@
               { drv = pkgs.curl; path = "bin/curl"; }
               { drv = pkgs.bash; path = "bin/bash"; }
               { drv = patosPkgs.glibc; path = "bin/ldd"; }
+              { drv = pkgs.util-linux; path = "bin/sfdisk"; }
+              { drv = pkgs.readline.out; path = "lib/libreadline.so.8.2"; }
+              { drv = pkgs.readline.out; path = "lib/libreadline.so.8"; }
+              { drv = pkgs.readline.out; path = "lib/libhistory.so.8.2"; }
+              { drv = pkgs.readline.out; path = "lib/libhistory.so.8"; }
+              { drv = pkgs.ncurses.out; path = "/lib/libncursesw.so.6.5"; }
+              { drv = pkgs.ncurses.out; path = "/lib/libncursesw.so.6"; }
               { drv = pkgs.keyutils; path = "bin/keyctl"; }
               { drv = pkgs.gnutar; path = "bin/tar"; }
               { drv = pkgs.binutils-unwrapped; path = "bin/strings"; }
@@ -69,7 +76,7 @@
               # shared lib required for binutils
               { drv = pkgs.binutils-unwrapped.lib; path = "lib/libsframe.so.1.0.0"; }
               { drv = pkgs.binutils-unwrapped.lib; path = "lib/libsframe.so.1"; }
-              { drv = pkgs.binutils-unwrapped.lib; path = "lib/libbfd-2.43.1.so"; }
+              { drv = pkgs.binutils-unwrapped.lib; path = "lib/libbfd-2.44.so"; }
               { drv = pkgs.binutils-unwrapped.lib; path = "lib/libbfd.so"; }
               # shared lib required for strace
               { drv = pkgs.elfutils.out; path = "lib/libdw-0.192.so"; }
diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index 05d9c72..f42e95d 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -30,7 +30,7 @@ runCommand pname {
     SYSTEMD_REPART_MKFS_OPTIONS_EROFS = "--all-root -zlz4hc,12 -C1048576 -Efragments,dedupe,ztailpacking";
   };
 
-  kernelCmdLine = "console=ttyS0 patos.secureboot=${secureBoot}";
+  kernelCmdLine = "console=ttyS0 systemd.volatile=overlay patos.secureboot=${secureBoot}";
 }
 ''
 mkdir -p $out/init.repart.d $out/final.repart.d

From c883ff1cb2da53be1bc99ccd95021fd2b28e4e52 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Fri, 23 May 2025 13:14:12 +0200
Subject: [PATCH 10/25] Revert sysupdate fix due to a bug in systemd.

sysext need to be unmerged before sysupdate can be used.
https://github.com/systemd/systemd/pull/36617/
fix in main but not backported to stable yet.
---
 pkgs/image/default.nix | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index f42e95d..05d9c72 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -30,7 +30,7 @@ runCommand pname {
     SYSTEMD_REPART_MKFS_OPTIONS_EROFS = "--all-root -zlz4hc,12 -C1048576 -Efragments,dedupe,ztailpacking";
   };
 
-  kernelCmdLine = "console=ttyS0 systemd.volatile=overlay patos.secureboot=${secureBoot}";
+  kernelCmdLine = "console=ttyS0 patos.secureboot=${secureBoot}";
 }
 ''
 mkdir -p $out/init.repart.d $out/final.repart.d

From df4c60d87c5c3860556a9f51db4073541aeb689f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Sat, 24 May 2025 19:19:12 +0200
Subject: [PATCH 11/25] chore: kernel and systemd update

---
 pkgs/kernel/default.nix  | 4 ++--
 pkgs/systemd/default.nix | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/pkgs/kernel/default.nix b/pkgs/kernel/default.nix
index fcc8066..27e4055 100644
--- a/pkgs/kernel/default.nix
+++ b/pkgs/kernel/default.nix
@@ -1,7 +1,7 @@
 { pkgs }:
 let
-  version = "6.14.7";
-  hash = "sha256-gRIgK8JtCGlXqU0hCabc1EeMW6GNDwpeHF3+6gH1SXI=";
+  version = "6.14.8";
+  hash = "sha256-YrEuzTB1o1frMgk1ZX3oTgFVKANxfa04P6fMOqSqKQU=";
 in
 (pkgs.callPackage ./manual-config.nix { }) {
   version = "${version}-patos1";
diff --git a/pkgs/systemd/default.nix b/pkgs/systemd/default.nix
index db0b64c..fea417a 100644
--- a/pkgs/systemd/default.nix
+++ b/pkgs/systemd/default.nix
@@ -7,7 +7,7 @@
   ...
 }:
 let
-  version = "257.5";
+  version = "257.6";
 
   # Use the command below to update `releaseTimestamp` on every (major) version
   # change. More details in the commentary at mesonFlags.

From 2729e079960c5d07ff6155b8a967f03f056e941e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Tue, 3 Jun 2025 08:16:50 +0200
Subject: [PATCH 12/25] chore: kernel update

---
 pkgs/kernel/default.nix | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pkgs/kernel/default.nix b/pkgs/kernel/default.nix
index 27e4055..06c14cd 100644
--- a/pkgs/kernel/default.nix
+++ b/pkgs/kernel/default.nix
@@ -1,7 +1,7 @@
 { pkgs }:
 let
-  version = "6.14.8";
-  hash = "sha256-YrEuzTB1o1frMgk1ZX3oTgFVKANxfa04P6fMOqSqKQU=";
+  version = "6.14.9";
+  hash = "sha256-OQzd4DJxmSWghCcnAZfvVdtOkMCdRU6cNVQVcpLJ82E=";
 in
 (pkgs.callPackage ./manual-config.nix { }) {
   version = "${version}-patos1";

From 827b2c3d0f1b5c6cc3cabffc4a811a35b456ddf9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 4 Jun 2025 09:59:41 +0200
Subject: [PATCH 13/25] feat: start using systemd from main line

---
 pkgs/image/default.nix   | 17 ++++++++++-------
 pkgs/rootfs/mkrootfs.nix |  5 +++--
 pkgs/systemd/default.nix | 10 +++++++---
 3 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index 05d9c72..86c3708 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -30,7 +30,7 @@ runCommand pname {
     SYSTEMD_REPART_MKFS_OPTIONS_EROFS = "--all-root -zlz4hc,12 -C1048576 -Efragments,dedupe,ztailpacking";
   };
 
-  kernelCmdLine = "console=ttyS0 patos.secureboot=${secureBoot}";
+  kernelCmdLine = "systemd.journald.forward_to_console=1 console=ttyS0 patos.secureboot=${secureBoot}";
 }
 ''
 mkdir -p $out/init.repart.d $out/final.repart.d
@@ -141,6 +141,7 @@ cat <<EOF > init.repart.d/10-root.conf
 Type=root
 Format=erofs
 Minimize=best
+AddValidateFS=false
 CopyFiles=/rootfs:/
 Verity=data
 VerityMatchKey=root
@@ -152,6 +153,7 @@ cat <<EOF > init.repart.d/20-root-verity.conf
 Type=root-verity
 Verity=hash
 VerityMatchKey=root
+AddValidateFS=false
 Minimize=best
 SplitName=verity
 EOF
@@ -162,11 +164,13 @@ ${patosPkgs.systemd}/usr/bin/systemd-repart \
   --no-pager \
   --empty=create \
   --size=auto \
-  --definitions=./init.repart.d \
+  --definitions=$out/init.repart.d \
   --split=true \
   --json=pretty \
   --root=$out \
-  patos_$version.raw > init-repart-output.json && rm -f patos_$version.raw
+  patos_$version.raw > init-repart-output.json
+
+rm -f patos_$version.raw
 
 roothash=$(jq -r '.[0].roothash' init-repart-output.json)
 rootPart=$(jq -r '.[0].split_path' init-repart-output.json)
@@ -217,14 +221,14 @@ Type=esp
 Format=vfat
 SizeMinBytes=128M
 SizeMaxBytes=128M
-CopyFiles=/rootfs/boot:/
+CopyFiles=$out/rootfs/boot:/
 EOF
 
 cat <<EOF > final.repart.d/20-root.conf
 [Partition]
 Type=root
 Label=root-${version}
-CopyBlocks=/$rootPart
+CopyBlocks=$out/$rootPart
 UUID=$rootUuid
 SizeMinBytes=64M
 SizeMaxBytes=64M
@@ -235,7 +239,7 @@ cat <<EOF > final.repart.d/22-root-verity.conf
 [Partition]
 Type=root-verity
 Label=verity-${version}
-CopyBlocks=/$verityPart
+CopyBlocks=$out/$verityPart
 UUID=$verityUuid
 ReadOnly=1
 EOF
@@ -246,7 +250,6 @@ ${patosPkgs.systemd}/usr/bin/systemd-repart \
   --empty=create \
   --size=auto \
   --definitions=./final.repart.d \
-  --root=$out \
   patos_${version}.img > final-repart-output.json
 
 rm -rf rootfs init.repart.d final.repart.d *.json
diff --git a/pkgs/rootfs/mkrootfs.nix b/pkgs/rootfs/mkrootfs.nix
index bda4c7d..bdc0ba1 100644
--- a/pkgs/rootfs/mkrootfs.nix
+++ b/pkgs/rootfs/mkrootfs.nix
@@ -35,7 +35,6 @@ find $out -type d -exec chmod 755 {} \;
 rm -rf $out/usr/include
 rm -rf $out/usr/sbin
 ln -sf /usr/bin $out/usr/sbin
-rm -f $out/usr/lib/systemd/system/sysinit.target.wants/systemd-firstboot.service
 # enable in ramdisk instead
 rm -f $out/usr/lib/systemd/system/sysinit.target.wants/systemd-repart.service
 rm -f $out/usr/lib/systemd/system/initrd-root-fs.target.wants/systemd-repart.service
@@ -206,7 +205,9 @@ chmod 600 $out/etc/shadow
 rm -rf creds
 
 # Ephemeral machine-id until registration
-ln -sf /run/machine-id $out/etc/machine-id
+# ln -sf /run/machine-id $out/etc/machine-id
+# FIXME: above line does not work in systemd > 257
+${patosPkgs.systemd}/usr/bin/systemd-machine-id-setup --root=$out
 
 ### Find and install all shared libs
 find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | \
diff --git a/pkgs/systemd/default.nix b/pkgs/systemd/default.nix
index fea417a..dfe506c 100644
--- a/pkgs/systemd/default.nix
+++ b/pkgs/systemd/default.nix
@@ -7,7 +7,7 @@
   ...
 }:
 let
-  version = "257.6";
+  version = "devel";
 
   # Use the command below to update `releaseTimestamp` on every (major) version
   # change. More details in the commentary at mesonFlags.
@@ -26,8 +26,8 @@ stdenv.mkDerivation (finalAttrs: {
   src = fetchFromGitHub {
     owner = "systemd";
     repo = "systemd";
-    rev = "v${version}";
-    hash = "sha256-mn/JB/nrOz2TOobu2d+XBH2dVH3vn/HPvWN4Zz6s+SM=";
+    rev = "959d7f1759d67994e3bed7b9d2f23e063475a872"; # main
+    hash = "sha256-IxGg0t/0GEllU4EPHqY2bwMDYwrQ5KWyE2QhwhTxqGs=";
   };
 
   patches = [ ./skip-verify-esp.patch ];
@@ -137,6 +137,10 @@ stdenv.mkDerivation (finalAttrs: {
     ''
       substituteInPlace meson.build \
         --replace "find_program('clang'" "find_program('${stdenv.cc.targetPrefix}clang'"
+    '' +
+    ''
+      substituteInPlace src/test/meson.build \
+        --replace "test_env.set('SYSTEMD_LANGUAGE_FALLBACK_MAP', language_fallback_map)" ""
     ''
     + ''
       substituteInPlace src/ukify/ukify.py \

From 6361308cd0c7b968afde4524c9e0fedefcf7dee8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Mon, 9 Jun 2025 12:35:50 +0200
Subject: [PATCH 14/25] chore: nix flake update and kernel upgrade

---
 flake.lock              | 6 +++---
 pkgs/kernel/default.nix | 4 ++--
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/flake.lock b/flake.lock
index bac1c51..e0246ab 100644
--- a/flake.lock
+++ b/flake.lock
@@ -20,11 +20,11 @@
     },
     "nixpkgs": {
       "locked": {
-        "lastModified": 1747542820,
-        "narHash": "sha256-GaOZntlJ6gPPbbkTLjbd8BMWaDYafhuuYRNrxCGnPJw=",
+        "lastModified": 1749285348,
+        "narHash": "sha256-frdhQvPbmDYaScPFiCnfdh3B/Vh81Uuoo0w5TkWmmjU=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "292fa7d4f6519c074f0a50394dbbe69859bb6043",
+        "rev": "3e3afe5174c561dee0df6f2c2b2236990146329f",
         "type": "github"
       },
       "original": {
diff --git a/pkgs/kernel/default.nix b/pkgs/kernel/default.nix
index 06c14cd..69edc22 100644
--- a/pkgs/kernel/default.nix
+++ b/pkgs/kernel/default.nix
@@ -1,7 +1,7 @@
 { pkgs }:
 let
-  version = "6.14.9";
-  hash = "sha256-OQzd4DJxmSWghCcnAZfvVdtOkMCdRU6cNVQVcpLJ82E=";
+  version = "6.15.1";
+  hash = "sha256-RPG7hP5RLnuv4ObchdOOwcbI/L6XzLUdjBmTC3mfDWQ=";
 in
 (pkgs.callPackage ./manual-config.nix { }) {
   version = "${version}-patos1";

From e85353bc3532bc5fbe01c292204cc633c22a2f1c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 11 Jun 2025 11:07:55 +0200
Subject: [PATCH 15/25] chore: better compression for sysext images

---
 flake.nix           | 54 +++++++++++++++++----------------------------
 lib/make-sysext.nix | 22 +++++++++++++++++-
 2 files changed, 41 insertions(+), 35 deletions(-)

diff --git a/flake.nix b/flake.nix
index 3567477..cfbd77c 100644
--- a/flake.nix
+++ b/flake.nix
@@ -46,45 +46,31 @@
             name = "debug-tools";
             version = "0.0.1";
             packages = [
-              { drv = pkgs.curl; path = "bin/curl"; }
-              { drv = pkgs.bash; path = "bin/bash"; }
+              { drv = pkgs.curl; path = "bin/"; }
+              { drv = pkgs.bash; path = "bin/"; }
+              { drv = pkgs.keyutils; path = "bin/"; }
+              { drv = pkgs.gnutar; path = "bin/"; }
+              { drv = pkgs.strace; path = "bin/"; }
+              { drv = pkgs.cryptsetup; path = "bin/"; }
+              { drv = pkgs.erofs-utils; path = "bin/"; }
+              { drv = pkgs.binutils-unwrapped; path = "bin/"; }
+              { drv = pkgs.binutils-unwrapped.lib; path = "lib/"; }
+              { drv = pkgs.util-linuxMinimal; path = "bin/"; }
+              { drv = pkgs.util-linuxMinimal.mount; path = "bin/"; }
+              { drv = pkgs.util-linuxMinimal.login; path = "bin/"; }
+              { drv = pkgs.util-linuxMinimal.swap; path = "bin/"; }
               { drv = patosPkgs.glibc; path = "bin/ldd"; }
-              { drv = pkgs.util-linux; path = "bin/sfdisk"; }
-              { drv = pkgs.readline.out; path = "lib/libreadline.so.8.2"; }
-              { drv = pkgs.readline.out; path = "lib/libreadline.so.8"; }
-              { drv = pkgs.readline.out; path = "lib/libhistory.so.8.2"; }
-              { drv = pkgs.readline.out; path = "lib/libhistory.so.8"; }
-              { drv = pkgs.ncurses.out; path = "/lib/libncursesw.so.6.5"; }
-              { drv = pkgs.ncurses.out; path = "/lib/libncursesw.so.6"; }
-              { drv = pkgs.keyutils; path = "bin/keyctl"; }
-              { drv = pkgs.gnutar; path = "bin/tar"; }
-              { drv = pkgs.binutils-unwrapped; path = "bin/strings"; }
-              { drv = pkgs.strace; path = "bin/strace"; }
               { drv = patosPkgs.tpm2-tools; path = "bin/tpm2"; }
               { drv = patosPkgs.openssl; path = "bin/openssl"; }
-              { drv = pkgs.cryptsetup; path = "bin/cryptsetup"; }
-              { drv = pkgs.cryptsetup; path = "bin/veritysetup"; }
-              { drv = pkgs.erofs-utils; path = "bin/mkfs.erofs"; }
-              # shared lib required for cryptsetup
-              { drv = pkgs.popt; path = "lib/libpopt.so.0.0.2"; }
-              { drv = pkgs.popt; path = "lib/libpopt.so.0"; }
-              { drv = pkgs.popt; path = "lib/libpopt.so"; }
               # shared lib required for mkfs.erofs
-              { drv = pkgs.lz4.lib; path = "lib/liblz4.so.1.10.0"; }
-              { drv = pkgs.lz4.lib; path = "lib/liblz4.so.1"; }
-              { drv = pkgs.lz4.lib; path = "lib/liblz4.so"; }
-              # shared lib required for binutils
-              { drv = pkgs.binutils-unwrapped.lib; path = "lib/libsframe.so.1.0.0"; }
-              { drv = pkgs.binutils-unwrapped.lib; path = "lib/libsframe.so.1"; }
-              { drv = pkgs.binutils-unwrapped.lib; path = "lib/libbfd-2.44.so"; }
-              { drv = pkgs.binutils-unwrapped.lib; path = "lib/libbfd.so"; }
+              { drv = pkgs.lz4.lib; path = "lib/"; }
+              # shared lib required for cryptsetup
+              { drv = pkgs.popt; path = "lib/"; }
               # shared lib required for strace
-              { drv = pkgs.elfutils.out; path = "lib/libdw-0.192.so"; }
-              { drv = pkgs.elfutils.out; path = "lib/libdw.so.1"; }
-              { drv = pkgs.elfutils.out; path = "lib/libdw.so"; }
-              { drv = pkgs.elfutils.out; path = "lib/libelf-0.192.so"; }
-              { drv = pkgs.elfutils.out; path = "lib/libelf.so.1"; }
-              { drv = pkgs.elfutils.out; path = "lib/libelf.so"; }
+              { drv = pkgs.elfutils.out; path = "lib/"; }
+              # shared lib required for bash
+              { drv = pkgs.readline.out; path = "lib/"; }
+              { drv = pkgs.ncurses.out; path = "lib/"; }
             ];
           };
         };
diff --git a/lib/make-sysext.nix b/lib/make-sysext.nix
index 6de1e63..59b04cf 100644
--- a/lib/make-sysext.nix
+++ b/lib/make-sysext.nix
@@ -46,6 +46,7 @@ runCommand name
 
   }
   ''
+    set -ex -o pipefail
     do_copy () {
       local prefix="$1"
       local drv="$2"
@@ -60,6 +61,25 @@ runCommand name
       destdir="$(dirname -- "$destfile")"
 
       mkdir -pv "$destdir"
+
+      # recursively copy if ending with /
+      if [[ "$destfile" =~ /$ ]]; then
+        basedir="$(dirname -- "$destfile")"
+        chmod -R 755 "$basedir"
+        # remove if exists
+        for f in $srcfile/*; do
+          basename="$(basename -- "$f")"
+          rm -f "$destfile/$basename"
+        done
+        cp -rPv "$srcfile" "$basedir"
+        chmod -R 755 "$basedir"
+        for f in $destfile/*; do
+          patchelf --set-interpreter /lib/ld-linux-x86-64.so.2 $f || true
+          patchelf --set-rpath /usr/lib $f || true
+        done
+        return
+      fi
+
       cp -Pv "$srcfile" "$destfile"
 
       chmod 755 "$destfile"
@@ -79,7 +99,7 @@ runCommand name
 
     pushd $out
     find tree -type d -exec chmod 0755 {} \;
-    mkfs.erofs --all-root $name.raw tree/
+    mkfs.erofs -zlz4hc,12 -C1048576 -Efragments,dedupe,ztailpacking --all-root $name.raw tree/
     veritysetup format --root-hash-file $name.roothash $name.raw $name.verity
     # TODO: pcks7 signature
     # openssl smime -sign -nocerts -noattr -binary -in ${name}.roothash \

From 6f84c2c41d18546ff0d62efa1d6e10f2ef671b27 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 11 Jun 2025 15:27:09 +0200
Subject: [PATCH 16/25] feat: add firewall tools as sysext

---
 flake.nix           | 22 ++++++++++++++++++++++
 lib/make-sysext.nix |  2 +-
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/flake.nix b/flake.nix
index cfbd77c..2655ff0 100644
--- a/flake.nix
+++ b/flake.nix
@@ -42,6 +42,28 @@
 
           qemu-uefi-tpm = pkgs.callPackage ./utils/qemu-uefi-tpm.nix { };
 
+          firewall-sysext = pkgs.callPackage ./lib/make-sysext.nix {
+            name = "firewall-tools";
+            version = "0.0.1";
+            packages = [
+              # network/firewalling
+              { drv = pkgs.iproute2; path = "bin/"; }
+              { drv = pkgs.nftables; path = "bin/"; }
+              { drv = pkgs.wireguard-tools; path = "bin/.wg-wrapped"; destpath = "bin/wg"; }
+              # deps
+              { drv = pkgs.nftables; path = "lib/"; }
+              { drv = pkgs.libnftnl; path = "lib/"; }
+              { drv = pkgs.iptables; path = "lib/"; }
+              { drv = pkgs.libgcc.lib; path = "lib/"; }
+              { drv = pkgs.libgcc; path = "lib/"; }
+              { drv = pkgs.libmnl; path = "lib/"; }
+              { drv = pkgs.gmp; path = "lib/"; }
+              { drv = pkgs.jansson.out; path = "lib/"; }
+              { drv = pkgs.ncurses.out; path = "lib/"; }
+              { drv = pkgs.libedit; path = "lib/"; }
+            ];
+          };
+
           debug-tools-sysext = pkgs.callPackage ./lib/make-sysext.nix {
             name = "debug-tools";
             version = "0.0.1";
diff --git a/lib/make-sysext.nix b/lib/make-sysext.nix
index 59b04cf..70ed570 100644
--- a/lib/make-sysext.nix
+++ b/lib/make-sysext.nix
@@ -69,7 +69,7 @@ runCommand name
         # remove if exists
         for f in $srcfile/*; do
           basename="$(basename -- "$f")"
-          rm -f "$destfile/$basename"
+          rm -rf "$destfile/$basename"
         done
         cp -rPv "$srcfile" "$basedir"
         chmod -R 755 "$basedir"

From 34c83b7c3b178091078253b7ef580b7255eef441 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 11 Jun 2025 22:24:38 +0200
Subject: [PATCH 17/25] fix(kexec-tools): build using autoconf

---
 pkgs/kexec-tools/default.nix | 26 +++++++++++++++++---------
 1 file changed, 17 insertions(+), 9 deletions(-)

diff --git a/pkgs/kexec-tools/default.nix b/pkgs/kexec-tools/default.nix
index 7454821..b83a6a6 100644
--- a/pkgs/kexec-tools/default.nix
+++ b/pkgs/kexec-tools/default.nix
@@ -4,6 +4,7 @@
   buildPackages,
   fetchFromGitHub,
   autoconf,
+  autoreconfHook,
   zlib,
 }:
 
@@ -27,20 +28,27 @@ stdenv.mkDerivation {
     "pie"
   ];
 
-  buildCommand = ''
-    unpackPhase
-    mkdir -p $out
-    cd source
-    ./bootstrap
-    ./configure --prefix=/
-    make DESTDIR=$out install
+  preAutoreconf = "./bootstrap";
+
+  configurePlatforms = [
+    "build"
+    "host"
+  ];
+
+  configureFlags = [ "BUILD_CC=${buildPackages.stdenv.cc.targetPrefix}cc" "--prefix=/"];
+  depsBuildBuild = [ buildPackages.stdenv.cc ];
+
+  installPhase = ''
+      make DESTDIR=$out install
   '';
 
-  depsBuildBuild = [ buildPackages.stdenv.cc ];
+  nativeBuildInputs = [
+    autoconf
+    autoreconfHook
+  ];
 
   buildInputs = [
     zlib
-    autoconf
   ];
 
   enableParallelBuilding = true;

From bd002f2d25aacfe61eec16f4a9ca42ede60f06f8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 11 Jun 2025 22:24:38 +0200
Subject: [PATCH 18/25] fix: explict use nativeBuildInputs

---
 pkgs/rootfs/mkrootfs.nix | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/pkgs/rootfs/mkrootfs.nix b/pkgs/rootfs/mkrootfs.nix
index bdc0ba1..4818478 100644
--- a/pkgs/rootfs/mkrootfs.nix
+++ b/pkgs/rootfs/mkrootfs.nix
@@ -12,7 +12,9 @@ runCommand "patos-rootfs"
 {
   inherit version;
 
-  buildInputs = with pkgs;[
+  nativeBuildInputs = with pkgs; [
+    stdenv.cc
+    patchelf
     glibc
     binutils
   ];
@@ -222,7 +224,7 @@ find $out -type f -executable -exec patchelf --set-interpreter /lib/ld-linux-x86
 patchelf --remove-rpath $out/usr/lib/ld-linux-x86-64.so.2
 
 # strip binaries
-find $out -type f -executable -exec strip {} \;
+find $out -type f -executable -exec $STRIP {} \;
 find $out -type d -exec chmod 755 {} \;
 
 # install kernel modules

From 760c8fe6370e2399abacf66920800ac567b4dc7f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Wed, 11 Jun 2025 22:24:38 +0200
Subject: [PATCH 19/25] feat: support cross compile to aarch64

---
 flake.nix                | 56 +++++++++++++++++++++++++---------------
 pkgs/image/default.nix   | 19 +++++++-------
 pkgs/rootfs/mkinitrd.nix |  3 +--
 pkgs/rootfs/mkrootfs.nix | 39 ++++++++++++++--------------
 4 files changed, 65 insertions(+), 52 deletions(-)

diff --git a/flake.nix b/flake.nix
index 2655ff0..776919f 100644
--- a/flake.nix
+++ b/flake.nix
@@ -15,30 +15,44 @@
     flake-utils.lib.eachDefaultSystem (
       system:
       let
-        pkgs = import nixpkgs { inherit system; };
-        patosPkgs = self.packages.${system};
         version = "0.0.1";
         secureBoot = "false";
         cpuArch = "intel";
         updateUrl = "http://10.0.2.2:8000/";
+
+        overlay = final: prev: {
+          patos = prev.lib.makeScope prev.newScope (self: {
+            kernel = final.callPackage ./pkgs/kernel { };
+            glibc = final.callPackage ./pkgs/glibc { };
+            busybox = final.callPackage ./pkgs/busybox { };
+            openssl = final.callPackage ./pkgs/openssl { };
+            kexec = final.callPackage ./pkgs/kexec-tools { };
+            lvm2 = final.callPackage ./pkgs/lvm2 { };
+            tpm2-tools = final.callPackage ./pkgs/tpm2-tools { };
+            tpm2-tss = final.callPackage ./pkgs/tpm2-tss { };
+            systemd = final.callPackage ./pkgs/systemd { };
+            dbus-broker = final.callPackage ./pkgs/dbus-broker { };
+
+            rootfs = final.callPackage ./pkgs/rootfs/mkrootfs.nix { inherit version; };
+            initrd = final.callPackage ./pkgs/rootfs/mkinitrd.nix { inherit version; };
+          });
+        };
+
+        pkgs = import nixpkgs { inherit system; overlays = [ overlay ]; };
+        pkgsCross = import nixpkgs {
+          inherit system;
+          overlays = [ overlay ];
+          crossSystem = {
+            config = "aarch64-unknown-linux-gnu";
+          };
+        };
       in
       {
         packages = {
-          default = patosPkgs.image;
-          image = pkgs.callPackage ./pkgs/image { inherit patosPkgs version updateUrl cpuArch secureBoot; };
-          rootfs = pkgs.callPackage ./pkgs/rootfs/mkrootfs.nix { inherit patosPkgs version; };
-          initrd = pkgs.callPackage ./pkgs/rootfs/mkinitrd.nix { inherit patosPkgs version; };
-          kernel = pkgs.callPackage ./pkgs/kernel { };
-          glibc = pkgs.callPackage ./pkgs/glibc { };
-          busybox = pkgs.callPackage ./pkgs/busybox { };
-          openssl = pkgs.callPackage ./pkgs/openssl { };
-          cert = pkgs.callPackage ./pkgs/cert { };
-          kexec = pkgs.callPackage ./pkgs/kexec-tools { };
-          lvm2 = pkgs.callPackage ./pkgs/lvm2 { };
-          tpm2-tools = pkgs.callPackage ./pkgs/tpm2-tools { inherit patosPkgs; };
-          tpm2-tss = pkgs.callPackage ./pkgs/tpm2-tss { };
-          systemd = pkgs.callPackage ./pkgs/systemd { };
-          dbus-broker = pkgs.callPackage ./pkgs/dbus-broker { };
+          default = self.packages.${system}.image;
+
+          image = pkgs.callPackage ./pkgs/image { inherit version updateUrl cpuArch secureBoot; };
+          image-aarch64 = pkgsCross.callPackage ./pkgs/image { inherit version updateUrl cpuArch secureBoot; };
 
           qemu-uefi-tpm = pkgs.callPackage ./utils/qemu-uefi-tpm.nix { };
 
@@ -81,9 +95,9 @@
               { drv = pkgs.util-linuxMinimal.mount; path = "bin/"; }
               { drv = pkgs.util-linuxMinimal.login; path = "bin/"; }
               { drv = pkgs.util-linuxMinimal.swap; path = "bin/"; }
-              { drv = patosPkgs.glibc; path = "bin/ldd"; }
-              { drv = patosPkgs.tpm2-tools; path = "bin/tpm2"; }
-              { drv = patosPkgs.openssl; path = "bin/openssl"; }
+              { drv = pkgs.patos.glibc; path = "bin/ldd"; }
+              { drv = pkgs.patos.tpm2-tools; path = "bin/tpm2"; }
+              { drv = pkgs.patos.openssl; path = "bin/openssl"; }
               # shared lib required for mkfs.erofs
               { drv = pkgs.lz4.lib; path = "lib/"; }
               # shared lib required for cryptsetup
@@ -111,7 +125,7 @@
             just
             nixd
             nixfmt-rfc-style
-            patosPkgs.qemu-uefi-tpm
+            self.packages.${system}.qemu-uefi-tpm
           ];
         };
 
diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index 86c3708..d9205f3 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -1,7 +1,6 @@
 {
   lib,
   pkgs,
-  patosPkgs,
   version,
   runCommand,
   updateUrl,
@@ -37,13 +36,13 @@ mkdir -p $out/init.repart.d $out/final.repart.d
 pushd $out
 
 mkdir rootfs
-cp -prP ${patosPkgs.rootfs}/* rootfs/
+cp -prP ${pkgs.patos.rootfs}/* rootfs/
 find rootfs/ -type d -exec chmod 755 {} \;
 
 # package kernel modules as sysext (will reduce the image size a little bit (~3MB))
 mkdir rootfs/etc/extensions
 rm -rf rootfs/usr/lib/modules
-cp ${patosPkgs.kernel}/patos-kernel-modules* rootfs/etc/extensions/
+cp ${pkgs.patos.kernel}/patos-kernel-modules* rootfs/etc/extensions/
 
 # set default target to multi-user
 ln -sf multi-user.target rootfs/usr/lib/systemd/system/default.target
@@ -160,7 +159,7 @@ EOF
 
 #TODO: Add verity signature partition
 
-${patosPkgs.systemd}/usr/bin/systemd-repart \
+${pkgs.patos.systemd}/usr/bin/systemd-repart \
   --no-pager \
   --empty=create \
   --size=auto \
@@ -182,16 +181,16 @@ verityUuid=$(jq -r '.[1].uuid' init-repart-output.json)
 ln -sf patos_$version.verity.raw patos_${version}_$verityUuid.verity
 ln -sf patos_$version.root.raw patos_${version}_$rootUuid.root
 
-${patosPkgs.systemd}/usr/bin/ukify build \
-  --linux ${patosPkgs.kernel}/bzImage \
-  --initrd ${patosPkgs.initrd}/initrd.xz \
+${pkgs.patos.systemd}/usr/bin/ukify build \
+  --linux ${pkgs.patos.kernel}/bzImage \
+  --initrd ${pkgs.patos.initrd}/initrd.xz \
   $microcode \
   --os-release @rootfs/etc/os-release \
   --cmdline "$kernelCmdLine roothash=$roothash" \
   -o patos_${version}.efi
 
 # install ESP
-SYSTEMD_RELAX_ESP_CHECKS=1 ${patosPkgs.systemd}/usr/bin/bootctl install --root ./rootfs --esp-path /boot
+SYSTEMD_RELAX_ESP_CHECKS=1 ${pkgs.patos.systemd}/usr/bin/bootctl install --root ./rootfs --esp-path /boot
 
 # setup factory reset
 mkdir -p rootfs/boot/EFI/tools
@@ -245,14 +244,14 @@ ReadOnly=1
 EOF
 
 # finalize image ready for boot
-${patosPkgs.systemd}/usr/bin/systemd-repart \
+${pkgs.patos.systemd}/usr/bin/systemd-repart \
   --no-pager \
   --empty=create \
   --size=auto \
   --definitions=./final.repart.d \
   patos_${version}.img > final-repart-output.json
 
-rm -rf rootfs init.repart.d final.repart.d *.json
+rm -rf init.repart.d final.repart.d *.json
 sha256sum *.root *.verity *.efi *.tar.xz > SHA256SUMS
 
 popd
diff --git a/pkgs/rootfs/mkinitrd.nix b/pkgs/rootfs/mkinitrd.nix
index c46ed9d..cdbfe11 100644
--- a/pkgs/rootfs/mkinitrd.nix
+++ b/pkgs/rootfs/mkinitrd.nix
@@ -1,6 +1,5 @@
 {
   pkgs,
-  patosPkgs,
   runCommand,
   ...
 }:
@@ -21,7 +20,7 @@ mkdir -p $out/root
 pushd $out/root
 
 ### copy rootfs
-cp -prP ${patosPkgs.rootfs}/* .
+cp -prP ${pkgs.patos.rootfs}/* .
 find . -type d -exec chmod 755 {} \;
 mkdir sysroot
 
diff --git a/pkgs/rootfs/mkrootfs.nix b/pkgs/rootfs/mkrootfs.nix
index 4818478..ed34662 100644
--- a/pkgs/rootfs/mkrootfs.nix
+++ b/pkgs/rootfs/mkrootfs.nix
@@ -1,6 +1,5 @@
 {
   pkgs,
-  patosPkgs,
   version,
   runCommand,
 }:
@@ -32,7 +31,7 @@ ln -sf /tmp $out/var/tmp
 ln -sf ../proc/self/mounts $out/etc/mtab
 
 ### install systemd
-cp -Pr ${patosPkgs.systemd}/* $out/
+cp -Pr ${pkgs.patos.systemd}/* $out/
 find $out -type d -exec chmod 755 {} \;
 rm -rf $out/usr/include
 rm -rf $out/usr/sbin
@@ -137,33 +136,33 @@ ManagerEnvironment=PATH=/bin:/sbin:/usr/bin SYSTEMD_CRYPTTAB=/run/crypttab SYSTE
 EOF
 
 ### install PatOS glibc
-cp -P ${patosPkgs.glibc}/lib/*.so* $out/usr/lib/
+cp -P ${pkgs.patos.glibc}/lib/*.so* $out/usr/lib/
 
 ### install openssl
-cp -P ${patosPkgs.openssl}/lib/*.so* $out/usr/lib/
-cp -Pr ${patosPkgs.openssl}/etc/ssl $out/etc/
+cp -P ${pkgs.patos.openssl}/lib/*.so* $out/usr/lib/
+cp -Pr ${pkgs.patos.openssl}/etc/ssl $out/etc/
 
 ### install busybox
-cp ${patosPkgs.busybox}/bin/busybox $out/usr/bin/
+cp ${pkgs.patos.busybox}/bin/busybox $out/usr/bin/
 $out/usr/bin/busybox --list | xargs -I {} ln -sf busybox $out/usr/bin/{}
 
 ### install dbus broker
-cp -r ${patosPkgs.dbus-broker}/* $out/
+cp -r ${pkgs.patos.dbus-broker}/* $out/
 
 ### install kexec
-cp -Pr ${patosPkgs.kexec}/sbin/kexec $out/usr/bin/
+cp -Pr ${pkgs.patos.kexec}/sbin/kexec $out/usr/bin/
 
 ### install dmsetup udev rules
-cp -P ${patosPkgs.lvm2}/usr/bin/dmsetup $out/usr/bin/
-cp -P ${patosPkgs.lvm2}/lib/libdevmapper.so* $out/usr/lib/
-cp -P ${patosPkgs.lvm2}/lib/udev/rules.d/* $out/usr/lib/udev/rules.d/
+cp -P ${pkgs.patos.lvm2}/usr/bin/dmsetup $out/usr/bin/
+cp -P ${pkgs.patos.lvm2}/lib/libdevmapper.so* $out/usr/lib/
+cp -P ${pkgs.patos.lvm2}/lib/udev/rules.d/* $out/usr/lib/udev/rules.d/
 
 ### install btrfs progs
 cp -Pr ${pkgs.btrfs-progs}/bin/* $out/usr/bin/
 cp -Pr ${pkgs.btrfs-progs}/lib/* $out/usr/lib/
 
 ### install tpm2 libs
-cp -P ${patosPkgs.tpm2-tss}/lib/*.so* $out/usr/lib/
+cp -P ${pkgs.patos.tpm2-tss}/lib/*.so* $out/usr/lib/
 
 ### install lib kmod
 cp -P ${pkgs.kmod.lib}/lib/*.so* $out/usr/lib/
@@ -194,22 +193,22 @@ ln -sf ../cert.pem $out/etc/ssl/certs/ca-bundle.crt
 rm -rf $out/usr/lib/pkgconfig
 
 # setup default files
-${patosPkgs.systemd}/usr/bin/systemd-hwdb --root=$out --usr update
-${patosPkgs.systemd}/usr/bin/systemd-tmpfiles --root=$out $out/usr/lib/tmpfiles.d/etc.conf --create
+${pkgs.patos.systemd}/usr/bin/systemd-hwdb --root=$out --usr update
+${pkgs.patos.systemd}/usr/bin/systemd-tmpfiles --root=$out $out/usr/lib/tmpfiles.d/etc.conf --create
 cp $out/usr/share/factory/etc/nsswitch.conf $out/etc/
 cp $out/usr/share/factory/etc/locale.conf $out/etc/
 cp $out/usr/share/factory/etc/vconsole.conf $out/etc/
 # install sys users
 mkdir creds
 echo -n ${defaultPassword} > creds/passwd.plaintext-password.root
-CREDENTIALS_DIRECTORY=$PWD/creds SYSTEMD_CRYPT_PREFIX='$6$' ${patosPkgs.systemd}/usr/bin/systemd-sysusers --root=$out rootfs/usr/lib/sysusers.d/*.conf
+CREDENTIALS_DIRECTORY=$PWD/creds SYSTEMD_CRYPT_PREFIX='$6$' ${pkgs.patos.systemd}/usr/bin/systemd-sysusers --root=$out rootfs/usr/lib/sysusers.d/*.conf
 chmod 600 $out/etc/shadow
 rm -rf creds
 
 # Ephemeral machine-id until registration
 # ln -sf /run/machine-id $out/etc/machine-id
 # FIXME: above line does not work in systemd > 257
-${patosPkgs.systemd}/usr/bin/systemd-machine-id-setup --root=$out
+${pkgs.patos.systemd}/usr/bin/systemd-machine-id-setup --root=$out
 
 ### Find and install all shared libs
 find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | \
@@ -219,15 +218,17 @@ find $out -type f -executable -exec ldd {} \; | awk '{print $3}' | \
 find $out -type f -executable -exec chmod 755 {} \;
 
 # patch ELFs
+interpreter=$(patchelf --print-interpreter $out/usr/bin/busybox)
+ldLinux=$(basename $interpreter)
 find $out -type f -executable -exec patchelf --set-rpath /lib:/usr/lib:/usr/lib/systemd:/usr/lib/cryptsetup {} \;
-find $out -type f -executable -exec patchelf --set-interpreter /lib/ld-linux-x86-64.so.2 {} \;
-patchelf --remove-rpath $out/usr/lib/ld-linux-x86-64.so.2
+find $out -type f -executable -exec patchelf --set-interpreter /lib/$ldLinux {} \;
+patchelf --remove-rpath $out/usr/lib/$ldLinux
 
 # strip binaries
 find $out -type f -executable -exec $STRIP {} \;
 find $out -type d -exec chmod 755 {} \;
 
 # install kernel modules
-cp -r ${patosPkgs.kernel}/lib/modules $out/usr/lib/
+cp -r ${pkgs.patos.kernel}/lib/modules $out/usr/lib/
 find $out/usr/lib/modules -type d -exec chmod 755 {} \;
 ''

From d745cbe1c2c31c803b07676735eb8dcc0b688477 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Thu, 12 Jun 2025 16:50:07 +0200
Subject: [PATCH 20/25] fix: aarch64 builds needs nativeBuildInputs

---
 flake.nix                | 2 +-
 pkgs/image/default.nix   | 4 ++--
 pkgs/rootfs/mkinitrd.nix | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/flake.nix b/flake.nix
index 776919f..496393c 100644
--- a/flake.nix
+++ b/flake.nix
@@ -52,7 +52,7 @@
           default = self.packages.${system}.image;
 
           image = pkgs.callPackage ./pkgs/image { inherit version updateUrl cpuArch secureBoot; };
-          image-aarch64 = pkgsCross.callPackage ./pkgs/image { inherit version updateUrl cpuArch secureBoot; };
+          image-aarch64 = pkgsCross.callPackage ./pkgs/image { inherit version updateUrl secureBoot; };
 
           qemu-uefi-tpm = pkgs.callPackage ./utils/qemu-uefi-tpm.nix { };
 
diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index d9205f3..6af3c14 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -16,7 +16,7 @@ runCommand pname {
   microcode = lib.optionalString (cpuArch == "amd") "--microcode ${pkgs.microcode-amd}/amd-ucode.img"
       + lib.optionalString (cpuArch == "intel") "--microcode ${pkgs.microcode-intel}/intel-ucode.img";
 
-  buildInputs = with pkgs; [
+  nativeBuildInputs = with pkgs; [
     erofs-utils
     dosfstools
     mtools
@@ -251,7 +251,7 @@ ${pkgs.patos.systemd}/usr/bin/systemd-repart \
   --definitions=./final.repart.d \
   patos_${version}.img > final-repart-output.json
 
-rm -rf init.repart.d final.repart.d *.json
+rm -rf rootfs init.repart.d final.repart.d *.json
 sha256sum *.root *.verity *.efi *.tar.xz > SHA256SUMS
 
 popd
diff --git a/pkgs/rootfs/mkinitrd.nix b/pkgs/rootfs/mkinitrd.nix
index cdbfe11..0691e7b 100644
--- a/pkgs/rootfs/mkinitrd.nix
+++ b/pkgs/rootfs/mkinitrd.nix
@@ -9,7 +9,7 @@ in
 runCommand "patos-initrd" {
   inherit secureBootEnroll;
 
-  buildInputs = with pkgs; [
+  nativeBuildInputs = with pkgs; [
     cpio
     xz
   ];

From 19c91e16ab8176a91c5f536cabe680c3ba912915 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Thu, 12 Jun 2025 19:37:01 +0200
Subject: [PATCH 21/25] chore: s/cpuArch/microcode

---
 flake.nix              |  4 ++--
 pkgs/image/default.nix | 10 +++++-----
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/flake.nix b/flake.nix
index 496393c..66b86c8 100644
--- a/flake.nix
+++ b/flake.nix
@@ -17,7 +17,7 @@
       let
         version = "0.0.1";
         secureBoot = "false";
-        cpuArch = "intel";
+        microcode = "intel";
         updateUrl = "http://10.0.2.2:8000/";
 
         overlay = final: prev: {
@@ -51,7 +51,7 @@
         packages = {
           default = self.packages.${system}.image;
 
-          image = pkgs.callPackage ./pkgs/image { inherit version updateUrl cpuArch secureBoot; };
+          image = pkgs.callPackage ./pkgs/image { inherit version updateUrl microcode secureBoot; };
           image-aarch64 = pkgsCross.callPackage ./pkgs/image { inherit version updateUrl secureBoot; };
 
           qemu-uefi-tpm = pkgs.callPackage ./utils/qemu-uefi-tpm.nix { };
diff --git a/pkgs/image/default.nix b/pkgs/image/default.nix
index 6af3c14..863c795 100644
--- a/pkgs/image/default.nix
+++ b/pkgs/image/default.nix
@@ -4,17 +4,17 @@
   version,
   runCommand,
   updateUrl,
-  cpuArch ? "",
+  microcode ? "",
   secureBoot ? "false"
 }:
 let
   pname = "patos-image";
 in
 runCommand pname {
-  inherit version cpuArch updateUrl secureBoot;
+  inherit version microcode updateUrl secureBoot;
 
-  microcode = lib.optionalString (cpuArch == "amd") "--microcode ${pkgs.microcode-amd}/amd-ucode.img"
-      + lib.optionalString (cpuArch == "intel") "--microcode ${pkgs.microcode-intel}/intel-ucode.img";
+  mcode = lib.optionalString (microcode == "amd") "--microcode ${pkgs.microcode-amd}/amd-ucode.img"
+      + lib.optionalString (microcode == "intel") "--microcode ${pkgs.microcode-intel}/intel-ucode.img";
 
   nativeBuildInputs = with pkgs; [
     erofs-utils
@@ -184,7 +184,7 @@ ln -sf patos_$version.root.raw patos_${version}_$rootUuid.root
 ${pkgs.patos.systemd}/usr/bin/ukify build \
   --linux ${pkgs.patos.kernel}/bzImage \
   --initrd ${pkgs.patos.initrd}/initrd.xz \
-  $microcode \
+  $mcode \
   --os-release @rootfs/etc/os-release \
   --cmdline "$kernelCmdLine roothash=$roothash" \
   -o patos_${version}.efi

From 49c09d772dba5a7b487610f6856bf1fd0575a989 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Thu, 12 Jun 2025 21:48:08 +0200
Subject: [PATCH 22/25] chore: update kernel

---
 pkgs/kernel/default.nix | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pkgs/kernel/default.nix b/pkgs/kernel/default.nix
index 69edc22..2a86881 100644
--- a/pkgs/kernel/default.nix
+++ b/pkgs/kernel/default.nix
@@ -1,7 +1,7 @@
 { pkgs }:
 let
-  version = "6.15.1";
-  hash = "sha256-RPG7hP5RLnuv4ObchdOOwcbI/L6XzLUdjBmTC3mfDWQ=";
+  version = "6.15.2";
+  hash = "sha256-NFjNamxQjhYdvFQG5yuZ1dvfkp+vcEpn25ukbQdRSFg=";
 in
 (pkgs.callPackage ./manual-config.nix { }) {
   version = "${version}-patos1";

From f856983210b5901357f3e21a407034c101936be6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Fri, 13 Jun 2025 08:16:49 +0200
Subject: [PATCH 23/25] chore: move overlay to own file

---
 flake.nix            | 19 +------------------
 overlays/default.nix | 21 +++++++++++++++++++++
 2 files changed, 22 insertions(+), 18 deletions(-)
 create mode 100644 overlays/default.nix

diff --git a/flake.nix b/flake.nix
index 66b86c8..58a8aab 100644
--- a/flake.nix
+++ b/flake.nix
@@ -20,24 +20,7 @@
         microcode = "intel";
         updateUrl = "http://10.0.2.2:8000/";
 
-        overlay = final: prev: {
-          patos = prev.lib.makeScope prev.newScope (self: {
-            kernel = final.callPackage ./pkgs/kernel { };
-            glibc = final.callPackage ./pkgs/glibc { };
-            busybox = final.callPackage ./pkgs/busybox { };
-            openssl = final.callPackage ./pkgs/openssl { };
-            kexec = final.callPackage ./pkgs/kexec-tools { };
-            lvm2 = final.callPackage ./pkgs/lvm2 { };
-            tpm2-tools = final.callPackage ./pkgs/tpm2-tools { };
-            tpm2-tss = final.callPackage ./pkgs/tpm2-tss { };
-            systemd = final.callPackage ./pkgs/systemd { };
-            dbus-broker = final.callPackage ./pkgs/dbus-broker { };
-
-            rootfs = final.callPackage ./pkgs/rootfs/mkrootfs.nix { inherit version; };
-            initrd = final.callPackage ./pkgs/rootfs/mkinitrd.nix { inherit version; };
-          });
-        };
-
+        overlay = import ./overlays { version = version; };
         pkgs = import nixpkgs { inherit system; overlays = [ overlay ]; };
         pkgsCross = import nixpkgs {
           inherit system;
diff --git a/overlays/default.nix b/overlays/default.nix
new file mode 100644
index 0000000..2c2cdce
--- /dev/null
+++ b/overlays/default.nix
@@ -0,0 +1,21 @@
+{
+  version
+}:
+
+final: prev: {
+  patos = prev.lib.makeScope prev.newScope (self: {
+    kernel = final.callPackage ../pkgs/kernel { };
+    glibc = final.callPackage ../pkgs/glibc { };
+    busybox = final.callPackage ../pkgs/busybox { };
+    openssl = final.callPackage ../pkgs/openssl { };
+    kexec = final.callPackage ../pkgs/kexec-tools { };
+    lvm2 = final.callPackage ../pkgs/lvm2 { };
+    tpm2-tools = final.callPackage ../pkgs/tpm2-tools { };
+    tpm2-tss = final.callPackage ../pkgs/tpm2-tss { };
+    systemd = final.callPackage ../pkgs/systemd { };
+    dbus-broker = final.callPackage ../pkgs/dbus-broker { };
+
+    rootfs = final.callPackage ../pkgs/rootfs/mkrootfs.nix { inherit version; };
+    initrd = final.callPackage ../pkgs/rootfs/mkinitrd.nix { inherit version; };
+  });
+}

From 52a38d60c0ee8e0cc8855a39f6796882f76972a5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Fri, 13 Jun 2025 08:33:09 +0200
Subject: [PATCH 24/25] chore(flake): use inherit

---
 flake.nix | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/flake.nix b/flake.nix
index 58a8aab..690b1ab 100644
--- a/flake.nix
+++ b/flake.nix
@@ -20,7 +20,7 @@
         microcode = "intel";
         updateUrl = "http://10.0.2.2:8000/";
 
-        overlay = import ./overlays { version = version; };
+        overlay = import ./overlays { inherit version; };
         pkgs = import nixpkgs { inherit system; overlays = [ overlay ]; };
         pkgsCross = import nixpkgs {
           inherit system;

From 217ff2d4a84cf34c8d31f57b2ab18340a8948a43 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lars=20Sj=C3=B6strom?= <lars@radicore.se>
Date: Fri, 13 Jun 2025 10:26:57 +0200
Subject: [PATCH 25/25] chore: add qemu script to launch aarch64 image

---
 flake.nix                       |  1 +
 utils/qemu-aarch64-uefi-tpm.nix | 54 +++++++++++++++++++++++++++++++++
 2 files changed, 55 insertions(+)
 create mode 100644 utils/qemu-aarch64-uefi-tpm.nix

diff --git a/flake.nix b/flake.nix
index 690b1ab..884349e 100644
--- a/flake.nix
+++ b/flake.nix
@@ -38,6 +38,7 @@
           image-aarch64 = pkgsCross.callPackage ./pkgs/image { inherit version updateUrl secureBoot; };
 
           qemu-uefi-tpm = pkgs.callPackage ./utils/qemu-uefi-tpm.nix { };
+          qemu-aarch64-uefi-tpm = pkgs.callPackage ./utils/qemu-aarch64-uefi-tpm.nix { };
 
           firewall-sysext = pkgs.callPackage ./lib/make-sysext.nix {
             name = "firewall-tools";
diff --git a/utils/qemu-aarch64-uefi-tpm.nix b/utils/qemu-aarch64-uefi-tpm.nix
new file mode 100644
index 0000000..87c9d69
--- /dev/null
+++ b/utils/qemu-aarch64-uefi-tpm.nix
@@ -0,0 +1,54 @@
+{
+  pkgs,
+  ...
+}:
+pkgs.writeShellApplication {
+  name = "qemu-aarch64-uefi-tpm";
+
+  runtimeInputs = with pkgs; [
+    qemu
+    swtpm
+  ];
+
+  text =
+    let
+      tpmOVMF = pkgs.OVMF.override {
+        tpmSupport = true;
+        secureBoot = true;
+      };
+    in
+    ''
+      set -ex
+      state="/tmp/patos-qemu-$USER"
+      rm -rf "$state"
+      mkdir -m 700 "$state"
+      qemu-img create -f qcow2 -F raw -b "$(readlink -e "$1")" "$state/disk.qcow2" 2G
+
+      OVMF_FD=$(nix-build '<nixpkgs>' --no-out-link -A OVMF.fd --system aarch64-linux)
+      cp "$OVMF_FD/AAVMF/vars-template-pflash.raw" "$state/vars-pflash.raw"
+      chmod u+w "$state/vars-pflash.raw"
+
+      # swtpm socket -d --tpmstate dir="$state" \
+      #   --ctrl type=unixio,path="$state/swtpm-sock" \
+      #   --tpm2 \
+      #   --log file="$state/swtpm.log",level=20
+
+      qemu-system-aarch64 \
+        -machine virt,gic-version=max \
+        -cpu max \
+        -smp 8 \
+        -m 4G \
+        -display none \
+        -serial stdio \
+        -drive "if=pflash,format=raw,unit=0,readonly=on,file=$OVMF_FD/AAVMF/QEMU_EFI-pflash.raw" \
+        -drive "if=pflash,format=raw,unit=1,file=$state/vars-pflash.raw" \
+        -device virtio-scsi-pci \
+        -device virtio-gpu-pci \
+        -device virtio-net-pci,netdev=wan \
+        -netdev user,id=wan \
+        -device virtio-rng-pci,rng=rng0 \
+        -object rng-random,filename=/dev/urandom,id=rng0 \
+        -device virtio-serial-pci \
+        -drive "format=qcow2,file=$state/disk.qcow2"
+    '';
+}