| .. 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 |
| =================== |
| |
| First, before you perform a KHO kexec, you need to move the system into |
| the :ref:`KHO finalization phase <kho-finalization-phase>` :: |
| |
| $ echo 1 > /sys/kernel/debug/kho/out/finalize |
| |
| After this command, the KHO FDT is available in |
| ``/sys/kernel/debug/kho/out/fdt``. Other subsystems may also register |
| their own preserved sub FDTs under |
| ``/sys/kernel/debug/kho/out/sub_fdts/``. |
| |
| Next, 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. |
| |
| Abort a KHO exec |
| ================ |
| |
| You can move the system out of KHO finalization phase again by calling :: |
| |
| $ echo 0 > /sys/kernel/debug/kho/out/active |
| |
| After this command, the KHO FDT is no longer available in |
| ``/sys/kernel/debug/kho/out/fdt``. |
| |
| debugfs Interfaces |
| ================== |
| |
| 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/finalize`` |
| Kexec HandOver (KHO) allows Linux to transition the state of |
| compatible drivers into the next kexec'ed kernel. To do so, |
| device drivers will instruct KHO to preserve memory regions, |
| which could contain serialized kernel state. |
| While the state is serialized, they are unable to perform |
| any modifications to state that was serialized, such as |
| handed over memory allocations. |
| |
| When this file contains "1", the system is in the transition |
| state. When contains "0", it is not. To switch between the |
| two states, echo the respective number into this file. |
| |
| ``/sys/kernel/debug/kho/out/fdt`` |
| When KHO state tree is finalized, 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/`` |
| In the KHO finalization phase, KHO producers register their own |
| FDT 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 FDT blobs |
| of KHO producers passed from the old kernel. |