[PATCH v2 06/10] nixosfi: add the imageless NixOS bringup backend

Daniel Gomez <[email protected]> Fri, 12 Jun 2026 12:55:18 +0200
Newsgroups dev.linux.lists.kdevops
Message-ID <[email protected]>
From: Daniel Gomez <[email protected]>

Add NIXOSFI, a "Node bring up method" that runs each guest imagelessly:
a nixos-flake backends.imageless closure (tmpfs root, /nix/store and
/lib/modules over virtiofs) booted via QEMU -kernel against a
controller-built kernel (BOOTLINUX_DIRECT_BOOT), with no disk image.

The backend is split from its runtime. The nixosfi role owns the nix
work -- per-node imageless flakes, closure builds, and rebuild-boot /
rebuild-test kernel iteration -- and drives the qsu runtime through
include_role. The qsu role is the qemu-system-units runtime: it
installs QEMU and virtiofsd, renders the systemd template units and
per-VM env and drop-ins, and runs each guest as a systemd machine
registered with systemd-machined (visible in machinectl). The QSU_*
knobs (cpu, memory, NVMe, ssh, vsock) configure that runtime, and
nixosfi reuses them the same way nixosfl reuses libvirt.

Generated-by: Claude AI
Signed-off-by: Daniel Gomez <[email protected]>
---
 MAINTAINERS                                        |   26 +
 defconfigs/nixosfi-nvme-4kn-atomics                |   24 +
 docs/nixos-flake-backends.md                       |   35 +
 docs/nixosfi.md                                    |   51 +
 docs/qsu.md                                        |   37 +
 kconfigs/Kconfig.ansible_provisioning              |    6 +-
 kconfigs/Kconfig.bringup                           |   26 +
 kconfigs/Kconfig.bringup.goals                     |    6 +-
 kconfigs/Kconfig.kdevops                           |    2 +-
 kconfigs/Kconfig.nixos_flake                       |   25 +-
 kconfigs/Kconfig.qsu                               |  498 ++++
 kconfigs/monitors/Kconfig                          |   13 +-
 kconfigs/workflows/Kconfig                         |    1 +
 playbooks/nixosfi.yml                              |   23 +
 playbooks/roles/bootlinux/tasks/config.yml         |    7 +
 .../roles/bootlinux/templates/config-imageless     | 2957 ++++++++++++++++++++
 playbooks/roles/nixosfi/tasks/generate-configs.yml |   71 +
 .../roles/nixosfi/tasks/imageless-build-per-vm.yml |   40 +
 playbooks/roles/nixosfi/tasks/imageless-build.yml  |   62 +
 playbooks/roles/nixosfi/tasks/main.yml             |   87 +
 playbooks/roles/nixosfi/tasks/rebuild-boot.yml     |   27 +
 playbooks/roles/nixosfi/tasks/rebuild-test.yml     |   35 +
 playbooks/roles/nixosfi/templates/default.nix.j2   |   75 +
 playbooks/roles/nixosfi/templates/flake.nix.j2     |   41 +
 playbooks/roles/qsu/tasks/bringup.yml              |  105 +
 playbooks/roles/qsu/tasks/console.yml              |   23 +
 playbooks/roles/qsu/tasks/destroy.yml              |  134 +
 playbooks/roles/qsu/tasks/install-deps.yml         |   31 +
 playbooks/roles/qsu/tasks/render-per-vm.yml        |  280 ++
 playbooks/roles/qsu/tasks/render-units.yml         |   55 +
 playbooks/roles/qsu/tasks/restart-vms.yml          |   55 +
 playbooks/roles/qsu/tasks/start-vms.yml            |   46 +
 playbooks/roles/qsu/tasks/stop-vms.yml             |   25 +
 playbooks/roles/qsu/templates/debug-vars.yaml.j2   |  175 ++
 playbooks/roles/qsu/vars/main.yml                  |   26 +
 scripts/nixosfi.Makefile                           |  125 +
 scripts/nixosfi_ssh_key_name.py                    |   55 +
 scripts/provision.Makefile                         |    4 +
 scripts/update_ssh_config_nixosfi.py               |  216 ++
 workflows/linux/Kconfig                            |    1 +
 40 files changed, 5512 insertions(+), 19 deletions(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index f71da5de..f2af8b43 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -149,6 +149,7 @@ L:	[email protected]
 S:	Maintained
 T:	git https://github.com/linux-kdevops/kdevops.git
 F:	kconfigs/Kconfig.nixos_flake
+F:	docs/nixos-flake-backends.md
 F:	docs/nixosfl.md
 F:	playbooks/nixosfl.yml
 F:	playbooks/roles/nixosfl/
@@ -167,6 +168,31 @@ T:	git https://github.com/linux-kdevops/kdevops.git
 F:	workflows/pynfs/
 F:	playbooks/roles/pynfs/
 
+NIXOSFI
+M:	Daniel Gomez <[email protected]>
+L:	[email protected]
+S:	Maintained
+T:	git https://github.com/linux-kdevops/kdevops.git
+F:	defconfigs/nixosfi-*
+F:	docs/nixosfi.md
+F:	playbooks/nixosfi.yml
+F:	playbooks/roles/nixosfi/
+F:	scripts/nixosfi.Makefile
+F:	scripts/nixosfi_ssh_key_name.py
+F:	scripts/update_ssh_config_nixosfi.py
+N:	nixosfi
+
+QEMU SYSTEM UNITS (QSU)
+M:	Daniel Gomez <[email protected]>
+L:	[email protected]
+S:	Maintained
+T:	git https://github.com/linux-kdevops/kdevops.git
+F:	docs/qsu.md
+F:	kconfigs/Kconfig.qsu
+F:	playbooks/roles/qsu/
+F:	scripts/qemu-system-units/
+N:	qsu|QSU
+
 KDEVOPS
 M:	Luis Chamberlain <[email protected]>
 R:	Daniel Gomez <[email protected]>
diff --git a/defconfigs/nixosfi-nvme-4kn-atomics b/defconfigs/nixosfi-nvme-4kn-atomics
new file mode 100644
index 00000000..337e53a7
--- /dev/null
+++ b/defconfigs/nixosfi-nvme-4kn-atomics
@@ -0,0 +1,24 @@
+CONFIG_NIXOSFI=y
+
+CONFIG_WORKFLOWS=y
+CONFIG_WORKFLOW_LINUX_CUSTOM=y
+CONFIG_BOOTLINUX=y
+CONFIG_BOOTLINUX_DIRECT_BOOT=y
+
+# CONFIG_KDEVOPS_BASELINE_AND_DEV is not set
+
+CONFIG_QSU_NVME_DRIVE_COUNT=4
+CONFIG_QSU_NVME_DRIVE_SIZE_GB=20
+CONFIG_QSU_NVME_LOGICAL_BLOCK_SIZE="4096"
+CONFIG_QSU_NVME_PHYSICAL_BLOCK_SIZE="4096"
+CONFIG_QSU_NVME_MIN_IO_SIZE="4096"
+CONFIG_QSU_NVME_OPT_IO_SIZE="4096"
+CONFIG_QSU_NVME_DISCARD_GRANULARITY="4096"
+CONFIG_QSU_NVME_MDTS="9"
+
+CONFIG_QSU_NVME_ATOMIC_AWUN="15"
+CONFIG_QSU_NVME_ATOMIC_AWUPF="15"
+CONFIG_QSU_NVME_ATOMIC_NAWUN="15"
+CONFIG_QSU_NVME_ATOMIC_NAWUPF="15"
+
+CONFIG_ANSIBLE_CFG_CALLBACK_PLUGIN_LUCID=y
diff --git a/docs/nixos-flake-backends.md b/docs/nixos-flake-backends.md
new file mode 100644
index 00000000..a679a91d
--- /dev/null
+++ b/docs/nixos-flake-backends.md
@@ -0,0 +1,35 @@
+# NixOS-flake bring-up backends
+
+kdevops can build guests declaratively from the **nixos-flake** library
+(vendored at `scripts/nixos-flake/`) instead of from a distro image. Two
+"Node bring up method" choices select which nixos-flake backend module to
+build and how to run it:
+
+| Choice | nixos-flake module | Image | Runtime | Manager |
+|---|---|---|---|---|
+| `NIXOSFL` | `backends.libvirt` | qcow2 disk image | libvirtd | `virsh` |
+| `NIXOSFI` | `backends.imageless` | system closure (virtiofs root) | qsu / systemd-machined | `machinectl` |
+
+`NIXOSFL` is the Nix counterpart of `GUESTFS`: the same libvirt runtime,
+with the image built from a reproducible flake instead of by libguestfs.
+`NIXOSFI` swaps that runtime for qemu-system-units (qsu)  — no disk
+image, no daemon — and boots a controller-built kernel directly
+(`BOOTLINUX_DIRECT_BOOT`).
+
+## Layers
+
+- **library** — `scripts/nixos-flake/` (the flake: modules, overlays,
+  backend definitions), configured by the shared `Kconfig.nixos_flake`
+  menu (`NIXOS_FLAKE_*`: profiles, mounts, testSuites) and a one-time Nix
+  install on the controller (`make nixos-flake-runtime-deps-setup`).
+- **backends** — `NIXOSFL` ([nixosfl.md](nixosfl.md)) and `NIXOSFI`
+  ([nixosfi.md](nixosfi.md)).
+- **runtime** — libvirtd for `NIXOSFL`; qsu ([qsu.md](qsu.md)) for `NIXOSFI`.
+
+## Scope today
+
+Both backends gate off the test workflows (fstests, blktests, ...) and the
+monitors. A nixos-flake guest is built declaratively, so once it boots
+there is no per-guest Ansible step left for kdevops to run; wiring those
+workflows needs a controller/guest setup separation that is not in place
+yet.
diff --git a/docs/nixosfi.md b/docs/nixosfi.md
new file mode 100644
index 00000000..8815f833
--- /dev/null
+++ b/docs/nixosfi.md
@@ -0,0 +1,51 @@
+# NIXOSFI — nixos-flake imageless backend
+
+`NIXOSFI` runs each guest imagelessly: a nixos-flake `backends.imageless`
+closure (tmpfs root; `/nix/store` and `/lib/modules` shared read-only over
+virtiofs) booted via QEMU's `-kernel` against a kernel you build on the
+controller. No disk image, no distro. Each guest runs on the qsu runtime
+as a systemd-machined machine — see [qsu.md](qsu.md) — and
+[nixos-flake-backends.md](nixos-flake-backends.md) for how it relates to
+the libvirt `NIXOSFL` backend.
+
+## Enable
+
+```
+make menuconfig   # Node bring up method -> NixOS imageless configuration with systemd-machined
+```
+
+or `CONFIG_NIXOSFI=y`. `BOOTLINUX_DIRECT_BOOT` is auto-selected: the guest
+boots the controller-built kernel. Guest contents use the shared
+`NIXOS_FLAKE_*` options; the VM runtime (cpu, memory, NVMe, ssh, vsock)
+uses the `QSU_*` knobs.
+
+## Bring up
+
+```
+make
+make bringup        # build kernel + closures, render units, start machines, wait for SSH
+ssh <guest>
+```
+
+`make bringup` builds the direct-boot kernel, then runs
+`playbooks/nixosfi.yml`: it renders per-guest imageless flakes,
+`nix build`s each `toplevel` closure, and drives the qsu runtime to render
+the systemd units and start each guest.
+
+## Fast kernel iteration
+
+```
+make linux-direct-boot      # build a new kernel on the controller
+make nixosfi-rebuild-boot   # reboot guests onto it, no image rebuild
+```
+
+## Inspect and tear down
+
+See [qsu.md](qsu.md) for `machinectl` / `systemctl --user`. Then
+`make destroy`.
+
+## Prerequisites
+
+Nix on the controller (`make nixos-flake-runtime-deps-setup`) and the qsu
+runtime dependencies (QEMU, virtiofsd, socat, systemd-container), installed
+by the bringup itself.
diff --git a/docs/qsu.md b/docs/qsu.md
new file mode 100644
index 00000000..b4a11998
--- /dev/null
+++ b/docs/qsu.md
@@ -0,0 +1,37 @@
+# qsu runtime (qemu-system-units)
+
+The `NIXOSFI` backend runs each guest through **qsu**, the vendored
+qemu-system-units project (`scripts/qemu-system-units/`): every guest is a
+`qemu-system@<vm>` systemd **user** service registered with
+systemd-machined, so it appears as a machine and is managed like one. This
+is the systemd-vmspawn model — `machinectl` is to qsu what `virsh` is to
+libvirt.
+
+## Inspect running guests
+
+```
+machinectl list                              # registered machines
+systemctl --user status qemu-system@<vm>
+systemctl --user list-units 'qemu-system@*' 'virtiofsd@*'
+```
+
+## Lifecycle (via kdevops)
+
+```
+make nixosfi-console VM=<vm>     # serial console
+make nixosfi-status              # inventory + running state
+make nixosfi-stop / nixosfi-start / nixosfi-restart
+```
+
+## Shipped configuration
+
+kdevops writes, per guest, under `~/.config/systemd/`:
+`qemu-system/<vm>.env` (the QEMU command line), the
+`qemu-system@<vm>.service.d/` and `virtiofsd@<vm>-<tag>.service.d/`
+drop-ins, and a debug snapshot at `$QSU_VARS_DIR/<vm>.yaml`. Reading those
+shows exactly what each machine boots with. The `QSU_*` Kconfig knobs (cpu,
+ram, cpus, machine type, ssh/vsock, NVMe geometry) configure this runtime.
+
+For the qsu project itself — the systemd unit templates and the standalone
+(non-Ansible) workflow — see the upstream docs under
+`scripts/qemu-system-units/`.
diff --git a/kconfigs/Kconfig.ansible_provisioning b/kconfigs/Kconfig.ansible_provisioning
index 68b980b7..c3c31eea 100644
--- a/kconfigs/Kconfig.ansible_provisioning
+++ b/kconfigs/Kconfig.ansible_provisioning
@@ -131,7 +131,7 @@ config KDEVOPS_PYTHON_OLD_INTERPRETER
 config KDEVOPS_BASELINE_PYTHON_INTERPRETER
 	string "Python interpreter for the [baseline] host group"
 	output yaml
-	default "/run/current-system/sw/bin/python3" if NIXOSFL
+	default "/run/current-system/sw/bin/python3" if KDEVOPS_ENABLE_NIXOS_FLAKE
 	default KDEVOPS_PYTHON_INTERPRETER
 	help
 	  Python interpreter emitted under [baseline:vars] in the generated
@@ -144,7 +144,7 @@ config KDEVOPS_BASELINE_PYTHON_INTERPRETER
 config KDEVOPS_DEV_PYTHON_INTERPRETER
 	string "Python interpreter for the [dev] host group"
 	output yaml
-	default "/run/current-system/sw/bin/python3" if NIXOSFL
+	default "/run/current-system/sw/bin/python3" if KDEVOPS_ENABLE_NIXOS_FLAKE
 	default KDEVOPS_PYTHON_INTERPRETER
 	help
 	  Python interpreter emitted under [dev:vars] in the generated
@@ -153,7 +153,7 @@ config KDEVOPS_DEV_PYTHON_INTERPRETER
 config KDEVOPS_SERVICE_PYTHON_INTERPRETER
 	string "Python interpreter for the [service] host group"
 	output yaml
-	default "/run/current-system/sw/bin/python3" if NIXOSFL
+	default "/run/current-system/sw/bin/python3" if KDEVOPS_ENABLE_NIXOS_FLAKE
 	default KDEVOPS_PYTHON_INTERPRETER
 	help
 	  Python interpreter emitted under [service:vars] in the generated
diff --git a/kconfigs/Kconfig.bringup b/kconfigs/Kconfig.bringup
index 7d6c70ca..f1f1dfab 100644
--- a/kconfigs/Kconfig.bringup
+++ b/kconfigs/Kconfig.bringup
@@ -14,6 +14,10 @@ config KDEVOPS_ENABLE_NIXOSFL
 	bool
 	output yaml
 
+config KDEVOPS_ENABLE_NIXOSFI
+	bool
+	output yaml
+
 config CLOUD_INITIALIZED
 	bool
 	default $(shell, test -f .cloud.initialized && echo y || echo n) = "y"
@@ -76,6 +80,27 @@ config NIXOSFL
 	  to produce a qcow2 disk image; kdevops stages it into the libvirt
 	  storage pool, defines and starts the domain, and waits for SSH.
 
+config NIXOSFI
+	bool "qsu systemd-unit toolkit for QEMU VMs (nixos-flake imageless guests)"
+	select KDEVOPS_ENABLE_NIXOSFI
+	select KDEVOPS_ENABLE_NIXOS_FLAKE
+	select HAVE_CUSTOM_DISTRO_HOST_PREFIX
+	select HAVE_DISTRO_PREFERS_CUSTOM_HOST_PREFIX
+	select EXTRA_STORAGE_SUPPORTS_512
+	select EXTRA_STORAGE_SUPPORTS_1K
+	select EXTRA_STORAGE_SUPPORTS_2K
+	select EXTRA_STORAGE_SUPPORTS_4K
+	help
+	  Run each guest as a systemd machine: a qemu-system@<vm>
+	  service registered with systemd-machined (visible in
+	  machinectl, placed in machine.slice), the model
+	  systemd-vmspawn uses, from the templates in
+	  scripts/qemu-system-units/. The guest closure is the
+	  nixos-flake backends.imageless NixOS module (tmpfs root,
+	  /nix/store and /lib/modules shared in via virtiofs); the
+	  kernel comes from BOOTLINUX_DIRECT_BOOT via qemu-system-*
+	  -kernel. No libvirt daemon, no qcow2.
+
 config SKIP_BRINGUP
 	bool "Skip bring up - bare metal or existing nodes"
 	select EXTRA_STORAGE_SUPPORTS_512
@@ -97,6 +122,7 @@ config LIBVIRT
 
 source "kconfigs/Kconfig.guestfs"
 source "kconfigs/Kconfig.nixos_flake"
+source "kconfigs/Kconfig.qsu"
 source "terraform/Kconfig"
 source "kconfigs/Kconfig.declared_hosts"
 if LIBVIRT
diff --git a/kconfigs/Kconfig.bringup.goals b/kconfigs/Kconfig.bringup.goals
index 1f4741c4..69518f32 100644
--- a/kconfigs/Kconfig.bringup.goals
+++ b/kconfigs/Kconfig.bringup.goals
@@ -13,7 +13,7 @@ config HAVE_DISTRO_PREFERS_INSTALL_KDEVTOOLS
 
 config KDEVOPS_TRY_REFRESH_REPOS
 	bool "Try to refresh repositories on bringup?"
-	depends on !NIXOSFL
+	depends on !KDEVOPS_ENABLE_NIXOS_FLAKE
 	default n if !HAVE_DISTRO_PREFERS_REFRESH
 	default y if HAVE_DISTRO_PREFERS_REFRESH
 	help
@@ -31,7 +31,7 @@ config KDEVOPS_TRY_REFRESH_REPOS
 
 config RHEL_REGISTER
 	bool "Register the guests with Red Hat?"
-	depends on !NIXOSFL
+	depends on !KDEVOPS_ENABLE_NIXOS_FLAKE
 	default n
 	help
 	  Official RHEL installations require a subscription before you can download
@@ -54,7 +54,7 @@ config RHEL_ACTIVATION_KEY
 
 config KDEVOPS_CUSTOM_YUM_REPOFILE
 	string "Custom yum repo file"
-	depends on !NIXOSFL
+	depends on !KDEVOPS_ENABLE_NIXOS_FLAKE
 	default ""
 	help
 	  Add a custom yum repo file to /etc/yum.repos.d before updating? Leave blank to
diff --git a/kconfigs/Kconfig.kdevops b/kconfigs/Kconfig.kdevops
index 7b784a12..7f98d9a9 100644
--- a/kconfigs/Kconfig.kdevops
+++ b/kconfigs/Kconfig.kdevops
@@ -28,7 +28,7 @@ config CUSTOM_DISTRO_HOST_PREFIX
 	depends on HAVE_CUSTOM_DISTRO_HOST_PREFIX
 	default GUESTFS_FEDORA_BOX_SHORT if GUESTFS_FEDORA
 	default GUESTFS_DEBIAN_BOX_SHORT if GUESTFS_DEBIAN
-	default "nixos" if NIXOSFL
+	default "nixos" if KDEVOPS_ENABLE_NIXOS_FLAKE
 
 config CUSTOM_SSH_KEXALGORITHMS
 	string
diff --git a/kconfigs/Kconfig.nixos_flake b/kconfigs/Kconfig.nixos_flake
index ac7364df..7d1f867e 100644
--- a/kconfigs/Kconfig.nixos_flake
+++ b/kconfigs/Kconfig.nixos_flake
@@ -2,7 +2,7 @@
 #
 # nixos_flake -- shared infrastructure feature for the Nix flake at
 # scripts/nixos-flake/. Consumed by the NIXOSFL bringup
-# choice today and by the imageless backend (QSU) later.
+# choice today and by the imageless backend (NIXOSFI) later.
 
 if KDEVOPS_ENABLE_NIXOS_FLAKE
 
@@ -42,6 +42,22 @@ config NIXOSFL_STORAGE_DIR
 
 endif # NIXOSFL
 
+if NIXOSFI
+
+config NIXOSFI_CONFIG_DIR
+	string
+	output yaml
+	default "$(TOPDIR_PATH)/nixos/generated"
+	help
+	  Controller-side directory where the qsu role writes one
+	  subdirectory per guest holding the rendered flake.nix and
+	  default.nix for the imageless backend. Defaults to
+	  nixos/generated/ at the kdevops topdir (same path the libvirt
+	  backend uses; they're mutually exclusive bringup choices),
+	  which is gitignored.
+
+endif # NIXOSFI
+
 menu "Profiles"
 
 config NIXOS_FLAKE_PROFILE_DEVEL
@@ -86,12 +102,13 @@ menu "Mounts"
 config NIXOS_FLAKE_MOUNT_SHARES
 	bool "Enable virtiofs shares (mounts/shares.nix)"
 	output yaml
+	default y if NIXOSFI
 	default n
 	help
 	  Imports nixos-flake.nixosModules.mounts.shares. Mounts named
-	  virtiofs shares inside the guest. qsu pairs this with the
-	  nixos-flake backends.imageless closure for /nix/store +
-	  /lib/modules + data-* shares.
+	  virtiofs shares inside the guest. The imageless backend
+	  requires this (it sources /nix/store and /lib/modules over
+	  virtiofs), so the knob auto-enables under NIXOSFI.
 
 config NIXOS_FLAKE_MOUNT_STORAGE
 	bool "Enable block-device storage mounts (mounts/storage.nix)"
diff --git a/kconfigs/Kconfig.qsu b/kconfigs/Kconfig.qsu
new file mode 100644
index 00000000..7d5d4cb5
--- /dev/null
+++ b/kconfigs/Kconfig.qsu
@@ -0,0 +1,498 @@
+# SPDX-License-Identifier: copyleft-next-0.3.1
+
+if NIXOSFI
+
+config QSU_VARS_DIR
+	string
+	output yaml
+	default "{{ topdir_path }}/scripts/qemu-system-units/vars"
+	help
+	  Where kdevops renders per-VM qemu-system-units vars files.
+	  qemu-system-units' own .gitignore already excludes everything
+	  under vars/ except the upstream example, so kdevops-generated
+	  artefacts there never leak back upstream through a subtree
+	  push.
+
+config QSU_QEMU_BINARY
+	string "QEMU system emulator binary"
+	output yaml
+	default QEMU_BUILD_BIN_PATH if QEMU_BUILD
+	default "/usr/bin/qemu-system-x86_64"
+	help
+	  Absolute path to the QEMU system emulator binary for the
+	  guest architecture. The qsu templates invoke this as the
+	  ExecStart= binary path.
+
+	  When QEMU_BUILD=y, this defaults to QEMU_BUILD_BIN_PATH so
+	  the qsu service exec'd by systemd is the binary the
+	  build_qemu role just installed under
+	  KDEVOPS_CONTROLLER_DATA_PATH/qemu-destdir/bin/, with no
+	  manual override needed in the defconfig. The Jinja2
+	  template resolves at Ansible-use time so changing the
+	  controller data path or destdir path higher up propagates
+	  here transitively.
+
+config QSU_CPU
+	string "Guest CPU model"
+	output yaml
+	default "host"
+	help
+	  Passed to QEMU as -cpu. "host" passes host CPU features
+	  through to the guest and requires KVM. Use "max" with TCG.
+
+config QSU_ACCEL
+	string "QEMU accelerator"
+	output yaml
+	default "kvm"
+	help
+	  Passed to QEMU as -accel. "kvm" on Linux hosts with hardware
+	  virtualization, "tcg" for pure software emulation.
+
+config QSU_RAM
+	int "Guest RAM (MB)"
+	output yaml
+	default 4096
+
+config QSU_CPUS
+	int "Guest vCPU count"
+	output yaml
+	default 4
+
+config QSU_MACHINE_TYPE
+	string "QEMU machine type"
+	output yaml
+	default "q35"
+	help
+	  Passed to QEMU as -machine type=. q35 for modern x86 guests,
+	  microvm for minimal boot, virt for aarch64.
+
+menu "SSH access"
+
+config QSU_SSH_PORT_BASE
+	int "SSH host port forwarding base"
+	output yaml
+	default 10022
+	help
+	  qsu uses QEMU user-mode networking, so each guest's port 22
+	  is forwarded to a unique host port. The role computes guest N's
+	  host port as ssh_port_base + N from the inventory index.
+
+config QSU_VSOCK_CID_BASE
+	int "VSOCK Context ID base"
+	output yaml
+	default 100
+	help
+	  Each guest's vsock_cid is vsock_cid_base + N from the inventory
+	  index. Valid range is 3 to 4294967295 (0 is the hypervisor, 1
+	  is local, 2 is the host). Used by qsu's graceful shutdown
+	  ExecStop= which targets root@vsock/<cid>.
+
+choice
+	prompt "Default SSH transport for `ssh <vm>` alias"
+	default QSU_SSH_DEFAULT_VSOCK
+	help
+	  kdevops renders three ssh_config stanzas per qsu VM:
+	  <name>-vsock via systemd-ssh-proxy over AF_VSOCK,
+	  <name>-net via TCP SLIRP hostfwd, and the bare <name>
+	  which groups with one of them. This knob picks which.
+
+	  vsock has zero TCP/SLIRP overhead and uses the guest's
+	  sshd-vsock.socket that systemd-ssh-generator emits when
+	  CONFIG_VIRTIO_VSOCKETS is built in.
+
+	  tcp is the legacy path; prefer it when the host lacks
+	  vhost-vsock, runs in a container that cannot create
+	  AF_VSOCK, or when systemd-ssh-proxy's machine/* resolver
+	  behaves poorly on the installed systemd version.
+
+config QSU_SSH_DEFAULT_VSOCK
+	bool "vsock"
+	output yaml
+
+config QSU_SSH_DEFAULT_TCP
+	bool "tcp"
+	output yaml
+
+endchoice
+
+endmenu  # SSH access
+
+
+menu "NVMe storage"
+
+config QSU_NVME_DRIVE_COUNT
+	int "Extra NVMe drives per guest"
+	output yaml
+	default 4
+	help
+	  Number of qemu-img qcow2 backing files to create per VM, each
+	  attached as a separate NVMe controller with one namespace.
+	  Guest device paths are /dev/nvme0n1 .. /dev/nvme<N-1>n1;
+	  stable symlinks live under
+	  /dev/disk/by-id/nvme-QEMU_NVMe_Ctrl_nvme<N-1>_1. Set to 0 to
+	  skip extra drive creation. The fstests workflow uses one
+	  TEST_DEV plus eight SCRATCH_DEV_POOL devices by default, so
+	  fstests defconfigs override this to 9.
+
+config QSU_NVME_DRIVE_SIZE_GB
+	int "Extra NVMe drive size (GB)"
+	output yaml
+	default 20
+	help
+	  Size in GiB passed to `qemu-img create -f qcow2`. qcow2 only
+	  allocates host space on write, so large virtual sizes are
+	  cheap at rest.
+
+config QSU_NVME_LOGICAL_BLOCK_SIZE
+	string "NVMe logical block size (bytes), per-drive list or global"
+	output yaml
+	default ""
+	help
+	  Logical block size (LBA size in bytes) advertised by each
+	  emulated NVMe namespace. Empty string leaves the value unset
+	  on the QEMU command line so QEMU's built-in default applies
+	  (512 bytes today).
+
+	  Two input forms are accepted:
+	    - A single integer (e.g. "4096") applies the same value to
+	      every extra storage drive provisioned for the VM.
+	    - A comma-separated list of integers (e.g. "4096,512,512,
+	      512,512,512,512,512,4096") sets each drive by index. List
+	      entries left empty (",,") fall back to no override for
+	      that drive. Entries past the drive count are ignored;
+	      drives past the list length get no override.
+
+	  Common values: 512 (legacy "512n"), 4096 (modern "4Kn" /
+	  Advanced Format Native).
+
+	  Per-drive control lets a single VM mix shapes — e.g. TEST_DEV
+	  at 4Kn while the SCRATCH_DEV_POOL stays at 512n — without
+	  needing a separate VM per shape.
+
+	  See: <qemu_binary> -device nvme,help (logical_block_size)
+
+config QSU_NVME_PHYSICAL_BLOCK_SIZE
+	string "NVMe physical block size (bytes), per-drive list or global"
+	output yaml
+	default ""
+	help
+	  Physical block size advertised by each emulated NVMe namespace,
+	  in bytes. Must be >= logical block size on each drive. Empty
+	  string leaves the value unset so QEMU defaults to logical block
+	  size.
+
+	  Same input forms as the logical block size knob: a single
+	  integer applies globally, a comma-separated list of length N
+	  sets each drive by index.
+
+	  Common pairings (LBS / PBS): 512/4096 ("512e", classic
+	  Advanced Format with 512-byte emulation), 4096/4096 ("4Kn",
+	  native 4 KiB everywhere).
+
+	  See: <qemu_binary> -device nvme,help (physical_block_size)
+
+config QSU_NVME_MIN_IO_SIZE
+	string "NVMe min_io_size (bytes), per-drive list or global"
+	output yaml
+	default ""
+	help
+	  Minimum I/O size hint advertised by each emulated NVMe
+	  namespace, in bytes. Surfaces in NVMe Identify Namespace as
+	  NPWG (Namespace Preferred Write Granularity) so the guest
+	  block layer can align write allocations. Accepts plain
+	  integers and QEMU SIZE32 suffixes ("4K", "1M"). Empty string
+	  leaves the value unset; QEMU's default is 0, which the device
+	  layer interprets as "fall back to logical_block_size".
+
+	  Same input forms as the block-size knobs: single value or
+	  comma-separated list of length N.
+
+	  See: <qemu_binary> -device nvme,help (min_io_size),
+	  hw/core/qdev-properties-system.c BlockConf.
+
+config QSU_NVME_OPT_IO_SIZE
+	string "NVMe opt_io_size (bytes), per-drive list or global"
+	output yaml
+	default ""
+	help
+	  Optimal I/O size hint advertised by each emulated NVMe
+	  namespace, in bytes. Surfaces in NVMe Identify Namespace as
+	  NPWA (Namespace Preferred Write Alignment) so filesystem
+	  mkfs and the kernel block layer can pick stripe-aligned
+	  sizes for best throughput. Accepts plain integers and QEMU
+	  SIZE32 suffixes. Empty string leaves the value unset;
+	  QEMU's default is 0 which the device layer interprets as
+	  "fall back to logical_block_size".
+
+	  Same input forms as the block-size knobs: single value or
+	  comma-separated list of length N.
+
+	  See: <qemu_binary> -device nvme,help (opt_io_size),
+	  hw/core/qdev-properties-system.c BlockConf.
+
+config QSU_NVME_DISCARD_GRANULARITY
+	string "NVMe discard_granularity (bytes), per-drive list or global"
+	output yaml
+	default ""
+	help
+	  Minimum size of a single TRIM/DSM deallocate request the
+	  emulated NVMe namespace advertises, in bytes. Surfaces in
+	  NVMe DSM range descriptor accounting and is honored by the
+	  guest block layer to coalesce small discards into the
+	  granularity boundary. Accepts plain integers and QEMU
+	  SIZE32 suffixes. Empty string leaves the value unset; QEMU
+	  defaults to -1 which the block layer interprets as "inherit
+	  from backend" (typically 4 KiB on qcow2).
+
+	  Same input forms as the block-size knobs: single value or
+	  comma-separated list of length N.
+
+	  See: <qemu_binary> -device nvme,help (discard_granularity),
+	  hw/core/qdev-properties-system.c BlockConf.
+
+config QSU_NVME_WRITE_CACHE
+	string "NVMe write cache mode, per-drive list or global"
+	output yaml
+	default ""
+	help
+	  Volatile-write-cache (VWC) mode advertised by each emulated
+	  NVMe namespace. Surfaces in NVMe Identify Controller VWC
+	  and changes the guest block layer's flush behaviour: with
+	  the cache reported present the kernel issues explicit FLUSH
+	  / fsync to drain it, with the cache reported absent the
+	  kernel skips the flush.
+
+	  Unlike the block-size knobs this is an ON_OFF_AUTO field
+	  (BlockConf.wce, hw/core/qdev-properties-system.c) so the
+	  values are "on", "off", or "auto" rather than integers:
+
+	    on    - writeback cache present; FLUSH commands semantic.
+	    off   - writethrough; the device claims to never buffer
+	            so the guest skips the explicit drain. Useful to
+	            stress the no-cache path xfstests' fsync tests
+	            poke at.
+	    auto  - inherit from the block backend (qcow2 typically
+	            defaults to writeback).
+
+	  Empty string leaves the value unset and QEMU's BlockConf
+	  defaults to auto. Same input forms as the block-size
+	  knobs: single value applied globally, or a comma-separated
+	  list of length N for per-drive control (e.g.
+	  "off,off,off,off,off,off,off,off,on" to force every
+	  scratch drive to writethrough while keeping the test
+	  device on writeback).
+
+	  See: <qemu_binary> -device nvme,help (write-cache).
+
+config QSU_NVME_MDTS
+	string "NVMe Maximum Data Transfer Size (mdts), per-drive list or global"
+	output yaml
+	default ""
+	help
+	  Controller-level Maximum Data Transfer Size (NVMe Identify
+	  Controller MDTS field, offset 77). Encoded as a log2
+	  multiplier above the controller's minimum memory page size
+	  (CAP.MPSMIN, 4 KiB on standard configurations), so mdts=N
+	  means max transfer = (1 << N) * 4 KiB. The Linux nvme driver
+	  reads this and surfaces it as
+	    /sys/block/<dev>/queue/max_hw_sectors_kb
+	  via nvme_mps_to_sectors (drivers/nvme/host/core.c
+	  nvme_init_identify path), which the block layer caps every
+	  request against. Useful for exercising small-MDTS paths
+	  (where the kernel must split larger I/O into MDTS-sized
+	  chunks) without changing real hardware, or for matching the
+	  MDTS a particular SSD model advertises.
+
+	  Examples (with the default 4 KiB MPSMIN):
+	    mdts=1 -> 8 KiB max transfer
+	    mdts=4 -> 64 KiB
+	    mdts=7 -> 512 KiB (QEMU default)
+	    mdts=10 -> 4 MiB
+
+	  QEMU rejects mdts=0 (hw/nvme/ctrl.c:8628-8631:
+	  "mdts exceeds IOV_MAX") and any value where
+	  (1 << mdts) + 1 > IOV_MAX, so leave the knob empty for the
+	  default 7 rather than setting 0. zoned.zasl, when set,
+	  must be <= mdts (hw/nvme/ctrl.c:8634).
+
+	  Empty string leaves MDTS at QEMU's default. Same input
+	  forms as the block-size knobs: a single value applied to
+	  every drive, or a comma-separated list of length N for
+	  per-drive control (e.g. "7,7,7,7,7,7,7,7,1" to keep the
+	  first eight drives at 512 KiB and pin the last to 8 KiB
+	  for a small-MDTS section).
+
+	  See: <qemu_binary> -device nvme,help (mdts);
+	  hw/nvme/ctrl.c DEFINE_PROP_UINT8("mdts", ..., 7) at line 9383
+	  and id->mdts = n->params.mdts at line 9123;
+	  NVMe Base Specification, Identify Controller Data Structure
+	  (MDTS field).
+
+menu "Atomic writes"
+
+config QSU_NVME_ATOMIC_DN
+	string "NVMe atomic-write 'disable normal' (atomic.dn), per-drive list or global"
+	output yaml
+	default ""
+	help
+	  When set to "on", the controller reports
+	  AWUN == AWUPF (Atomic Write Unit Normal == ... Power Fail)
+	  via NVMe Identify Controller — i.e. the "normal" atomic-write
+	  unit is collapsed onto the power-fail value. This is the
+	  shape the Linux block layer expects when the device offers a
+	  single guaranteed-atomic write unit instead of separate
+	  best-effort and persisted units. xfstests' atomic-write tests
+	  read the resulting awu_min/awu_max from
+	  /sys/block/<dev>/queue/atomic_write_unit_{min,max}_bytes (and
+	  through statx via STATX_WRITE_ATOMIC).
+
+	  Values: "on" / "off" / "" (empty leaves the QEMU default).
+	  Unlike the integer knobs this is a bool — comma-separated
+	  per-drive lists are still accepted, but each entry must be
+	  on/off (or empty for "leave default"). A single value applies
+	  to every drive's controller.
+
+	  See: <qemu_binary> -device nvme,help (atomic.dn);
+	  hw/nvme/ctrl.c DEFINE_PROP_BOOL("atomic.dn", ..., atomic_dn).
+
+config QSU_NVME_ATOMIC_AWUN
+	string "NVMe Atomic Write Unit Normal (atomic.awun), per-drive list or global"
+	output yaml
+	default ""
+	help
+	  Controller-level Atomic Write Unit Normal (NVMe Identify
+	  Controller AWUN field). The 0-based count of LBAs the
+	  controller can write atomically under normal operation:
+	  awun=N means (N+1) LBAs. With LBS=4096 and awun=63, the
+	  controller advertises a 256 KiB atomic write unit at the
+	  controller level.
+
+	  This knob alone does NOT make the kernel report a non-default
+	  atomic_write_unit_max. drivers/nvme/host/core.c
+	  (nvme_atomic_bs, ~line 2027) consumes only the per-namespace
+	  NAWUPF when the namespace's NSFEAT_NSABP bit is set; absent
+	  that, the kernel logs "AWUPF ignored, only NAWUPF accepted"
+	  once and uses the logical block size as the atomic write unit.
+	  To actually drive
+	    /sys/block/<dev>/queue/atomic_write_unit_max_bytes
+	    statx() STATX_WRITE_ATOMIC fields
+	  to a non-trivial value, also set ATOMIC_NAWUN/ATOMIC_NAWUPF
+	  (which QEMU's hw/nvme/ns.c sets NSABP for and writes to the
+	  per-namespace NAWUN/NAWUPF). XFS bounds the per-file
+	  atomic_write_unit_min by the filesystem block size, so
+	  large-fsbs profiles (8/16/32/64 KiB) only satisfy tests whose
+	  min gate is >= fsblock; the device-side capability is still
+	  advertised for the kernel paths that read it directly.
+
+	  Empty string leaves AWUN at QEMU's default (0, no atomic
+	  write capability advertised). Single value or comma-separated
+	  per-drive list.
+
+	  See: <qemu_binary> -device nvme,help (atomic.awun);
+	  hw/nvme/ctrl.c DEFINE_PROP_UINT16("atomic.awun", ...);
+	  NVMe Base Specification, Identify Controller AWUN.
+
+config QSU_NVME_ATOMIC_AWUPF
+	string "NVMe Atomic Write Unit Power Fail (atomic.awupf), per-drive list or global"
+	output yaml
+	default ""
+	help
+	  Controller-level Atomic Write Unit Power Fail (NVMe Identify
+	  Controller AWUPF field). 0-based: awupf=N means (N+1) LBAs
+	  guaranteed atomic across power-fail. Must be <= AWUN, and
+	  per QEMU's hw/nvme/ns.c the per-namespace NAWUPF must be
+	  >= AWUPF.
+
+	  Same caveat as ATOMIC_AWUN: the kernel does not derive
+	  atomic_write_unit_max from controller-level AWUPF — it logs
+	  "AWUPF ignored, only NAWUPF accepted" when only the
+	  controller value is set. To actually drive the kernel's
+	  per-namespace atomic write reporting set ATOMIC_NAWUPF
+	  alongside this knob.
+
+	  Same input forms as the block-size knobs.
+
+	  See: <qemu_binary> -device nvme,help (atomic.awupf);
+	  hw/nvme/ctrl.c DEFINE_PROP_UINT16("atomic.awupf", ...);
+	  NVMe Base Specification, Identify Controller AWUPF.
+
+config QSU_NVME_ATOMIC_NAWUN
+	string "NVMe Namespace AWU Normal (atomic.nawun), per-drive list or global"
+	output yaml
+	default ""
+	help
+	  Per-namespace override of AWUN, exposed in NVMe Identify
+	  Namespace NAWUN. When set, the namespace reports its own
+	  atomic-write capability that supersedes the controller-level
+	  AWUN for I/O issued to this namespace. Same 0-based encoding:
+	  nawun=N means (N+1) LBAs.
+
+	  QEMU's hw/nvme/ns.c rejects NAWUN values smaller than the
+	  controller's AWUN, so set the controller's AWUN/AWUPF first
+	  if you want NAWUN to take effect (or leave AWUN unset and
+	  let NAWUN be the only source).
+
+	  Same input forms as the block-size knobs.
+
+	  See: <qemu_binary> -device nvme-ns,help (atomic.nawun);
+	  hw/nvme/ns.c nvme_ns_set_nsabp.
+
+config QSU_NVME_ATOMIC_NAWUPF
+	string "NVMe Namespace AWU Power Fail (atomic.nawupf), per-drive list or global"
+	output yaml
+	default ""
+	help
+	  Per-namespace override of AWUPF (NVMe Identify Namespace
+	  NAWUPF). Must be <= NAWUN, and >= controller AWUPF (QEMU
+	  enforces both).
+
+	  See: <qemu_binary> -device nvme-ns,help (atomic.nawupf).
+
+config QSU_NVME_ATOMIC_NABSN
+	string "NVMe Namespace Atomic Boundary Size Normal (atomic.nabsn)"
+	output yaml
+	default ""
+	help
+	  Atomic-write boundary size (NVMe Identify Namespace NABSN),
+	  in 0-based LBAs. Defines the granularity an atomic write
+	  cannot cross during normal operation. Must be >= NAWUN.
+
+	  Most kernels treat NABSN > 0 as "this device has an atomic
+	  boundary; align large atomic writes to it"; on cards that
+	  honor a hard boundary (e.g. NVMe SSDs whose firmware can
+	  only guarantee atomicity within a 16 KiB or 64 KiB stripe)
+	  this is the field that surfaces.
+
+	  Empty leaves NABSN at QEMU's default (0, no boundary). Same
+	  input forms as the other knobs.
+
+	  See: <qemu_binary> -device nvme-ns,help (atomic.nabsn);
+	  hw/nvme/ns.c nvme_ns_atomic_configure_boundary.
+
+config QSU_NVME_ATOMIC_NABSPF
+	string "NVMe Namespace Atomic Boundary Size Power Fail (atomic.nabspf)"
+	output yaml
+	default ""
+	help
+	  Atomic-write boundary size for power-fail (NVMe Identify
+	  Namespace NABSPF). Must be >= NAWUPF.
+
+	  See: <qemu_binary> -device nvme-ns,help (atomic.nabspf).
+
+config QSU_NVME_ATOMIC_NABO
+	string "NVMe Namespace Atomic Boundary Offset (atomic.nabo)"
+	output yaml
+	default ""
+	help
+	  Atomic-write boundary offset (NVMe Identify Namespace NABO).
+	  Where the first atomic boundary starts in LBAs from LBA 0.
+	  Must be <= min(NABSN, NABSPF). 0 means boundary aligned at
+	  start of namespace.
+
+	  See: <qemu_binary> -device nvme-ns,help (atomic.nabo).
+
+endmenu  # Atomic writes
+
+endmenu  # NVMe storage
+
+endif # NIXOSFI
diff --git a/kconfigs/monitors/Kconfig b/kconfigs/monitors/Kconfig
index 14811dab..fcb25254 100644
--- a/kconfigs/monitors/Kconfig
+++ b/kconfigs/monitors/Kconfig
@@ -4,7 +4,7 @@ config ENABLE_MONITORING
 	bool "Enable monitoring services during workflow execution"
 	output yaml
 	default n
-	depends on !NIXOSFL
+	depends on !KDEVOPS_ENABLE_NIXOS_FLAKE
 	help
 	  Enable monitoring services to collect statistics during workflow
 	  execution. This allows collection of various system metrics while
@@ -19,13 +19,10 @@ config ENABLE_MONITORING
 	  Currently supported workflows:
 	  - fstests
 
-	  Not available under NIXOSFL: the kdevops monitoring
-	  role's install-deps step uses apt/dnf without a NixOS branch, and
-	  every consumer workflow (fstests, mmtests, sysbench, ai, minio) is
-	  gated out under that backend anyway. The nixos-flake guest-side
-	  monitoring profile (NIXOS_FLAKE_PROFILE_MONITORING) is the
-	  Nix-native equivalent; the kdevops side needs an orchestrator that
-	  drives those systemd template units, which is unscoped work.
+	  Not available under nixos_flake guests: the kdevops monitoring
+	  role's install-deps step uses apt/dnf without a NixOS branch.
+	  The Nix-native equivalent is NIXOS_FLAKE_PROFILE_MONITORING on
+	  the guest side.
 
 if ENABLE_MONITORING
 
diff --git a/kconfigs/workflows/Kconfig b/kconfigs/workflows/Kconfig
index 0b0c47ec..00751290 100644
--- a/kconfigs/workflows/Kconfig
+++ b/kconfigs/workflows/Kconfig
@@ -22,6 +22,7 @@ endmenu
 choice
 	prompt "Target Linux kernel to use"
 	default WORKFLOW_LINUX_DISTRO if NIXOSFL
+	default WORKFLOW_LINUX_CUSTOM if NIXOSFI
 	default WORKFLOW_LINUX_DISTRO if !QEMU_ENABLE_EXTRA_DRIVE_LARGEIO
 	default WORKFLOW_LINUX_CUSTOM if QEMU_ENABLE_EXTRA_DRIVE_LARGEIO
 
diff --git a/playbooks/nixosfi.yml b/playbooks/nixosfi.yml
new file mode 100644
index 00000000..8f0e1dec
--- /dev/null
+++ b/playbooks/nixosfi.yml
@@ -0,0 +1,23 @@
+---
+- name: Manage imageless NixOS VMs with qemu-system-units
+  hosts: localhost
+  vars_files:
+    - "{{ playbook_dir }}/../extra_vars.yaml"
+  roles:
+    - role: nixosfi
+
+- name: Run nixos-rebuild test on running nixosfi guests
+  hosts: baseline:dev
+  gather_facts: false
+  vars_files:
+    - "{{ playbook_dir }}/../extra_vars.yaml"
+  tasks:
+    - name: Include nixosfi rebuild-test tasks
+      ansible.builtin.include_role:
+        name: nixosfi
+        tasks_from: rebuild-test
+        apply:
+          tags:
+            - rebuild-test
+      tags:
+        - rebuild-test
diff --git a/playbooks/roles/bootlinux/tasks/config.yml b/playbooks/roles/bootlinux/tasks/config.yml
index a54db514..c2288ac6 100644
--- a/playbooks/roles/bootlinux/tasks/config.yml
+++ b/playbooks/roles/bootlinux/tasks/config.yml
@@ -6,6 +6,13 @@
       - "{{ role_path }}/templates/config-kdevops"
       - "{{ role_path }}/templates/{{ target_linux_config }}"
 
+- name: Prefer the imageless preset under direct-boot + qsu
+  ansible.builtin.set_fact:
+    search_list: "{{ [role_path ~ '/templates/config-imageless'] + search_list }}"
+  when:
+    - bootlinux_direct_boot | default(false) | bool
+    - kdevops_enable_nixosfi | default(false) | bool
+
 - name: Find all linux-next kernel config files
   delegate_to: localhost
   run_once: true
diff --git a/playbooks/roles/bootlinux/templates/config-imageless b/playbooks/roles/bootlinux/templates/config-imageless
new file mode 100644
index 00000000..3e5d46a9
--- /dev/null
+++ b/playbooks/roles/bootlinux/templates/config-imageless
@@ -0,0 +1,2957 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Linux/x86 7.0.0-rc2 Kernel Configuration
+#
+CONFIG_CC_VERSION_TEXT="Debian clang version 21.1.8 (3+b1)"
+CONFIG_GCC_VERSION=0
+CONFIG_CC_IS_CLANG=y
+CONFIG_CLANG_VERSION=210108
+CONFIG_AS_IS_LLVM=y
+CONFIG_AS_VERSION=210108
+CONFIG_LD_VERSION=0
+CONFIG_LD_IS_LLD=y
+CONFIG_LLD_VERSION=210108
+CONFIG_RUSTC_VERSION=109101
+CONFIG_RUST_IS_AVAILABLE=y
+CONFIG_RUSTC_LLVM_VERSION=210102
+CONFIG_CC_CAN_LINK=y
+CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y
+CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y
+CONFIG_TOOLS_SUPPORT_RELR=y
+CONFIG_CC_HAS_ASM_INLINE=y
+CONFIG_CC_HAS_ASSUME=y
+CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y
+CONFIG_CC_HAS_COUNTED_BY=y
+CONFIG_CC_HAS_BROKEN_COUNTED_BY_REF=y
+CONFIG_CC_HAS_MULTIDIMENSIONAL_NONSTRING=y
+CONFIG_LD_CAN_USE_KEEP_IN_OVERLAY=y
+CONFIG_RUSTC_HAS_SLICE_AS_FLATTENED=y
+CONFIG_RUSTC_HAS_COERCE_POINTEE=y
+CONFIG_RUSTC_HAS_SPAN_FILE=y
+CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES=y
+CONFIG_RUSTC_HAS_FILE_WITH_NUL=y
+CONFIG_RUSTC_HAS_FILE_AS_C_STR=y
+CONFIG_PAHOLE_VERSION=131
+CONFIG_IRQ_WORK=y
+CONFIG_BUILDTIME_TABLE_SORT=y
+CONFIG_THREAD_INFO_IN_TASK=y
+
+#
+# General setup
+#
+CONFIG_INIT_ENV_ARG_LIMIT=32
+# CONFIG_COMPILE_TEST is not set
+# CONFIG_WERROR is not set
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_BUILD_SALT=""
+CONFIG_HAVE_KERNEL_GZIP=y
+CONFIG_HAVE_KERNEL_BZIP2=y
+CONFIG_HAVE_KERNEL_LZMA=y
+CONFIG_HAVE_KERNEL_XZ=y
+CONFIG_HAVE_KERNEL_LZO=y
+CONFIG_HAVE_KERNEL_LZ4=y
+CONFIG_HAVE_KERNEL_ZSTD=y
+CONFIG_KERNEL_GZIP=y
+# CONFIG_KERNEL_BZIP2 is not set
+# CONFIG_KERNEL_LZMA is not set
+# CONFIG_KERNEL_XZ is not set
+# CONFIG_KERNEL_LZO is not set
+# CONFIG_KERNEL_LZ4 is not set
+# CONFIG_KERNEL_ZSTD is not set
+CONFIG_DEFAULT_INIT=""
+CONFIG_DEFAULT_HOSTNAME="(none)"
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_WATCH_QUEUE is not set
+CONFIG_CROSS_MEMORY_ATTACH=y
+# CONFIG_AUDIT is not set
+CONFIG_HAVE_ARCH_AUDITSYSCALL=y
+
+#
+# IRQ subsystem
+#
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_GENERIC_IRQ_SHOW=y
+CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
+CONFIG_GENERIC_PENDING_IRQ=y
+CONFIG_GENERIC_IRQ_MIGRATION=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_IRQ_DOMAIN=y
+CONFIG_IRQ_DOMAIN_HIERARCHY=y
+CONFIG_GENERIC_MSI_IRQ=y
+CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y
+CONFIG_GENERIC_IRQ_RESERVATION_MODE=y
+CONFIG_IRQ_FORCED_THREADING=y
+CONFIG_SPARSE_IRQ=y
+# CONFIG_GENERIC_IRQ_DEBUGFS is not set
+# end of IRQ subsystem
+
+CONFIG_CLOCKSOURCE_WATCHDOG=y
+CONFIG_ARCH_CLOCKSOURCE_INIT=y
+CONFIG_GENERIC_TIME_VSYSCALL=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
+CONFIG_GENERIC_CLOCKEVENTS_BROADCAST_IDLE=y
+CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y
+CONFIG_GENERIC_CMOS_UPDATE=y
+CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y
+CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y
+CONFIG_CONTEXT_TRACKING=y
+CONFIG_CONTEXT_TRACKING_IDLE=y
+
+#
+# Timers subsystem
+#
+CONFIG_TICK_ONESHOT=y
+CONFIG_HZ_PERIODIC=y
+# CONFIG_NO_HZ_IDLE is not set
+# CONFIG_NO_HZ_FULL is not set
+# CONFIG_NO_HZ is not set
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=125
+# CONFIG_POSIX_AUX_CLOCKS is not set
+# end of Timers subsystem
+
+CONFIG_BPF=y
+CONFIG_HAVE_EBPF_JIT=y
+CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y
+
+#
+# BPF subsystem
+#
+CONFIG_BPF_SYSCALL=y
+CONFIG_BPF_JIT=y
+CONFIG_BPF_JIT_ALWAYS_ON=y
+CONFIG_BPF_JIT_DEFAULT_ON=y
+# CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set
+# CONFIG_BPF_PRELOAD is not set
+CONFIG_BPF_LSM=y
+# end of BPF subsystem
+
+CONFIG_PREEMPT_BUILD=y
+CONFIG_ARCH_HAS_PREEMPT_LAZY=y
+# CONFIG_PREEMPT is not set
+CONFIG_PREEMPT_LAZY=y
+# CONFIG_PREEMPT_RT is not set
+CONFIG_PREEMPT_COUNT=y
+CONFIG_PREEMPTION=y
+# CONFIG_PREEMPT_DYNAMIC is not set
+# CONFIG_SCHED_CORE is not set
+# CONFIG_SCHED_CLASS_EXT is not set
+
+#
+# CPU/Task time and stats accounting
+#
+CONFIG_TICK_CPU_ACCOUNTING=y
+# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set
+# CONFIG_IRQ_TIME_ACCOUNTING is not set
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_TASKSTATS is not set
+CONFIG_PSI=y
+# CONFIG_PSI_DEFAULT_DISABLED is not set
+# end of CPU/Task time and stats accounting
+
+CONFIG_CPU_ISOLATION=y
+
+#
+# RCU Subsystem
+#
+CONFIG_TREE_RCU=y
+# CONFIG_RCU_EXPERT is not set
+CONFIG_TREE_SRCU=y
+CONFIG_TASKS_RCU_GENERIC=y
+CONFIG_NEED_TASKS_RCU=y
+CONFIG_TASKS_RCU=y
+CONFIG_TASKS_RUDE_RCU=y
+CONFIG_TASKS_TRACE_RCU=y
+CONFIG_RCU_STALL_COMMON=y
+CONFIG_RCU_NEED_SEGCBLIST=y
+# end of RCU Subsystem
+
+# CONFIG_IKCONFIG is not set
+CONFIG_IKHEADERS=y
+CONFIG_LOG_BUF_SHIFT=17
+CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
+# CONFIG_PRINTK_INDEX is not set
+CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
+
+#
+# Scheduler features
+#
+# CONFIG_SCHED_PROXY_EXEC is not set
+# end of Scheduler features
+
+CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
+CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y
+CONFIG_CC_HAS_INT128=y
+CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough"
+CONFIG_GCC10_NO_ARRAY_BOUNDS=y
+CONFIG_GCC_NO_STRINGOP_OVERFLOW=y
+CONFIG_ARCH_SUPPORTS_INT128=y
+CONFIG_SLAB_OBJ_EXT=y
+CONFIG_CGROUPS=y
+CONFIG_PAGE_COUNTER=y
+# CONFIG_CGROUP_FAVOR_DYNMODS is not set
+CONFIG_MEMCG=y
+# CONFIG_MEMCG_V1 is not set
+CONFIG_BLK_CGROUP=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_GROUP_SCHED_WEIGHT=y
+CONFIG_GROUP_SCHED_BANDWIDTH=y
+CONFIG_FAIR_GROUP_SCHED=y
+CONFIG_CFS_BANDWIDTH=y
+# CONFIG_RT_GROUP_SCHED is not set
+# CONFIG_CGROUP_PIDS is not set
+# CONFIG_CGROUP_RDMA is not set
+# CONFIG_CGROUP_DMEM is not set
+# CONFIG_CGROUP_FREEZER is not set
+# CONFIG_CGROUP_HUGETLB is not set
+# CONFIG_CPUSETS is not set
+# CONFIG_CGROUP_DEVICE is not set
+# CONFIG_CGROUP_CPUACCT is not set
+# CONFIG_CGROUP_PERF is not set
+CONFIG_CGROUP_BPF=y
+# CONFIG_CGROUP_MISC is not set
+# CONFIG_CGROUP_DEBUG is not set
+CONFIG_SOCK_CGROUP_DATA=y
+CONFIG_NAMESPACES=y
+CONFIG_UTS_NS=y
+CONFIG_TIME_NS=y
+CONFIG_IPC_NS=y
+CONFIG_USER_NS=y
+CONFIG_PID_NS=y
+CONFIG_NET_NS=y
+CONFIG_CHECKPOINT_RESTORE=y
+# CONFIG_SCHED_AUTOGROUP is not set
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_RD_GZIP is not set
+# CONFIG_RD_BZIP2 is not set
+# CONFIG_RD_LZMA is not set
+# CONFIG_RD_XZ is not set
+# CONFIG_RD_LZO is not set
+# CONFIG_RD_LZ4 is not set
+CONFIG_RD_ZSTD=y
+# CONFIG_BOOT_CONFIG is not set
+CONFIG_CMDLINE_LOG_WRAP_IDEAL_LEN=1021
+# CONFIG_INITRAMFS_PRESERVE_MTIME is not set
+CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_LD_ORPHAN_WARN=y
+CONFIG_LD_ORPHAN_WARN_LEVEL="warn"
+CONFIG_SYSCTL=y
+CONFIG_SYSCTL_EXCEPTION_TRACE=y
+# CONFIG_SYSFS_SYSCALL is not set
+CONFIG_HAVE_PCSPKR_PLATFORM=y
+CONFIG_EXPERT=y
+CONFIG_MULTIUSER=y
+# CONFIG_SGETMASK_SYSCALL is not set
+CONFIG_FHANDLE=y
+CONFIG_POSIX_TIMERS=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+# CONFIG_PCSPKR_PLATFORM is not set
+# CONFIG_BASE_SMALL is not set
+CONFIG_FUTEX=y
+CONFIG_FUTEX_PI=y
+CONFIG_FUTEX_PRIVATE_HASH=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+CONFIG_IO_URING=y
+# CONFIG_IO_URING_MOCK_FILE is not set
+CONFIG_ADVISE_SYSCALLS=y
+CONFIG_MEMBARRIER=y
+CONFIG_KCMP=y
+# CONFIG_RSEQ is not set
+# CONFIG_CACHESTAT_SYSCALL is not set
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_SELFTEST is not set
+# CONFIG_KALLSYMS_ALL is not set
+CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y
+CONFIG_ARCH_SUPPORTS_MSEAL_SYSTEM_MAPPINGS=y
+CONFIG_HAVE_PERF_EVENTS=y
+CONFIG_GUEST_PERF_EVENTS=y
+CONFIG_PERF_GUEST_MEDIATED_PMU=y
+
+#
+# Kernel Performance Events And Counters
+#
+CONFIG_PERF_EVENTS=y
+# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
+# end of Kernel Performance Events And Counters
+
+CONFIG_PROFILING=y
+# CONFIG_RUST is not set
+CONFIG_TRACEPOINTS=y
+
+#
+# Kexec and crash features
+#
+# CONFIG_KEXEC is not set
+# CONFIG_KEXEC_FILE is not set
+# end of Kexec and crash features
+
+#
+# Live Update and Kexec HandOver
+#
+# CONFIG_KEXEC_HANDOVER is not set
+# end of Live Update and Kexec HandOver
+# end of General setup
+
+CONFIG_64BIT=y
+CONFIG_X86_64=y
+CONFIG_X86=y
+CONFIG_INSTRUCTION_DECODER=y
+CONFIG_OUTPUT_FORMAT="elf64-x86-64"
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_MMU=y
+CONFIG_ARCH_MMAP_RND_BITS_MIN=28
+CONFIG_ARCH_MMAP_RND_BITS_MAX=32
+CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8
+CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ARCH_HAS_CPU_RELAX=y
+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_AUDIT_ARCH=y
+CONFIG_ARCH_SUPPORTS_UPROBES=y
+CONFIG_FIX_EARLYCON_MEM=y
+CONFIG_PGTABLE_LEVELS=5
+
+#
+# Processor type and features
+#
+CONFIG_SMP=y
+# CONFIG_X86_X2APIC is not set
+# CONFIG_X86_MPPARSE is not set
+CONFIG_X86_FRED=y
+# CONFIG_X86_EXTENDED_PLATFORM is not set
+# CONFIG_X86_INTEL_LPSS is not set
+# CONFIG_X86_AMD_PLATFORM_DEVICE is not set
+# CONFIG_IOSF_MBI is not set
+# CONFIG_SCHED_OMIT_FRAME_POINTER is not set
+CONFIG_HYPERVISOR_GUEST=y
+CONFIG_PARAVIRT=y
+# CONFIG_PARAVIRT_SPINLOCKS is not set
+CONFIG_X86_HV_CALLBACK_VECTOR=y
+# CONFIG_XEN is not set
+CONFIG_KVM_GUEST=y
+CONFIG_ARCH_CPUIDLE_HALTPOLL=y
+# CONFIG_PVH is not set
+# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set
+CONFIG_PARAVIRT_CLOCK=y
+# CONFIG_JAILHOUSE_GUEST is not set
+# CONFIG_ACRN_GUEST is not set
+# CONFIG_BHYVE_GUEST is not set
+CONFIG_CC_HAS_MARCH_NATIVE=y
+# CONFIG_X86_NATIVE_CPU is not set
+CONFIG_X86_INTERNODE_CACHE_SHIFT=6
+CONFIG_X86_L1_CACHE_SHIFT=6
+CONFIG_X86_TSC=y
+CONFIG_X86_HAVE_PAE=y
+CONFIG_X86_CX8=y
+CONFIG_X86_CMOV=y
+CONFIG_X86_MINIMUM_CPU_FAMILY=64
+CONFIG_X86_DEBUGCTLMSR=y
+CONFIG_IA32_FEAT_CTL=y
+CONFIG_X86_VMX_FEATURE_NAMES=y
+# CONFIG_PROCESSOR_SELECT is not set
+CONFIG_BROADCAST_TLB_FLUSH=y
+CONFIG_CPU_SUP_INTEL=y
+CONFIG_CPU_SUP_AMD=y
+CONFIG_CPU_SUP_HYGON=y
+CONFIG_CPU_SUP_CENTAUR=y
+CONFIG_CPU_SUP_ZHAOXIN=y
+CONFIG_HPET_TIMER=y
+CONFIG_DMI=y
+# CONFIG_GART_IOMMU is not set
+# CONFIG_MAXSMP is not set
+CONFIG_NR_CPUS_RANGE_BEGIN=2
+CONFIG_NR_CPUS_RANGE_END=512
+CONFIG_NR_CPUS_DEFAULT=64
+CONFIG_NR_CPUS=64
+CONFIG_X86_LOCAL_APIC=y
+CONFIG_ACPI_MADT_WAKEUP=y
+CONFIG_X86_IO_APIC=y
+# CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set
+# CONFIG_X86_MCE is not set
+
+#
+# Performance monitoring
+#
+# CONFIG_PERF_EVENTS_INTEL_UNCORE is not set
+# CONFIG_PERF_EVENTS_INTEL_RAPL is not set
+# CONFIG_PERF_EVENTS_INTEL_CSTATE is not set
+CONFIG_PERF_EVENTS_AMD_POWER=m
+CONFIG_PERF_EVENTS_AMD_UNCORE=m
+CONFIG_PERF_EVENTS_AMD_BRS=y
+# end of Performance monitoring
+
+# CONFIG_X86_VSYSCALL_EMULATION is not set
+# CONFIG_X86_IOPL_IOPERM is not set
+CONFIG_MICROCODE=y
+# CONFIG_MICROCODE_LATE_LOADING is not set
+# CONFIG_MICROCODE_DBG is not set
+# CONFIG_X86_MSR is not set
+# CONFIG_X86_CPUID is not set
+CONFIG_X86_DIRECT_GBPAGES=y
+# CONFIG_X86_CPA_STATISTICS is not set
+# CONFIG_NUMA is not set
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_DEFAULT=y
+# CONFIG_ARCH_MEMORY_PROBE is not set
+CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
+# CONFIG_X86_PMEM_LEGACY is not set
+# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set
+# CONFIG_MTRR is not set
+# CONFIG_X86_UMIP is not set
+CONFIG_CC_HAS_IBT=y
+# CONFIG_X86_KERNEL_IBT is not set
+# CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set
+CONFIG_ARCH_PKEY_BITS=4
+# CONFIG_X86_INTEL_TSX_MODE_OFF is not set
+# CONFIG_X86_INTEL_TSX_MODE_ON is not set
+CONFIG_X86_INTEL_TSX_MODE_AUTO=y
+# CONFIG_X86_USER_SHADOW_STACK is not set
+# CONFIG_EFI is not set
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=250
+CONFIG_SCHED_HRTICK=y
+CONFIG_ARCH_SUPPORTS_KEXEC=y
+CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y
+CONFIG_ARCH_SUPPORTS_KEXEC_PURGATORY=y
+CONFIG_ARCH_SUPPORTS_KEXEC_SIG=y
+CONFIG_ARCH_SUPPORTS_KEXEC_SIG_FORCE=y
+CONFIG_ARCH_SUPPORTS_KEXEC_BZIMAGE_VERIFY_SIG=y
+CONFIG_ARCH_SUPPORTS_KEXEC_JUMP=y
+CONFIG_ARCH_SUPPORTS_KEXEC_HANDOVER=y
+CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y
+CONFIG_ARCH_DEFAULT_CRASH_DUMP=y
+CONFIG_ARCH_SUPPORTS_CRASH_HOTPLUG=y
+CONFIG_PHYSICAL_START=0x1000000
+# CONFIG_RELOCATABLE is not set
+CONFIG_PHYSICAL_ALIGN=0x200000
+# CONFIG_ADDRESS_MASKING is not set
+CONFIG_HOTPLUG_CPU=y
+CONFIG_LEGACY_VSYSCALL_XONLY=y
+# CONFIG_LEGACY_VSYSCALL_NONE is not set
+# CONFIG_CMDLINE_BOOL is not set
+# CONFIG_MODIFY_LDT_SYSCALL is not set
+# CONFIG_STRICT_SIGALTSTACK_SIZE is not set
+CONFIG_HAVE_LIVEPATCH=y
+CONFIG_HAVE_KLP_BUILD=y
+# CONFIG_X86_BUS_LOCK_DETECT is not set
+# end of Processor type and features
+
+CONFIG_CC_HAS_NAMED_AS_FIXED_SANITIZERS=y
+CONFIG_CC_HAS_SLS=y
+CONFIG_CC_HAS_RETURN_THUNK=y
+CONFIG_CC_HAS_ENTRY_PADDING=y
+CONFIG_CC_HAS_KCFI_ARITY=y
+CONFIG_FUNCTION_PADDING_CFI=11
+CONFIG_FUNCTION_PADDING_BYTES=16
+# CONFIG_CPU_MITIGATIONS is not set
+CONFIG_ARCH_HAS_ADD_PAGES=y
+
+#
+# Power management and ACPI options
+#
+# CONFIG_SUSPEND is not set
+# CONFIG_PM is not set
+CONFIG_ARCH_SUPPORTS_ACPI=y
+CONFIG_ACPI=y
+CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y
+CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y
+CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y
+# CONFIG_ACPI_DEBUGGER is not set
+# CONFIG_ACPI_SPCR_TABLE is not set
+# CONFIG_ACPI_FPDT is not set
+CONFIG_ACPI_LPIT=y
+# CONFIG_ACPI_REV_OVERRIDE_POSSIBLE is not set
+# CONFIG_ACPI_EC is not set
+# CONFIG_ACPI_AC is not set
+# CONFIG_ACPI_BATTERY is not set
+# CONFIG_ACPI_BUTTON is not set
+CONFIG_ACPI_TINY_POWER_BUTTON=y
+CONFIG_ACPI_TINY_POWER_BUTTON_SIGNAL=38
+# CONFIG_ACPI_DOCK is not set
+# CONFIG_ACPI_PROCESSOR is not set
+CONFIG_ACPI_CUSTOM_DSDT_FILE=""
+CONFIG_ARCH_HAS_ACPI_TABLE_UPGRADE=y
+# CONFIG_ACPI_TABLE_UPGRADE is not set
+# CONFIG_ACPI_DEBUG is not set
+# CONFIG_ACPI_PCI_SLOT is not set
+# CONFIG_ACPI_CONTAINER is not set
+# CONFIG_ACPI_HOTPLUG_MEMORY is not set
+CONFIG_ACPI_HOTPLUG_IOAPIC=y
+# CONFIG_ACPI_HED is not set
+# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set
+# CONFIG_ACPI_NFIT is not set
+CONFIG_HAVE_ACPI_APEI=y
+CONFIG_HAVE_ACPI_APEI_NMI=y
+# CONFIG_ACPI_APEI is not set
+# CONFIG_ACPI_DPTF is not set
+# CONFIG_ACPI_CONFIGFS is not set
+# CONFIG_ACPI_PFRUT is not set
+# CONFIG_ACPI_FFH is not set
+CONFIG_ACPI_MRRM=y
+# CONFIG_PMIC_OPREGION is not set
+# CONFIG_X86_PM_TIMER is not set
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ is not set
+# end of CPU Frequency scaling
+
+#
+# CPU Idle
+#
+# CONFIG_CPU_IDLE is not set
+# end of CPU Idle
+# end of Power management and ACPI options
+
+#
+# Bus options (PCI etc.)
+#
+CONFIG_PCI_DIRECT=y
+# CONFIG_PCI_MMCONFIG is not set
+# CONFIG_ISA_BUS is not set
+# CONFIG_ISA_DMA_API is not set
+CONFIG_AMD_NB=y
+CONFIG_AMD_NODE=y
+# end of Bus options (PCI etc.)
+
+#
+# Binary Emulations
+#
+# CONFIG_IA32_EMULATION is not set
+# end of Binary Emulations
+
+CONFIG_KVM_COMMON=y
+CONFIG_HAVE_KVM_PFNCACHE=y
+CONFIG_HAVE_KVM_IRQCHIP=y
+CONFIG_HAVE_KVM_IRQ_ROUTING=y
+CONFIG_HAVE_KVM_DIRTY_RING=y
+CONFIG_HAVE_KVM_DIRTY_RING_TSO=y
+CONFIG_HAVE_KVM_DIRTY_RING_ACQ_REL=y
+CONFIG_KVM_MMIO=y
+CONFIG_KVM_ASYNC_PF=y
+CONFIG_HAVE_KVM_MSI=y
+CONFIG_HAVE_KVM_READONLY_MEM=y
+CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y
+CONFIG_KVM_VFIO=y
+CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y
+CONFIG_KVM_GENERIC_PRE_FAULT_MEMORY=y
+CONFIG_HAVE_KVM_IRQ_BYPASS=m
+CONFIG_HAVE_KVM_NO_POLL=y
+CONFIG_VIRT_XFER_TO_GUEST_WORK=y
+CONFIG_KVM_GENERIC_HARDWARE_ENABLING=y
+CONFIG_KVM_ELIDE_TLB_FLUSH_IF_YOUNG=y
+CONFIG_KVM_MMU_LOCKLESS_AGING=y
+CONFIG_KVM_GUEST_MEMFD=y
+CONFIG_VIRTUALIZATION=y
+CONFIG_KVM_X86=m
+CONFIG_KVM=m
+# CONFIG_KVM_WERROR is not set
+# CONFIG_KVM_SW_PROTECTED_VM is not set
+CONFIG_KVM_INTEL=m
+# CONFIG_KVM_INTEL_PROVE_VE is not set
+CONFIG_KVM_AMD=m
+CONFIG_KVM_IOAPIC=y
+CONFIG_KVM_SMM=y
+# CONFIG_KVM_HYPERV is not set
+# CONFIG_KVM_XEN is not set
+# CONFIG_KVM_PROVE_MMU is not set
+CONFIG_KVM_MAX_NR_VCPUS=1024
+CONFIG_X86_REQUIRED_FEATURE_ALWAYS=y
+CONFIG_X86_REQUIRED_FEATURE_NOPL=y
+CONFIG_X86_REQUIRED_FEATURE_CX8=y
+CONFIG_X86_REQUIRED_FEATURE_CMOV=y
+CONFIG_X86_REQUIRED_FEATURE_CPUID=y
+CONFIG_X86_REQUIRED_FEATURE_FPU=y
+CONFIG_X86_REQUIRED_FEATURE_PAE=y
+CONFIG_X86_REQUIRED_FEATURE_PSE=y
+CONFIG_X86_REQUIRED_FEATURE_PGE=y
+CONFIG_X86_REQUIRED_FEATURE_MSR=y
+CONFIG_X86_REQUIRED_FEATURE_FXSR=y
+CONFIG_X86_REQUIRED_FEATURE_XMM=y
+CONFIG_X86_REQUIRED_FEATURE_XMM2=y
+CONFIG_X86_REQUIRED_FEATURE_LM=y
+CONFIG_X86_DISABLED_FEATURE_UMIP=y
+CONFIG_X86_DISABLED_FEATURE_VME=y
+CONFIG_X86_DISABLED_FEATURE_K6_MTRR=y
+CONFIG_X86_DISABLED_FEATURE_CYRIX_ARR=y
+CONFIG_X86_DISABLED_FEATURE_CENTAUR_MCR=y
+CONFIG_X86_DISABLED_FEATURE_PKU=y
+CONFIG_X86_DISABLED_FEATURE_OSPKE=y
+CONFIG_X86_DISABLED_FEATURE_PTI=y
+CONFIG_X86_DISABLED_FEATURE_RETPOLINE=y
+CONFIG_X86_DISABLED_FEATURE_RETPOLINE_LFENCE=y
+CONFIG_X86_DISABLED_FEATURE_RETHUNK=y
+CONFIG_X86_DISABLED_FEATURE_UNRET=y
+CONFIG_X86_DISABLED_FEATURE_CALL_DEPTH=y
+CONFIG_X86_DISABLED_FEATURE_LAM=y
+CONFIG_X86_DISABLED_FEATURE_ENQCMD=y
+CONFIG_X86_DISABLED_FEATURE_SGX=y
+CONFIG_X86_DISABLED_FEATURE_XENPV=y
+CONFIG_X86_DISABLED_FEATURE_TDX_GUEST=y
+CONFIG_X86_DISABLED_FEATURE_USER_SHSTK=y
+CONFIG_X86_DISABLED_FEATURE_IBT=y
+CONFIG_X86_DISABLED_FEATURE_SEV_SNP=y
+CONFIG_AS_WRUSS=y
+CONFIG_ARCH_CONFIGURES_CPU_MITIGATIONS=y
+
+#
+# General architecture-dependent options
+#
+CONFIG_HOTPLUG_SMT=y
+CONFIG_ARCH_SUPPORTS_SCHED_SMT=y
+CONFIG_ARCH_SUPPORTS_SCHED_CLUSTER=y
+CONFIG_ARCH_SUPPORTS_SCHED_MC=y
+CONFIG_SCHED_SMT=y
+# CONFIG_SCHED_CLUSTER is not set
+# CONFIG_SCHED_MC is not set
+CONFIG_HOTPLUG_CORE_SYNC=y
+CONFIG_HOTPLUG_CORE_SYNC_DEAD=y
+CONFIG_HOTPLUG_CORE_SYNC_FULL=y
+CONFIG_HOTPLUG_SPLIT_STARTUP=y
+CONFIG_HOTPLUG_PARALLEL=y
+CONFIG_GENERIC_IRQ_ENTRY=y
+CONFIG_GENERIC_SYSCALL=y
+CONFIG_GENERIC_ENTRY=y
+CONFIG_KPROBES=y
+# CONFIG_JUMP_LABEL is not set
+# CONFIG_STATIC_CALL_SELFTEST is not set
+CONFIG_OPTPROBES=y
+CONFIG_KPROBES_ON_FTRACE=y
+CONFIG_UPROBES=y
+CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
+CONFIG_ARCH_USE_BUILTIN_BSWAP=y
+CONFIG_KRETPROBES=y
+CONFIG_KRETPROBE_ON_RETHOOK=y
+CONFIG_USER_RETURN_NOTIFIER=y
+CONFIG_HAVE_IOREMAP_PROT=y
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_OPTPROBES=y
+CONFIG_HAVE_KPROBES_ON_FTRACE=y
+CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y
+CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y
+CONFIG_HAVE_NMI=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y
+CONFIG_HAVE_ARCH_TRACEHOOK=y
+CONFIG_HAVE_DMA_CONTIGUOUS=y
+CONFIG_GENERIC_SMP_IDLE_THREAD=y
+CONFIG_ARCH_HAS_FORTIFY_SOURCE=y
+CONFIG_ARCH_HAS_SET_MEMORY=y
+CONFIG_ARCH_HAS_SET_DIRECT_MAP=y
+CONFIG_ARCH_HAS_CPU_FINALIZE_INIT=y
+CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y
+CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y
+CONFIG_ARCH_WANTS_NO_INSTR=y
+CONFIG_HAVE_ASM_MODVERSIONS=y
+CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
+CONFIG_HAVE_RSEQ=y
+CONFIG_HAVE_RUST=y
+CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y
+CONFIG_HAVE_HW_BREAKPOINT=y
+CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y
+CONFIG_HAVE_USER_RETURN_NOTIFIER=y
+CONFIG_HAVE_PERF_EVENTS_NMI=y
+CONFIG_HAVE_HARDLOCKUP_DETECTOR_PERF=y
+CONFIG_UNWIND_USER=y
+CONFIG_HAVE_UNWIND_USER_FP=y
+CONFIG_HAVE_PERF_REGS=y
+CONFIG_HAVE_PERF_USER_STACK_DUMP=y
+CONFIG_HAVE_ARCH_JUMP_LABEL=y
+CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y
+CONFIG_MMU_GATHER_TABLE_FREE=y
+CONFIG_MMU_GATHER_RCU_TABLE_FREE=y
+CONFIG_MMU_GATHER_MERGE_VMAS=y
+CONFIG_ARCH_WANT_IRQS_OFF_ACTIVATE_MM=y
+CONFIG_MMU_LAZY_TLB_REFCOUNT=y
+CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
+CONFIG_ARCH_HAVE_EXTRA_ELF_NOTES=y
+CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS=y
+CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
+CONFIG_HAVE_CMPXCHG_LOCAL=y
+CONFIG_HAVE_CMPXCHG_DOUBLE=y
+CONFIG_HAVE_ARCH_SECCOMP=y
+CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
+CONFIG_SECCOMP=y
+CONFIG_SECCOMP_FILTER=y
+# CONFIG_SECCOMP_CACHE_DEBUG is not set
+CONFIG_HAVE_ARCH_KSTACK_ERASE=y
+CONFIG_HAVE_STACKPROTECTOR=y
+# CONFIG_STACKPROTECTOR is not set
+CONFIG_ARCH_SUPPORTS_LTO_CLANG=y
+CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y
+CONFIG_HAS_LTO_CLANG=y
+CONFIG_LTO_NONE=y
+# CONFIG_LTO_CLANG_FULL is not set
+# CONFIG_LTO_CLANG_THIN is not set
+CONFIG_ARCH_SUPPORTS_AUTOFDO_CLANG=y
+# CONFIG_AUTOFDO_CLANG is not set
+CONFIG_ARCH_SUPPORTS_PROPELLER_CLANG=y
+# CONFIG_PROPELLER_CLANG is not set
+CONFIG_ARCH_SUPPORTS_CFI=y
+# CONFIG_CFI is not set
+CONFIG_HAVE_CFI_ICALL_NORMALIZE_INTEGERS=y
+CONFIG_HAVE_CFI_ICALL_NORMALIZE_INTEGERS_RUSTC=y
+CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y
+CONFIG_HAVE_CONTEXT_TRACKING_USER=y
+CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y
+CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
+CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
+CONFIG_HAVE_PV_STEAL_CLOCK_GEN=y
+CONFIG_HAVE_MOVE_PUD=y
+CONFIG_HAVE_MOVE_PMD=y
+CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
+CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y
+CONFIG_HAVE_ARCH_HUGE_VMAP=y
+CONFIG_HAVE_ARCH_HUGE_VMALLOC=y
+CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
+CONFIG_ARCH_WANT_PMD_MKWRITE=y
+CONFIG_HAVE_ARCH_SOFT_DIRTY=y
+CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
+CONFIG_MODULES_USE_ELF_RELA=y
+CONFIG_ARCH_HAS_EXECMEM_ROX=y
+CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y
+CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y
+CONFIG_SOFTIRQ_ON_OWN_STACK=y
+CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
+CONFIG_HAVE_ARCH_MMAP_RND_BITS=y
+CONFIG_HAVE_EXIT_THREAD=y
+CONFIG_ARCH_MMAP_RND_BITS=28
+CONFIG_HAVE_PAGE_SIZE_4KB=y
+CONFIG_PAGE_SIZE_4KB=y
+CONFIG_PAGE_SIZE_LESS_THAN_64KB=y
+CONFIG_PAGE_SIZE_LESS_THAN_256KB=y
+CONFIG_PAGE_SHIFT=12
+CONFIG_HAVE_OBJTOOL=y
+CONFIG_HAVE_JUMP_LABEL_HACK=y
+CONFIG_HAVE_NOINSTR_HACK=y
+CONFIG_HAVE_NOINSTR_VALIDATION=y
+CONFIG_HAVE_UACCESS_VALIDATION=y
+CONFIG_HAVE_STACK_VALIDATION=y
+CONFIG_HAVE_RELIABLE_STACKTRACE=y
+# CONFIG_COMPAT_32BIT_TIME is not set
+CONFIG_ARCH_SUPPORTS_RT=y
+CONFIG_HAVE_ARCH_VMAP_STACK=y
+# CONFIG_VMAP_STACK is not set
+CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y
+# CONFIG_RANDOMIZE_KSTACK_OFFSET is not set
+CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
+CONFIG_STRICT_KERNEL_RWX=y
+CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y
+CONFIG_STRICT_MODULE_RWX=y
+CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y
+# CONFIG_LOCK_EVENT_COUNTS is not set
+CONFIG_ARCH_HAS_MEM_ENCRYPT=y
+CONFIG_HAVE_STATIC_CALL=y
+CONFIG_HAVE_STATIC_CALL_INLINE=y
+CONFIG_HAVE_PREEMPT_DYNAMIC=y
+CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y
+CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y
+CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
+CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y
+CONFIG_ARCH_HAS_ELFCORE_COMPAT=y
+CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y
+CONFIG_DYNAMIC_SIGFRAME=y
+CONFIG_ARCH_HAS_HW_PTE_YOUNG=y
+CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y
+CONFIG_ARCH_HAS_KERNEL_FPU_SUPPORT=y
+CONFIG_HAVE_GENERIC_TIF_BITS=y
+
+#
+# GCOV-based kernel profiling
+#
+# CONFIG_GCOV_KERNEL is not set
+CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
+# end of GCOV-based kernel profiling
+
+CONFIG_HAVE_GCC_PLUGINS=y
+CONFIG_FUNCTION_ALIGNMENT_4B=y
+CONFIG_FUNCTION_ALIGNMENT_16B=y
+CONFIG_FUNCTION_ALIGNMENT=16
+CONFIG_CC_HAS_SANE_FUNCTION_ALIGNMENT=y
+# end of General architecture-dependent options
+
+CONFIG_RT_MUTEXES=y
+CONFIG_MODULES=y
+CONFIG_MODULE_DEBUGFS=y
+# CONFIG_MODULE_DEBUG is not set
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+CONFIG_MODULE_UNLOAD_TAINT_TRACKING=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+# CONFIG_MODULE_SIG is not set
+# CONFIG_MODULE_COMPRESS is not set
+# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set
+CONFIG_MODPROBE_PATH="/sbin/modprobe"
+# CONFIG_TRIM_UNUSED_KSYMS is not set
+CONFIG_MODULES_TREE_LOOKUP=y
+CONFIG_BLOCK=y
+# CONFIG_BLOCK_LEGACY_AUTOLOAD is not set
+CONFIG_BLK_DEV_BSG_COMMON=y
+# CONFIG_BLK_DEV_BSGLIB is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
+# CONFIG_BLK_DEV_WRITE_MOUNTED is not set
+CONFIG_BLK_DEV_ZONED=y
+# CONFIG_BLK_WBT is not set
+# CONFIG_BLK_DEBUG_FS is not set
+CONFIG_BLK_INLINE_ENCRYPTION=y
+CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_EFI_PARTITION=y
+# end of Partition Types
+
+#
+# IO Schedulers
+#
+# CONFIG_MQ_IOSCHED_DEADLINE is not set
+# CONFIG_MQ_IOSCHED_KYBER is not set
+# CONFIG_IOSCHED_BFQ is not set
+# end of IO Schedulers
+
+CONFIG_PREEMPT_NOTIFIERS=y
+CONFIG_PADATA=y
+CONFIG_UNINLINE_SPIN_UNLOCK=y
+CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
+CONFIG_MUTEX_SPIN_ON_OWNER=y
+CONFIG_RWSEM_SPIN_ON_OWNER=y
+CONFIG_LOCK_SPIN_ON_OWNER=y
+CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y
+CONFIG_QUEUED_SPINLOCKS=y
+CONFIG_ARCH_USE_QUEUED_RWLOCKS=y
+CONFIG_QUEUED_RWLOCKS=y
+CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y
+CONFIG_ARCH_HAS_SYNC_CORE_BEFORE_USERMODE=y
+CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_ELFCORE=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_BINFMT_SCRIPT=y
+CONFIG_BINFMT_MISC=y
+CONFIG_COREDUMP=y
+# end of Executable file formats
+
+#
+# Memory Management options
+#
+CONFIG_SWAP=y
+
+#
+# Slab allocator options
+#
+CONFIG_SLUB=y
+CONFIG_KVFREE_RCU_BATCHED=y
+# CONFIG_SLUB_TINY is not set
+# CONFIG_SLAB_MERGE_DEFAULT is not set
+# CONFIG_SLAB_FREELIST_RANDOM is not set
+# CONFIG_SLAB_FREELIST_HARDENED is not set
+# CONFIG_SLAB_BUCKETS is not set
+# CONFIG_SLUB_STATS is not set
+# CONFIG_RANDOM_KMALLOC_CACHES is not set
+# end of Slab allocator options
+
+# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set
+# CONFIG_COMPAT_BRK is not set
+CONFIG_SPARSEMEM=y
+CONFIG_SPARSEMEM_EXTREME=y
+CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
+CONFIG_SPARSEMEM_VMEMMAP=y
+CONFIG_SPARSEMEM_VMEMMAP_PREINIT=y
+CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP=y
+CONFIG_ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP=y
+CONFIG_ARCH_WANT_HUGETLB_VMEMMAP_PREINIT=y
+CONFIG_HAVE_GUP_FAST=y
+CONFIG_MEMORY_ISOLATION=y
+CONFIG_HAVE_BOOTMEM_INFO_NODE=y
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+CONFIG_MEMORY_HOTPLUG=y
+CONFIG_MHP_DEFAULT_ONLINE_TYPE_OFFLINE=y
+# CONFIG_MHP_DEFAULT_ONLINE_TYPE_ONLINE_AUTO is not set
+# CONFIG_MHP_DEFAULT_ONLINE_TYPE_ONLINE_KERNEL is not set
+# CONFIG_MHP_DEFAULT_ONLINE_TYPE_ONLINE_MOVABLE is not set
+CONFIG_MEMORY_HOTREMOVE=y
+CONFIG_MHP_MEMMAP_ON_MEMORY=y
+CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y
+CONFIG_SPLIT_PTE_PTLOCKS=y
+CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y
+CONFIG_SPLIT_PMD_PTLOCKS=y
+CONFIG_COMPACTION=y
+CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1
+# CONFIG_PAGE_REPORTING is not set
+CONFIG_MIGRATION=y
+CONFIG_DEVICE_MIGRATION=y
+CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y
+CONFIG_ARCH_ENABLE_THP_MIGRATION=y
+CONFIG_CONTIG_ALLOC=y
+CONFIG_PCP_BATCH_SCALE_MAX=5
+CONFIG_PHYS_ADDR_T_64BIT=y
+CONFIG_MMU_NOTIFIER=y
+# CONFIG_KSM is not set
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
+CONFIG_ARCH_WANTS_THP_SWAP=y
+# CONFIG_PERSISTENT_HUGE_ZERO_FOLIO is not set
+CONFIG_MM_ID=y
+CONFIG_TRANSPARENT_HUGEPAGE=y
+CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
+# CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set
+# CONFIG_TRANSPARENT_HUGEPAGE_NEVER is not set
+CONFIG_TRANSPARENT_HUGEPAGE_SHMEM_HUGE_NEVER=y
+# CONFIG_TRANSPARENT_HUGEPAGE_SHMEM_HUGE_ALWAYS is not set
+# CONFIG_TRANSPARENT_HUGEPAGE_SHMEM_HUGE_WITHIN_SIZE is not set
+# CONFIG_TRANSPARENT_HUGEPAGE_SHMEM_HUGE_ADVISE is not set
+CONFIG_TRANSPARENT_HUGEPAGE_TMPFS_HUGE_NEVER=y
+# CONFIG_TRANSPARENT_HUGEPAGE_TMPFS_HUGE_ALWAYS is not set
+# CONFIG_TRANSPARENT_HUGEPAGE_TMPFS_HUGE_WITHIN_SIZE is not set
+# CONFIG_TRANSPARENT_HUGEPAGE_TMPFS_HUGE_ADVISE is not set
+# CONFIG_READ_ONLY_THP_FOR_FS is not set
+# CONFIG_NO_PAGE_MAPCOUNT is not set
+CONFIG_PAGE_MAPCOUNT=y
+CONFIG_PGTABLE_HAS_HUGE_LEAVES=y
+CONFIG_HAVE_GIGANTIC_FOLIOS=y
+CONFIG_ARCH_SUPPORTS_HUGE_PFNMAP=y
+CONFIG_ARCH_SUPPORTS_PMD_PFNMAP=y
+CONFIG_ARCH_SUPPORTS_PUD_PFNMAP=y
+CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
+CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
+CONFIG_HAVE_SETUP_PER_CPU_AREA=y
+CONFIG_CMA=y
+# CONFIG_CMA_DEBUGFS is not set
+CONFIG_CMA_SYSFS=y
+CONFIG_CMA_AREAS=8
+CONFIG_PAGE_BLOCK_MAX_ORDER=10
+# CONFIG_MEM_SOFT_DIRTY is not set
+CONFIG_GENERIC_EARLY_IOREMAP=y
+# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set
+CONFIG_PAGE_IDLE_FLAG=y
+# CONFIG_IDLE_PAGE_TRACKING is not set
+CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
+CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y
+CONFIG_ARCH_HAS_ZONE_DMA_SET=y
+CONFIG_ZONE_DMA=y
+CONFIG_ZONE_DMA32=y
+CONFIG_ZONE_DEVICE=y
+# CONFIG_DEVICE_PRIVATE is not set
+CONFIG_VM_EVENT_COUNTERS=y
+# CONFIG_PERCPU_STATS is not set
+# CONFIG_GUP_TEST is not set
+# CONFIG_DMAPOOL_TEST is not set
+CONFIG_ARCH_HAS_PTE_SPECIAL=y
+CONFIG_MEMFD_CREATE=y
+# CONFIG_SECRETMEM is not set
+# CONFIG_ANON_VMA_NAME is not set
+# CONFIG_USERFAULTFD is not set
+# CONFIG_LRU_GEN is not set
+CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y
+CONFIG_PER_VMA_LOCK=y
+CONFIG_LOCK_MM_AND_FIND_VMA=y
+CONFIG_EXECMEM=y
+CONFIG_PT_RECLAIM=y
+
+#
+# Data Access Monitoring
+#
+CONFIG_DAMON=y
+CONFIG_DAMON_VADDR=y
+CONFIG_DAMON_PADDR=y
+CONFIG_DAMON_SYSFS=y
+CONFIG_DAMON_RECLAIM=y
+CONFIG_DAMON_LRU_SORT=y
+CONFIG_DAMON_STAT=y
+CONFIG_DAMON_STAT_ENABLED_DEFAULT=y
+# end of Data Access Monitoring
+# end of Memory Management options
+
+CONFIG_NET=y
+CONFIG_NET_INGRESS=y
+CONFIG_NET_EGRESS=y
+CONFIG_NET_XGRESS=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=m
+# CONFIG_PACKET_DIAG is not set
+# CONFIG_INET_PSP is not set
+CONFIG_UNIX=y
+# CONFIG_AF_UNIX_OOB is not set
+CONFIG_UNIX_DIAG=y
+# CONFIG_TLS is not set
+# CONFIG_XFRM_USER is not set
+# CONFIG_NET_KEY is not set
+# CONFIG_DIBS is not set
+# CONFIG_XDP_SOCKETS is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE_DEMUX is not set
+CONFIG_NET_IP_TUNNEL=y
+CONFIG_SYN_COOKIES=y
+# CONFIG_NET_IPVTI is not set
+CONFIG_NET_UDP_TUNNEL=y
+# CONFIG_NET_FOU is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+CONFIG_INET_TABLE_PERTURB_ORDER=16
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_IPV6_OPTIMISTIC_DAD is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_IPV6_ILA is not set
+# CONFIG_IPV6_VTI is not set
+# CONFIG_IPV6_SIT is not set
+# CONFIG_IPV6_TUNNEL is not set
+CONFIG_IPV6_MULTIPLE_TABLES=y
+# CONFIG_IPV6_SUBTREES is not set
+# CONFIG_IPV6_MROUTE is not set
+CONFIG_IPV6_SEG6_LWTUNNEL=y
+# CONFIG_IPV6_SEG6_HMAC is not set
+# CONFIG_IPV6_RPL_LWTUNNEL is not set
+# CONFIG_IPV6_IOAM6_LWTUNNEL is not set
+# CONFIG_NETLABEL is not set
+# CONFIG_MPTCP is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
+CONFIG_NETFILTER=y
+CONFIG_NETFILTER_ADVANCED=y
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_INGRESS is not set
+# CONFIG_NETFILTER_EGRESS is not set
+CONFIG_NETFILTER_BPF_LINK=y
+# CONFIG_NETFILTER_NETLINK_ACCT is not set
+# CONFIG_NETFILTER_NETLINK_QUEUE is not set
+# CONFIG_NETFILTER_NETLINK_LOG is not set
+# CONFIG_NETFILTER_NETLINK_OSF is not set
+# CONFIG_NF_CONNTRACK is not set
+# CONFIG_NF_LOG_SYSLOG is not set
+# CONFIG_NF_TABLES is not set
+CONFIG_NETFILTER_XTABLES=y
+# CONFIG_NETFILTER_XTABLES_LEGACY is not set
+
+#
+# Xtables combined modules
+#
+# CONFIG_NETFILTER_XT_MARK is not set
+
+#
+# Xtables targets
+#
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_HMARK is not set
+# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set
+# CONFIG_NETFILTER_XT_TARGET_LOG is not set
+# CONFIG_NETFILTER_XT_TARGET_MARK is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
+# CONFIG_NETFILTER_XT_TARGET_TEE is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+
+#
+# Xtables matches
+#
+# CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set
+CONFIG_NETFILTER_XT_MATCH_BPF=y
+# CONFIG_NETFILTER_XT_MATCH_CGROUP is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_CPU is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ECN is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+# CONFIG_NETFILTER_XT_MATCH_HL is not set
+# CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set
+# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
+# CONFIG_NETFILTER_XT_MATCH_L2TP is not set
+# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
+# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set
+# CONFIG_NETFILTER_XT_MATCH_MAC is not set
+# CONFIG_NETFILTER_XT_MATCH_MARK is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set
+# CONFIG_NETFILTER_XT_MATCH_OSF is not set
+# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_RECENT is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_SOCKET is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_TIME is not set
+# CONFIG_NETFILTER_XT_MATCH_U32 is not set
+# end of Core Netfilter Configuration
+
+# CONFIG_IP_SET is not set
+# CONFIG_IP_VS is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_NF_SOCKET_IPV4 is not set
+# CONFIG_NF_TPROXY_IPV4 is not set
+# CONFIG_NF_DUP_IPV4 is not set
+# CONFIG_NF_LOG_ARP is not set
+# CONFIG_NF_LOG_IPV4 is not set
+# CONFIG_NF_REJECT_IPV4 is not set
+# CONFIG_IP_NF_IPTABLES is not set
+# end of IP: Netfilter Configuration
+
+#
+# IPv6: Netfilter Configuration
+#
+# CONFIG_NF_SOCKET_IPV6 is not set
+# CONFIG_NF_TPROXY_IPV6 is not set
+# CONFIG_NF_DUP_IPV6 is not set
+# CONFIG_NF_REJECT_IPV6 is not set
+# CONFIG_NF_LOG_IPV6 is not set
+# CONFIG_IP6_NF_IPTABLES is not set
+# end of IPv6: Netfilter Configuration
+
+# CONFIG_IP_SCTP is not set
+# CONFIG_RDS is not set
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_L2TP is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_NET_DSA is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_LLC2 is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_PHONET is not set
+# CONFIG_6LOWPAN is not set
+# CONFIG_IEEE802154 is not set
+CONFIG_NET_SCHED=y
+
+#
+# Queueing/Scheduling
+#
+# CONFIG_NET_SCH_HTB is not set
+# CONFIG_NET_SCH_HFSC is not set
+# CONFIG_NET_SCH_PRIO is not set
+# CONFIG_NET_SCH_MULTIQ is not set
+# CONFIG_NET_SCH_RED is not set
+# CONFIG_NET_SCH_SFB is not set
+CONFIG_NET_SCH_SFQ=y
+# CONFIG_NET_SCH_TEQL is not set
+# CONFIG_NET_SCH_TBF is not set
+# CONFIG_NET_SCH_CBS is not set
+# CONFIG_NET_SCH_ETF is not set
+# CONFIG_NET_SCH_TAPRIO is not set
+# CONFIG_NET_SCH_GRED is not set
+# CONFIG_NET_SCH_NETEM is not set
+# CONFIG_NET_SCH_DRR is not set
+# CONFIG_NET_SCH_MQPRIO is not set
+# CONFIG_NET_SCH_SKBPRIO is not set
+# CONFIG_NET_SCH_CHOKE is not set
+# CONFIG_NET_SCH_QFQ is not set
+# CONFIG_NET_SCH_CODEL is not set
+# CONFIG_NET_SCH_FQ_CODEL is not set
+# CONFIG_NET_SCH_CAKE is not set
+# CONFIG_NET_SCH_FQ is not set
+# CONFIG_NET_SCH_HHF is not set
+# CONFIG_NET_SCH_PIE is not set
+# CONFIG_NET_SCH_INGRESS is not set
+# CONFIG_NET_SCH_PLUG is not set
+# CONFIG_NET_SCH_ETS is not set
+# CONFIG_NET_SCH_BPF is not set
+# CONFIG_NET_SCH_DUALPI2 is not set
+# CONFIG_NET_SCH_DEFAULT is not set
+
+#
+# Classification
+#
+CONFIG_NET_CLS=y
+# CONFIG_NET_CLS_BASIC is not set
+# CONFIG_NET_CLS_ROUTE4 is not set
+# CONFIG_NET_CLS_FW is not set
+# CONFIG_NET_CLS_U32 is not set
+# CONFIG_NET_CLS_FLOW is not set
+# CONFIG_NET_CLS_CGROUP is not set
+CONFIG_NET_CLS_BPF=y
+# CONFIG_NET_CLS_FLOWER is not set
+# CONFIG_NET_CLS_MATCHALL is not set
+# CONFIG_NET_EMATCH is not set
+CONFIG_NET_CLS_ACT=y
+CONFIG_NET_ACT_POLICE=y
+CONFIG_NET_ACT_GACT=y
+# CONFIG_GACT_PROB is not set
+# CONFIG_NET_ACT_MIRRED is not set
+# CONFIG_NET_ACT_SAMPLE is not set
+# CONFIG_NET_ACT_NAT is not set
+# CONFIG_NET_ACT_PEDIT is not set
+# CONFIG_NET_ACT_SIMP is not set
+# CONFIG_NET_ACT_SKBEDIT is not set
+# CONFIG_NET_ACT_CSUM is not set
+# CONFIG_NET_ACT_MPLS is not set
+# CONFIG_NET_ACT_VLAN is not set
+CONFIG_NET_ACT_BPF=y
+# CONFIG_NET_ACT_SKBMOD is not set
+# CONFIG_NET_ACT_IFE is not set
+# CONFIG_NET_ACT_TUNNEL_KEY is not set
+# CONFIG_NET_ACT_GATE is not set
+# CONFIG_NET_TC_SKB_EXT is not set
+CONFIG_NET_SCH_FIFO=y
+# CONFIG_DCB is not set
+# CONFIG_BATMAN_ADV is not set
+# CONFIG_OPENVSWITCH is not set
+CONFIG_VSOCKETS=m
+CONFIG_VSOCKETS_DIAG=m
+CONFIG_VSOCKETS_LOOPBACK=m
+CONFIG_VIRTIO_VSOCKETS=m
+CONFIG_VIRTIO_VSOCKETS_COMMON=m
+# CONFIG_NETLINK_DIAG is not set
+# CONFIG_MPLS is not set
+# CONFIG_NET_NSH is not set
+# CONFIG_HSR is not set
+# CONFIG_NET_SWITCHDEV is not set
+# CONFIG_NET_L3_MASTER_DEV is not set
+# CONFIG_QRTR is not set
+# CONFIG_NET_NCSI is not set
+# CONFIG_PCPU_DEV_REFCNT is not set
+CONFIG_MAX_SKB_FRAGS=17
+# CONFIG_RPS is not set
+CONFIG_SOCK_RX_QUEUE_MAPPING=y
+CONFIG_XPS=y
+# CONFIG_CGROUP_NET_PRIO is not set
+# CONFIG_CGROUP_NET_CLASSID is not set
+CONFIG_NET_RX_BUSY_POLL=y
+# CONFIG_BQL is not set
+CONFIG_BPF_STREAM_PARSER=y
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_NET_DROP_MONITOR is not set
+# end of Network testing
+# end of Networking options
+
+# CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
+# CONFIG_BT is not set
+# CONFIG_AF_RXRPC is not set
+# CONFIG_AF_KCM is not set
+CONFIG_STREAM_PARSER=y
+# CONFIG_MCTP is not set
+CONFIG_FIB_RULES=y
+# CONFIG_WIRELESS is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+# CONFIG_CAIF is not set
+# CONFIG_CEPH_LIB is not set
+# CONFIG_NFC is not set
+# CONFIG_PSAMPLE is not set
+# CONFIG_NET_IFE is not set
+CONFIG_LWTUNNEL=y
+CONFIG_LWTUNNEL_BPF=y
+CONFIG_DST_CACHE=y
+CONFIG_GRO_CELLS=y
+CONFIG_NET_SOCK_MSG=y
+CONFIG_PAGE_POOL=y
+# CONFIG_PAGE_POOL_STATS is not set
+CONFIG_FAILOVER=m
+# CONFIG_ETHTOOL_NETLINK is not set
+
+#
+# Device Drivers
+#
+CONFIG_HAVE_PCI=y
+CONFIG_GENERIC_PCI_IOMAP=y
+CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
+# CONFIG_PCIEPORTBUS is not set
+# CONFIG_PCIEASPM is not set
+# CONFIG_PCIE_PTM is not set
+CONFIG_PCI_MSI=y
+# CONFIG_PCI_QUIRKS is not set
+# CONFIG_PCI_DEBUG is not set
+# CONFIG_PCI_STUB is not set
+# CONFIG_PCI_TSM is not set
+# CONFIG_PCI_DOE is not set
+CONFIG_PCI_LOCKLESS_CONFIG=y
+# CONFIG_PCI_IOV is not set
+# CONFIG_PCI_PRI is not set
+# CONFIG_PCI_PASID is not set
+# CONFIG_PCIE_TPH is not set
+# CONFIG_PCI_P2PDMA is not set
+CONFIG_PCI_LABEL=y
+# CONFIG_PCIE_BUS_TUNE_OFF is not set
+CONFIG_PCIE_BUS_DEFAULT=y
+# CONFIG_PCIE_BUS_SAFE is not set
+# CONFIG_PCIE_BUS_PERFORMANCE is not set
+# CONFIG_PCIE_BUS_PEER2PEER is not set
+# CONFIG_VGA_ARB is not set
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# PCI controller drivers
+#
+# CONFIG_VMD is not set
+
+#
+# Cadence-based PCIe controllers
+#
+# end of Cadence-based PCIe controllers
+
+#
+# DesignWare-based PCIe controllers
+#
+# CONFIG_PCI_MESON is not set
+# CONFIG_PCIE_DW_PLAT_HOST is not set
+# end of DesignWare-based PCIe controllers
+
+#
+# Mobiveil-based PCIe controllers
+#
+# end of Mobiveil-based PCIe controllers
+
+#
+# PLDA-based PCIe controllers
+#
+# end of PLDA-based PCIe controllers
+# end of PCI controller drivers
+
+#
+# PCI Endpoint
+#
+# CONFIG_PCI_ENDPOINT is not set
+# end of PCI Endpoint
+
+#
+# PCI switch controller drivers
+#
+# CONFIG_PCI_SW_SWITCHTEC is not set
+# end of PCI switch controller drivers
+
+# CONFIG_PCI_PWRCTRL_SLOT is not set
+# CONFIG_CXL_BUS is not set
+# CONFIG_PCCARD is not set
+# CONFIG_RAPIDIO is not set
+# CONFIG_PC104 is not set
+
+#
+# Generic Driver Options
+#
+# CONFIG_UEVENT_HELPER is not set
+CONFIG_DEVTMPFS=y
+# CONFIG_DEVTMPFS_MOUNT is not set
+# CONFIG_DEVTMPFS_SAFE is not set
+# CONFIG_STANDALONE is not set
+# CONFIG_PREVENT_FIRMWARE_BUILD is not set
+
+#
+# Firmware loader
+#
+CONFIG_FW_LOADER=y
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_FW_LOADER_USER_HELPER is not set
+# CONFIG_FW_LOADER_COMPRESS is not set
+# CONFIG_FW_UPLOAD is not set
+# end of Firmware loader
+
+CONFIG_ALLOW_DEV_COREDUMP=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set
+# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set
+CONFIG_GENERIC_CPU_DEVICES=y
+CONFIG_GENERIC_CPU_AUTOPROBE=y
+CONFIG_GENERIC_CPU_VULNERABILITIES=y
+# CONFIG_FW_DEVLINK_SYNC_STATE_TIMEOUT is not set
+# end of Generic Driver Options
+
+#
+# Bus devices
+#
+# CONFIG_MHI_BUS is not set
+# CONFIG_MHI_BUS_EP is not set
+# end of Bus devices
+
+# CONFIG_CONNECTOR is not set
+
+#
+# Firmware Drivers
+#
+
+#
+# ARM System Control and Management Interface Protocol
+#
+# end of ARM System Control and Management Interface Protocol
+
+# CONFIG_EDD is not set
+# CONFIG_FIRMWARE_MEMMAP is not set
+CONFIG_DMIID=y
+# CONFIG_DMI_SYSFS is not set
+CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y
+# CONFIG_ISCSI_IBFT is not set
+# CONFIG_FW_CFG_SYSFS is not set
+# CONFIG_SYSFB_SIMPLEFB is not set
+# CONFIG_GOOGLE_FIRMWARE is not set
+
+#
+# Qualcomm firmware drivers
+#
+# end of Qualcomm firmware drivers
+
+#
+# Tegra firmware driver
+#
+# end of Tegra firmware driver
+# end of Firmware Drivers
+
+# CONFIG_FWCTL is not set
+# CONFIG_GNSS is not set
+# CONFIG_MTD is not set
+# CONFIG_OF is not set
+CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
+# CONFIG_PARPORT is not set
+CONFIG_PNP=y
+# CONFIG_PNP_DEBUG_MESSAGES is not set
+
+#
+# Protocols
+#
+CONFIG_PNPACPI=y
+CONFIG_BLK_DEV=y
+CONFIG_BLK_DEV_NULL_BLK=m
+# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
+# CONFIG_ZRAM is not set
+CONFIG_BLK_DEV_LOOP=m
+CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
+# CONFIG_BLK_DEV_DRBD is not set
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=m
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+# CONFIG_ATA_OVER_ETH is not set
+CONFIG_VIRTIO_BLK=m
+# CONFIG_BLK_DEV_RBD is not set
+# CONFIG_BLK_DEV_UBLK is not set
+
+#
+# NVME Support
+#
+CONFIG_NVME_CORE=m
+CONFIG_BLK_DEV_NVME=m
+# CONFIG_NVME_MULTIPATH is not set
+CONFIG_NVME_VERBOSE_ERRORS=y
+# CONFIG_NVME_HWMON is not set
+# CONFIG_NVME_FC is not set
+# CONFIG_NVME_TCP is not set
+# CONFIG_NVME_HOST_AUTH is not set
+# CONFIG_NVME_TARGET is not set
+# end of NVME Support
+
+#
+# Misc devices
+#
+# CONFIG_DUMMY_IRQ is not set
+# CONFIG_IBM_ASM is not set
+# CONFIG_PHANTOM is not set
+# CONFIG_RPMB is not set
+# CONFIG_TIFM_CORE is not set
+# CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_HP_ILO is not set
+# CONFIG_SRAM is not set
+# CONFIG_DW_XDATA_PCIE is not set
+# CONFIG_PCI_ENDPOINT_TEST is not set
+# CONFIG_XILINX_SDFEC is not set
+# CONFIG_NTSYNC is not set
+# CONFIG_NSM is not set
+# CONFIG_C2PORT is not set
+
+#
+# EEPROM support
+#
+# CONFIG_EEPROM_93CX6 is not set
+# end of EEPROM support
+
+# CONFIG_CB710_CORE is not set
+
+#
+# Altera FPGA firmware download module (requires I2C)
+#
+# CONFIG_INTEL_MEI is not set
+# CONFIG_VMWARE_VMCI is not set
+# CONFIG_GENWQE is not set
+# CONFIG_BCM_VK is not set
+# CONFIG_MISC_ALCOR_PCI is not set
+# CONFIG_MISC_RTSX_PCI is not set
+# CONFIG_UACCE is not set
+# CONFIG_PVPANIC is not set
+# end of Misc devices
+
+#
+# SCSI device support
+#
+CONFIG_SCSI_MOD=y
+# CONFIG_RAID_ATTRS is not set
+CONFIG_SCSI_COMMON=y
+CONFIG_SCSI=y
+CONFIG_SCSI_DMA=y
+# CONFIG_SCSI_PROC_FS is not set
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=m
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_BLK_DEV_SR is not set
+CONFIG_CHR_DEV_SG=m
+CONFIG_BLK_DEV_BSG=y
+# CONFIG_CHR_DEV_SCH is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+# CONFIG_SCSI_SRP_ATTRS is not set
+# end of SCSI Transports
+
+CONFIG_SCSI_LOWLEVEL=y
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_ISCSI_BOOT_SYSFS is not set
+# CONFIG_SCSI_CXGB3_ISCSI is not set
+# CONFIG_SCSI_BNX2_ISCSI is not set
+# CONFIG_BE2ISCSI is not set
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_HPSA is not set
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_3W_SAS is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_AIC94XX is not set
+# CONFIG_SCSI_MVSAS is not set
+# CONFIG_SCSI_MVUMI is not set
+# CONFIG_SCSI_ADVANSYS is not set
+# CONFIG_SCSI_ARCMSR is not set
+# CONFIG_SCSI_ESAS2R is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+# CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
+# CONFIG_SCSI_MPT3SAS is not set
+# CONFIG_SCSI_MPT2SAS is not set
+# CONFIG_SCSI_MPI3MR is not set
+# CONFIG_SCSI_SMARTPQI is not set
+# CONFIG_SCSI_HPTIOP is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_MYRB is not set
+# CONFIG_SCSI_MYRS is not set
+# CONFIG_VMWARE_PVSCSI is not set
+# CONFIG_SCSI_SNIC is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_FDOMAIN_PCI is not set
+# CONFIG_SCSI_ISCI is not set
+# CONFIG_SCSI_IPS is not set
+# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_STEX is not set
+# CONFIG_SCSI_SYM53C8XX_2 is not set
+# CONFIG_SCSI_IPR is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_QLA_ISCSI is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_AM53C974 is not set
+# CONFIG_SCSI_WD719X is not set
+CONFIG_SCSI_DEBUG=m
+# CONFIG_SCSI_PMCRAID is not set
+# CONFIG_SCSI_PM8001 is not set
+CONFIG_SCSI_VIRTIO=m
+# CONFIG_SCSI_DH is not set
+# end of SCSI device support
+
+# CONFIG_ATA is not set
+CONFIG_MD=y
+# CONFIG_BLK_DEV_MD is not set
+CONFIG_BLK_DEV_DM=m
+# CONFIG_DM_DEBUG is not set
+CONFIG_DM_BUFIO=m
+# CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set
+CONFIG_DM_BIO_PRISON=m
+CONFIG_DM_PERSISTENT_DATA=m
+# CONFIG_DM_UNSTRIPED is not set
+CONFIG_DM_CRYPT=m
+CONFIG_DM_SNAPSHOT=m
+CONFIG_DM_THIN_PROVISIONING=m
+# CONFIG_DM_CACHE is not set
+# CONFIG_DM_WRITECACHE is not set
+# CONFIG_DM_EBS is not set
+# CONFIG_DM_ERA is not set
+# CONFIG_DM_CLONE is not set
+# CONFIG_DM_MIRROR is not set
+CONFIG_DM_LOG_WRITES=m
+# CONFIG_DM_RAID is not set
+CONFIG_DM_ZERO=m
+# CONFIG_DM_MULTIPATH is not set
+CONFIG_DM_DELAY=m
+# CONFIG_DM_DUST is not set
+# CONFIG_DM_INIT is not set
+# CONFIG_DM_UEVENT is not set
+CONFIG_DM_FLAKEY=m
+# CONFIG_DM_VERITY is not set
+# CONFIG_DM_SWITCH is not set
+# CONFIG_DM_INTEGRITY is not set
+# CONFIG_DM_AUDIT is not set
+# CONFIG_TARGET_CORE is not set
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_FIREWIRE is not set
+# CONFIG_FIREWIRE_NOSY is not set
+# end of IEEE 1394 (FireWire) support
+
+# CONFIG_MACINTOSH_DRIVERS is not set
+CONFIG_NETDEVICES=y
+CONFIG_NET_CORE=y
+# CONFIG_BONDING is not set
+CONFIG_DUMMY=y
+# CONFIG_WIREGUARD is not set
+# CONFIG_OVPN is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_NET_FC is not set
+# CONFIG_NET_TEAM is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_IPVLAN is not set
+CONFIG_VXLAN=y
+# CONFIG_GENEVE is not set
+# CONFIG_BAREUDP is not set
+# CONFIG_GTP is not set
+# CONFIG_PFCP is not set
+# CONFIG_MACSEC is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_TUN is not set
+# CONFIG_TUN_VNET_CROSS_LE is not set
+# CONFIG_VETH is not set
+CONFIG_VIRTIO_NET=m
+# CONFIG_NLMON is not set
+# CONFIG_NETKIT is not set
+# CONFIG_ARCNET is not set
+# CONFIG_ETHERNET is not set
+# CONFIG_FDDI is not set
+# CONFIG_MDIO_BUS is not set
+# CONFIG_PHYLIB is not set
+
+#
+# PCS device drivers
+#
+# CONFIG_PCS_XPCS is not set
+# end of PCS device drivers
+
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+
+#
+# Host-side USB support is needed for USB Network Adapter support
+#
+# CONFIG_WLAN is not set
+# CONFIG_WAN is not set
+
+#
+# Wireless WAN
+#
+# CONFIG_WWAN is not set
+# end of Wireless WAN
+
+# CONFIG_VMXNET3 is not set
+# CONFIG_FUJITSU_ES is not set
+# CONFIG_NETDEVSIM is not set
+CONFIG_NET_FAILOVER=m
+# CONFIG_ISDN is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+# CONFIG_INPUT_SPARSEKMAP is not set
+# CONFIG_INPUT_MATRIXKMAP is not set
+
+#
+# Userland interfaces
+#
+# CONFIG_INPUT_MOUSEDEV is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+
+#
+# Input Device Drivers
+#
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+# CONFIG_RMI4_CORE is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y
+# CONFIG_GAMEPORT is not set
+# end of Hardware I/O ports
+# end of Input device support
+
+#
+# Character devices
+#
+CONFIG_TTY=y
+CONFIG_VT=y
+# CONFIG_CONSOLE_TRANSLATIONS is not set
+# CONFIG_VT_CONSOLE is not set
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+CONFIG_UNIX98_PTYS=y
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_LEGACY_TIOCSTI is not set
+# CONFIG_LDISC_AUTOLOAD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_EARLYCON=y
+CONFIG_SERIAL_8250=y
+# CONFIG_SERIAL_8250_PNP is not set
+# CONFIG_SERIAL_8250_16550A_VARIANTS is not set
+# CONFIG_SERIAL_8250_FINTEK is not set
+CONFIG_SERIAL_8250_CONSOLE=y
+# CONFIG_SERIAL_8250_PCI is not set
+# CONFIG_SERIAL_8250_EXAR is not set
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+# CONFIG_SERIAL_8250_PCI1XXXX is not set
+# CONFIG_SERIAL_8250_DW is not set
+# CONFIG_SERIAL_8250_RT288X is not set
+# CONFIG_SERIAL_8250_LPSS is not set
+# CONFIG_SERIAL_8250_MID is not set
+# CONFIG_SERIAL_8250_PERICOM is not set
+# CONFIG_SERIAL_8250_NI is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_UARTLITE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_JSM is not set
+# CONFIG_SERIAL_LANTIQ is not set
+# CONFIG_SERIAL_SCCNXP is not set
+# CONFIG_SERIAL_ALTERA_JTAGUART is not set
+# CONFIG_SERIAL_ALTERA_UART is not set
+# CONFIG_SERIAL_ARC is not set
+# CONFIG_SERIAL_RP2 is not set
+# CONFIG_SERIAL_FSL_LPUART is not set
+# CONFIG_SERIAL_FSL_LINFLEXUART is not set
+# end of Serial drivers
+
+# CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_N_GSM is not set
+# CONFIG_NOZOMI is not set
+# CONFIG_NULL_TTY is not set
+CONFIG_HVC_DRIVER=y
+# CONFIG_SERIAL_DEV_BUS is not set
+# CONFIG_TTY_PRINTK is not set
+CONFIG_VIRTIO_CONSOLE=m
+# CONFIG_IPMI_HANDLER is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_HW_RANDOM_TIMERIOMEM is not set
+# CONFIG_HW_RANDOM_INTEL is not set
+# CONFIG_HW_RANDOM_AMD is not set
+# CONFIG_HW_RANDOM_BA431 is not set
+# CONFIG_HW_RANDOM_VIA is not set
+# CONFIG_HW_RANDOM_VIRTIO is not set
+# CONFIG_HW_RANDOM_XIPHERA is not set
+# CONFIG_APPLICOM is not set
+CONFIG_DEVMEM=y
+# CONFIG_NVRAM is not set
+# CONFIG_DEVPORT is not set
+# CONFIG_HPET is not set
+# CONFIG_HANGCHECK_TIMER is not set
+# CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
+# CONFIG_XILLYBUS is not set
+# end of Character devices
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+# end of I2C support
+
+# CONFIG_I3C is not set
+# CONFIG_SPI is not set
+# CONFIG_SPMI is not set
+# CONFIG_HSI is not set
+# CONFIG_PPS is not set
+
+#
+# PTP clock support
+#
+# CONFIG_PTP_1588_CLOCK is not set
+CONFIG_PTP_1588_CLOCK_OPTIONAL=y
+
+#
+# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
+#
+# end of PTP clock support
+
+#
+# DPLL device support
+#
+# end of DPLL device support
+
+# CONFIG_PINCTRL is not set
+CONFIG_GPIOLIB_LEGACY=y
+# CONFIG_GPIOLIB is not set
+# CONFIG_W1 is not set
+# CONFIG_POWER_RESET is not set
+# CONFIG_POWER_SEQUENCING is not set
+# CONFIG_POWER_SUPPLY is not set
+CONFIG_HWMON=y
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Native drivers
+#
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_ABITUGURU3 is not set
+# CONFIG_SENSORS_AS370 is not set
+# CONFIG_SENSORS_AXI_FAN_CONTROL is not set
+# CONFIG_SENSORS_K8TEMP is not set
+# CONFIG_SENSORS_K10TEMP is not set
+# CONFIG_SENSORS_FAM15H_POWER is not set
+# CONFIG_SENSORS_APPLESMC is not set
+# CONFIG_SENSORS_I5K_AMB is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_F71882FG is not set
+# CONFIG_SENSORS_GPD is not set
+# CONFIG_SENSORS_I5500 is not set
+# CONFIG_SENSORS_CORETEMP is not set
+# CONFIG_SENSORS_IT87 is not set
+# CONFIG_SENSORS_LENOVO_EC is not set
+# CONFIG_SENSORS_MAX197 is not set
+# CONFIG_SENSORS_MR75203 is not set
+# CONFIG_SENSORS_PC87360 is not set
+# CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_NCT6683 is not set
+# CONFIG_SENSORS_NCT6775 is not set
+# CONFIG_SENSORS_NPCM7XX is not set
+# CONFIG_SENSORS_SIS5595 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_VIA_CPUTEMP is not set
+# CONFIG_SENSORS_VIA686A is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_SENSORS_VT8231 is not set
+# CONFIG_SENSORS_W83627HF is not set
+# CONFIG_SENSORS_W83627EHF is not set
+
+#
+# ACPI drivers
+#
+# CONFIG_SENSORS_ACPI_POWER is not set
+# CONFIG_SENSORS_ATK0110 is not set
+# CONFIG_THERMAL is not set
+# CONFIG_WATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+# CONFIG_SSB is not set
+CONFIG_BCMA_POSSIBLE=y
+# CONFIG_BCMA is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_CGBC is not set
+# CONFIG_MFD_MADERA is not set
+# CONFIG_LPC_ICH is not set
+# CONFIG_LPC_SCH is not set
+# CONFIG_MFD_INTEL_LPSS_ACPI is not set
+# CONFIG_MFD_INTEL_LPSS_PCI is not set
+# CONFIG_MFD_JANZ_CMODIO is not set
+# CONFIG_MFD_KEMPLD is not set
+# CONFIG_MFD_MT6397 is not set
+# CONFIG_MFD_RDC321X is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_MFD_SYSCON is not set
+# CONFIG_MFD_TQMX86 is not set
+# CONFIG_MFD_VX855 is not set
+# CONFIG_MFD_UPBOARD_FPGA is not set
+# end of Multifunction device drivers
+
+# CONFIG_REGULATOR is not set
+CONFIG_RC_CORE=y
+CONFIG_BPF_LIRC_MODE2=y
+CONFIG_LIRC=y
+# CONFIG_RC_MAP is not set
+# CONFIG_RC_DECODERS is not set
+# CONFIG_RC_DEVICES is not set
+
+#
+# CEC support
+#
+# CONFIG_MEDIA_CEC_SUPPORT is not set
+# end of CEC support
+
+# CONFIG_MEDIA_SUPPORT is not set
+
+#
+# Graphics support
+#
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_AGP is not set
+# CONFIG_VGA_SWITCHEROO is not set
+# CONFIG_DRM is not set
+
+#
+# Frame buffer Devices
+#
+# CONFIG_FB is not set
+# end of Frame buffer Devices
+
+#
+# Backlight & LCD device support
+#
+# CONFIG_LCD_CLASS_DEVICE is not set
+# CONFIG_BACKLIGHT_CLASS_DEVICE is not set
+# end of Backlight & LCD device support
+
+# CONFIG_FIRMWARE_EDID is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_DUMMY_CONSOLE_COLUMNS=80
+CONFIG_DUMMY_CONSOLE_ROWS=25
+# end of Console display driver support
+
+# CONFIG_TRACE_GPU_MEM is not set
+# end of Graphics support
+
+# CONFIG_SOUND is not set
+# CONFIG_HID_SUPPORT is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+CONFIG_USB_SUPPORT=y
+# CONFIG_USB_ULPI_BUS is not set
+CONFIG_USB_ARCH_HAS_HCD=y
+# CONFIG_USB is not set
+# CONFIG_USB_PCI is not set
+
+#
+# USB dual-mode controller drivers
+#
+
+#
+# USB port drivers
+#
+
+#
+# USB Physical Layer drivers
+#
+# CONFIG_NOP_USB_XCEIV is not set
+# end of USB Physical Layer drivers
+
+# CONFIG_USB_GADGET is not set
+# CONFIG_TYPEC is not set
+# CONFIG_USB_ROLE_SWITCH is not set
+# CONFIG_MMC is not set
+# CONFIG_SCSI_UFSHCD is not set
+# CONFIG_MEMSTICK is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_ACCESSIBILITY is not set
+# CONFIG_INFINIBAND is not set
+CONFIG_EDAC_ATOMIC_SCRUB=y
+CONFIG_EDAC_SUPPORT=y
+CONFIG_RTC_LIB=y
+CONFIG_RTC_MC146818_LIB=y
+# CONFIG_RTC_CLASS is not set
+# CONFIG_DMADEVICES is not set
+
+#
+# DMABUF options
+#
+# CONFIG_SYNC_FILE is not set
+# CONFIG_DMABUF_HEAPS is not set
+# end of DMABUF options
+
+# CONFIG_UIO is not set
+# CONFIG_VFIO is not set
+CONFIG_IRQ_BYPASS_MANAGER=m
+# CONFIG_VIRT_DRIVERS is not set
+CONFIG_VIRTIO_ANCHOR=y
+CONFIG_VIRTIO=y
+CONFIG_VIRTIO_PCI_LIB=y
+CONFIG_VIRTIO_PCI_LIB_LEGACY=y
+CONFIG_VIRTIO_MENU=y
+CONFIG_VIRTIO_PCI=y
+CONFIG_VIRTIO_PCI_ADMIN_LEGACY=y
+CONFIG_VIRTIO_PCI_LEGACY=y
+# CONFIG_VIRTIO_BALLOON is not set
+# CONFIG_VIRTIO_INPUT is not set
+# CONFIG_VIRTIO_MMIO is not set
+# CONFIG_VIRTIO_DEBUG is not set
+# CONFIG_VIRTIO_RTC is not set
+# CONFIG_VDPA is not set
+CONFIG_VHOST_TASK=y
+# CONFIG_VHOST_MENU is not set
+
+#
+# Microsoft Hyper-V guest support
+#
+# CONFIG_HYPERV is not set
+# end of Microsoft Hyper-V guest support
+
+# CONFIG_GREYBUS is not set
+# CONFIG_COMEDI is not set
+# CONFIG_GPIB is not set
+# CONFIG_STAGING is not set
+# CONFIG_GOLDFISH is not set
+# CONFIG_CHROME_PLATFORMS is not set
+# CONFIG_MELLANOX_PLATFORM is not set
+# CONFIG_SURFACE_PLATFORMS is not set
+# CONFIG_X86_PLATFORM_DEVICES is not set
+# CONFIG_ACPI_WMI is not set
+# CONFIG_COMMON_CLK is not set
+# CONFIG_HWSPINLOCK is not set
+
+#
+# Clock Source drivers
+#
+CONFIG_CLKEVT_I8253=y
+CONFIG_CLKBLD_I8253=y
+# end of Clock Source drivers
+
+# CONFIG_MAILBOX is not set
+CONFIG_IOMMU_IOVA=y
+CONFIG_IOMMU_API=y
+CONFIG_IOMMU_SUPPORT=y
+
+#
+# Generic IOMMU Pagetable Support
+#
+# end of Generic IOMMU Pagetable Support
+
+# CONFIG_IOMMU_DEBUGFS is not set
+# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set
+CONFIG_IOMMU_DEFAULT_DMA_LAZY=y
+# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set
+CONFIG_IOMMU_DMA=y
+# CONFIG_AMD_IOMMU is not set
+# CONFIG_INTEL_IOMMU is not set
+# CONFIG_IOMMUFD is not set
+# CONFIG_IRQ_REMAP is not set
+# CONFIG_VIRTIO_IOMMU is not set
+
+#
+# Remoteproc drivers
+#
+# CONFIG_REMOTEPROC is not set
+# end of Remoteproc drivers
+
+#
+# Rpmsg drivers
+#
+# CONFIG_RPMSG_VIRTIO is not set
+# end of Rpmsg drivers
+
+#
+# SOC (System On Chip) specific Drivers
+#
+
+#
+# Amlogic SoC drivers
+#
+# end of Amlogic SoC drivers
+
+#
+# Broadcom SoC drivers
+#
+# end of Broadcom SoC drivers
+
+#
+# NXP/Freescale QorIQ SoC drivers
+#
+# end of NXP/Freescale QorIQ SoC drivers
+
+#
+# fujitsu SoC drivers
+#
+# end of fujitsu SoC drivers
+
+#
+# i.MX SoC drivers
+#
+# end of i.MX SoC drivers
+
+#
+# Enable LiteX SoC Builder specific drivers
+#
+# end of Enable LiteX SoC Builder specific drivers
+
+# CONFIG_WPCM450_SOC is not set
+
+#
+# Qualcomm SoC drivers
+#
+# end of Qualcomm SoC drivers
+
+# CONFIG_SOC_TI is not set
+
+#
+# Xilinx SoC drivers
+#
+# end of Xilinx SoC drivers
+# end of SOC (System On Chip) specific Drivers
+
+#
+# PM Domains
+#
+
+#
+# Amlogic PM Domains
+#
+# end of Amlogic PM Domains
+
+#
+# Broadcom PM Domains
+#
+# end of Broadcom PM Domains
+
+#
+# i.MX PM Domains
+#
+# end of i.MX PM Domains
+
+#
+# Qualcomm PM Domains
+#
+# end of Qualcomm PM Domains
+# end of PM Domains
+
+# CONFIG_PM_DEVFREQ is not set
+# CONFIG_EXTCON is not set
+# CONFIG_MEMORY is not set
+# CONFIG_IIO is not set
+# CONFIG_NTB is not set
+# CONFIG_PWM is not set
+
+#
+# IRQ chip support
+#
+# end of IRQ chip support
+
+# CONFIG_IPACK_BUS is not set
+# CONFIG_RESET_CONTROLLER is not set
+
+#
+# PHY Subsystem
+#
+# CONFIG_GENERIC_PHY is not set
+# CONFIG_USB_LGM_PHY is not set
+# CONFIG_PHY_CAN_TRANSCEIVER is not set
+
+#
+# PHY drivers for Broadcom platforms
+#
+# CONFIG_BCM_KONA_USB2_PHY is not set
+# end of PHY drivers for Broadcom platforms
+
+# CONFIG_PHY_PXA_28NM_HSIC is not set
+# CONFIG_PHY_PXA_28NM_USB2 is not set
+# CONFIG_PHY_INTEL_LGM_EMMC is not set
+# end of PHY Subsystem
+
+# CONFIG_POWERCAP is not set
+# CONFIG_MCB is not set
+
+#
+# Performance monitor support
+#
+# CONFIG_DWC_PCIE_PMU is not set
+# end of Performance monitor support
+
+# CONFIG_RAS is not set
+# CONFIG_USB4 is not set
+
+#
+# Android
+#
+# CONFIG_ANDROID_BINDER_IPC is not set
+# end of Android
+
+# CONFIG_LIBNVDIMM is not set
+CONFIG_DAX=y
+# CONFIG_DEV_DAX is not set
+# CONFIG_NVMEM is not set
+
+#
+# HW tracing support
+#
+# CONFIG_STM is not set
+# CONFIG_INTEL_TH is not set
+# end of HW tracing support
+
+# CONFIG_FPGA is not set
+# CONFIG_TEE is not set
+# CONFIG_SIOX is not set
+# CONFIG_SLIMBUS is not set
+# CONFIG_INTERCONNECT is not set
+# CONFIG_COUNTER is not set
+# CONFIG_MOST is not set
+# CONFIG_PECI is not set
+# CONFIG_HTE is not set
+# end of Device Drivers
+
+#
+# File systems
+#
+CONFIG_DCACHE_WORD_ACCESS=y
+# CONFIG_VALIDATE_FS_PARSER is not set
+CONFIG_FS_IOMAP=y
+CONFIG_FS_STACK=y
+CONFIG_BUFFER_HEAD=y
+# CONFIG_EXT2_FS is not set
+CONFIG_EXT4_FS=m
+CONFIG_EXT4_USE_FOR_EXT2=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+# CONFIG_EXT4_FS_SECURITY is not set
+# CONFIG_EXT4_DEBUG is not set
+CONFIG_JBD2=m
+# CONFIG_JBD2_DEBUG is not set
+CONFIG_FS_MBCACHE=m
+# CONFIG_JFS_FS is not set
+CONFIG_XFS_FS=m
+CONFIG_XFS_SUPPORT_V4=y
+CONFIG_XFS_SUPPORT_ASCII_CI=y
+CONFIG_XFS_QUOTA=y
+CONFIG_XFS_POSIX_ACL=y
+CONFIG_XFS_RT=y
+CONFIG_XFS_ONLINE_SCRUB=y
+CONFIG_XFS_ONLINE_SCRUB_STATS=y
+CONFIG_XFS_ONLINE_REPAIR=y
+# CONFIG_XFS_WARN is not set
+CONFIG_XFS_DEBUG=y
+CONFIG_XFS_ASSERT_FATAL=y
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_BTRFS_FS is not set
+# CONFIG_NILFS2_FS is not set
+# CONFIG_F2FS_FS is not set
+CONFIG_FS_DAX=y
+CONFIG_FS_DAX_PMD=y
+CONFIG_FS_POSIX_ACL=y
+CONFIG_EXPORTFS=y
+# CONFIG_EXPORTFS_BLOCK_OPS is not set
+CONFIG_FILE_LOCKING=y
+CONFIG_FS_ENCRYPTION=y
+CONFIG_FS_ENCRYPTION_ALGS=y
+CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y
+CONFIG_FS_VERITY=y
+CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y
+CONFIG_FSNOTIFY=y
+# CONFIG_DNOTIFY is not set
+CONFIG_INOTIFY_USER=y
+CONFIG_FANOTIFY=y
+CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y
+CONFIG_QUOTA=y
+# CONFIG_QUOTA_NETLINK_INTERFACE is not set
+# CONFIG_QUOTA_DEBUG is not set
+# CONFIG_QFMT_V1 is not set
+# CONFIG_QFMT_V2 is not set
+CONFIG_QUOTACTL=y
+CONFIG_AUTOFS_FS=m
+CONFIG_FUSE_FS=y
+# CONFIG_CUSE is not set
+CONFIG_VIRTIO_FS=y
+CONFIG_FUSE_DAX=y
+CONFIG_FUSE_PASSTHROUGH=y
+CONFIG_FUSE_IO_URING=y
+CONFIG_OVERLAY_FS=m
+CONFIG_OVERLAY_FS_REDIRECT_DIR=y
+CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y
+CONFIG_OVERLAY_FS_INDEX=y
+CONFIG_OVERLAY_FS_XINO_AUTO=y
+CONFIG_OVERLAY_FS_METACOPY=y
+# CONFIG_OVERLAY_FS_DEBUG is not set
+
+#
+# Caches
+#
+# end of Caches
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+# end of CD-ROM/DVD Filesystems
+
+#
+# DOS/FAT/EXFAT/NT Filesystems
+#
+# CONFIG_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_EXFAT_FS is not set
+# CONFIG_NTFS3_FS is not set
+# CONFIG_NTFS_FS is not set
+# end of DOS/FAT/EXFAT/NT Filesystems
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+# CONFIG_PROC_KCORE is not set
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_PROC_CHILDREN=y
+CONFIG_PROC_PID_ARCH_STATUS=y
+CONFIG_KERNFS=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_TMPFS_XATTR=y
+# CONFIG_TMPFS_INODE64 is not set
+# CONFIG_TMPFS_QUOTA is not set
+CONFIG_ARCH_SUPPORTS_HUGETLBFS=y
+CONFIG_HUGETLBFS=y
+# CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON is not set
+CONFIG_HUGETLB_PAGE=y
+CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y
+CONFIG_HUGETLB_PMD_PAGE_TABLE_SHARING=y
+CONFIG_ARCH_HAS_GIGANTIC_PAGE=y
+CONFIG_CONFIGFS_FS=m
+# end of Pseudo filesystems
+
+# CONFIG_MISC_FILESYSTEMS is not set
+CONFIG_NETWORK_FILESYSTEMS=y
+# CONFIG_NFS_FS is not set
+# CONFIG_NFSD is not set
+# CONFIG_CEPH_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_SMB_SERVER is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_MAC_ROMAN is not set
+# CONFIG_NLS_MAC_CELTIC is not set
+# CONFIG_NLS_MAC_CENTEURO is not set
+# CONFIG_NLS_MAC_CROATIAN is not set
+# CONFIG_NLS_MAC_CYRILLIC is not set
+# CONFIG_NLS_MAC_GAELIC is not set
+# CONFIG_NLS_MAC_GREEK is not set
+# CONFIG_NLS_MAC_ICELAND is not set
+# CONFIG_NLS_MAC_INUIT is not set
+# CONFIG_NLS_MAC_ROMANIAN is not set
+# CONFIG_NLS_MAC_TURKISH is not set
+# CONFIG_NLS_UTF8 is not set
+# CONFIG_DLM is not set
+CONFIG_UNICODE=y
+CONFIG_IO_WQ=y
+# end of File systems
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY_DMESG_RESTRICT is not set
+CONFIG_PROC_MEM_ALWAYS_FORCE=y
+# CONFIG_PROC_MEM_FORCE_PTRACE is not set
+# CONFIG_PROC_MEM_NO_FORCE is not set
+CONFIG_SECURITY=y
+CONFIG_SECURITYFS=y
+# CONFIG_SECURITY_NETWORK is not set
+# CONFIG_SECURITY_PATH is not set
+# CONFIG_STATIC_USERMODEHELPER is not set
+# CONFIG_SECURITY_SMACK is not set
+# CONFIG_SECURITY_TOMOYO is not set
+# CONFIG_SECURITY_APPARMOR is not set
+# CONFIG_SECURITY_LOADPIN is not set
+# CONFIG_SECURITY_YAMA is not set
+# CONFIG_SECURITY_SAFESETID is not set
+CONFIG_SECURITY_LOCKDOWN_LSM=y
+# CONFIG_SECURITY_LOCKDOWN_LSM_EARLY is not set
+CONFIG_LOCK_DOWN_KERNEL_FORCE_NONE=y
+# CONFIG_LOCK_DOWN_KERNEL_FORCE_INTEGRITY is not set
+# CONFIG_LOCK_DOWN_KERNEL_FORCE_CONFIDENTIALITY is not set
+# CONFIG_SECURITY_LANDLOCK is not set
+# CONFIG_INTEGRITY is not set
+CONFIG_DEFAULT_SECURITY_DAC=y
+CONFIG_LSM="landlock,lockdown,yama,loadpin,safesetid,ipe,bpf"
+
+#
+# Kernel hardening options
+#
+
+#
+# Memory initialization
+#
+CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y
+CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y
+CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y
+# CONFIG_INIT_STACK_NONE is not set
+# CONFIG_INIT_STACK_ALL_PATTERN is not set
+CONFIG_INIT_STACK_ALL_ZERO=y
+CONFIG_CC_HAS_SANCOV_STACK_DEPTH_CALLBACK=y
+# CONFIG_KSTACK_ERASE is not set
+# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set
+# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set
+CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y
+# CONFIG_ZERO_CALL_USED_REGS is not set
+# end of Memory initialization
+
+#
+# Bounds checking
+#
+# CONFIG_FORTIFY_SOURCE is not set
+# CONFIG_HARDENED_USERCOPY is not set
+# end of Bounds checking
+
+#
+# Hardening of kernel data structures
+#
+# CONFIG_LIST_HARDENED is not set
+# CONFIG_BUG_ON_DATA_CORRUPTION is not set
+# end of Hardening of kernel data structures
+
+CONFIG_CC_HAS_RANDSTRUCT=y
+CONFIG_RANDSTRUCT_NONE=y
+# CONFIG_RANDSTRUCT_FULL is not set
+# end of Kernel hardening options
+# end of Security options
+
+# CONFIG_CRYPTO is not set
+CONFIG_BINARY_PRINTF=y
+
+#
+# Library routines
+#
+# CONFIG_PACKING is not set
+CONFIG_BITREVERSE=y
+CONFIG_GENERIC_STRNCPY_FROM_USER=y
+CONFIG_GENERIC_STRNLEN_USER=y
+CONFIG_GENERIC_NET_UTILS=y
+# CONFIG_CORDIC is not set
+# CONFIG_PRIME_NUMBERS is not set
+CONFIG_GENERIC_IOMAP=y
+CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
+CONFIG_ARCH_HAS_FAST_MULTIPLIER=y
+CONFIG_ARCH_USE_SYM_ANNOTATIONS=y
+CONFIG_CRC16=m
+CONFIG_CRC32=y
+# CONFIG_CRC_OPTIMIZATIONS is not set
+
+#
+# Crypto library routines
+#
+CONFIG_CRYPTO_LIB_BLAKE2S_ARCH=y
+CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11
+CONFIG_CRYPTO_LIB_SHA1=m
+CONFIG_CRYPTO_LIB_SHA1_ARCH=y
+CONFIG_CRYPTO_LIB_SHA256=y
+CONFIG_CRYPTO_LIB_SHA256_ARCH=y
+# end of Crypto library routines
+
+CONFIG_XXHASH=y
+# CONFIG_RANDOM32_SELFTEST is not set
+CONFIG_ZSTD_COMMON=y
+CONFIG_ZSTD_DECOMPRESS=y
+# CONFIG_XZ_DEC is not set
+CONFIG_DECOMPRESS_ZSTD=y
+CONFIG_INTERVAL_TREE=y
+CONFIG_XARRAY_MULTI=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_IOPORT_MAP=y
+CONFIG_HAS_DMA=y
+CONFIG_DMA_OPS_HELPERS=y
+CONFIG_NEED_SG_DMA_FLAGS=y
+CONFIG_NEED_SG_DMA_LENGTH=y
+CONFIG_NEED_DMA_MAP_STATE=y
+CONFIG_ARCH_DMA_ADDR_T_64BIT=y
+CONFIG_SWIOTLB=y
+# CONFIG_SWIOTLB_DYNAMIC is not set
+CONFIG_DMA_NEED_SYNC=y
+# CONFIG_DMA_CMA is not set
+# CONFIG_DMA_API_DEBUG is not set
+# CONFIG_DMA_MAP_BENCHMARK is not set
+CONFIG_GLOB=y
+CONFIG_NLATTR=y
+# CONFIG_IRQ_POLL is not set
+CONFIG_DIMLIB=m
+CONFIG_HAVE_GENERIC_VDSO=y
+CONFIG_GENERIC_GETTIMEOFDAY=y
+CONFIG_GENERIC_VDSO_OVERFLOW_PROTECT=y
+CONFIG_VDSO_GETRANDOM=y
+CONFIG_SG_POOL=y
+CONFIG_ARCH_HAS_PMEM_API=y
+CONFIG_ARCH_HAS_CPU_CACHE_INVALIDATE_MEMREGION=y
+CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y
+CONFIG_ARCH_HAS_COPY_MC=y
+CONFIG_ARCH_STACKWALK=y
+CONFIG_SBITMAP=y
+# CONFIG_LWQ_TEST is not set
+# end of Library routines
+
+CONFIG_FIRMWARE_TABLE=y
+
+#
+# Kernel hacking
+#
+
+#
+# printk and dmesg options
+#
+CONFIG_PRINTK_TIME=y
+# CONFIG_PRINTK_CALLER is not set
+# CONFIG_STACKTRACE_BUILD_ID is not set
+CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7
+CONFIG_CONSOLE_LOGLEVEL_QUIET=4
+CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
+# CONFIG_BOOT_PRINTK_DELAY is not set
+# CONFIG_DYNAMIC_DEBUG is not set
+# CONFIG_DYNAMIC_DEBUG_CORE is not set
+# CONFIG_SYMBOLIC_ERRNAME is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# end of printk and dmesg options
+
+CONFIG_DEBUG_KERNEL=y
+CONFIG_DEBUG_MISC=y
+
+#
+# Compile-time checks and compiler options
+#
+CONFIG_DEBUG_INFO=y
+CONFIG_AS_HAS_NON_CONST_ULEB128=y
+# CONFIG_DEBUG_INFO_NONE is not set
+CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y
+# CONFIG_DEBUG_INFO_DWARF4 is not set
+# CONFIG_DEBUG_INFO_DWARF5 is not set
+# CONFIG_DEBUG_INFO_REDUCED is not set
+CONFIG_DEBUG_INFO_COMPRESSED_NONE=y
+# CONFIG_DEBUG_INFO_COMPRESSED_ZLIB is not set
+# CONFIG_DEBUG_INFO_COMPRESSED_ZSTD is not set
+# CONFIG_DEBUG_INFO_SPLIT is not set
+CONFIG_DEBUG_INFO_BTF=y
+CONFIG_PAHOLE_HAS_BTF_TAG=y
+CONFIG_PAHOLE_HAS_LANG_EXCLUDE=y
+# CONFIG_DEBUG_INFO_BTF_MODULES is not set
+# CONFIG_GDB_SCRIPTS is not set
+CONFIG_FRAME_WARN=2048
+# CONFIG_STRIP_ASM_SYMS is not set
+# CONFIG_HEADERS_INSTALL is not set
+# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
+# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set
+CONFIG_OBJTOOL=y
+# CONFIG_OBJTOOL_WERROR is not set
+# CONFIG_VMLINUX_MAP is not set
+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
+# end of Compile-time checks and compiler options
+
+#
+# Generic Kernel Debugging Instruments
+#
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
+# CONFIG_MAGIC_SYSRQ_SERIAL is not set
+CONFIG_DEBUG_FS=y
+CONFIG_DEBUG_FS_ALLOW_ALL=y
+# CONFIG_DEBUG_FS_ALLOW_NONE is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_KGDB is not set
+CONFIG_ARCH_HAS_UBSAN=y
+# CONFIG_UBSAN is not set
+CONFIG_HAVE_ARCH_KCSAN=y
+CONFIG_HAVE_KCSAN_COMPILER=y
+# CONFIG_KCSAN is not set
+# end of Generic Kernel Debugging Instruments
+
+#
+# Networking Debugging
+#
+# CONFIG_NET_DEV_REFCNT_TRACKER is not set
+# CONFIG_NET_NS_REFCNT_TRACKER is not set
+# CONFIG_DEBUG_NET is not set
+# CONFIG_DEBUG_NET_SMALL_RTNL is not set
+# end of Networking Debugging
+
+#
+# Memory Debugging
+#
+# CONFIG_PAGE_EXTENSION is not set
+# CONFIG_DEBUG_PAGEALLOC is not set
+# CONFIG_SLUB_DEBUG is not set
+# CONFIG_PAGE_OWNER is not set
+# CONFIG_PAGE_POISONING is not set
+# CONFIG_DEBUG_PAGE_REF is not set
+# CONFIG_DEBUG_RODATA_TEST is not set
+CONFIG_ARCH_HAS_DEBUG_WX=y
+# CONFIG_DEBUG_WX is not set
+CONFIG_ARCH_HAS_PTDUMP=y
+# CONFIG_PTDUMP_DEBUGFS is not set
+CONFIG_HAVE_DEBUG_KMEMLEAK=y
+# CONFIG_DEBUG_KMEMLEAK is not set
+# CONFIG_PER_VMA_LOCK_STATS is not set
+# CONFIG_DEBUG_OBJECTS is not set
+# CONFIG_SHRINKER_DEBUG is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_SCHED_STACK_END_CHECK is not set
+CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y
+# CONFIG_DEBUG_VFS is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_VM_PGTABLE is not set
+CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y
+# CONFIG_DEBUG_VIRTUAL is not set
+# CONFIG_DEBUG_MEMORY_INIT is not set
+# CONFIG_DEBUG_PER_CPU_MAPS is not set
+CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y
+# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set
+# CONFIG_MEM_ALLOC_PROFILING is not set
+CONFIG_HAVE_ARCH_KASAN=y
+CONFIG_HAVE_ARCH_KASAN_VMALLOC=y
+CONFIG_CC_HAS_KASAN_GENERIC=y
+CONFIG_CC_HAS_KASAN_SW_TAGS=y
+CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y
+# CONFIG_KASAN is not set
+CONFIG_HAVE_ARCH_KFENCE=y
+# CONFIG_KFENCE is not set
+CONFIG_HAVE_ARCH_KMSAN=y
+CONFIG_HAVE_KMSAN_COMPILER=y
+# CONFIG_KMSAN is not set
+# end of Memory Debugging
+
+# CONFIG_DEBUG_SHIRQ is not set
+
+#
+# Debug Oops, Lockups and Hangs
+#
+# CONFIG_PANIC_ON_OOPS is not set
+CONFIG_PANIC_TIMEOUT=0
+# CONFIG_SOFTLOCKUP_DETECTOR is not set
+CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y
+# CONFIG_HARDLOCKUP_DETECTOR is not set
+CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y
+# CONFIG_DETECT_HUNG_TASK is not set
+# CONFIG_WQ_WATCHDOG is not set
+# CONFIG_WQ_CPU_INTENSIVE_REPORT is not set
+# CONFIG_TEST_LOCKUP is not set
+# end of Debug Oops, Lockups and Hangs
+
+#
+# Scheduler Debugging
+#
+CONFIG_SCHED_INFO=y
+# CONFIG_SCHEDSTATS is not set
+# end of Scheduler Debugging
+
+# CONFIG_DEBUG_PREEMPT is not set
+# CONFIG_DEBUG_ATOMIC is not set
+
+#
+# Lock Debugging (spinlocks, mutexes, etc...)
+#
+CONFIG_LOCK_DEBUGGING_SUPPORT=y
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_LOCK_STAT is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set
+# CONFIG_DEBUG_RWSEMS is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_DEBUG_ATOMIC_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_LOCK_TORTURE_TEST is not set
+# CONFIG_WW_MUTEX_SELFTEST is not set
+# CONFIG_SCF_TORTURE_TEST is not set
+# CONFIG_CSD_LOCK_WAIT_DEBUG is not set
+# end of Lock Debugging (spinlocks, mutexes, etc...)
+
+# CONFIG_NMI_CHECK_CPU is not set
+# CONFIG_DEBUG_IRQFLAGS is not set
+CONFIG_STACKTRACE=y
+# CONFIG_DEBUG_KOBJECT is not set
+
+#
+# Debug kernel data structures
+#
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_DEBUG_PLIST is not set
+# CONFIG_DEBUG_SG is not set
+# CONFIG_DEBUG_NOTIFIERS is not set
+# CONFIG_DEBUG_MAPLE_TREE is not set
+# end of Debug kernel data structures
+
+#
+# RCU Debugging
+#
+# CONFIG_RCU_SCALE_TEST is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_RCU_REF_SCALE_TEST is not set
+CONFIG_RCU_CPU_STALL_TIMEOUT=21
+CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0
+# CONFIG_RCU_CPU_STALL_CPUTIME is not set
+# CONFIG_RCU_TRACE is not set
+# CONFIG_RCU_EQS_DEBUG is not set
+# end of RCU Debugging
+
+# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set
+# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set
+# CONFIG_LATENCYTOP is not set
+# CONFIG_DEBUG_CGROUP_REF is not set
+CONFIG_USER_STACKTRACE_SUPPORT=y
+CONFIG_NOP_TRACER=y
+CONFIG_HAVE_RETHOOK=y
+CONFIG_RETHOOK=y
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
+CONFIG_HAVE_FUNCTION_GRAPH_FREGS=y
+CONFIG_HAVE_FTRACE_GRAPH_FUNC=y
+CONFIG_HAVE_DYNAMIC_FTRACE=y
+CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y
+CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y
+CONFIG_HAVE_SINGLE_FTRACE_DIRECT_OPS=y
+CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y
+CONFIG_HAVE_FTRACE_REGS_HAVING_PT_REGS=y
+CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y
+CONFIG_HAVE_DYNAMIC_FTRACE_WITH_JMP=y
+CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
+CONFIG_HAVE_FENTRY=y
+CONFIG_HAVE_OBJTOOL_MCOUNT=y
+CONFIG_HAVE_OBJTOOL_NOP_MCOUNT=y
+CONFIG_HAVE_C_RECORDMCOUNT=y
+CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y
+CONFIG_BUILDTIME_MCOUNT_SORT=y
+CONFIG_TRACE_CLOCK=y
+CONFIG_RING_BUFFER=y
+CONFIG_EVENT_TRACING=y
+CONFIG_CONTEXT_SWITCH_TRACER=y
+CONFIG_TRACING=y
+CONFIG_GENERIC_TRACER=y
+CONFIG_TRACING_SUPPORT=y
+CONFIG_FTRACE=y
+# CONFIG_TRACEFS_AUTOMOUNT_DEPRECATED is not set
+# CONFIG_BOOTTIME_TRACING is not set
+CONFIG_FUNCTION_TRACER=y
+CONFIG_FUNCTION_GRAPH_TRACER=y
+# CONFIG_FUNCTION_GRAPH_RETVAL is not set
+# CONFIG_FUNCTION_GRAPH_RETADDR is not set
+CONFIG_DYNAMIC_FTRACE=y
+CONFIG_DYNAMIC_FTRACE_WITH_REGS=y
+CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y
+CONFIG_DYNAMIC_FTRACE_WITH_ARGS=y
+CONFIG_DYNAMIC_FTRACE_WITH_JMP=y
+# CONFIG_FUNCTION_SELF_TRACING is not set
+# CONFIG_FPROBE is not set
+# CONFIG_FUNCTION_PROFILER is not set
+CONFIG_STACK_TRACER=y
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_PREEMPT_TRACER is not set
+# CONFIG_SCHED_TRACER is not set
+# CONFIG_HWLAT_TRACER is not set
+# CONFIG_OSNOISE_TRACER is not set
+# CONFIG_TIMERLAT_TRACER is not set
+# CONFIG_MMIOTRACE is not set
+CONFIG_FTRACE_SYSCALLS=y
+CONFIG_TRACE_SYSCALL_BUF_SIZE_DEFAULT=63
+# CONFIG_TRACER_SNAPSHOT is not set
+CONFIG_BRANCH_PROFILE_NONE=y
+# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
+# CONFIG_PROFILE_ALL_BRANCHES is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_PROBE_EVENTS_BTF_ARGS is not set
+CONFIG_KPROBE_EVENTS=y
+# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set
+CONFIG_UPROBE_EVENTS=y
+# CONFIG_EPROBE_EVENTS is not set
+CONFIG_BPF_EVENTS=y
+CONFIG_DYNAMIC_EVENTS=y
+CONFIG_PROBE_EVENTS=y
+CONFIG_BPF_KPROBE_OVERRIDE=y
+CONFIG_FTRACE_MCOUNT_USE_OBJTOOL=y
+# CONFIG_SYNTH_EVENTS is not set
+# CONFIG_USER_EVENTS is not set
+# CONFIG_HIST_TRIGGERS is not set
+# CONFIG_TRACE_EVENT_INJECT is not set
+# CONFIG_TRACEPOINT_BENCHMARK is not set
+# CONFIG_RING_BUFFER_BENCHMARK is not set
+# CONFIG_TRACE_EVAL_MAP_FILE is not set
+# CONFIG_FTRACE_RECORD_RECURSION is not set
+# CONFIG_FTRACE_VALIDATE_RCU_IS_WATCHING is not set
+# CONFIG_FTRACE_STARTUP_TEST is not set
+# CONFIG_FTRACE_SORT_STARTUP_TEST is not set
+# CONFIG_RING_BUFFER_STARTUP_TEST is not set
+# CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set
+# CONFIG_PREEMPTIRQ_DELAY_TEST is not set
+# CONFIG_KPROBE_EVENT_GEN_TEST is not set
+# CONFIG_RV is not set
+# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
+# CONFIG_SAMPLES is not set
+CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y
+CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y
+CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y
+# CONFIG_STRICT_DEVMEM is not set
+
+#
+# x86 Debugging
+#
+# CONFIG_X86_VERBOSE_BOOTUP is not set
+# CONFIG_EARLY_PRINTK is not set
+# CONFIG_DEBUG_TLBFLUSH is not set
+CONFIG_HAVE_MMIOTRACE_SUPPORT=y
+# CONFIG_X86_DECODER_SELFTEST is not set
+CONFIG_IO_DELAY_0X80=y
+# CONFIG_IO_DELAY_0XED is not set
+# CONFIG_IO_DELAY_UDELAY is not set
+# CONFIG_IO_DELAY_NONE is not set
+# CONFIG_DEBUG_BOOT_PARAMS is not set
+# CONFIG_CPA_DEBUG is not set
+# CONFIG_DEBUG_ENTRY is not set
+# CONFIG_DEBUG_NMI_SELFTEST is not set
+# CONFIG_X86_DEBUG_FPU is not set
+# CONFIG_PUNIT_ATOM_DEBUG is not set
+CONFIG_UNWINDER_ORC=y
+# CONFIG_UNWINDER_FRAME_POINTER is not set
+# CONFIG_UNWINDER_GUESS is not set
+# end of x86 Debugging
+
+#
+# Kernel Testing and Coverage
+#
+# CONFIG_KUNIT is not set
+# CONFIG_NOTIFIER_ERROR_INJECTION is not set
+CONFIG_FUNCTION_ERROR_INJECTION=y
+CONFIG_FAULT_INJECTION=y
+CONFIG_FAULT_INJECTION_DEBUG_FS=y
+CONFIG_FAIL_MAKE_REQUEST=y
+# CONFIG_FAIL_PAGE_ALLOC is not set
+# CONFIG_FAULT_INJECTION_STACKTRACE_FILTER is not set
+# CONFIG_FAILSLAB is not set
+# CONFIG_FAIL_IO_TIMEOUT is not set
+# CONFIG_FAIL_FUTEX is not set
+# CONFIG_FAIL_FUNCTION is not set
+# CONFIG_FAIL_MMC_REQUEST is not set
+# CONFIG_FAIL_SUNRPC is not set
+CONFIG_ARCH_HAS_KCOV=y
+# CONFIG_KCOV is not set
+# CONFIG_RUNTIME_TESTING_MENU is not set
+CONFIG_ARCH_USE_MEMTEST=y
+# CONFIG_MEMTEST is not set
+# end of Kernel Testing and Coverage
+
+#
+# Rust hacking
+#
+# end of Rust hacking
+# end of Kernel hacking
+
+CONFIG_IO_URING_ZCRX=y
+CONFIG_IO_URING_BPF=y
diff --git a/playbooks/roles/nixosfi/tasks/generate-configs.yml b/playbooks/roles/nixosfi/tasks/generate-configs.yml
new file mode 100644
index 00000000..7f4eaed8
--- /dev/null
+++ b/playbooks/roles/nixosfi/tasks/generate-configs.yml
@@ -0,0 +1,71 @@
+---
+# SPDX-License-Identifier: copyleft-next-0.3.1
+#
+# Per-node imageless configuration generation. Creates one directory
+# per guest under $NIXOSFI_CONFIG_DIR, seeds the SSH key,
+# copies the upstream nixos-flake imageless template flake into it,
+# rewrites the nixos-flake.url input to resolve at the checked-in
+# subtree, and renders the per-node default.nix using the shared
+# nixos-flake/templates/default.nix.j2 with the imageless backend
+# fact set.
+
+- name: Localhost generate-configs
+  delegate_to: localhost
+  run_once: true
+  block:
+    - name: Create top-level qsu config directory
+      ansible.builtin.file:
+        path: "{{ nixosfi_config_dir }}"
+        state: directory
+        mode: "0755"
+      tags: do_install
+
+    - name: Create per-node configuration directories
+      ansible.builtin.file:
+        path: "{{ nixosfi_config_dir }}/{{ item }}"
+        state: directory
+        mode: "0755"
+      loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
+      tags: do_install
+
+    - name: Determine SSH key path
+      ansible.builtin.command: python3 {{ playbook_dir }}/../scripts/nixosfi_ssh_key_name.py --path
+      register: nixosfi_ssh_key_path_result
+      changed_when: false
+
+    - name: Set SSH key path fact
+      ansible.builtin.set_fact:
+        nixosfi_ssh_key_path: "{{ nixosfi_ssh_key_path_result.stdout | trim }}"
+
+    - name: Generate SSH key for imageless VMs if not exists
+      community.crypto.openssh_keypair:
+        path: "{{ nixosfi_ssh_key_path }}"
+        type: rsa
+        size: 2048
+        comment: "kdevops@qsu"
+        force: false
+      tags: do_install
+
+    - name: Read SSH public key
+      ansible.builtin.slurp:
+        src: "{{ nixosfi_ssh_key_path }}.pub"
+      register: nixosfi_ssh_public_key
+
+    - name: Render per-node imageless flake.nix
+      ansible.builtin.template:
+        src: "{{ playbook_dir }}/roles/nixosfi/templates/flake.nix.j2"
+        dest: "{{ nixosfi_config_dir }}/{{ item }}/flake.nix"
+        mode: "0644"
+      loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
+      tags: do_install
+
+    - name: Render per-node imageless default.nix
+      ansible.builtin.template:
+        src: "{{ playbook_dir }}/roles/nixosfi/templates/default.nix.j2"
+        dest: "{{ nixosfi_config_dir }}/{{ item }}/default.nix"
+        mode: "0644"
+      loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
+      vars:
+        vm_name: "{{ item }}"
+        nixosfi_ssh_authorized_key: "{{ nixosfi_ssh_public_key['content'] | b64decode | trim }}"
+      tags: do_install
diff --git a/playbooks/roles/nixosfi/tasks/imageless-build-per-vm.yml b/playbooks/roles/nixosfi/tasks/imageless-build-per-vm.yml
new file mode 100644
index 00000000..e8adf18c
--- /dev/null
+++ b/playbooks/roles/nixosfi/tasks/imageless-build-per-vm.yml
@@ -0,0 +1,40 @@
+---
+# SPDX-License-Identifier: copyleft-next-0.3.1
+#
+# Per-VM imageless closure build: nix-build the toplevel, read the
+# bootspec for init/initrd, then hand the boot artefacts to the qsu
+# runtime to render this guest's env and unit drop-ins. Looped from
+# imageless-build.yml with qsu_vm_name / qsu_vm_idx.
+
+- name: Build the imageless NixOS closure for {{ qsu_vm_name }}
+  ansible.builtin.command:
+    argv:
+      - nix
+      - build
+      - "path:{{ nixosfi_config_dir }}/{{ qsu_vm_name }}#toplevel"
+      - --out-link
+      - "{{ nixosfi_config_dir }}/{{ qsu_vm_name }}/result"
+  environment:
+    PATH: "/nix/var/nix/profiles/default/bin:{{ lookup('env', 'PATH') | default('/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin') }}"
+  changed_when: true
+
+- name: Read bootspec from the built closure for {{ qsu_vm_name }}
+  ansible.builtin.slurp:
+    src: "{{ nixosfi_config_dir }}/{{ qsu_vm_name }}/result/boot.json"
+  register: nixosfi_bootspec_raw
+
+- name: Extract init and initrd paths from bootspec for {{ qsu_vm_name }}
+  ansible.builtin.set_fact:
+    nixosfi_init: "{{ (nixosfi_bootspec_raw.content | b64decode | from_json)['org.nixos.bootspec.v1'].init }}"
+    nixosfi_initrd: "{{ (nixosfi_bootspec_raw.content | b64decode | from_json)['org.nixos.bootspec.v1'].initrd }}"
+
+- name: Render qsu runtime artefacts for {{ qsu_vm_name }}
+  ansible.builtin.include_role:
+    name: qsu
+    tasks_from: render-per-vm
+  vars:
+    qsu_kernel_release: "{{ nixosfi_kernel_release }}"
+    qsu_kernel_image: "{{ nixosfi_kernel_image }}"
+    qsu_modules_dir: "{{ nixosfi_modules_dir }}"
+    qsu_init: "{{ nixosfi_init }}"
+    qsu_initrd: "{{ nixosfi_initrd }}"
diff --git a/playbooks/roles/nixosfi/tasks/imageless-build.yml b/playbooks/roles/nixosfi/tasks/imageless-build.yml
new file mode 100644
index 00000000..560a8c1b
--- /dev/null
+++ b/playbooks/roles/nixosfi/tasks/imageless-build.yml
@@ -0,0 +1,62 @@
+---
+# SPDX-License-Identifier: copyleft-next-0.3.1
+#
+# Build the per-node imageless NixOS closure and render qsu's
+# per-VM env files using its own upstream templates, so systemd
+# can start each VM against a freshly built closure and the
+# controller-installed kernel from bootlinux.
+
+- name: Resolve controller-built kernel release from the linux build tree
+  ansible.builtin.command:
+    chdir: "{{ bootlinux_direct_boot_tree_path }}"
+    argv:
+      - make
+      - --silent
+      - O={{ bootlinux_direct_boot_builddir }}
+      - kernelrelease
+  environment:
+    LOCALVERSION: "{{ target_linux_localversion | default('', true) }}"
+  register: nixosfi_kernelrelease_make
+  changed_when: false
+
+- name: Derive the controller-built kernel artefact paths
+  ansible.builtin.set_fact:
+    nixosfi_kernel_release: "{{ nixosfi_kernelrelease_make.stdout | trim }}"
+    nixosfi_kernel_image: "{{ bootlinux_direct_boot_destdir }}/boot/vmlinuz-{{ nixosfi_kernelrelease_make.stdout | trim }}"
+    nixosfi_modules_dir: "{{ bootlinux_direct_boot_destdir }}/lib/modules"
+
+- name: Ensure the qsu vars directory exists for debug snapshots
+  ansible.builtin.file:
+    path: "{{ qsu_vars_dir }}"
+    state: directory
+    mode: "0755"
+
+# `nix build path:<dir>` pins each input by narHash in flake.lock.
+# A leftover flake.lock from a previous bringup keeps that pin
+# pointed at the old nixos-flake source tree, so subsequent builds
+# silently reuse a stale closure even after the in-tree subtree
+# (modules, overlays, packages) changes — including changes that
+# fix module-evaluation errors. `rebuild-boot.yml` already does
+# this refresh on the kernel-rebuild path; bringup needs the
+# same step for first-time and re-bringup runs after edits.
+- name: Refresh nixos-flake flake input for each VM
+  ansible.builtin.command:
+    argv:
+      - nix
+      - flake
+      - update
+      - --flake
+      - "path:{{ nixosfi_config_dir }}/{{ item }}"
+      - nixos-flake
+  environment:
+    PATH: "/nix/var/nix/profiles/default/bin:{{ lookup('env', 'PATH') | default('/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin') }}"
+  loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
+  changed_when: true
+
+- name: Prepare qsu imageless artefacts per VM
+  ansible.builtin.include_tasks: imageless-build-per-vm.yml
+  loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
+  loop_control:
+    loop_var: qsu_vm_name
+    index_var: qsu_vm_idx
+    label: "{{ qsu_vm_name }}"
diff --git a/playbooks/roles/nixosfi/tasks/main.yml b/playbooks/roles/nixosfi/tasks/main.yml
new file mode 100644
index 00000000..a8cdafb0
--- /dev/null
+++ b/playbooks/roles/nixosfi/tasks/main.yml
@@ -0,0 +1,87 @@
+---
+# SPDX-License-Identifier: copyleft-next-0.3.1
+#
+# nixosfi role entry point: the imageless NixOS backend. It owns the
+# nix work (per-node flakes, closure build, kernel rebuild) and drives
+# the qsu runtime (dependency install, systemd units, VM lifecycle)
+# through include_role ... tasks_from. Each phase is tag-gated; the
+# nixosfi Make targets pass the matching tag.
+
+- name: Install the qsu runtime dependencies
+  ansible.builtin.include_role:
+    name: qsu
+    tasks_from: install-deps
+    apply:
+      tags: [install-deps]
+  tags: [install-deps]
+
+- name: Render the shared qsu systemd units
+  ansible.builtin.include_role:
+    name: qsu
+    tasks_from: render-units
+    apply:
+      tags: [generate-configs]
+  tags: [generate-configs]
+
+- name: Generate the per-node imageless flakes
+  ansible.builtin.import_tasks:
+    file: "{{ role_path }}/tasks/generate-configs.yml"
+  tags: [generate-configs]
+
+- name: Build the imageless closures and render per-VM qsu artefacts
+  ansible.builtin.import_tasks:
+    file: "{{ role_path }}/tasks/imageless-build.yml"
+  tags: [build-vms]
+
+- name: Bring up the qsu machines
+  ansible.builtin.include_role:
+    name: qsu
+    tasks_from: bringup
+    apply:
+      tags: [bringup]
+  tags: [bringup]
+
+- name: Show the console access banner
+  ansible.builtin.include_role:
+    name: qsu
+    tasks_from: console
+    apply:
+      tags: [console]
+  tags: [console]
+
+- name: Stop the qsu machines
+  ansible.builtin.include_role:
+    name: qsu
+    tasks_from: stop-vms
+    apply:
+      tags: [stop-vms]
+  tags: [stop-vms]
+
+- name: Rebuild and reboot guests onto a freshly built kernel
+  ansible.builtin.import_tasks:
+    file: "{{ role_path }}/tasks/rebuild-boot.yml"
+  tags: [rebuild-boot]
+
+- name: Restart the qsu machines
+  ansible.builtin.include_role:
+    name: qsu
+    tasks_from: restart-vms
+    apply:
+      tags: [restart-vms]
+  tags: [restart-vms]
+
+- name: Start the qsu machines
+  ansible.builtin.include_role:
+    name: qsu
+    tasks_from: start-vms
+    apply:
+      tags: [start-vms]
+  tags: [start-vms]
+
+- name: Destroy the qsu machines
+  ansible.builtin.include_role:
+    name: qsu
+    tasks_from: destroy
+    apply:
+      tags: [destroy]
+  tags: [destroy, never]
diff --git a/playbooks/roles/nixosfi/tasks/rebuild-boot.yml b/playbooks/roles/nixosfi/tasks/rebuild-boot.yml
new file mode 100644
index 00000000..9b398b53
--- /dev/null
+++ b/playbooks/roles/nixosfi/tasks/rebuild-boot.yml
@@ -0,0 +1,27 @@
+---
+# SPDX-License-Identifier: copyleft-next-0.3.1
+#
+# Re-render per-VM artefacts so the next start of
+# qemu-system@<vm>.service boots from the latest closure. No
+# hot activation. See README.md.
+#
+# Renders per-node default.nix first, in case the role's template
+# vars (workflow toggles, monitoring opt-in, ssh key) changed
+# since bringup. Without this step the closure built by
+# imageless-build.yml would still reflect the bringup-time
+# default.nix and skip new module imports or removed options.
+
+# Re-render per-node flake.nix and default.nix in case Kconfig
+# toggles or template content changed since bringup. Imports
+# generate-configs.yml because the default.nix template depends on
+# the SSH key fact which generate-configs.yml sets — duplicating
+# the fact resolution here would drift out of sync.
+- name: Re-render per-node imageless configs for rebuild-boot
+  ansible.builtin.import_tasks: generate-configs.yml
+
+# The flake-input refreshes (nixos-flake plus any active
+# per-package source-override) and the closure rebuild itself live
+# in imageless-build.yml; both the bringup and rebuild-boot paths
+# import it.
+- name: Rebuild imageless toplevel closure for rebuild-boot
+  ansible.builtin.import_tasks: imageless-build.yml
diff --git a/playbooks/roles/nixosfi/tasks/rebuild-test.yml b/playbooks/roles/nixosfi/tasks/rebuild-test.yml
new file mode 100644
index 00000000..4a7b31ed
--- /dev/null
+++ b/playbooks/roles/nixosfi/tasks/rebuild-test.yml
@@ -0,0 +1,35 @@
+---
+# SPDX-License-Identifier: copyleft-next-0.3.1
+#
+# Rebuild the per-VM imageless NixOS closure on the controller
+# and activate it on the running guest. See README.md.
+
+- name: Rebuild imageless NixOS toplevel on the controller for {{ inventory_hostname }}
+  delegate_to: localhost
+  ansible.builtin.command:
+    argv:
+      - nix
+      - build
+      - "path:{{ nixosfi_config_dir }}/{{ inventory_hostname }}#toplevel"
+      - --out-link
+      - "{{ nixosfi_config_dir }}/{{ inventory_hostname }}/result"
+  environment:
+    PATH: "/nix/var/nix/profiles/default/bin:{{ lookup('env', 'PATH') | default('/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin') }}"
+  changed_when: true
+
+- name: Resolve new toplevel store path for {{ inventory_hostname }}
+  delegate_to: localhost
+  ansible.builtin.command:
+    argv:
+      - readlink
+      - -f
+      - "{{ nixosfi_config_dir }}/{{ inventory_hostname }}/result"
+  register: nixosfi_new_toplevel
+  changed_when: false
+
+- name: Activate new toplevel on the running guest {{ inventory_hostname }}
+  ansible.builtin.command:
+    cmd: "{{ nixosfi_new_toplevel.stdout }}/bin/switch-to-configuration test"
+  register: nixosfi_activate_result
+  failed_when: nixosfi_activate_result.rc not in [0, 4, 100]
+  changed_when: nixosfi_activate_result.rc in [0, 4, 100]
diff --git a/playbooks/roles/nixosfi/templates/default.nix.j2 b/playbooks/roles/nixosfi/templates/default.nix.j2
new file mode 100644
index 00000000..026275b2
--- /dev/null
+++ b/playbooks/roles/nixosfi/templates/default.nix.j2
@@ -0,0 +1,75 @@
+# SPDX-License-Identifier: copyleft-next-0.3.1
+#
+# Per-node overrides for {{ vm_name }}. Generated by kdevops.
+#
+# The flake that imports this module (copied from
+# scripts/nixos-flake/templates/imageless/flake.nix)
+# passes `nixos-flake` and the flake inputs through specialArgs, so
+# backend, profile, mount, and testSuite modules are imported
+# directly and mirror substituters attach to nixos-flake's overlay
+# through plain nixpkgs config.
+{ config, lib, pkgs, nixos-flake, inputs, ... }: {
+  imports = [
+    nixos-flake.nixosModules.backends.imageless
+    nixos-flake.nixosModules.user
+{% if nixos_flake_profile_devel is defined and nixos_flake_profile_devel %}
+    nixos-flake.nixosModules.profiles.devel
+{% endif %}
+{% if nixos_flake_profile_build_tools is defined and nixos_flake_profile_build_tools %}
+    nixos-flake.nixosModules.profiles.build-tools
+{% endif %}
+{% if nixos_flake_profile_monitoring is defined and nixos_flake_profile_monitoring %}
+    nixos-flake.nixosModules.profiles.monitoring
+{% endif %}
+{% if nixos_flake_mount_shares is defined and nixos_flake_mount_shares %}
+    nixos-flake.nixosModules.mounts.shares
+{% endif %}
+{% if nixos_flake_mount_storage is defined and nixos_flake_mount_storage %}
+    nixos-flake.nixosModules.mounts.storage
+{% endif %}
+{% if nixos_flake_testsuite_fstests is defined and nixos_flake_testsuite_fstests %}
+    nixos-flake.nixosModules.testSuites.fstests
+{% endif %}
+{% if nixos_flake_testsuite_blktests is defined and nixos_flake_testsuite_blktests %}
+    nixos-flake.nixosModules.testSuites.blktests
+{% endif %}
+{% if nixos_flake_testsuite_ltp is defined and nixos_flake_testsuite_ltp %}
+    nixos-flake.nixosModules.testSuites.ltp
+{% endif %}
+{% if nixos_flake_testsuite_mmtests is defined and nixos_flake_testsuite_mmtests %}
+    nixos-flake.nixosModules.testSuites.mmtests
+{% endif %}
+{% if nixos_flake_testsuite_pynfs is defined and nixos_flake_testsuite_pynfs %}
+    nixos-flake.nixosModules.testSuites.pynfs
+{% endif %}
+{% if nixos_flake_testsuite_gitr is defined and nixos_flake_testsuite_gitr %}
+    nixos-flake.nixosModules.testSuites.gitr
+{% endif %}
+{% if nixos_flake_testsuite_selftests is defined and nixos_flake_testsuite_selftests %}
+    nixos-flake.nixosModules.testSuites.selftests
+{% endif %}
+{% if nixos_flake_testsuite_sysbench is defined and nixos_flake_testsuite_sysbench %}
+    nixos-flake.nixosModules.testSuites.sysbench
+{% endif %}
+  ];
+
+  networking.hostName = "{{ vm_name }}";
+
+  nixos-flake.user.name = "kdevops";
+
+{% if nixosfi_ssh_authorized_key is defined %}
+  users.users.root.openssh.authorizedKeys.keys = [ "{{ nixosfi_ssh_authorized_key }}" ];
+  users.users.kdevops.openssh.authorizedKeys.keys = [ "{{ nixosfi_ssh_authorized_key }}" ];
+{% endif %}
+
+{% if bootlinux_9p is defined and bootlinux_9p %}
+  # 9P mount for shared kernel source
+  boot.kernelModules = [ "9p" "9pnet_virtio" ];
+  boot.initrd.kernelModules = [ "9p" "9pnet_virtio" ];
+  fileSystems."/mnt/linux" = {
+    device = "linux_source";
+    fsType = "9p";
+    options = [ "trans=virtio" "version=9p2000.L" "cache=loose" ];
+  };
+{% endif %}
+}
diff --git a/playbooks/roles/nixosfi/templates/flake.nix.j2 b/playbooks/roles/nixosfi/templates/flake.nix.j2
new file mode 100644
index 00000000..fce2fe68
--- /dev/null
+++ b/playbooks/roles/nixosfi/templates/flake.nix.j2
@@ -0,0 +1,41 @@
+{#
+  SPDX-License-Identifier: copyleft-next-0.3.1
+
+  Per-VM imageless flake rendered by kdevops. Mirrors upstream's
+  starter at scripts/nixos-flake/templates/imageless/flake.nix and
+  resolves the nixos-flake input at the vendored subtree. Builds the
+  system toplevel closure (packages.<system>.toplevel) that qsu boots
+  imagelessly: tmpfs root with /nix/store and /lib/modules over
+  virtiofs, no disk image.
+#}
+{
+  inputs = {
+    nixos-flake.url = "path:{{ topdir_path }}/scripts/nixos-flake";
+    nixpkgs.follows = "nixos-flake/nixpkgs";
+  };
+
+  outputs =
+    {
+      self,
+      nixpkgs,
+      nixos-flake,
+      ...
+    }@inputs:
+    let
+      system = "x86_64-linux";
+    in
+    {
+      nixosConfigurations.vm = nixpkgs.lib.nixosSystem {
+        inherit system;
+        specialArgs = { inherit inputs nixos-flake; };
+        modules = [
+          nixos-flake.nixosModules.backends.imageless
+          nixos-flake.nixosModules.user
+          { nixpkgs.overlays = [ nixos-flake.overlays.default ]; }
+          ./default.nix
+        ];
+      };
+
+      packages.${system}.toplevel = self.nixosConfigurations.vm.config.system.build.toplevel;
+    };
+}
diff --git a/playbooks/roles/qsu/tasks/bringup.yml b/playbooks/roles/qsu/tasks/bringup.yml
new file mode 100644
index 00000000..6d8de4a2
--- /dev/null
+++ b/playbooks/roles/qsu/tasks/bringup.yml
@@ -0,0 +1,105 @@
+---
+# SPDX-License-Identifier: copyleft-next-0.3.1
+#
+# Start each imageless guest as a systemd machine (qemu-system@
+# service registered with machined), wait for
+# sshd on the forwarded port, register it in ~/.ssh/config.
+
+- name: Reload user systemd so new unit files and drop-ins are visible
+  ansible.builtin.systemd_service:
+    daemon_reload: true
+    scope: user
+
+# daemon-reload does not restart running virtiofsd sockets, so a
+# re-rendered template leaves a zombie listener that QEMU's later
+# connect sees as refused. Restrict the per-share socket-restart
+# set to env files that match our own inventory-VM x share-tag
+# product; a blind glob would touch sockets serving live VMs in
+# other kdevops trees on the same host.
+- name: Compute expected per-share env paths for inventory VMs
+  ansible.builtin.set_fact:
+    qsu_owned_env_paths: >-
+      {{
+        (groups['all'] | reject('equalto', 'localhost') | list)
+        | product(qsu_canonical_share_tags)
+        | map('join', '-')
+        | map('regex_replace', '^',
+              lookup('env', 'HOME') ~ '/.config/systemd/virtiofsd/')
+        | map('regex_replace', '$', '.env')
+        | list
+      }}
+
+- name: Locate deployed virtiofsd per-share env files
+  ansible.builtin.find:
+    paths: "{{ lookup('env', 'HOME') }}/.config/systemd/virtiofsd"
+    patterns: "*.env"
+    file_type: file
+  register: qsu_virtiofsd_envs_all
+
+- name: Restrict env list to exact-path matches owned by inventory VMs
+  ansible.builtin.set_fact:
+    qsu_virtiofsd_envs_owned: >-
+      {{
+        qsu_virtiofsd_envs_all.files
+        | selectattr('path', 'in', qsu_owned_env_paths)
+        | list
+      }}
+
+- name: Restart virtiofsd sockets so QEMU connects to fresh listeners
+  ansible.builtin.systemd_service:
+    name: "virtiofsd@{{ item.path | basename | splitext | first }}.socket"
+    state: restarted
+    scope: user
+  loop: "{{ qsu_virtiofsd_envs_owned }}"
+  loop_control:
+    label: "virtiofsd@{{ item.path | basename | splitext | first }}.socket"
+
+- name: Start qemu-system@<vm> instances
+  ansible.builtin.systemd_service:
+    name: "qemu-system@{{ item }}.service"
+    state: started
+    scope: user
+  loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
+
+- name: Determine SSH key path
+  ansible.builtin.command: python3 {{ playbook_dir }}/../scripts/nixosfi_ssh_key_name.py --path
+  register: qsu_ssh_key_path_result
+  changed_when: false
+
+- name: Wait for sshd to greet on each VM's forwarded port
+  ansible.builtin.wait_for:
+    host: 127.0.0.1
+    port: "{{ qsu_ssh_port_base | int + qsu_vm_idx }}"
+    search_regex: "^SSH-2\\.0"
+    delay: 5
+    timeout: 300
+  loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
+  loop_control:
+    loop_var: qsu_vm_name
+    index_var: qsu_vm_idx
+    label: "{{ qsu_vm_name }}:{{ qsu_ssh_port_base | int + qsu_vm_idx }}"
+
+- name: Update SSH config for qsu VMs
+  ansible.builtin.command:
+    argv:
+      - python3
+      - "{{ playbook_dir }}/../scripts/update_ssh_config_nixosfi.py"
+      - update
+      - "{{ qsu_vm_name }}"
+      - 127.0.0.1
+      - "{{ qsu_ssh_port_base | int + qsu_vm_idx }}"
+      - root
+      - "{{ lookup('env', 'HOME') }}/.ssh/config"
+      - "{{ qsu_ssh_key_path_result.stdout | trim }}"
+      - qsu imageless NixOS
+      - --vsock-cid
+      - "{{ qsu_vsock_cid_base | int + qsu_vm_idx }}"
+      - --default-transport
+      - "{{ 'tcp' if qsu_ssh_default_tcp | default(false) | bool else 'vsock' }}"
+  register: qsu_ssh_config_update
+  changed_when: qsu_ssh_config_update.rc == 0
+  loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
+  loop_control:
+    loop_var: qsu_vm_name
+    index_var: qsu_vm_idx
+    label: "{{ qsu_vm_name }}"
diff --git a/playbooks/roles/qsu/tasks/console.yml b/playbooks/roles/qsu/tasks/console.yml
new file mode 100644
index 00000000..9a88547d
--- /dev/null
+++ b/playbooks/roles/qsu/tasks/console.yml
@@ -0,0 +1,23 @@
+---
+# SPDX-License-Identifier: copyleft-next-0.3.1
+#
+# Final status banner listing SSH, VSOCK, and console access for
+# each imageless VM plus the common systemctl and machinectl
+# commands.
+
+- name: Display qsu VM access information
+  ansible.builtin.debug:
+    msg: |
+      qemu-system-units imageless NixOS VMs are running.
+
+      {% for vm in groups['all'] | reject('equalto', 'localhost') | list %}
+      {% set idx = loop.index0 %}
+      {{ vm }}:
+        ssh:     ssh {{ vm }}  (or ssh -p {{ qsu_ssh_port_base | int + idx }} [email protected])
+        vsock:   ssh root@vsock/{{ qsu_vsock_cid_base | int + idx }}
+        console: socat -,raw,echo=0,escape=0x1d UNIX-CONNECT:$XDG_RUNTIME_DIR/qemu-system/{{ vm }}/console.sock
+      {% endfor %}
+
+      Status: systemctl --user status qemu-system@<vm>
+      Logs:   journalctl --user-unit=qemu-system@<vm>.service
+      List:   machinectl --user list
diff --git a/playbooks/roles/qsu/tasks/destroy.yml b/playbooks/roles/qsu/tasks/destroy.yml
new file mode 100644
index 00000000..50849258
--- /dev/null
+++ b/playbooks/roles/qsu/tasks/destroy.yml
@@ -0,0 +1,134 @@
+---
+# SPDX-License-Identifier: copyleft-next-0.3.1
+#
+# Stop any running qsu VMs and remove the shared units plus
+# the QMP powerdown helper.
+
+# Each qemu-system stop uses QMP system_powerdown via ExecStop,
+# falling back to SIGKILL after TimeoutStopSec=2min. Run all
+# stops in parallel via async so wall time is max(per-VM) and
+# not N * 2min worst-case. The 180s async cap leaves a small
+# buffer past TimeoutStopSec for systemd's own teardown.
+#
+# systemctl(1) is used instead of the systemd_service module
+# so a partially-cleaned tree (missing unit file, live cgroup)
+# still stops cleanly; the module errors on LOAD=not-found
+# even when ACTIVE=running.
+- name: Stop qemu-system@<vm> instances (parallel)
+  ansible.builtin.command:
+    argv:
+      - systemctl
+      - --user
+      - stop
+      - "qemu-system@{{ item }}.service"
+  loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
+  loop_control:
+    label: "qemu-system@{{ item }}"
+  async: 180
+  poll: 0
+  register: qsu_stop_jobs
+  changed_when: true
+  failed_when: false
+
+- name: Wait for qemu-system stops to complete
+  ansible.builtin.async_status:
+    jid: "{{ item.ansible_job_id }}"
+  loop: "{{ qsu_stop_jobs.results }}"
+  loop_control:
+    label: "qemu-system@{{ item.item }}"
+  register: qsu_stop_wait
+  until: qsu_stop_wait.finished
+  retries: 60
+  delay: 3
+  failed_when: false
+  when: item.ansible_job_id is defined
+
+- name: Remove SSH config entries for qsu VMs
+  ansible.builtin.command:
+    argv:
+      - python3
+      - "{{ playbook_dir }}/../scripts/update_ssh_config_nixosfi.py"
+      - remove
+      - "{{ item }}"
+      - ""
+      - ""
+      - ""
+      - "{{ lookup('env', 'HOME') }}/.ssh/config"
+      - ""
+      - qsu imageless NixOS
+  register: qsu_ssh_config_remove
+  changed_when: qsu_ssh_config_remove.rc == 0
+  loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
+  failed_when: false
+
+- name: Clean up per-node generated imageless configurations
+  ansible.builtin.file:
+    path: "{{ nixosfi_config_dir }}/{{ item }}"
+    state: absent
+  loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
+
+- name: Remove per-VM vm.env files
+  ansible.builtin.file:
+    path: "{{ lookup('env', 'HOME') }}/.config/systemd/qemu-system/{{ item }}.env"
+    state: absent
+  loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
+
+- name: Remove per-VM service drop-in directories
+  ansible.builtin.file:
+    path: "{{ lookup('env', 'HOME') }}/.config/systemd/user/qemu-system@{{ item }}.service.d"
+    state: absent
+  loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
+
+- name: Remove per-share virtiofsd env files
+  ansible.builtin.file:
+    path: "{{ lookup('env', 'HOME') }}/.config/systemd/virtiofsd/{{ item.0 }}-{{ item.1 }}.env"
+    state: absent
+  loop: "{{ (groups['all'] | reject('equalto', 'localhost') | list) | product(qsu_canonical_share_tags) | list }}"
+  loop_control:
+    label: "{{ item.0 }}-{{ item.1 }}"
+
+- name: Remove per-(VM, share) virtiofsd drop-in directories
+  ansible.builtin.file:
+    path: "{{ lookup('env', 'HOME') }}/.config/systemd/user/virtiofsd@{{ item.0 }}-{{ item.1 }}.service.d"
+    state: absent
+  loop: "{{ (groups['all'] | reject('equalto', 'localhost') | list) | product(qsu_canonical_share_tags) | list }}"
+  loop_control:
+    label: "virtiofsd@{{ item.0 }}-{{ item.1 }}.service.d"
+
+# `true` as the third default() arg so an empty XDG_STATE_HOME
+# falls through to $HOME/.local/state rather than producing a
+# bogus "/qemu-system/<vm>" path.
+- name: Resolve systemd state root for destroy
+  ansible.builtin.set_fact:
+    qsu_state_root: "{{ lookup('env', 'XDG_STATE_HOME') | default(lookup('env', 'HOME') ~ '/.local/state', true) }}/qemu-system"
+
+# Workloads may leave entries with restrictive modes inside the
+# per-VM /data tree. Restore owner traversal so the following
+# state: absent task can finish.
+- name: Make per-VM state directories traversable before removal
+  ansible.builtin.command:
+    cmd: "chmod -R u+rwX {{ qsu_state_root }}/{{ item }}"
+  loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
+  failed_when: false
+  changed_when: false
+
+- name: Remove per-VM systemd state directories
+  ansible.builtin.file:
+    path: "{{ qsu_state_root }}/{{ item }}"
+    state: absent
+  loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
+
+- name: Remove qsu shared units and helper
+  ansible.builtin.file:
+    path: "{{ item }}"
+    state: absent
+  loop:
+    - "{{ lookup('env', 'HOME') }}/.config/systemd/user/[email protected]"
+    - "{{ lookup('env', 'HOME') }}/.config/systemd/user/[email protected]"
+    - "{{ lookup('env', 'HOME') }}/.config/systemd/user/[email protected]"
+    - "{{ lookup('env', 'HOME') }}/.config/systemd/qemu-system/qmp-powerdown"
+
+- name: Reload user systemd after removal
+  ansible.builtin.systemd_service:
+    daemon_reload: true
+    scope: user
diff --git a/playbooks/roles/qsu/tasks/install-deps.yml b/playbooks/roles/qsu/tasks/install-deps.yml
new file mode 100644
index 00000000..1694a922
--- /dev/null
+++ b/playbooks/roles/qsu/tasks/install-deps.yml
@@ -0,0 +1,31 @@
+---
+# SPDX-License-Identifier: copyleft-next-0.3.1
+#
+# Host dependencies for the qsu runtime (nixosfi backend): the
+# QEMU system emulator, virtiofsd, socat for QMP graceful shutdown,
+# and systemd-container for machinectl. Nix is handled by the
+# existing nixos-flake path when the imageless guest image is built.
+
+- name: Ensure qsu dependencies are installed (Debian)
+  become: true
+  ansible.builtin.package:
+    name:
+      - qemu-system-x86
+      - qemu-utils
+      - socat
+      - systemd-container
+      - virtiofsd
+    state: present
+  when: ansible_facts.os_family == "Debian"
+
+- name: Ensure qsu dependencies are installed (RedHat)
+  become: true
+  ansible.builtin.package:
+    name:
+      - qemu-kvm
+      - qemu-img
+      - socat
+      - systemd-container
+      - virtiofsd
+    state: present
+  when: ansible_facts.os_family == "RedHat"
diff --git a/playbooks/roles/qsu/tasks/render-per-vm.yml b/playbooks/roles/qsu/tasks/render-per-vm.yml
new file mode 100644
index 00000000..83895bda
--- /dev/null
+++ b/playbooks/roles/qsu/tasks/render-per-vm.yml
@@ -0,0 +1,280 @@
+---
+# SPDX-License-Identifier: copyleft-next-0.3.1
+
+# Mirrors [email protected] StateDirectory=qemu-system/%i so
+# vm.env relative paths resolve against the service WorkingDirectory.
+- name: Compute per-VM systemd state directory for {{ qsu_vm_name }}
+  ansible.builtin.set_fact:
+    qsu_state_dir: "{{ lookup('env', 'XDG_STATE_HOME') | default(lookup('env', 'HOME') ~ '/.local/state', true) }}/qemu-system/{{ qsu_vm_name }}"
+
+- name: Ensure qsu per-VM directories exist
+  ansible.builtin.file:
+    path: "{{ item }}"
+    state: directory
+    mode: "0755"
+  loop: "{{ qsu_per_vm_dirs }}"
+  vars:
+    qsu_per_vm_dirs_base:
+      - "{{ lookup('env', 'HOME') }}/.config/systemd/qemu-system"
+      - "{{ lookup('env', 'HOME') }}/.config/systemd/virtiofsd"
+      - "{{ lookup('env', 'HOME') }}/.config/systemd/user/qemu-system@{{ qsu_vm_name }}.service.d"
+      - "{{ qsu_state_dir }}"
+      - "{{ qsu_state_dir }}/data"
+      - "{{ qsu_state_dir }}/data/configs"
+    # data-results is per-(vm, kernel) so A/B kernel builds don't
+    # clobber each other and tooling can index runs by (vm, kernel).
+    qsu_per_vm_dirs_fstests: >-
+      {{
+        [topdir_path ~ '/workflows/fstests/results/' ~ qsu_vm_name,
+         topdir_path ~ '/workflows/fstests/results/' ~ qsu_vm_name ~ '/' ~ qsu_kernel_release]
+        if (kdevops_workflow_enable_fstests | default(false) | bool)
+        else []
+      }}
+    qsu_per_vm_dirs: "{{ qsu_per_vm_dirs_base + qsu_per_vm_dirs_fstests }}"
+
+# last-run points at the kernel vm.env is currently rendered for;
+# rebuild-boot re-runs this task so the symlink follows.
+- name: Update last-run symlink for {{ qsu_vm_name }}
+  ansible.builtin.file:
+    src: "{{ qsu_kernel_release }}"
+    dest: "{{ topdir_path }}/workflows/fstests/results/{{ qsu_vm_name }}/last-run"
+    state: link
+    force: true
+  when:
+    - kdevops_workflow_enable_fstests | default(false) | bool
+
+- name: Update last-kernel.txt for {{ qsu_vm_name }}
+  ansible.builtin.copy:
+    content: "{{ qsu_kernel_release }}\n"
+    dest: "{{ topdir_path }}/workflows/fstests/results/{{ qsu_vm_name }}/last-kernel.txt"
+    mode: "0644"
+  when:
+    - kdevops_workflow_enable_fstests | default(false) | bool
+
+- name: Create per-VM NVMe qcow2 backing files for {{ qsu_vm_name }}
+  ansible.builtin.command:
+    argv:
+      - qemu-img
+      - create
+      - -f
+      - qcow2
+      - "{{ qsu_state_dir }}/nvme{{ item }}.qcow2"
+      - "{{ qsu_nvme_drive_size_gb }}G"
+    creates: "{{ qsu_state_dir }}/nvme{{ item }}.qcow2"
+  loop: "{{ range(qsu_nvme_drive_count | int) | list }}"
+  loop_control:
+    label: "{{ qsu_vm_name }}-nvme{{ item }}"
+
+- name: Reset per-VM nvme drives accumulator for {{ qsu_vm_name }}
+  ansible.builtin.set_fact:
+    qsu_nvme_drives: []
+
+# `kdevops<N>` serial matches the libvirt bringup; by-id symlinks
+# resolve the same on both backends. Each BlockConf knob takes a
+# single value (global) or comma-list of length N (per-drive).
+- name: Compose per-VM nvme drives for {{ qsu_vm_name }}
+  ansible.builtin.set_fact:
+    qsu_nvme_drives: "{{ qsu_nvme_drives + [composed_drive] }}"
+  vars:
+    base_drive:
+      file: "nvme{{ item }}.qcow2"
+      format: qcow2
+      serial: "kdevops{{ item }}"
+    blockconf_knobs:
+      logical_block_size: "{{ qsu_nvme_logical_block_size | default('') | string }}"
+      physical_block_size: "{{ qsu_nvme_physical_block_size | default('') | string }}"
+      min_io_size: "{{ qsu_nvme_min_io_size | default('') | string }}"
+      opt_io_size: "{{ qsu_nvme_opt_io_size | default('') | string }}"
+      discard_granularity: "{{ qsu_nvme_discard_granularity | default('') | string }}"
+      write-cache: "{{ qsu_nvme_write_cache | default('') | string }}"
+      # MDTS encoded as log2 above CAP.MPSMIN (4 KiB): mdts=N ->
+      # (1 << N) * 4 KiB. QEMU defaults to 7 (= 512 KiB).
+      mdts: "{{ qsu_nvme_mdts | default('') | string }}"
+      # atomic.{dn,awun,awupf} are NvmeCtrl; atomic.{nawun,nawupf,
+      # nabsn,nabspf,nabo} are NvmeNamespace. The partition step
+      # below routes each to its device. Linux's nvme_atomic_bs
+      # reads NAWUPF, so the namespace fields drive
+      # /sys/block/<dev>/queue/atomic_write_unit_max_bytes.
+      "atomic.dn": "{{ qsu_nvme_atomic_dn | default('') | string }}"
+      "atomic.awun": "{{ qsu_nvme_atomic_awun | default('') | string }}"
+      "atomic.awupf": "{{ qsu_nvme_atomic_awupf | default('') | string }}"
+      "atomic.nawun": "{{ qsu_nvme_atomic_nawun | default('') | string }}"
+      "atomic.nawupf": "{{ qsu_nvme_atomic_nawupf | default('') | string }}"
+      "atomic.nabsn": "{{ qsu_nvme_atomic_nabsn | default('') | string }}"
+      "atomic.nabspf": "{{ qsu_nvme_atomic_nabspf | default('') | string }}"
+      "atomic.nabo": "{{ qsu_nvme_atomic_nabo | default('') | string }}"
+    drive_overrides: >-
+      {%- set out = {} -%}
+      {%- for key, raw in blockconf_knobs.items() -%}
+        {%- set parts = raw.split(',') -%}
+        {%- set value = parts[0] if (parts | length == 1) else (parts[item] if item < (parts | length) else '') -%}
+        {%- if (value | string | length) > 0 -%}
+          {%- set _ = out.update({key: value}) -%}
+        {%- endif -%}
+      {%- endfor -%}
+      {{ out }}
+    # Route each key to the device that accepts it; BlockConf lands
+    # on whichever device owns the drive backend (controller in
+    # simple mode, namespace in explicit mode).
+    nvme_ctrl_keys: ["mdts", "atomic.dn", "atomic.awun", "atomic.awupf"]
+    nvme_ns_keys: ["atomic.nawun", "atomic.nawupf", "atomic.nabsn", "atomic.nabspf", "atomic.nabo"]
+    nvme_blockconf_keys: ["logical_block_size", "physical_block_size", "min_io_size", "opt_io_size", "discard_granularity", "write-cache"]
+    ctrl_overrides: >-
+      {%- set out = {} -%}
+      {%- for k in nvme_ctrl_keys -%}
+        {%- if k in drive_overrides -%}{%- set _ = out.update({k: drive_overrides[k]}) -%}{%- endif -%}
+      {%- endfor -%}
+      {{ out }}
+    ns_overrides: >-
+      {%- set out = {} -%}
+      {%- for k in nvme_ns_keys -%}
+        {%- if k in drive_overrides -%}{%- set _ = out.update({k: drive_overrides[k]}) -%}{%- endif -%}
+      {%- endfor -%}
+      {{ out }}
+    blockconf_overrides: >-
+      {%- set out = {} -%}
+      {%- for k in nvme_blockconf_keys -%}
+        {%- if k in drive_overrides -%}{%- set _ = out.update({k: drive_overrides[k]}) -%}{%- endif -%}
+      {%- endfor -%}
+      {{ out }}
+    # Pivot to explicit-namespace mode when any per-namespace
+    # atomic.* is set; QEMU only accepts those on -device nvme-ns.
+    composed_drive: >-
+      {%- if (nvme_ns_keys | select('in', drive_overrides) | list | length) > 0 -%}
+        {%- set ns0 = {'file': base_drive.file, 'format': base_drive.format} | combine(blockconf_overrides) | combine(ns_overrides) -%}
+        {{ {'serial': base_drive.serial} | combine(ctrl_overrides) | combine({'namespaces': [ns0]}) }}
+      {%- else -%}
+        {{ base_drive | combine(ctrl_overrides) | combine(blockconf_overrides) }}
+      {%- endif -%}
+  loop: "{{ range(qsu_nvme_drive_count | int) | list }}"
+  loop_control:
+    label: "{{ qsu_vm_name }}-kdevops{{ item }}"
+
+- name: Compose per-VM virtiofs shares for {{ qsu_vm_name }}
+  ansible.builtin.set_fact:
+    qsu_shares: "{{ qsu_shares_base + qsu_shares_fstests }}"
+  vars:
+    qsu_shares_base:
+      - tag: store
+        dir: /nix/store
+        mount: /nix/store
+      - tag: modules
+        dir: "{{ qsu_modules_dir }}"
+        mount: /lib/modules
+    qsu_shares_fstests: >-
+      {{
+        [
+          {'tag': 'data-configs',
+           'dir': qsu_state_dir ~ '/data/configs',
+           'mount': '/data/configs'},
+          {'tag': 'data-results',
+           'dir': topdir_path ~ '/workflows/fstests/results/' ~ qsu_vm_name ~ '/' ~ qsu_kernel_release,
+           'mount': '/data/results'},
+          {'tag': 'kdevops-fstests',
+           'dir': topdir_path ~ '/workflows/fstests',
+           'mount': '/usr/local/lib/kdevops/fstests'}
+        ]
+        if (kdevops_workflow_enable_fstests | default(false) | bool)
+        else []
+      }}
+
+- name: Render vm.env for {{ qsu_vm_name }}
+  ansible.builtin.template:
+    src: "{{ topdir_path }}/scripts/qemu-system-units/templates/vm.env.j2"
+    dest: "{{ lookup('env', 'HOME') }}/.config/systemd/qemu-system/{{ qsu_vm_name }}.env"
+    mode: "0644"
+  vars:
+    vm_name: "{{ qsu_vm_name }}"
+    qemu_binary: "{{ qsu_qemu_binary }}"
+    cpu: "{{ qsu_cpu }}"
+    accel: "{{ qsu_accel }}"
+    ram: "{{ qsu_ram }}"
+    cpus: "{{ qsu_cpus }}"
+    machine_type: "{{ qsu_machine_type }}"
+    ssh_port: "{{ qsu_ssh_port_base | int + qsu_vm_idx }}"
+    vsock_cid: "{{ qsu_vsock_cid_base | int + qsu_vm_idx }}"
+    kernel:
+      image: "{{ qsu_kernel_image }}"
+      initrd: "{{ qsu_initrd }}"
+      append: "root=tmpfs console=ttyS0,115200 console=hvc0 init={{ qsu_init }}"
+    shares: "{{ qsu_shares }}"
+    nvme:
+      drives: "{{ qsu_nvme_drives }}"
+
+- name: Render qsu debug vars snapshot for {{ qsu_vm_name }}
+  ansible.builtin.template:
+    src: debug-vars.yaml.j2
+    dest: "{{ qsu_vars_dir }}/{{ qsu_vm_name }}.yaml"
+    mode: "0644"
+  vars:
+    vm_name: "{{ qsu_vm_name }}"
+    service_scope: user
+    qemu_binary: "{{ qsu_qemu_binary }}"
+    cpu: "{{ qsu_cpu }}"
+    accel: "{{ qsu_accel }}"
+    ram: "{{ qsu_ram }}"
+    cpus: "{{ qsu_cpus }}"
+    machine_type: "{{ qsu_machine_type }}"
+    ssh_port: "{{ qsu_ssh_port_base | int + qsu_vm_idx }}"
+    vsock_cid: "{{ qsu_vsock_cid_base | int + qsu_vm_idx }}"
+    kernel:
+      image: "{{ qsu_kernel_image }}"
+      initrd: "{{ qsu_initrd }}"
+      append: "root=tmpfs console=ttyS0,115200 console=hvc0 init={{ qsu_init }}"
+    shares: "{{ qsu_shares }}"
+    nvme:
+      drives: "{{ qsu_nvme_drives }}"
+
+- name: Render per-VM service drop-in override.conf for {{ qsu_vm_name }}
+  ansible.builtin.template:
+    src: "{{ topdir_path }}/scripts/qemu-system-units/templates/qemu-system-override.conf.j2"
+    dest: "{{ lookup('env', 'HOME') }}/.config/systemd/user/qemu-system@{{ qsu_vm_name }}.service.d/override.conf"
+    mode: "0644"
+  vars:
+    vm_name: "{{ qsu_vm_name }}"
+    service_scope: user
+    qemu_binary: "{{ qsu_qemu_binary }}"
+    ram: "{{ qsu_ram }}"
+    machine_type: "{{ qsu_machine_type }}"
+    vsock_cid: "{{ qsu_vsock_cid_base | int + qsu_vm_idx }}"
+    shares: "{{ qsu_shares }}"
+
+# Per-(VM, share) drop-in adding Before=qemu-system@<vm>.service so
+# virtiofsd outlives qemu's ExecStop= graceful shutdown. Without it,
+# virtiofsd tears down concurrently with the guest's poweroff and
+# qemu hits TimeoutStopSec -> SIGKILL waiting on missing virtiofs
+# responses.
+- name: Ensure per-(VM, share) virtiofsd drop-in dirs exist for {{ qsu_vm_name }}
+  ansible.builtin.file:
+    path: "{{ lookup('env', 'HOME') }}/.config/systemd/user/virtiofsd@{{ qsu_vm_name }}-{{ item.tag }}.service.d"
+    state: directory
+    mode: "0755"
+  loop: "{{ qsu_shares }}"
+  loop_control:
+    label: "virtiofsd@{{ qsu_vm_name }}-{{ item.tag }}.service.d"
+
+- name: Render per-(VM, share) virtiofsd drop-in for {{ qsu_vm_name }}
+  ansible.builtin.template:
+    src: "{{ topdir_path }}/scripts/qemu-system-units/templates/virtiofsd-override.conf.j2"
+    dest: "{{ lookup('env', 'HOME') }}/.config/systemd/user/virtiofsd@{{ qsu_vm_name }}-{{ item.tag }}.service.d/override.conf"
+    mode: "0644"
+  vars:
+    vm_name: "{{ qsu_vm_name }}"
+  loop: "{{ qsu_shares }}"
+  loop_control:
+    label: "virtiofsd@{{ qsu_vm_name }}-{{ item.tag }}.service.d/override.conf"
+
+- name: Render virtiofsd env files for the imageless shares of {{ qsu_vm_name }}
+  ansible.builtin.template:
+    src: "{{ topdir_path }}/scripts/qemu-system-units/templates/virtiofsd.env.j2"
+    dest: "{{ lookup('env', 'HOME') }}/.config/systemd/virtiofsd/{{ qsu_vm_name }}-{{ item.tag }}.env"
+    mode: "0644"
+  vars:
+    vm_name: "{{ qsu_vm_name }}"
+    share_tag: "{{ item.tag }}"
+    shares:
+      - tag: "{{ item.tag }}"
+        dir: "{{ item.dir }}"
+  loop: "{{ qsu_shares }}"
+  loop_control:
+    label: "{{ qsu_vm_name }}-{{ item.tag }}"
diff --git a/playbooks/roles/qsu/tasks/render-units.yml b/playbooks/roles/qsu/tasks/render-units.yml
new file mode 100644
index 00000000..624b7301
--- /dev/null
+++ b/playbooks/roles/qsu/tasks/render-units.yml
@@ -0,0 +1,55 @@
+---
+# SPDX-License-Identifier: copyleft-next-0.3.1
+#
+# Deploy the three qemu-system-units template units (qemu-system@,
+# [email protected], [email protected]) and the QMP powerdown
+# script that [email protected]'s ExecStop= pipes into the VM.
+# These files are shared across all VMs on the host; per-VM state
+# lives in %E/systemd/qemu-system/<vm>.env and is rendered in a
+# later task file.
+
+- name: Ensure user systemd and qsu config directories exist
+  ansible.builtin.file:
+    path: "{{ item }}"
+    state: directory
+    mode: "0755"
+  loop:
+    - "{{ lookup('env', 'HOME') }}/.config/systemd/user"
+    - "{{ lookup('env', 'HOME') }}/.config/systemd/qemu-system"
+
+- name: Render [email protected]
+  ansible.builtin.template:
+    src: "{{ topdir_path }}/scripts/qemu-system-units/templates/[email protected]"
+    dest: "{{ lookup('env', 'HOME') }}/.config/systemd/user/[email protected]"
+    mode: "0644"
+  vars:
+    qemu_binary: "{{ qsu_qemu_binary }}"
+    service_scope: user
+
+- name: Render [email protected]
+  ansible.builtin.template:
+    src: "{{ topdir_path }}/scripts/qemu-system-units/templates/[email protected]"
+    dest: "{{ lookup('env', 'HOME') }}/.config/systemd/user/[email protected]"
+    mode: "0644"
+  vars:
+    service_scope: user
+
+- name: Render [email protected]
+  ansible.builtin.template:
+    src: "{{ topdir_path }}/scripts/qemu-system-units/templates/[email protected]"
+    dest: "{{ lookup('env', 'HOME') }}/.config/systemd/user/[email protected]"
+    mode: "0644"
+  vars:
+    service_scope: user
+
+- name: Install QMP powerdown helper for [email protected] ExecStop=
+  ansible.builtin.copy:
+    src: "{{ topdir_path }}/scripts/qemu-system-units/files/qmp-powerdown"
+    dest: "{{ lookup('env', 'HOME') }}/.config/systemd/qemu-system/qmp-powerdown"
+    remote_src: true
+    mode: "0644"
+
+- name: Reload user systemd so the rendered units are visible
+  ansible.builtin.systemd_service:
+    daemon_reload: true
+    scope: user
diff --git a/playbooks/roles/qsu/tasks/restart-vms.yml b/playbooks/roles/qsu/tasks/restart-vms.yml
new file mode 100644
index 00000000..5800e79c
--- /dev/null
+++ b/playbooks/roles/qsu/tasks/restart-vms.yml
@@ -0,0 +1,55 @@
+---
+# SPDX-License-Identifier: copyleft-next-0.3.1
+#
+# Native systemctl restart of every qemu-system@<vm>.service in
+# the inventory, then wait for each guest's sshd to greet on its
+# forwarded port. Used by `make restart-vms` and
+# `make rebuild-restart`.
+#
+# JOB_RESTART works cleanly because qemu-system-override.conf
+# uses Requires=virtiofsd@%i-<tag>.service rather than BindsTo=,
+# which removes the UNIT_ATOM_CANNOT_BE_ACTIVE_WITHOUT death-link
+# (src/core/unit.c:2233 unit_is_bound_by_inactive()) that
+# previously raced the in-place JOB_RESTART -> JOB_START morph
+# (src/core/job.c:1027). After the stop phase drops virtiofsd to
+# inactive via vhost-user disconnect, the morphed JOB_START runs
+# without the death-link tripping; QEMU connects to
+# [email protected] and socket activation spawns a fresh
+# [email protected]. See
+# scripts/qemu-system-units/docs/design-decisions.md
+# "virtiofsd dependency: Requires=, not BindsTo=" for the
+# tradeoff (loss of automatic crash-kill propagation) and the
+# revert path if that property must be re-acquired.
+
+- name: Restart qemu-system@<vm> instances
+  ansible.builtin.systemd_service:
+    name: "qemu-system@{{ item }}.service"
+    state: restarted
+    scope: user
+  loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
+
+# After the restart QEMU re-execs and the guest goes through
+# stage-1 + stage-2 boot before sshd is reachable. Without
+# blocking on sshd-greeting, the next play (typically
+# fstests-baseline) hits the guest while the proxy dialer's
+# upstream socket is up but the guest hasn't bound port 22 yet,
+# producing
+#   Failed to connect to the host via ssh:
+#     mm_receive_fd: recvmsg: expected received 1 got 0
+#     proxy dialer did not pass back a connection
+# in the very first ssh task. Mirror the same wait_for that
+# bringup.yml runs after starting the qemu-system services so
+# every restart path enforces the same readiness contract: sshd
+# must answer before we declare the VM available.
+- name: Wait for sshd to greet on each VM's forwarded port
+  ansible.builtin.wait_for:
+    host: 127.0.0.1
+    port: "{{ qsu_ssh_port_base | int + qsu_vm_idx }}"
+    search_regex: "^SSH-2\\.0"
+    delay: 5
+    timeout: 300
+  loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
+  loop_control:
+    loop_var: qsu_vm_name
+    index_var: qsu_vm_idx
+    label: "{{ qsu_vm_name }}:{{ qsu_ssh_port_base | int + qsu_vm_idx }}"
diff --git a/playbooks/roles/qsu/tasks/start-vms.yml b/playbooks/roles/qsu/tasks/start-vms.yml
new file mode 100644
index 00000000..5309995e
--- /dev/null
+++ b/playbooks/roles/qsu/tasks/start-vms.yml
@@ -0,0 +1,46 @@
+---
+# SPDX-License-Identifier: copyleft-next-0.3.1
+#
+# Start every qemu-system@<vm>.service in the inventory, then
+# block until each guest's sshd answers on its forwarded port.
+# Used by `make start-vms` and as a building block for
+# higher-level lifecycle paths.
+#
+# The start transaction pulls in JOB_START on every Requires=
+# dependency in the per-VM drop-in: virtiofsd@%i-<tag>.socket
+# starts (or is already up via WantedBy=sockets.target), and
+# qemu's first connection to that socket spawns
+# virtiofsd@%i-<tag>.service via socket activation.
+
+- name: Start qemu-system@<vm> instances
+  ansible.builtin.systemd_service:
+    name: "qemu-system@{{ item }}.service"
+    state: started
+    scope: user
+  loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
+
+# After the start QEMU re-execs and the guest goes through
+# stage-1 + stage-2 boot before sshd is reachable. Without
+# blocking on sshd-greeting, the next play (typically
+# fstests-baseline) hits the guest while the proxy dialer's
+# upstream socket is up but the guest hasn't bound port 22 yet,
+# producing
+#   Failed to connect to the host via ssh:
+#     mm_receive_fd: recvmsg: expected received 1 got 0
+#     proxy dialer did not pass back a connection
+# in the very first ssh task. Mirror the same wait_for that
+# bringup.yml runs after starting the qemu-system services so
+# every start path enforces the same readiness contract: sshd
+# must answer before we declare the VM available.
+- name: Wait for sshd to greet on each VM's forwarded port
+  ansible.builtin.wait_for:
+    host: 127.0.0.1
+    port: "{{ qsu_ssh_port_base | int + qsu_vm_idx }}"
+    search_regex: "^SSH-2\\.0"
+    delay: 5
+    timeout: 300
+  loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
+  loop_control:
+    loop_var: qsu_vm_name
+    index_var: qsu_vm_idx
+    label: "{{ qsu_vm_name }}:{{ qsu_ssh_port_base | int + qsu_vm_idx }}"
diff --git a/playbooks/roles/qsu/tasks/stop-vms.yml b/playbooks/roles/qsu/tasks/stop-vms.yml
new file mode 100644
index 00000000..33250066
--- /dev/null
+++ b/playbooks/roles/qsu/tasks/stop-vms.yml
@@ -0,0 +1,25 @@
+---
+# SPDX-License-Identifier: copyleft-next-0.3.1
+#
+# Synchronous stop of every qemu-system@<vm>.service in the
+# inventory. Used by `make stop-vms` and as a building block
+# for higher-level lifecycle paths.
+#
+# state=stopped blocks until the qemu-system@<vm>.service unit
+# itself reaches inactive. The per-VM drop-in's
+# Requires=virtiofsd@%i-<tag>.service propagates the stop to
+# virtiofsd via RequiredBy.PROPAGATE_STOP; the per-instance
+# Before=qemu-system@<vm>.service drop-in on
+# virtiofsd@<vm>-<tag>.service orders virtiofsd's stop AFTER
+# qemu's ExecStop= completes, so the guest's ssh-driven
+# poweroff has working virtiofs throughout. See
+# scripts/qemu-system-units/docs/design-decisions.md
+# ("virtiofsd dependency: Requires=, not BindsTo=") for the
+# rationale and tradeoff.
+
+- name: Stop qemu-system@<vm> instances
+  ansible.builtin.systemd_service:
+    name: "qemu-system@{{ item }}.service"
+    state: stopped
+    scope: user
+  loop: "{{ groups['all'] | reject('equalto', 'localhost') | list }}"
diff --git a/playbooks/roles/qsu/templates/debug-vars.yaml.j2 b/playbooks/roles/qsu/templates/debug-vars.yaml.j2
new file mode 100644
index 00000000..79b80067
--- /dev/null
+++ b/playbooks/roles/qsu/templates/debug-vars.yaml.j2
@@ -0,0 +1,175 @@
+# SPDX-License-Identifier: copyleft-next-0.3.1
+#
+# qemu-system-units vars snapshot for {{ vm_name }}. Generated by
+# kdevops at bringup time (scripts/qemu-system-units/vars/ is
+# gitignored). Render the standalone qsu templates with:
+#
+#     minijinja-cli --trim-blocks templates/vm.env.j2 vars/{{ vm_name }}.yaml
+#
+# The YAML body below is a strict qsu vars file: every top-level
+# key is documented in scripts/qemu-system-units/docs/vars.md and
+# the file is intended to be hand-shareable. minijinja-cli reads
+# only the YAML; the comment block immediately below preserves the
+# kdevops Kconfig values and resolved per-VM facts that produced
+# this snapshot, so the file can be read alongside .config and
+# extra_vars.yaml without bouncing between files.
+#
+# Source kdevops Kconfig values
+# (cross-reference with .config / extra_vars.yaml):
+#
+#     CONFIG_QSU_NVME_DRIVE_COUNT="{{ qsu_nvme_drive_count | default('') }}"
+#     CONFIG_QSU_NVME_DRIVE_SIZE_GB="{{ qsu_nvme_drive_size_gb | default('') }}"
+#     CONFIG_QSU_NVME_LOGICAL_BLOCK_SIZE="{{ qsu_nvme_logical_block_size | default('') }}"
+#     CONFIG_QSU_NVME_PHYSICAL_BLOCK_SIZE="{{ qsu_nvme_physical_block_size | default('') }}"
+#     CONFIG_QSU_NVME_MIN_IO_SIZE="{{ qsu_nvme_min_io_size | default('') }}"
+#     CONFIG_QSU_NVME_OPT_IO_SIZE="{{ qsu_nvme_opt_io_size | default('') }}"
+#     CONFIG_QSU_NVME_DISCARD_GRANULARITY="{{ qsu_nvme_discard_granularity | default('') }}"
+#     CONFIG_QSU_NVME_WRITE_CACHE="{{ qsu_nvme_write_cache | default('') }}"
+#     CONFIG_QSU_NVME_MDTS="{{ qsu_nvme_mdts | default('') }}"
+#     CONFIG_QSU_NVME_ATOMIC_DN="{{ qsu_nvme_atomic_dn | default('') }}"
+#     CONFIG_QSU_NVME_ATOMIC_AWUN="{{ qsu_nvme_atomic_awun | default('') }}"
+#     CONFIG_QSU_NVME_ATOMIC_AWUPF="{{ qsu_nvme_atomic_awupf | default('') }}"
+#     CONFIG_QSU_NVME_ATOMIC_NAWUN="{{ qsu_nvme_atomic_nawun | default('') }}"
+#     CONFIG_QSU_NVME_ATOMIC_NAWUPF="{{ qsu_nvme_atomic_nawupf | default('') }}"
+#     CONFIG_QSU_NVME_ATOMIC_NABSN="{{ qsu_nvme_atomic_nabsn | default('') }}"
+#     CONFIG_QSU_NVME_ATOMIC_NABSPF="{{ qsu_nvme_atomic_nabspf | default('') }}"
+#     CONFIG_QSU_NVME_ATOMIC_NABO="{{ qsu_nvme_atomic_nabo | default('') }}"
+#     CONFIG_QSU_SSH_PORT_BASE={{ qsu_ssh_port_base | default('') }}
+#     CONFIG_QSU_VSOCK_CID_BASE={{ qsu_vsock_cid_base | default('') }}
+#     CONFIG_QSU_SSH_DEFAULT_VSOCK={{ 'y' if (qsu_ssh_default_vsock | default(false) | bool) else 'n' }}
+#     CONFIG_QSU_SSH_DEFAULT_TCP={{ 'y' if (qsu_ssh_default_tcp | default(false) | bool) else 'n' }}
+#
+# Resolved per-VM facts:
+#     vm_index={{ qsu_vm_idx | default('') }}
+#     state_dir={{ qsu_state_dir | default('') }}
+#     kernel_release={{ qsu_kernel_release | default('') }}
+#     kernel_image={{ qsu_kernel_image | default('') }}
+#     modules_dir={{ qsu_modules_dir | default('') }}
+#     init={{ qsu_init | default('') }}
+#     initrd={{ qsu_initrd | default('') }}
+
+vm_name: {{ vm_name }}
+service_scope: {{ service_scope | default('user') }}
+
+# QEMU
+qemu_binary: {{ qemu_binary }}
+cpu: {{ cpu }}
+accel: {{ accel }}
+ram: {{ ram }}
+cpus: {{ cpus }}
+machine_type: {{ machine_type }}
+{% if uuid is defined %}
+uuid: {{ uuid }}
+{% endif %}
+{% if iommu is defined %}
+iommu: {{ iommu }}
+{% endif %}
+
+# Networking
+ssh_port: {{ ssh_port }}
+{% if vsock_cid is defined %}
+vsock_cid: {{ vsock_cid }}
+{% endif %}
+{% if ssh_private_key is defined %}
+ssh_private_key: {{ ssh_private_key }}
+{% endif %}
+
+# Direct kernel boot
+kernel:
+  image: {{ kernel.image }}
+  initrd: {{ kernel.initrd }}
+  append: {{ kernel.append }}
+
+{% if firmware is defined %}
+# UEFI firmware (OVMF/AAVMF)
+firmware:
+  code: {{ firmware.code }}
+  vars: {{ firmware.vars }}
+{% if firmware.vars_format is defined %}
+  vars_format: {{ firmware.vars_format }}
+{% endif %}
+
+{% endif %}
+{% if image is defined %}
+# Root disk image (qcow2/raw, attached via virtio-blk)
+image:
+  file: {{ image.file }}
+  format: {{ image.format | default('raw') }}
+{% if image.cache is defined %}
+  cache: {{ image.cache }}
+{% endif %}
+{% if image.aio is defined %}
+  aio: {{ image.aio }}
+{% endif %}
+{% if image.discard is defined %}
+  discard: {{ image.discard }}
+{% endif %}
+
+{% endif %}
+{% if cloud_init is defined and cloud_init.seed is defined %}
+# cloud-init seed ISO (one-shot first boot)
+cloud_init:
+  seed: {{ cloud_init.seed }}
+
+{% endif %}
+{% if drives is defined and drives | length > 0 %}
+# Extra plain block drives (virtio-blk, no NVMe)
+drives:
+{% for d in drives %}
+  - file: {{ d.file }}
+    format: {{ d.format | default('raw') }}
+{% if d.cache is defined %}
+    cache: {{ d.cache }}
+{% endif %}
+{% if d.aio is defined %}
+    aio: {{ d.aio }}
+{% endif %}
+{% if d.discard is defined %}
+    discard: {{ d.discard }}
+{% endif %}
+{% endfor %}
+
+{% endif %}
+{% if pci_passthrough is defined and pci_passthrough | length > 0 %}
+# vfio-pci passthrough (host BDF -> guest)
+pci_passthrough:
+{% for dev in pci_passthrough %}
+  - addr: {{ dev.addr }}
+{% if dev.opts is defined %}
+    opts: {{ dev.opts }}
+{% endif %}
+{% endfor %}
+
+{% endif %}
+# virtiofs shares (host dir -> guest mount)
+{% if share_transport is defined %}
+share_transport: {{ share_transport }}
+{% endif %}
+shares:
+{% for s in shares %}
+  - tag: {{ s.tag }}
+    dir: {{ s.dir }}
+    mount: {{ s.mount }}
+{% endfor %}
+
+{% if nvme is defined and (nvme.drives | default([]) | length > 0
+       or nvme.subsystems | default([]) | length > 0) %}
+# NVMe drives. Each drive renders into one of two QEMU shapes:
+#
+#   - Simple mode (no `namespaces` key): one `-device nvme,drive=`
+#     with implicit namespace, BlockConf and controller atomics
+#     inline.
+#   - Explicit-namespace mode (`namespaces[]` present): separate
+#     `-device nvme,id=` controller and one `-device nvme-ns` per
+#     entry. Per-namespace atomics (atomic.nawun, atomic.nawupf,
+#     atomic.nabsn, atomic.nabspf, atomic.nabo) only render in
+#     explicit mode because QEMU's hw/nvme/ns.c rejects them on
+#     the controller; drivers/nvme/host/core.c's nvme_atomic_bs
+#     also only consumes per-namespace NAWUPF for the kernel-side
+#     atomic_write_unit_max value.
+#
+# The resolved per-drive dicts below are dumped as-is so the
+# shape of each drive (simple vs explicit) is visible at a glance.
+{{ {'nvme': nvme} | to_nice_yaml(indent=2, width=120) -}}
+
+{% endif %}
diff --git a/playbooks/roles/qsu/vars/main.yml b/playbooks/roles/qsu/vars/main.yml
new file mode 100644
index 00000000..5ac02375
--- /dev/null
+++ b/playbooks/roles/qsu/vars/main.yml
@@ -0,0 +1,26 @@
+---
+# SPDX-License-Identifier: copyleft-next-0.3.1
+#
+# Role-level constants for qsu. Auto-loaded
+# whenever the role is imported or included via roles: /
+# include_role: / import_role:.
+
+# Superset of every virtiofsd share tag the role can render an
+# env file for. Active subset per inventory VM is computed in
+# tasks/imageless-build-per-vm.yml as
+#   qsu_shares = qsu_shares_base + qsu_shares_fstests
+# under the kdevops_workflow_enable_fstests gate. bringup.yml uses
+# this list to validate that an env file
+# in the host-shared ~/.config/systemd/virtiofsd/ directory really
+# belongs to the role (i.e. matches `<inventory-vm>-<tag>.env`)
+# before restarting its socket — without this filter, a global
+# *.env glob touches sockets owned by VMs in other kdevops trees
+# on the host. destroy.yml uses it to enumerate exactly which
+# per-share env files to remove. Keep in sync with the shares
+# block in imageless-build-per-vm.yml whenever a share is added.
+qsu_canonical_share_tags:
+  - store
+  - modules
+  - data-configs
+  - data-results
+  - kdevops-fstests
diff --git a/scripts/nixosfi.Makefile b/scripts/nixosfi.Makefile
new file mode 100644
index 00000000..fc3ef394
--- /dev/null
+++ b/scripts/nixosfi.Makefile
@@ -0,0 +1,125 @@
+# SPDX-License-Identifier: copyleft-next-0.3.1
+#
+# Bringup glue for CONFIG_NIXOSFI.
+#
+# User-facing entry points are the kdevops top-level targets:
+# `make bringup`, `make destroy`, `make console`, `make rebuild-boot`,
+# `make rebuild-test`. They dispatch through the
+# KDEVOPS_PROVISION_*_METHOD variables below to the per-phase
+# tag-gated targets in playbooks/nixosfi.yml. The nixosfi-* targets in this
+# file are dispatch internals; users do not call them directly.
+
+KDEVOPS_NODES_TEMPLATE :=	$(KDEVOPS_NODES_ROLE_TEMPLATE_DIR)/guestfs_nodes.j2
+KDEVOPS_NODES :=		guestfs/kdevops_nodes.yaml
+
+export KDEVOPS_PROVISIONED_SSH := $(KDEVOPS_PROVISIONED_SSH_DEFAULT_GUARD)
+
+NIXOSFI_BRINGUP_DEPS :=
+
+ifeq (y,$(CONFIG_BOOTLINUX_DIRECT_BOOT))
+NIXOSFI_BRINGUP_DEPS += linux-direct-boot
+endif
+
+KDEVOPS_PROVISION_METHOD		:= bringup_nixosfi
+KDEVOPS_PROVISION_DESTROY_METHOD	:= destroy_nixosfi
+KDEVOPS_PROVISION_STATUS_METHOD		:= nixosfi-status
+KDEVOPS_PROVISION_CONSOLE_METHOD	:= nixosfi-console
+KDEVOPS_PROVISION_REBUILD_BOOT_METHOD	:= nixosfi-rebuild-boot
+KDEVOPS_PROVISION_REBUILD_TEST_METHOD	:= nixosfi-rebuild-test
+
+$(KDEVOPS_PROVISIONED_SSH): $(KDEVOPS_HOSTS_PREFIX)
+	$(Q)touch $(KDEVOPS_PROVISIONED_SSH)
+
+bringup_nixosfi: $(NIXOSFI_BRINGUP_DEPS)
+	$(Q)$(MAKE) nixosfi-bringup
+PHONY += bringup_nixosfi
+
+destroy_nixosfi:
+	$(Q)$(MAKE) nixosfi-destroy
+PHONY += destroy_nixosfi
+
+PHONY += nixosfi-bringup
+nixosfi-bringup: $(KDEVOPS_EXTRA_VARS)
+	$(Q)ansible-playbook $(KDEVOPS_PLAYBOOKS_DIR)/nixosfi.yml \
+		--tags install-deps,generate-configs,build-vms,bringup,console \
+		--extra-vars=@./extra_vars.yaml
+
+PHONY += nixosfi-destroy
+nixosfi-destroy: $(KDEVOPS_EXTRA_VARS)
+	$(Q)ansible-playbook $(KDEVOPS_PLAYBOOKS_DIR)/nixosfi.yml \
+		--tags destroy \
+		--extra-vars=@./extra_vars.yaml
+
+PHONY += nixosfi-console
+# Attach to a running qsu VM's serial console via socat. Defaults to
+# the single running VM; pass VM=<name> when more than one is up.
+nixosfi-console:
+	$(Q)set -e; \
+	if [ -n "$$VM" ]; then \
+		vm="$$VM"; \
+	else \
+		vms=$$(systemctl --user list-units 'qemu-system@*.service' \
+			--no-legend --state=active 2>/dev/null \
+			| awk '{sub(/qemu-system@/,"",$$1); sub(/\.service/,"",$$1); print $$1}'); \
+		count=$$(printf '%s\n' "$$vms" | sed '/^$$/d' | wc -l); \
+		case $$count in \
+		0) echo "no running qsu VM found"; exit 1 ;; \
+		1) vm="$$vms" ;; \
+		*) echo "multiple qsu VMs running, pick one with VM=<name>:"; \
+		   printf '  %s\n' $$vms; exit 1 ;; \
+		esac; \
+	fi; \
+	sock="$${XDG_RUNTIME_DIR}/qemu-system/$$vm/console.sock"; \
+	[ -S "$$sock" ] || { echo "qsu console socket missing: $$sock"; exit 1; }; \
+	command -v socat >/dev/null || { echo "socat is required"; exit 1; }; \
+	echo "Attaching to $$vm (Ctrl-] then Q to detach)"; \
+	exec socat -,raw,echo=0,escape=0x1d UNIX-CONNECT:"$$sock"
+
+PHONY += nixosfi-status
+# Report the run-state and currently-booted kernel for every guest
+# the active inventory declares. Running guests are probed over SSH;
+# stopped guests show '-'.
+nixosfi-status:
+	$(Q)set -e; \
+	hosts=$$(ansible all --list-hosts 2>/dev/null \
+		| tail -n +2 | awk '$$1 != "localhost" {print $$1}'); \
+	if [ -z "$$hosts" ]; then \
+		echo "no qsu hosts in inventory (run 'make' first?)"; \
+		exit 0; \
+	fi; \
+	printf '%-20s %-10s %s\n' VM STATE KERNEL; \
+	for vm in $$hosts; do \
+		st=stopped; \
+		k=-; \
+		if systemctl --user is-active --quiet "qemu-system@$$vm.service"; then \
+			st=running; \
+			k=$$(ssh -o BatchMode=yes -o ConnectTimeout=3 \
+				-o StrictHostKeyChecking=no \
+				"$$vm" uname -r 2>/dev/null || echo "?"); \
+		fi; \
+		printf '%-20s %-10s %s\n' "$$vm" "$$st" "$$k"; \
+	done
+
+PHONY += nixosfi-rebuild-boot
+nixosfi-rebuild-boot: $(KDEVOPS_EXTRA_VARS)
+	$(Q)ansible-playbook $(KDEVOPS_PLAYBOOKS_DIR)/nixosfi.yml \
+		--tags rebuild-boot,restart-vms \
+		--extra-vars=@./extra_vars.yaml
+
+PHONY += nixosfi-rebuild-test
+nixosfi-rebuild-test: $(KDEVOPS_EXTRA_VARS)
+	$(Q)ansible-playbook $(KDEVOPS_PLAYBOOKS_DIR)/nixosfi.yml \
+		--tags rebuild-test \
+		--extra-vars=@./extra_vars.yaml
+
+PHONY += nixosfi-stop
+nixosfi-stop: $(KDEVOPS_EXTRA_VARS)
+	$(Q)ansible-playbook $(KDEVOPS_PLAYBOOKS_DIR)/nixosfi.yml \
+		--tags stop-vms \
+		--extra-vars=@./extra_vars.yaml
+
+PHONY += nixosfi-start
+nixosfi-start: $(KDEVOPS_EXTRA_VARS)
+	$(Q)ansible-playbook $(KDEVOPS_PLAYBOOKS_DIR)/nixosfi.yml \
+		--tags start-vms \
+		--extra-vars=@./extra_vars.yaml
diff --git a/scripts/nixosfi_ssh_key_name.py b/scripts/nixosfi_ssh_key_name.py
new file mode 100755
index 00000000..8dffb993
--- /dev/null
+++ b/scripts/nixosfi_ssh_key_name.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: copyleft-next-0.3.1
+
+"""Generate SSH key name for NixOS VMs based on directory location."""
+
+import os
+import sys
+import hashlib
+
+
+def get_ssh_key_name():
+    """Generate SSH key name based on kdevops project directory."""
+    # Find the kdevops root directory
+    # Start from the script's location
+    script_dir = os.path.dirname(os.path.abspath(__file__))
+
+    # The script is in kdevops/scripts/, so go up one level
+    kdevops_root = os.path.dirname(script_dir)
+
+    # Use the kdevops root directory for consistent key naming
+    # This ensures the same key is used regardless of where the script is called from
+    cwd = kdevops_root
+
+    # Get the last two directory components for the key name
+    path_parts = cwd.split("/")
+    if len(path_parts) >= 2:
+        # Use last two directories
+        key_suffix = "-".join(path_parts[-2:])
+    else:
+        # Use just the last directory
+        key_suffix = path_parts[-1] if path_parts else "kdevops"
+
+    # Create a short hash to ensure uniqueness
+    path_hash = hashlib.sha256(cwd.encode()).hexdigest()[:8]
+
+    # Construct the key name
+    key_name = f"kdevops-nixos-{key_suffix}-{path_hash}"
+
+    return key_name
+
+
+def main():
+    """Main function."""
+    if len(sys.argv) > 1 and sys.argv[1] == "--path":
+        # Return full path to key
+        key_name = get_ssh_key_name()
+        key_path = os.path.expanduser(f"~/.ssh/{key_name}")
+        print(key_path)
+    else:
+        # Return just the key name
+        print(get_ssh_key_name())
+
+
+if __name__ == "__main__":
+    main()
diff --git a/scripts/provision.Makefile b/scripts/provision.Makefile
index bf2f4d40..289d0f76 100644
--- a/scripts/provision.Makefile
+++ b/scripts/provision.Makefile
@@ -80,6 +80,10 @@ ifeq (y,$(CONFIG_NIXOSFL))
 include scripts/nixosfl.Makefile
 endif
 
