| .. SPDX-License-Identifier: GPL-2.0-or-later |
| |
| ==================== |
| Kexec Handover Usage |
| ==================== |
| |
| Kexec HandOver (KHO) is a mechanism that allows Linux to preserve memory |
| regions, which could contain serialized system states, across kexec. |
| |
| This document expects that you are familiar with the base KHO |
| :ref:`concepts <kho-concepts>`. If you have not read |
| them yet, please do so now. |
| |
| Prerequisites |
| ============= |
| |
| KHO is available when the kernel is compiled with ``CONFIG_KEXEC_HANDOVER`` |
| set to y. Every KHO producer may have its own config option that you |
| need to enable if you would like to preserve their respective state across |
| kexec. |
| |
| To use KHO, please boot the kernel with the ``kho=on`` command line |
| parameter. You may use ``kho_scratch`` parameter to define size of the |
| scratch regions. For example ``kho_scratch=16M,512M,256M`` will reserve a |
| 16 MiB low memory scratch area, a 512 MiB global scratch region, and 256 MiB |
| per NUMA node scratch regions on boot. |
| |
| Perform a KHO kexec |
| =================== |
| |
| To perform a KHO kexec, load the target payload and kexec into it. It |
| is important that you use the ``-s`` parameter to use the in-kernel |
| kexec file loader, as user space kexec tooling currently has no |
| support for KHO with the user space based file loader :: |
| |
| # kexec -l /path/to/bzImage --initrd /path/to/initrd -s |
| # kexec -e |
| |
| The new kernel will boot up and contain some of the previous kernel's state. |
| |
| For example, if you used ``reserve_mem`` command line parameter to create |
| an early memory reservation, the new kernel will have that memory at the |
| same physical address as the old kernel. |
| |
| Kexec Metadata |
| ============== |
| |
| KHO automatically tracks metadata about the kexec chain, passing information |
| about the previous kernel to the next kernel. This feature helps diagnose |
| bugs that only reproduce when kexecing from specific kernel versions. |
| |
| On each KHO kexec, the kernel logs the previous kernel's version and the |
| number of kexec reboots since the last cold boot:: |
| |
| [ 0.000000] KHO: exec from: 6.19.0-rc4-next-20260107 (count 1) |
| |
| The metadata includes: |
| |
| ``previous_release`` |
| The kernel version string (from ``uname -r``) of the kernel that |
| initiated the kexec. |
| |
| ``kexec_count`` |
| The number of kexec boots since the last cold boot. On cold boot, |
| this counter starts at 0 and increments with each kexec. This helps |
| identify issues that only manifest after multiple consecutive kexec |
| reboots. |
| |
| Use Cases |
| --------- |
| |
| This metadata is particularly useful for debugging kexec transition bugs, |
| where a buggy kernel kexecs into a new kernel and the bug manifests only |
| in the second kernel. Examples of such bugs include: |
| |
| - Memory corruption from the previous kernel affecting the new kernel |
| - Incorrect hardware state left by the previous kernel |
| - Firmware/ACPI state issues that only appear in kexec scenarios |
| |
| At scale, correlating crashes to the previous kernel version enables |
| faster root cause analysis when issues only occur in specific kernel |
| transition scenarios. |
| |
| debugfs Interfaces |
| ================== |
| |
| These debugfs interfaces are available when the kernel is compiled with |
| ``CONFIG_KEXEC_HANDOVER_DEBUGFS`` enabled. |
| |
| Currently KHO creates the following debugfs interfaces. Notice that these |
| interfaces may change in the future. They will be moved to sysfs once KHO is |
| stabilized. |
| |
| ``/sys/kernel/debug/kho/out/fdt`` |
| The kernel exposes the flattened device tree blob that carries its |
| current KHO state in this file. Kexec user space tooling can use this |
| as input file for the KHO payload image. |
| |
| ``/sys/kernel/debug/kho/out/scratch_len`` |
| Lengths of KHO scratch regions, which are physically contiguous |
| memory regions that will always stay available for future kexec |
| allocations. Kexec user space tools can use this file to determine |
| where it should place its payload images. |
| |
| ``/sys/kernel/debug/kho/out/scratch_phys`` |
| Physical locations of KHO scratch regions. Kexec user space tools |
| can use this file in conjunction to scratch_phys to determine where |
| it should place its payload images. |
| |
| ``/sys/kernel/debug/kho/out/sub_fdts/`` |
| KHO producers can register their own FDT or another binary blob under |
| this directory. |
| |
| ``/sys/kernel/debug/kho/in/fdt`` |
| When the kernel was booted with Kexec HandOver (KHO), |
| the state tree that carries metadata about the previous |
| kernel's state is in this file in the format of flattened |
| device tree. This file may disappear when all consumers of |
| it finished to interpret their metadata. |
| |
| ``/sys/kernel/debug/kho/in/sub_fdts/`` |
| Similar to ``kho/out/sub_fdts/``, but contains sub blobs |
| of KHO producers passed from the old kernel. |