KHO FDT

KHO uses the flattened device tree (FDT) container format and libfdt library to create and parse the data that is passed between the kernels. The properties in KHO FDT are stored in native format. It includes the physical address of an in-memory structure describing all preserved memory regions, as well as physical addresses of KHO users’ own FDTs. Interpreting those sub FDTs is the responsibility of KHO users.

KHO nodes and properties

Property preserved-memory-map

KHO saves a special property named preserved-memory-map under the root node. This node contains the physical address of an in-memory structure for KHO to preserve memory regions across kexec.

Property compatible

The compatible property determines compatibility between the kernel that created the KHO FDT and the kernel that attempts to load it. If the kernel that loads the KHO FDT is not compatible with it, the entire KHO process will be bypassed.

Property fdt

Generally, A KHO user serialize its state into its own FDT and instructs KHO to preserve the underlying memory, such that after kexec, the new kernel can recover its state from the preserved FDT.

A KHO user thus can create a node in KHO root tree and save the physical address of its own FDT in that node’s property fdt .

Examples

The following example demonstrates KHO FDT that preserves two memory regions created with reserve_mem kernel command line parameter:

/dts-v1/;

/ {
      compatible = "kho-v1";

      preserved-memory-map = <0x40be16 0x1000000>;

      memblock {
              fdt = <0x1517 0x1000000>;
      };
};

where the memblock node contains an FDT that is requested by the subsystem memblock for preservation. The FDT contains the following serialized data:

/dts-v1/;

/ {
      compatible = "memblock-v1";

      n1 {
              compatible = "reserve-mem-v1";
              start = <0xc06b 0x4000000>;
              size = <0x04 0x00>;
      };

      n2 {
              compatible = "reserve-mem-v1";
              start = <0xc067 0x4000000>;
              size = <0x04 0x00>;
      };
};