€•¬Œsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ$/translations/zh_CN/core-api/kho/abi”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/zh_TW/core-api/kho/abi”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/it_IT/core-api/kho/abi”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/ja_JP/core-api/kho/abi”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/ko_KR/core-api/kho/abi”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/pt_BR/core-api/kho/abi”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/sp_SP/core-api/kho/abi”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ)SPDX-License-Identifier: GPL-2.0-or-later”h]”hŒ)SPDX-License-Identifier: GPL-2.0-or-later”…””}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³Œ>/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi.rst”h´KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒKexec Handover ABI”h]”hŒKexec Handover ABI”…””}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒCore Kexec Handover ABI”h]”hŒCore Kexec Handover ABI”…””}”(hhàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÝh²hh³hÇh´KubhŒ paragraph”“”)”}”(hŒóKexec Handover uses the ABI defined below for passing preserved data from one kernel to the next. The ABI uses Flattened Device Tree (FDT) format. The first kernel creates an FDT which is then passed to the next kernel during a kexec handover.”h]”hŒóKexec Handover uses the ABI defined below for passing preserved data from one kernel to the next. The ABI uses Flattened Device Tree (FDT) format. The first kernel creates an FDT which is then passed to the next kernel during a kexec handover.”…””}”(hhðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:10: ./include/linux/kho/abi/kexec_handover.h”h´KhhÝh²hubhï)”}”(hXþThis interface is a contract. Any modification to the FDT structure, node properties, compatible string, or the layout of the data structures referenced here constitutes a breaking change. Such changes require incrementing the version number in KHO_FDT_COMPATIBLE to prevent a new kernel from misinterpreting data from an older kernel. Changes are allowed provided the compatibility version is incremented. However, backward/forward compatibility is only guaranteed for kernels supporting the same ABI version.”h]”hXþThis interface is a contract. Any modification to the FDT structure, node properties, compatible string, or the layout of the data structures referenced here constitutes a breaking change. Such changes require incrementing the version number in KHO_FDT_COMPATIBLE to prevent a new kernel from misinterpreting data from an older kernel. Changes are allowed provided the compatibility version is incremented. However, backward/forward compatibility is only guaranteed for kernels supporting the same ABI version.”…””}”(hhÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:10: ./include/linux/kho/abi/kexec_handover.h”h´KhhÝh²hubhŒdefinition_list”“”)”}”(hhh]”hŒdefinition_list_item”“”)”}”(hXÚFDT Structure Overview: The FDT serves as a central registry for physical addresses of preserved data structures. The first kernel populates this FDT with references to memory regions and other metadata that need to persist across the kexec transition. The subsequent kernel then parses this FDT to locate and restore the preserved data.:: / { compatible = "kho-v3"; preserved-memory-map = <0x...>; { preserved-data = <0x...>; blob-size = <0x...>; }; { preserved-data = <0x...>; blob-size = <0x...>; }; ... ... { preserved-data = <0x...>; blob-size = <0x...>; }; }; Root KHO Node (/): - compatible: "kho-v3" Indentifies the overall KHO ABI version. - preserved-memory-map: u64 Physical memory address pointing to the root of the preserved memory map data structure. Subnodes (): Subnodes can also be added to the root node to describe other preserved data blobs. The is provided by the subsystem that uses KHO for preserving its data. - preserved-data: u64 Physical address pointing to a subnode data blob that is also being preserved. - blob-size: u64 Size in bytes of the preserved data blob. This is needed because blobs may use arbitrary formats (not just FDT), so the size cannot be determined from the blob content alone. ”h]”(hŒterm”“”)”}”(hŒFDT Structure Overview:”h]”hŒFDT Structure Overview:”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:10: ./include/linux/kho/abi/kexec_handover.h”h´KXhjubhŒ definition”“”)”}”(hhh]”(hï)”}”(hX;The FDT serves as a central registry for physical addresses of preserved data structures. The first kernel populates this FDT with references to memory regions and other metadata that need to persist across the kexec transition. The subsequent kernel then parses this FDT to locate and restore the preserved data.::”h]”hX:The FDT serves as a central registry for physical addresses of preserved data structures. The first kernel populates this FDT with references to memory regions and other metadata that need to persist across the kexec transition. The subsequent kernel then parses this FDT to locate and restore the preserved data.:”…””}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:10: ./include/linux/kho/abi/kexec_handover.h”h´K#hj,ubhŒ literal_block”“”)”}”(hXq/ { compatible = "kho-v3"; preserved-memory-map = <0x...>; { preserved-data = <0x...>; blob-size = <0x...>; }; { preserved-data = <0x...>; blob-size = <0x...>; }; ... ... { preserved-data = <0x...>; blob-size = <0x...>; }; };”h]”hXq/ { compatible = "kho-v3"; preserved-memory-map = <0x...>; { preserved-data = <0x...>; blob-size = <0x...>; }; { preserved-data = <0x...>; blob-size = <0x...>; }; ... ... { preserved-data = <0x...>; blob-size = <0x...>; }; };”…””}”hj@sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j>h³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:10: ./include/linux/kho/abi/kexec_handover.h”h´K)hj,ubj)”}”(hhh]”(j)”}”(hŒÑRoot KHO Node (/): - compatible: "kho-v3" Indentifies the overall KHO ABI version. - preserved-memory-map: u64 Physical memory address pointing to the root of the preserved memory map data structure. ”h]”(j)”}”(hŒRoot KHO Node (/):”h]”hŒRoot KHO Node (/):”…””}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:10: ./include/linux/kho/abi/kexec_handover.h”h´KFhjRubj+)”}”(hhh]”hŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒ?compatible: "kho-v3" Indentifies the overall KHO ABI version. ”h]”(hï)”}”(hŒcompatible: "kho-v3"”h]”hŒcompatible: “kho-v3—…””}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:10: ./include/linux/kho/abi/kexec_handover.h”h´K?hjoubhï)”}”(hŒ(Indentifies the overall KHO ABI version.”h]”hŒ(Indentifies the overall KHO ABI version.”…””}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:10: ./include/linux/kho/abi/kexec_handover.h”h´KAhjoubeh}”(h]”h ]”h"]”h$]”h&]”uh1jmhjjubjn)”}”(hŒtpreserved-memory-map: u64 Physical memory address pointing to the root of the preserved memory map data structure. ”h]”(hï)”}”(hŒpreserved-memory-map: u64”h]”hŒpreserved-memory-map: u64”…””}”(hj›h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:10: ./include/linux/kho/abi/kexec_handover.h”h´KChj—ubhï)”}”(hŒXPhysical memory address pointing to the root of the preserved memory map data structure.”h]”hŒXPhysical memory address pointing to the root of the preserved memory map data structure.”…””}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:10: ./include/linux/kho/abi/kexec_handover.h”h´KEhj—ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jmhjjubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jhh³jh´K?hjeubah}”(h]”h ]”h"]”h$]”h&]”uh1j*hjRubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³jdh´KFhjOubj)”}”(hXþSubnodes (): Subnodes can also be added to the root node to describe other preserved data blobs. The is provided by the subsystem that uses KHO for preserving its data. - preserved-data: u64 Physical address pointing to a subnode data blob that is also being preserved. - blob-size: u64 Size in bytes of the preserved data blob. This is needed because blobs may use arbitrary formats (not just FDT), so the size cannot be determined from the blob content alone. ”h]”(j)”}”(hŒSubnodes ():”h]”hŒSubnodes ():”…””}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³j)h´KXhjÓubj+)”}”(hhh]”(hï)”}”(hŒ¬Subnodes can also be added to the root node to describe other preserved data blobs. The is provided by the subsystem that uses KHO for preserving its data.”h]”hŒ¬Subnodes can also be added to the root node to describe other preserved data blobs. The is provided by the subsystem that uses KHO for preserving its data.”…””}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:10: ./include/linux/kho/abi/kexec_handover.h”h´KIhjåubji)”}”(hhh]”(jn)”}”(hŒdpreserved-data: u64 Physical address pointing to a subnode data blob that is also being preserved. ”h]”(hï)”}”(hŒpreserved-data: u64”h]”hŒpreserved-data: u64”…””}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:10: ./include/linux/kho/abi/kexec_handover.h”h´KNhjúubhï)”}”(hŒNPhysical address pointing to a subnode data blob that is also being preserved.”h]”hŒNPhysical address pointing to a subnode data blob that is also being preserved.”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:10: ./include/linux/kho/abi/kexec_handover.h”h´KPhjúubeh}”(h]”h ]”h"]”h$]”h&]”uh1jmhj÷ubjn)”}”(hŒÀblob-size: u64 Size in bytes of the preserved data blob. This is needed because blobs may use arbitrary formats (not just FDT), so the size cannot be determined from the blob content alone. ”h]”(hï)”}”(hŒblob-size: u64”h]”hŒblob-size: u64”…””}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:10: ./include/linux/kho/abi/kexec_handover.h”h´KShj"ubhï)”}”(hŒ®Size in bytes of the preserved data blob. This is needed because blobs may use arbitrary formats (not just FDT), so the size cannot be determined from the blob content alone.”h]”hŒ®Size in bytes of the preserved data blob. This is needed because blobs may use arbitrary formats (not just FDT), so the size cannot be determined from the blob content alone.”…””}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:10: ./include/linux/kho/abi/kexec_handover.h”h´KUhj"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jmhj÷ubeh}”(h]”h ]”h"]”h$]”h&]”jÅjÆuh1jhh³j h´KNhjåubeh}”(h]”h ]”h"]”h$]”h&]”uh1j*hjÓubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³j)h´KXhjOubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhj,ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j*hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³j)h´KXhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhhÝh²hh³Nh´Nubeh}”(h]”Œcore-kexec-handover-abi”ah ]”h"]”Œcore kexec handover abi”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒvmalloc preservation ABI”h]”hŒvmalloc preservation ABI”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj|h²hh³hÇh´Kubhï)”}”(hŒãThe Kexec Handover ABI for preserving vmalloc'ed memory is defined by a set of structures and helper macros. The layout of these structures is a stable contract between kernels and is versioned by the KHO_FDT_COMPATIBLE string.”h]”hŒåThe Kexec Handover ABI for preserving vmalloc’ed memory is defined by a set of structures and helper macros. The layout of these structures is a stable contract between kernels and is versioned by the KHO_FDT_COMPATIBLE string.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:16: ./include/linux/kho/abi/kexec_handover.h”h´Kihj|h²hubhï)”}”(hX½The preservation is managed through a main descriptor :c:type:`struct kho_vmalloc `, which points to a linked list of :c:type:`struct kho_vmalloc_chunk ` structures. These chunks contain the physical addresses of the preserved pages, allowing the next kernel to reconstruct the vmalloc area with the same content and layout. Helper macros are also defined for storing and loading pointers within these structures.”h]”(hŒ6The preservation is managed through a main descriptor ”…””}”(hjœh²hh³Nh´Nubh)”}”(hŒ*:c:type:`struct kho_vmalloc `”h]”hŒliteral”“”)”}”(hj¦h]”hŒstruct kho_vmalloc”…””}”(hjªh²hh³Nh´Nubah}”(h]”h ]”(Œxref”Œc”Œc-type”eh"]”h$]”h&]”uh1j¨hj¤ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œcore-api/kho/abi”Œ refdomain”jµŒreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰Œ reftarget”Œ kho_vmalloc”uh1hh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:16: ./include/linux/kho/abi/kexec_handover.h”h´KnhjœubhŒ#, which points to a linked list of ”…””}”(hjœh²hh³Nh´Nubh)”}”(hŒ6:c:type:`struct kho_vmalloc_chunk `”h]”j©)”}”(hjÐh]”hŒstruct kho_vmalloc_chunk”…””}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”(j´jµŒc-type”eh"]”h$]”h&]”uh1j¨hjÎubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jÁŒ refdomain”jµŒreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰jÇŒkho_vmalloc_chunk”uh1hh³jÉh´KnhjœubhX structures. These chunks contain the physical addresses of the preserved pages, allowing the next kernel to reconstruct the vmalloc area with the same content and layout. Helper macros are also defined for storing and loading pointers within these structures.”…””}”(hjœh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jÉh´Knhj|h²hubeh}”(h]”Œvmalloc-preservation-abi”ah ]”h"]”Œvmalloc preservation abi”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒmemblock preservation ABI”h]”hŒmemblock preservation ABI”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÿh²hh³hÇh´Kubhï)”}”(hŒðMemblock can serialize its current memory reservations created with reserve_mem command line option across kexec through KHO. The post-KHO kernel can then consume these reservations and they are guaranteed to have the same physical address.”h]”hŒðMemblock can serialize its current memory reservations created with reserve_mem command line option across kexec through KHO. The post-KHO kernel can then consume these reservations and they are guaranteed to have the same physical address.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œa/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:22: ./include/linux/kho/abi/memblock.h”h´Khjÿh²hubhï)”}”(hXRThe state is serialized using Flattened Device Tree (FDT) format. Any modification to the FDT structure, node properties, or the compatible strings constitutes a breaking change. Such changes require incrementing the version number in the relevant `_COMPATIBLE` string to prevent a new kernel from misinterpreting data from an old kernel.”h]”(hŒøThe state is serialized using Flattened Device Tree (FDT) format. Any modification to the FDT structure, node properties, or the compatible strings constitutes a breaking change. Such changes require incrementing the version number in the relevant ”…””}”(hjh²hh³Nh´NubhŒtitle_reference”“”)”}”(hŒ `_COMPATIBLE`”h]”hŒ _COMPATIBLE”…””}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j'hjubhŒM string to prevent a new kernel from misinterpreting data from an old kernel.”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œa/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:22: ./include/linux/kho/abi/memblock.h”h´K hjÿh²hubhï)”}”(hŒ®Changes are allowed provided the compatibility version is incremented. However, backward/forward compatibility is only guaranteed for kernels supporting the same ABI version.”h]”hŒ®Changes are allowed provided the compatibility version is incremented. However, backward/forward compatibility is only guaranteed for kernels supporting the same ABI version.”…””}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œa/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:22: ./include/linux/kho/abi/memblock.h”h´Khjÿh²hubj)”}”(hhh]”j)”}”(hX–FDT Structure Overview: The entire memblock state is encapsulated within a single KHO entry named "memblock". This entry contains an FDT with the following layout: .. code-block:: none / { compatible = "memblock-v1"; n1 { compatible = "reserve-mem-v1"; start = <0xc06b 0x4000000>; size = <0x04 0x00>; }; }; ”h]”(j)”}”(hŒFDT Structure Overview:”h]”hŒFDT Structure Overview:”…””}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³Œa/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:22: ./include/linux/kho/abi/memblock.h”h´K%hjTubj+)”}”(hhh]”(hï)”}”(hŒ‹The entire memblock state is encapsulated within a single KHO entry named "memblock". This entry contains an FDT with the following layout:”h]”hŒThe entire memblock state is encapsulated within a single KHO entry named “memblockâ€. This entry contains an FDT with the following layout:”…””}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œa/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:22: ./include/linux/kho/abi/memblock.h”h´Khjgubj?)”}”(hŒÂ/ { compatible = "memblock-v1"; n1 { compatible = "reserve-mem-v1"; start = <0xc06b 0x4000000>; size = <0x04 0x00>; }; };”h]”hŒÂ/ { compatible = "memblock-v1"; n1 { compatible = "reserve-mem-v1"; start = <0xc06b 0x4000000>; size = <0x04 0x00>; }; };”…””}”hjysbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒforce”‰Œlanguage”Œnone”Œhighlight_args”}”uh1j>h³Œa/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:22: ./include/linux/kho/abi/memblock.h”h´Khjgubeh}”(h]”h ]”h"]”h$]”h&]”uh1j*hjTubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³jfh´K%hjQubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÿh²hh³Nh´Nubhï)”}”(hŒMain memblock node (/):”h]”hŒMain memblock node (/):”…””}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œa/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:22: ./include/linux/kho/abi/memblock.h”h´K'hjÿh²hubhŒ block_quote”“”)”}”(hŒK- compatible: "memblock-v1" Identifies the overall memblock ABI version. ”h]”ji)”}”(hhh]”jn)”}”(hŒGcompatible: "memblock-v1" Identifies the overall memblock ABI version. ”h]”hï)”}”(hŒFcompatible: "memblock-v1" Identifies the overall memblock ABI version.”h]”hŒJcompatible: “memblock-v1†Identifies the overall memblock ABI version.”…””}”(hj»h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œa/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:22: ./include/linux/kho/abi/memblock.h”h´K)hj·ubah}”(h]”h ]”h"]”h$]”h&]”uh1jmhj´ubah}”(h]”h ]”h"]”h$]”h&]”jÅjÆuh1jhh³jÉh´K)hj°ubah}”(h]”h ]”h"]”h$]”h&]”uh1j®h³jÉh´K)hjÿh²hubj)”}”(hhh]”j)”}”(hXbreserved_mem node: These nodes describe all reserve_mem regions. The node name is the name defined by the user for a reserve_mem region. - compatible: "reserve-mem-v1" Identifies the ABI version of reserve_mem descriptions - start: u64 Physical address of the reserved memory region. - size: u64 size in bytes of the reserved memory region. ”h]”(j)”}”(hŒreserved_mem node:”h]”hŒreserved_mem node:”…””}”(hjãh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³Œa/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:22: ./include/linux/kho/abi/memblock.h”h´K;hjßubj+)”}”(hhh]”(hï)”}”(hŒuThese nodes describe all reserve_mem regions. The node name is the name defined by the user for a reserve_mem region.”h]”hŒuThese nodes describe all reserve_mem regions. The node name is the name defined by the user for a reserve_mem region.”…””}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œa/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:22: ./include/linux/kho/abi/memblock.h”h´K-hjòubji)”}”(hhh]”(jn)”}”(hŒUcompatible: "reserve-mem-v1" Identifies the ABI version of reserve_mem descriptions ”h]”(hï)”}”(hŒcompatible: "reserve-mem-v1"”h]”hŒ compatible: “reserve-mem-v1—…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œa/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:22: ./include/linux/kho/abi/memblock.h”h´K0hjubhï)”}”(hŒ6Identifies the ABI version of reserve_mem descriptions”h]”hŒ6Identifies the ABI version of reserve_mem descriptions”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œa/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:22: ./include/linux/kho/abi/memblock.h”h´K2hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jmhjubjn)”}”(hŒh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:28: ./include/linux/kho/abi/kexec_handover.h”h´K¼hjŸh²hubhï)”}”(hX The tree is traversed using a key that encodes the page's physical address (pa) and its order into a single unsigned long value. The encoded key value is composed of two parts: the 'order bit' in the upper part and the 'shifted physical address' in the lower part.::”h]”hXThe tree is traversed using a key that encodes the page’s physical address (pa) and its order into a single unsigned long value. The encoded key value is composed of two parts: the ‘order bit’ in the upper part and the ‘shifted physical address’ in the lower part.:”…””}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:28: ./include/linux/kho/abi/kexec_handover.h”h´KÍhjŸh²hubj?)”}”(hX?+------------+-----------------------------+--------------------------+ | Page Order | Order Bit | Shifted Physical Address | +------------+-----------------------------+--------------------------+ | 0 | ...000100 ... (at bit 52) | pa >> (PAGE_SHIFT + 0) | | 1 | ...000010 ... (at bit 51) | pa >> (PAGE_SHIFT + 1) | | 2 | ...000001 ... (at bit 50) | pa >> (PAGE_SHIFT + 2) | | ... | ... | ... | +------------+-----------------------------+--------------------------+”h]”hX?+------------+-----------------------------+--------------------------+ | Page Order | Order Bit | Shifted Physical Address | +------------+-----------------------------+--------------------------+ | 0 | ...000100 ... (at bit 52) | pa >> (PAGE_SHIFT + 0) | | 1 | ...000010 ... (at bit 51) | pa >> (PAGE_SHIFT + 1) | | 2 | ...000001 ... (at bit 50) | pa >> (PAGE_SHIFT + 2) | | ... | ... | ... | +------------+-----------------------------+--------------------------+”…””}”hjìsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j>h³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:28: ./include/linux/kho/abi/kexec_handover.h”h´KÒhjŸh²hubhï)”}”(hŒ¨Shifted Physical Address: The 'shifted physical address' is the physical address normalized for its order. It effectively represents the PFN shifted right by the order.”h]”hŒ¬Shifted Physical Address: The ‘shifted physical address’ is the physical address normalized for its order. It effectively represents the PFN shifted right by the order.”…””}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:28: ./include/linux/kho/abi/kexec_handover.h”h´KÛhjŸh²hubhï)”}”(hŒ—Order Bit: The 'order bit' encodes the page order by setting a single bit at a specific position. The position of this bit itself represents the order.”h]”hŒ›Order Bit: The ‘order bit’ encodes the page order by setting a single bit at a specific position. The position of this bit itself represents the order.”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:28: ./include/linux/kho/abi/kexec_handover.h”h´KßhjŸh²hubhï)”}”(hŒîFor instance, on a 64-bit system with 4KB pages (PAGE_SHIFT = 12), the maximum range for the shifted physical address (for order 0) is 52 bits (64 - 12). This address occupies bits [0-51]. For order 0, the order bit is set at position 52.”h]”hŒîFor instance, on a 64-bit system with 4KB pages (PAGE_SHIFT = 12), the maximum range for the shifted physical address (for order 0) is 52 bits (64 - 12). This address occupies bits [0-51]. For order 0, the order bit is set at position 52.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:28: ./include/linux/kho/abi/kexec_handover.h”h´KãhjŸh²hubhï)”}”(hŒ~The following diagram illustrates how the encoded key value is split into indices for the tree levels, with PAGE_SIZE of 4KB::”h]”hŒ}The following diagram illustrates how the encoded key value is split into indices for the tree levels, with PAGE_SIZE of 4KB:”…””}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:28: ./include/linux/kho/abi/kexec_handover.h”h´KèhjŸh²hubj?)”}”(hX$ 63:60 59:51 50:42 41:33 32:24 23:15 14:0 +---------+--------+--------+--------+--------+--------+-----------------+ | 0 | Lv 5 | Lv 4 | Lv 3 | Lv 2 | Lv 1 | Lv 0 (bitmap) | +---------+--------+--------+--------+--------+--------+-----------------+”h]”hX$ 63:60 59:51 50:42 41:33 32:24 23:15 14:0 +---------+--------+--------+--------+--------+--------+-----------------+ | 0 | Lv 5 | Lv 4 | Lv 3 | Lv 2 | Lv 1 | Lv 0 (bitmap) | +---------+--------+--------+--------+--------+--------+-----------------+”…””}”hj7sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j>h³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:28: ./include/linux/kho/abi/kexec_handover.h”h´KëhjŸh²hubhï)”}”(hXtThe radix tree stores pages of all orders in a single 6-level hierarchy. It efficiently shares higher tree levels, especially due to common zero top address bits, allowing a single, efficient algorithm to manage all pages. This bitmap approach also offers memory efficiency; for example, a 512KB bitmap can cover a 16GB memory range for 0-order pages with PAGE_SIZE = 4KB.”h]”hXtThe radix tree stores pages of all orders in a single 6-level hierarchy. It efficiently shares higher tree levels, especially due to common zero top address bits, allowing a single, efficient algorithm to manage all pages. This bitmap approach also offers memory efficiency; for example, a 512KB bitmap can cover a 16GB memory range for 0-order pages with PAGE_SIZE = 4KB.”…””}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:28: ./include/linux/kho/abi/kexec_handover.h”h´KðhjŸh²hubhï)”}”(hXThe data structures defined here are part of the KHO ABI. Any modification to these structures that breaks backward compatibility must be accompanied by an update to the "compatible" string. This ensures that a newer kernel can correctly interpret the data passed by an older kernel.”h]”hXThe data structures defined here are part of the KHO ABI. Any modification to these structures that breaks backward compatibility must be accompanied by an update to the “compatible†string. This ensures that a newer kernel can correctly interpret the data passed by an older kernel.”…””}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œg/var/lib/git/docbuild/linux/Documentation/core-api/kho/abi:28: ./include/linux/kho/abi/kexec_handover.h”h´K÷hjŸh²hubeh}”(h]”Œ!kho-persistent-memory-tracker-abi”ah ]”h"]”Œ!kho persistent memory tracker abi”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒSee Also”h]”hŒSee Also”…””}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjlh²hh³hÇh´K ubji)”}”(hhh]”jn)”}”(hŒ:doc:`/admin-guide/mm/kho`”h]”hï)”}”(hj‚h]”h)”}”(hj‚h]”hŒinline”“”)”}”(hj‚h]”hŒ/admin-guide/mm/kho”…””}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”(j´Œstd”Œstd-doc”eh"]”h$]”h&]”uh1jŠhj‡ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jÁŒ refdomain”j–Œreftype”Œdoc”Œ refexplicit”‰Œrefwarn”ˆjÇŒ/admin-guide/mm/kho”uh1hh³hÇh´K"hj„ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K"hj€ubah}”(h]”h ]”h"]”h$]”h&]”uh1jmhj}h²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”jÅjÆuh1jhh³hÇh´K"hjlh²hubeh}”(h]”Œsee-also”ah ]”h"]”Œsee also”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K ubeh}”(h]”Œkexec-handover-abi”ah ]”h"]”Œkexec handover abi”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jíŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jÇjÄjyjvjüjùjœj™jijfj¿j¼uŒ nametypes”}”(jljjy‰jü‰jœ‰ji‰j¿‰uh}”(jÄhÊjvhÝjùj|j™jÿjfjŸj¼jluŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.