+ifeq (y,$(CONFIG_NIXOSFI))
+include scripts/nixosfi.Makefile
+endif
+
 KDEVOPS_MRPROPER += $(KDEVOPS_PROVISIONED_SSH)
 KDEVOPS_MRPROPER += $(KDEVOPS_PROVISIONED_DEVCONFIG)
 
diff --git a/scripts/update_ssh_config_nixosfi.py b/scripts/update_ssh_config_nixosfi.py
new file mode 100755
index 00000000..bc9541e3
--- /dev/null
+++ b/scripts/update_ssh_config_nixosfi.py
@@ -0,0 +1,216 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: copyleft-next-0.3.1
+
+"""Update SSH config for NixOS guests provisioned by kdevops.
+
+Manages SSH configuration entries for kdevops-deployed NixOS guests
+provisioned through the nixos_flake libvirt backend, or driven by the
+qsu systemd-machined VMs against a nixos-flake imageless closure.
+
+Usage:
+    update_ssh_config_nixosfi.py update <hostname> <host> <port> <user>
+        <ssh_config> <privkey> <tag>
+        [--vsock-cid <N>] [--default-transport vsock|tcp]
+    update_ssh_config_nixosfi.py remove <hostname> '' '' '' <ssh_config>
+        '' <tag>
+
+When --vsock-cid is given, emit three Host stanzas:
+    <hostname>-vsock    : ProxyCommand systemd-ssh-proxy vsock/<cid> 22
+    <hostname>-tcp      : TCP via <host>:<port>
+    <hostname>          : alias of whichever --default-transport picks
+                          (defaults to vsock when --vsock-cid is set).
+
+Without --vsock-cid, one <hostname> stanza is emitted over TCP
+(backward-compatible with the nixos_flake libvirt caller).
+"""
+
+import argparse
+import os
+import re
+import sys
+
+SYSTEMD_SSH_PROXY = "/usr/lib/systemd/systemd-ssh-proxy"
+
+
+def render_vsock_stanza(host_tokens, user, key, cid):
+    return (
+        f"Host {host_tokens}\n"
+        f"    User {user}\n"
+        f"    IdentityFile {key}\n"
+        f"    ProxyCommand {SYSTEMD_SSH_PROXY} vsock/{cid} 22\n"
+        f"    ProxyUseFdpass yes\n"
+        f"    CheckHostIP no\n"
+        f"    StrictHostKeyChecking no\n"
+        f"    UserKnownHostsFile /dev/null\n"
+        f"    LogLevel ERROR\n"
+    )
+
+
+def render_tcp_stanza(host_tokens, host_ip, port, user, key):
+    return (
+        f"Host {host_tokens}\n"
+        f"    HostName {host_ip}\n"
+        f"    Port {port}\n"
+        f"    User {user}\n"
+        f"    IdentityFile {key}\n"
+        f"    StrictHostKeyChecking no\n"
+        f"    UserKnownHostsFile /dev/null\n"
+        f"    LogLevel ERROR\n"
+    )
+
+
+def build_entries(hostname, host_ip, port, user, key, vsock_cid, default_transport):
+    """Return a list of (alias, block_body) pairs to write.
+
+    Each block starts with its own `# kdevops-managed: {tag} - {alias}`
+    marker so remove-on-update can match and drop the old block via
+    regex.
+    """
+    if vsock_cid is None:
+        # Legacy single-stanza form used by the nixos_flake libvirt path.
+        return [
+            (hostname, render_tcp_stanza(hostname, host_ip, port, user, key)),
+        ]
+
+    # Three-stanza form: default alias groups with either -vsock or -tcp.
+    if default_transport == "tcp":
+        default_alias = f"{hostname} {hostname}-tcp"
+        bare_stanza = render_tcp_stanza(default_alias, host_ip, port, user, key)
+        return [
+            (hostname, bare_stanza),
+            (
+                f"{hostname}-vsock",
+                render_vsock_stanza(f"{hostname}-vsock", user, key, vsock_cid),
+            ),
+        ]
+
+    # default_transport == "vsock"
+    default_alias = f"{hostname} {hostname}-vsock"
+    bare_stanza = render_vsock_stanza(default_alias, user, key, vsock_cid)
+    return [
+        (hostname, bare_stanza),
+        (
+            f"{hostname}-tcp",
+            render_tcp_stanza(f"{hostname}-tcp", host_ip, port, user, key),
+        ),
+    ]
+
+
+def managed_block_regex(tag, hostname):
+    """Match every `# kdevops-managed: {tag} - <alias>` block whose alias
+    is either the base hostname or starts with it followed by a dash.
+    Catches qsu, qsu-vsock, qsu-tcp in one sweep without disturbing
+    unrelated entries that share the tag prefix.
+    """
+    return re.compile(
+        rf"^# kdevops-managed: {re.escape(tag)} - "
+        rf"{re.escape(hostname)}(?:-[\w-]+)?\n"
+        r"Host [^\n]+\n"
+        r"(?:[ \t]+[^\n]+\n)*",
+        re.MULTILINE,
+    )
+
+
+def update_ssh_config(
+    action,
+    hostname,
+    host_ip,
+    port,
+    username,
+    ssh_config_path,
+    ssh_key_path,
+    tag,
+    vsock_cid,
+    default_transport,
+):
+    ssh_config_path = os.path.expanduser(ssh_config_path)
+    os.makedirs(os.path.dirname(ssh_config_path), exist_ok=True)
+
+    config_content = ""
+    if os.path.exists(ssh_config_path):
+        with open(ssh_config_path, "r") as f:
+            config_content = f.read()
+
+    entry_pattern = managed_block_regex(tag, hostname)
+
+    # Always drop prior managed blocks for this base hostname.
+    config_content = entry_pattern.sub("", config_content)
+
+    if action == "remove":
+        print(f"Removed SSH config entries for {hostname}")
+    elif action == "update":
+        blocks = []
+        for alias, body in build_entries(
+            hostname,
+            host_ip,
+            port,
+            username,
+            ssh_key_path,
+            vsock_cid,
+            default_transport,
+        ):
+            blocks.append(f"# kdevops-managed: {tag} - {alias}\n{body}")
+        new_entries = "\n".join(blocks)
+        config_content = config_content.rstrip() + "\n\n" + new_entries + "\n"
+        if vsock_cid is None:
+            print(f"Updated SSH config entry for {hostname} (port {port})")
+        else:
+            print(
+                f"Updated SSH config entries for {hostname}, "
+                f"{hostname}-vsock, {hostname}-tcp "
+                f"(default={default_transport}, vsock CID={vsock_cid}, "
+                f"TCP port={port})"
+            )
+
+    with open(ssh_config_path, "w") as f:
+        f.write(config_content)
+
+
+def main():
+    parser = argparse.ArgumentParser(
+        description="Manage SSH config entries for kdevops-deployed NixOS guests.",
+    )
+    parser.add_argument("action", choices=["update", "remove"])
+    parser.add_argument("hostname")
+    parser.add_argument("host_ip", nargs="?", default="localhost")
+    parser.add_argument("port", nargs="?", default="22")
+    parser.add_argument("username", nargs="?", default="kdevops")
+    parser.add_argument("ssh_config_path")
+    parser.add_argument("ssh_key_path", nargs="?", default="")
+    parser.add_argument("tag", nargs="?", default="NixOS VM")
+    parser.add_argument(
+        "--vsock-cid",
+        type=int,
+        default=None,
+        help="VSOCK CID of the VM. When set, emit qsu-style three-stanza "
+        "layout (host, host-vsock, host-tcp).",
+    )
+    parser.add_argument(
+        "--default-transport",
+        choices=["vsock", "tcp"],
+        default="vsock",
+        help="Which transport the bare <hostname> alias groups with. Only "
+        "meaningful when --vsock-cid is set.",
+    )
+    args = parser.parse_args()
+
+    try:
+        update_ssh_config(
+            args.action,
+            args.hostname,
+            args.host_ip or "localhost",
+            args.port or "22",
+            args.username or "kdevops",
+            args.ssh_config_path,
+            args.ssh_key_path,
+            args.tag,
+            args.vsock_cid,
+            args.default_transport,
+        )
+    except Exception as e:
+        print(f"Error: {e}")
+        sys.exit(1)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/workflows/linux/Kconfig b/workflows/linux/Kconfig
index 4f8694d9..317c2073 100644
--- a/workflows/linux/Kconfig
+++ b/workflows/linux/Kconfig
@@ -37,6 +37,7 @@ endif # HAVE_SUPPORTS_PURE_IOMAP
 
 choice
 	prompt "Kernel build location"
+	default BOOTLINUX_DIRECT_BOOT if NIXOSFI
 	default BOOTLINUX_TARGETS if !LIBVIRT || GUESTFS_LACKS_9P
 	default BOOTLINUX_9P if LIBVIRT && !GUESTFS_LACKS_9P
 	help

-- 
2.54.0