tsphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget'/translations/zh_CN/admin-guide/ramoopsmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/zh_TW/admin-guide/ramoopsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/it_IT/admin-guide/ramoopsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/ja_JP/admin-guide/ramoopsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/ko_KR/admin-guide/ramoopsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/sp_SP/admin-guide/ramoopsmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(hRamoops oops/panic loggerh]hRamoops oops/panic logger}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhA/var/lib/git/docbuild/linux/Documentation/admin-guide/ramoops.rsthKubh paragraph)}(h%Sergiu Iordache h](hSergiu Iordache <}(hhhhhNhNubh reference)}(hsergiu@chromium.orgh]hsergiu@chromium.org}(hhhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:sergiu@chromium.orguh1hhhubh>}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hUpdated: 10 Feb 2021h]hUpdated: 10 Feb 2021}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h Introductionh]h Introduction}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhK ubh)}(hRamoops is an oops/panic logger that writes its logs to RAM before the system crashes. It works by logging oopses and panics in a circular buffer. Ramoops needs a system with persistent RAM so that the content of that area can survive after a restart.h]hRamoops is an oops/panic logger that writes its logs to RAM before the system crashes. It works by logging oopses and panics in a circular buffer. Ramoops needs a system with persistent RAM so that the content of that area can survive after a restart.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubeh}(h] introductionah ]h"] introductionah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(hRamoops conceptsh]hRamoops concepts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hRamoops uses a predefined memory area to store the dump. The start and size and type of the memory area are set using three variables:h]hRamoops uses a predefined memory area to store the dump. The start and size and type of the memory area are set using three variables:}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh block_quote)}(hX%* ``mem_address`` for the start * ``mem_size`` for the size. The memory size will be rounded down to a power of two. * ``mem_type`` to specify if the memory type (default is pgprot_writecombine). * ``mem_name`` to specify a memory region defined by ``reserve_mem`` command line parameter. h]h bullet_list)}(hhh](h list_item)}(h``mem_address`` for the starth]h)}(hj@h](hliteral)}(h``mem_address``h]h mem_address}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjBubh for the start}(hjBhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj>ubah}(h]h ]h"]h$]h&]uh1j<hj9ubj=)}(hR``mem_size`` for the size. The memory size will be rounded down to a power of two.h]h)}(hR``mem_size`` for the size. The memory size will be rounded down to a power of two.h](jF)}(h ``mem_size``h]hmem_size}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjiubhF for the size. The memory size will be rounded down to a power of two.}(hjihhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjeubah}(h]h ]h"]h$]h&]uh1j<hj9ubj=)}(hL``mem_type`` to specify if the memory type (default is pgprot_writecombine).h]h)}(hjh](jF)}(h ``mem_type``h]hmem_type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubh@ to specify if the memory type (default is pgprot_writecombine).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j<hj9ubj=)}(h[``mem_name`` to specify a memory region defined by ``reserve_mem`` command line parameter. h]h)}(hZ``mem_name`` to specify a memory region defined by ``reserve_mem`` command line parameter.h](jF)}(h ``mem_name``h]hmem_name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubh' to specify a memory region defined by }(hjhhhNhNubjF)}(h``reserve_mem``h]h reserve_mem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubh command line parameter.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j<hj9ubeh}(h]h ]h"]h$]h&]bullet*uh1j7hhhKhj3ubah}(h]h ]h"]h$]h&]uh1j1hhhKhjhhubh)}(hXdTypically the default value of ``mem_type=0`` should be used as that sets the pstore mapping to pgprot_writecombine. Setting ``mem_type=1`` attempts to use ``pgprot_noncached``, which only works on some platforms. This is because pstore depends on atomic operations. At least on ARM, pgprot_noncached causes the memory to be mapped strongly ordered, and atomic operations on strongly ordered memory are implementation defined, and won't work on many ARMs such as omaps. Setting ``mem_type=2`` attempts to treat the memory region as normal memory, which enables full cache on it. This can improve the performance.h](hTypically the default value of }(hjhhhNhNubjF)}(h``mem_type=0``h]h mem_type=0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubhP should be used as that sets the pstore mapping to pgprot_writecombine. Setting }(hjhhhNhNubjF)}(h``mem_type=1``h]h mem_type=1}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubh attempts to use }(hjhhhNhNubjF)}(h``pgprot_noncached``h]hpgprot_noncached}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubhX0, which only works on some platforms. This is because pstore depends on atomic operations. At least on ARM, pgprot_noncached causes the memory to be mapped strongly ordered, and atomic operations on strongly ordered memory are implementation defined, and won’t work on many ARMs such as omaps. Setting }(hjhhhNhNubjF)}(h``mem_type=2``h]h mem_type=2}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubhx attempts to treat the memory region as normal memory, which enables full cache on it. This can improve the performance.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hThe memory area is divided into ``record_size`` chunks (also rounded down to power of two) and each kmesg dump writes a ``record_size`` chunk of information.h](h The memory area is divided into }(hjLhhhNhNubjF)}(h``record_size``h]h record_size}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjLubhI chunks (also rounded down to power of two) and each kmesg dump writes a }(hjLhhhNhNubjF)}(h``record_size``h]h record_size}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjLubh chunk of information.}(hjLhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK&hjhhubh)}(hX Limiting which kinds of kmsg dumps are stored can be controlled via the ``max_reason`` value, as defined in include/linux/kmsg_dump.h's ``enum kmsg_dump_reason``. For example, to store both Oopses and Panics, ``max_reason`` should be set to 2 (KMSG_DUMP_OOPS), to store only Panics ``max_reason`` should be set to 1 (KMSG_DUMP_PANIC). Setting this to 0 (KMSG_DUMP_UNDEF), means the reason filtering will be controlled by the ``printk.always_kmsg_dump`` boot param: if unset, it'll be KMSG_DUMP_OOPS, otherwise KMSG_DUMP_MAX.h](hHLimiting which kinds of kmsg dumps are stored can be controlled via the }(hj~hhhNhNubjF)}(h``max_reason``h]h max_reason}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj~ubh4 value, as defined in include/linux/kmsg_dump.h’s }(hj~hhhNhNubjF)}(h``enum kmsg_dump_reason``h]henum kmsg_dump_reason}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj~ubh0. For example, to store both Oopses and Panics, }(hj~hhhNhNubjF)}(h``max_reason``h]h max_reason}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj~ubh; should be set to 2 (KMSG_DUMP_OOPS), to store only Panics }(hj~hhhNhNubjF)}(h``max_reason``h]h max_reason}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj~ubh should be set to 1 (KMSG_DUMP_PANIC). Setting this to 0 (KMSG_DUMP_UNDEF), means the reason filtering will be controlled by the }(hj~hhhNhNubjF)}(h``printk.always_kmsg_dump``h]hprintk.always_kmsg_dump}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj~ubhJ boot param: if unset, it’ll be KMSG_DUMP_OOPS, otherwise KMSG_DUMP_MAX.}(hj~hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK*hjhhubh)}(hThe module uses a counter to record multiple dumps but the counter gets reset on restart (i.e. new dumps after the restart will overwrite old ones).h]hThe module uses a counter to record multiple dumps but the counter gets reset on restart (i.e. new dumps after the restart will overwrite old ones).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK3hjhhubh)}(hXRamoops also supports software ECC protection of persistent memory regions. This might be useful when a hardware reset was used to bring the machine back to life (i.e. a watchdog triggered). In such cases, RAM may be somewhat corrupt, but usually it is restorable.h]hXRamoops also supports software ECC protection of persistent memory regions. This might be useful when a hardware reset was used to bring the machine back to life (i.e. a watchdog triggered). In such cases, RAM may be somewhat corrupt, but usually it is restorable.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjhhubeh}(h]ramoops-conceptsah ]h"]ramoops conceptsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hSetting the parametersh]hSetting the parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKhj hhubj2)}(hX A. Use the module parameters (which have the names of the variables described as before). For quick debugging, you can also reserve parts of memory during boot and then use the reserved memory for ramoops. For example, assuming a machine with > 128 MB of memory, the following kernel command line will tell the kernel to use only the first 128 MB of memory, and place ECC-protected ramoops region at 128 MB boundary:: mem=128M ramoops.mem_address=0x8000000 ramoops.ecc=1 B. Use Device Tree bindings, as described in ``Documentation/devicetree/bindings/reserved-memory/ramoops.yaml``. For example:: reserved-memory { #address-cells = <2>; #size-cells = <2>; ranges; ramoops@8f000000 { compatible = "ramoops"; reg = <0 0x8f000000 0 0x100000>; record-size = <0x4000>; console-size = <0x4000>; }; }; C. Use a platform device and set the platform data. The parameters can then be set through that platform data. An example of doing that is: .. code-block:: c #include [...] static struct ramoops_platform_data ramoops_data = { .mem_size = <...>, .mem_address = <...>, .mem_type = <...>, .record_size = <...>, .max_reason = <...>, .ecc = <...>, }; static struct platform_device ramoops_dev = { .name = "ramoops", .dev = { .platform_data = &ramoops_data, }, }; [... inside a function ...] int ret; ret = platform_device_register(&ramoops_dev); if (ret) { printk(KERN_ERR "unable to register platform device\n"); return ret; } D. Using a region of memory reserved via ``reserve_mem`` command line parameter. The address and size will be defined by the ``reserve_mem`` parameter. Note, that ``reserve_mem`` may not always allocate memory in the same location, and cannot be relied upon. Testing will need to be done, and it may not work on every machine, nor every kernel. Consider this a "best effort" approach. The ``reserve_mem`` option takes a size, alignment and name as arguments. The name is used to map the memory to a label that can be retrieved by ramoops. reserve_mem=2M:4096:oops ramoops.mem_name=oops h](h)}(hXA. Use the module parameters (which have the names of the variables described as before). For quick debugging, you can also reserve parts of memory during boot and then use the reserved memory for ramoops. For example, assuming a machine with > 128 MB of memory, the following kernel command line will tell the kernel to use only the first 128 MB of memory, and place ECC-protected ramoops region at 128 MB boundary::h]hXA. Use the module parameters (which have the names of the variables described as before). For quick debugging, you can also reserve parts of memory during boot and then use the reserved memory for ramoops. For example, assuming a machine with > 128 MB of memory, the following kernel command line will tell the kernel to use only the first 128 MB of memory, and place ECC-protected ramoops region at 128 MB boundary:}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK@hj)ubh literal_block)}(h4mem=128M ramoops.mem_address=0x8000000 ramoops.ecc=1h]h4mem=128M ramoops.mem_address=0x8000000 ramoops.ecc=1}hj=sbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1j;hhhKGhj)ubh)}(h~B. Use Device Tree bindings, as described in ``Documentation/devicetree/bindings/reserved-memory/ramoops.yaml``. For example::h](h-B. Use Device Tree bindings, as described in }(hjMhhhNhNubjF)}(hB``Documentation/devicetree/bindings/reserved-memory/ramoops.yaml``h]h>Documentation/devicetree/bindings/reserved-memory/ramoops.yaml}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjMubh. For example:}(hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKIhj)ubj<)}(hX.reserved-memory { #address-cells = <2>; #size-cells = <2>; ranges; ramoops@8f000000 { compatible = "ramoops"; reg = <0 0x8f000000 0 0x100000>; record-size = <0x4000>; console-size = <0x4000>; }; };h]hX.reserved-memory { #address-cells = <2>; #size-cells = <2>; ranges; ramoops@8f000000 { compatible = "ramoops"; reg = <0 0x8f000000 0 0x100000>; record-size = <0x4000>; console-size = <0x4000>; }; };}hjmsbah}(h]h ]h"]h$]h&]jKjLuh1j;hhhKMhj)ubh)}(hC. Use a platform device and set the platform data. The parameters can then be set through that platform data. An example of doing that is:h]hC. Use a platform device and set the platform data. The parameters can then be set through that platform data. An example of doing that is:}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKZhj)ubj<)}(hX#include [...] static struct ramoops_platform_data ramoops_data = { .mem_size = <...>, .mem_address = <...>, .mem_type = <...>, .record_size = <...>, .max_reason = <...>, .ecc = <...>, }; static struct platform_device ramoops_dev = { .name = "ramoops", .dev = { .platform_data = &ramoops_data, }, }; [... inside a function ...] int ret; ret = platform_device_register(&ramoops_dev); if (ret) { printk(KERN_ERR "unable to register platform device\n"); return ret; }h]hX#include [...] static struct ramoops_platform_data ramoops_data = { .mem_size = <...>, .mem_address = <...>, .mem_type = <...>, .record_size = <...>, .max_reason = <...>, .ecc = <...>, }; static struct platform_device ramoops_dev = { .name = "ramoops", .dev = { .platform_data = &ramoops_data, }, }; [... inside a function ...] int ret; ret = platform_device_register(&ramoops_dev); if (ret) { printk(KERN_ERR "unable to register platform device\n"); return ret; }}hjsbah}(h]h ]h"]h$]h&]jKjLforcelanguagechighlight_args}uh1j;hhhK]hj)ubhenumerated_list)}(hhh]j=)}(hXMUsing a region of memory reserved via ``reserve_mem`` command line parameter. The address and size will be defined by the ``reserve_mem`` parameter. Note, that ``reserve_mem`` may not always allocate memory in the same location, and cannot be relied upon. Testing will need to be done, and it may not work on every machine, nor every kernel. Consider this a "best effort" approach. The ``reserve_mem`` option takes a size, alignment and name as arguments. The name is used to map the memory to a label that can be retrieved by ramoops. reserve_mem=2M:4096:oops ramoops.mem_name=oops h](h)}(hXUsing a region of memory reserved via ``reserve_mem`` command line parameter. The address and size will be defined by the ``reserve_mem`` parameter. Note, that ``reserve_mem`` may not always allocate memory in the same location, and cannot be relied upon. Testing will need to be done, and it may not work on every machine, nor every kernel. Consider this a "best effort" approach. The ``reserve_mem`` option takes a size, alignment and name as arguments. The name is used to map the memory to a label that can be retrieved by ramoops.h](h&Using a region of memory reserved via }(hjhhhNhNubjF)}(h``reserve_mem``h]h reserve_mem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubhE command line parameter. The address and size will be defined by the }(hjhhhNhNubjF)}(h``reserve_mem``h]h reserve_mem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubh parameter. Note, that }(hjhhhNhNubjF)}(h``reserve_mem``h]h reserve_mem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubh may not always allocate memory in the same location, and cannot be relied upon. Testing will need to be done, and it may not work on every machine, nor every kernel. Consider this a “best effort” approach. The }(hjhhhNhNubjF)}(h``reserve_mem``h]h reserve_mem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubh option takes a size, alignment and name as arguments. The name is used to map the memory to a label that can be retrieved by ramoops.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK{hjubj2)}(h0reserve_mem=2M:4096:oops ramoops.mem_name=oops h]h)}(h/reserve_mem=2M:4096:oops ramoops.mem_name=oopsh]h/reserve_mem=2M:4096:oops ramoops.mem_name=oops}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j1hhhKhjubeh}(h]h ]h"]h$]h&]uh1j<hjubah}(h]h ]h"]h$]h&]enumtype upperalphaprefixhsuffix.startKuh1jhj)ubeh}(h]h ]h"]h$]h&]uh1j1hhhK@hj hhubh)}(hYou can specify either RAM memory or peripheral devices' memory. However, when specifying RAM, be sure to reserve the memory by issuing memblock_reserve() very early in the architecture code, e.g.::h]hYou can specify either RAM memory or peripheral devices’ memory. However, when specifying RAM, be sure to reserve the memory by issuing memblock_reserve() very early in the architecture code, e.g.:}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubj<)}(h_#include memblock_reserve(ramoops_data.mem_address, ramoops_data.mem_size);h]h_#include memblock_reserve(ramoops_data.mem_address, ramoops_data.mem_size);}hj9sbah}(h]h ]h"]h$]h&]jKjLuh1j;hhhKhj hhubeh}(h]setting-the-parametersah ]h"]setting the parametersah$]h&]uh1hhhhhhhhK /sys/kernel/debug/pstore/record_ftrace # reboot -f [...] # mount -t pstore pstore /mnt/ # tail /mnt/ftrace-ramoops 0 ffffffff8101ea64 ffffffff8101bcda native_apic_mem_read <- disconnect_bsp_APIC+0x6a/0xc0 0 ffffffff8101ea44 ffffffff8101bcf6 native_apic_mem_write <- disconnect_bsp_APIC+0x86/0xc0 0 ffffffff81020084 ffffffff8101a4b5 hpet_disable <- native_machine_shutdown+0x75/0x90 0 ffffffff81005f94 ffffffff8101a4bb iommu_shutdown_noop <- native_machine_shutdown+0x7b/0x90 0 ffffffff8101a6a1 ffffffff8101a437 native_machine_emergency_restart <- native_machine_restart+0x37/0x40 0 ffffffff811f9876 ffffffff8101a73a acpi_reboot <- native_machine_emergency_restart+0xaa/0x1e0 0 ffffffff8101a514 ffffffff8101a772 mach_reboot_fixups <- native_machine_emergency_restart+0xe2/0x1e0 0 ffffffff811d9c54 ffffffff8101a7a0 __const_udelay <- native_machine_emergency_restart+0x110/0x1e0 0 ffffffff811d9c34 ffffffff811d9c80 __delay <- __const_udelay+0x30/0x40 0 ffffffff811d9d14 ffffffff811d9c3f delay_tsc <- __delay+0xf/0x20h]hXB# mount -t debugfs debugfs /sys/kernel/debug/ # echo 1 > /sys/kernel/debug/pstore/record_ftrace # reboot -f [...] # mount -t pstore pstore /mnt/ # tail /mnt/ftrace-ramoops 0 ffffffff8101ea64 ffffffff8101bcda native_apic_mem_read <- disconnect_bsp_APIC+0x6a/0xc0 0 ffffffff8101ea44 ffffffff8101bcf6 native_apic_mem_write <- disconnect_bsp_APIC+0x86/0xc0 0 ffffffff81020084 ffffffff8101a4b5 hpet_disable <- native_machine_shutdown+0x75/0x90 0 ffffffff81005f94 ffffffff8101a4bb iommu_shutdown_noop <- native_machine_shutdown+0x7b/0x90 0 ffffffff8101a6a1 ffffffff8101a437 native_machine_emergency_restart <- native_machine_restart+0x37/0x40 0 ffffffff811f9876 ffffffff8101a73a acpi_reboot <- native_machine_emergency_restart+0xaa/0x1e0 0 ffffffff8101a514 ffffffff8101a772 mach_reboot_fixups <- native_machine_emergency_restart+0xe2/0x1e0 0 ffffffff811d9c54 ffffffff8101a7a0 __const_udelay <- native_machine_emergency_restart+0x110/0x1e0 0 ffffffff811d9c34 ffffffff811d9c80 __delay <- __const_udelay+0x30/0x40 0 ffffffff811d9d14 ffffffff811d9c3f delay_tsc <- __delay+0xf/0x20}hjsbah}(h]h ]h"]h$]h&]jKjLuh1j;hhhKhjhhubeh}(h]persistent-function-tracingah ]h"]persistent function tracingah$]h&]uh1hhhhhhhhKubeh}(h]ramoops-oops-panic-loggerah ]h"]ramoops oops/panic loggerah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj3error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(j j jj jjjLjIjjjjjju nametypes}(j jjjLjjjuh}(j hj hjjjIj jjOjjjju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]hsystem_message)}(hhh]h)}(h:Enumerated list start value not ordinal-1: "D" (ordinal 4)h]h>Enumerated list start value not ordinal-1: “D” (ordinal 4)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypeINFOsourcehlineKuh1jhj)ubatransform_messages] transformerN include_log] decorationNhhub.