+_sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/translations/zh_CN/bpf/s390modnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/zh_TW/bpf/s390modnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/it_IT/bpf/s390modnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/ja_JP/bpf/s390modnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/ko_KR/bpf/s390modnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget/translations/sp_SP/bpf/s390modnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(hTesting BPF on s390h]hTesting BPF on s390}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhh6/var/lib/git/docbuild/linux/Documentation/bpf/s390.rsthKubh)}(hhh](h)}(h1. Introductionh]h1. Introduction}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hIBM Z are mainframe computers, which are descendants of IBM System/360 from year 1964. They are supported by the Linux kernel under the name "s390". This document describes how to test BPF in an s390 QEMU guest.h]hIBM Z are mainframe computers, which are descendants of IBM System/360 from year 1964. They are supported by the Linux kernel under the name “s390”. This document describes how to test BPF in an s390 QEMU guest.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h] introductionah ]h"]1. introductionah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h2. One-time setuph]h2. One-time setup}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhK ubh)}(h:The following is required to build and run the test suite:h]h:The following is required to build and run the test suite:}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh block_quote)}(h* s390 GCC * s390 development headers and libraries * Clang with BPF support * QEMU with s390 support * Disk image with s390 rootfs h]h bullet_list)}(hhh](h list_item)}(hs390 GCCh]h)}(hjh]hs390 GCC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1j hjubj )}(h&s390 development headers and librariesh]h)}(hj%h]h&s390 development headers and libraries}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj#ubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hClang with BPF supporth]h)}(hj<h]hClang with BPF support}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj:ubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hQEMU with s390 supporth]h)}(hjSh]hQEMU with s390 support}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjQubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hDisk image with s390 rootfs h]h)}(hDisk image with s390 rootfsh]hDisk image with s390 rootfs}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]bullet*uh1jhhhKhjubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hDebian supports installing compiler and libraries for s390 out of the box. Users of other distros may use debootstrap in order to set up a Debian chroot::h]hDebian supports installing compiler and libraries for s390 out of the box. Users of other distros may use debootstrap in order to set up a Debian chroot:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh literal_block)}(hXsudo debootstrap \ --variant=minbase \ --include=sudo \ testing \ ./s390-toolchain sudo mount --rbind /dev ./s390-toolchain/dev sudo mount --rbind /proc ./s390-toolchain/proc sudo mount --rbind /sys ./s390-toolchain/sys sudo chroot ./s390-toolchainh]hXsudo debootstrap \ --variant=minbase \ --include=sudo \ testing \ ./s390-toolchain sudo mount --rbind /dev ./s390-toolchain/dev sudo mount --rbind /proc ./s390-toolchain/proc sudo mount --rbind /sys ./s390-toolchain/sys sudo chroot ./s390-toolchain}hjsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jhhhKhhhhubh)}(hEOnce on Debian, the build prerequisites can be installed as follows::h]hDOnce on Debian, the build prerequisites can be installed as follows:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK$hhhhubj)}(hXesudo dpkg --add-architecture s390x sudo apt-get update sudo apt-get install \ bc \ bison \ cmake \ debootstrap \ dwarves \ flex \ g++ \ gcc \ g++-s390x-linux-gnu \ gcc-s390x-linux-gnu \ gdb-multiarch \ git \ make \ python3 \ qemu-system-misc \ qemu-utils \ rsync \ libcap-dev:s390x \ libelf-dev:s390x \ libncurses-devh]hXesudo dpkg --add-architecture s390x sudo apt-get update sudo apt-get install \ bc \ bison \ cmake \ debootstrap \ dwarves \ flex \ g++ \ gcc \ g++-s390x-linux-gnu \ gcc-s390x-linux-gnu \ gdb-multiarch \ git \ make \ python3 \ qemu-system-misc \ qemu-utils \ rsync \ libcap-dev:s390x \ libelf-dev:s390x \ libncurses-dev}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK&hhhhubh)}(h8Latest Clang targeting BPF can be installed as follows::h]h7Latest Clang targeting BPF can be installed as follows:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK>hhhhubj)}(hXPgit clone https://github.com/llvm/llvm-project.git ln -s ../../clang llvm-project/llvm/tools/ mkdir llvm-project-build cd llvm-project-build cmake \ -DLLVM_TARGETS_TO_BUILD=BPF \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/opt/clang-bpf \ ../llvm-project/llvm make sudo make install export PATH=/opt/clang-bpf/bin:$PATHh]hXPgit clone https://github.com/llvm/llvm-project.git ln -s ../../clang llvm-project/llvm/tools/ mkdir llvm-project-build cd llvm-project-build cmake \ -DLLVM_TARGETS_TO_BUILD=BPF \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/opt/clang-bpf \ ../llvm-project/llvm make sudo make install export PATH=/opt/clang-bpf/bin:$PATH}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK@hhhhubh)}(hGThe disk image can be prepared using a loopback mount and debootstrap::h]hFThe disk image can be prepared using a loopback mount and debootstrap:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKMhhhhubj)}(hXqemu-img create -f raw ./s390.img 1G sudo losetup -f ./s390.img sudo mkfs.ext4 /dev/loopX mkdir ./s390.rootfs sudo mount /dev/loopX ./s390.rootfs sudo debootstrap \ --foreign \ --arch=s390x \ --variant=minbase \ --include=" \ iproute2, \ iputils-ping, \ isc-dhcp-client, \ kmod, \ libcap2, \ libelf1, \ netcat, \ procps" \ testing \ ./s390.rootfs sudo umount ./s390.rootfs sudo losetup -d /dev/loopXh]hXqemu-img create -f raw ./s390.img 1G sudo losetup -f ./s390.img sudo mkfs.ext4 /dev/loopX mkdir ./s390.rootfs sudo mount /dev/loopX ./s390.rootfs sudo debootstrap \ --foreign \ --arch=s390x \ --variant=minbase \ --include=" \ iproute2, \ iputils-ping, \ isc-dhcp-client, \ kmod, \ libcap2, \ libelf1, \ netcat, \ procps" \ testing \ ./s390.rootfs sudo umount ./s390.rootfs sudo losetup -d /dev/loopX}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKOhhhhubeh}(h]one-time-setupah ]h"]2. one-time setupah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(h3. Compilationh]h3. Compilation}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKgubh)}(hkIn addition to the usual Kconfig options required to run the BPF test suite, it is also helpful to select::h]hjIn addition to the usual Kconfig options required to run the BPF test suite, it is also helpful to select:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKihj hhubj)}(hICONFIG_NET_9P=y CONFIG_9P_FS=y CONFIG_NET_9P_VIRTIO=y CONFIG_VIRTIO_PCI=yh]hICONFIG_NET_9P=y CONFIG_9P_FS=y CONFIG_NET_9P_VIRTIO=y CONFIG_VIRTIO_PCI=y}hj)sbah}(h]h ]h"]h$]h&]jjuh1jhhhKlhj hhubh)}(hRas that would enable a very easy way to share files with the s390 virtual machine.h]hRas that would enable a very easy way to share files with the s390 virtual machine.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKqhj hhubh)}(hCompiling kernel, modules and testsuite, as well as preparing gdb scripts to simplify debugging, can be done using the following commands::h]hCompiling kernel, modules and testsuite, as well as preparing gdb scripts to simplify debugging, can be done using the following commands:}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKthj hhubj)}(hX+make ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- menuconfig make ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- bzImage modules scripts_gdb make ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- \ -C tools/testing/selftests \ TARGETS=bpf \ INSTALL_PATH=$PWD/tools/testing/selftests/kselftest_install \ installh]hX+make ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- menuconfig make ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- bzImage modules scripts_gdb make ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- \ -C tools/testing/selftests \ TARGETS=bpf \ INSTALL_PATH=$PWD/tools/testing/selftests/kselftest_install \ install}hjSsbah}(h]h ]h"]h$]h&]jjuh1jhhhKwhj hhubeh}(h] compilationah ]h"]3. compilationah$]h&]uh1hhhhhhhhKgubh)}(hhh](h)}(h4. Running the test suiteh]h4. Running the test suite}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihhhhhKubh)}(h/The virtual machine can be started as follows::h]h.The virtual machine can be started as follows:}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjihhubj)}(hXqemu-system-s390x \ -cpu max,zpci=on \ -smp 2 \ -m 4G \ -kernel linux/arch/s390/boot/compressed/vmlinux \ -drive file=./s390.img,if=virtio,format=raw \ -nographic \ -append 'root=/dev/vda rw console=ttyS1' \ -virtfs local,path=./linux,security_model=none,mount_tag=linux \ -object rng-random,filename=/dev/urandom,id=rng0 \ -device virtio-rng-ccw,rng=rng0 \ -netdev user,id=net0 \ -device virtio-net-ccw,netdev=net0h]hXqemu-system-s390x \ -cpu max,zpci=on \ -smp 2 \ -m 4G \ -kernel linux/arch/s390/boot/compressed/vmlinux \ -drive file=./s390.img,if=virtio,format=raw \ -nographic \ -append 'root=/dev/vda rw console=ttyS1' \ -virtfs local,path=./linux,security_model=none,mount_tag=linux \ -object rng-random,filename=/dev/urandom,id=rng0 \ -device virtio-rng-ccw,rng=rng0 \ -netdev user,id=net0 \ -device virtio-net-ccw,netdev=net0}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjihhubh)}(hWhen using this on a real IBM Z, ``-enable-kvm`` may be added for better performance. When starting the virtual machine for the first time, disk image setup must be finalized using the following command::h](h!When using this on a real IBM Z, }(hjhhhNhNubhliteral)}(h``-enable-kvm``h]h -enable-kvm}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh may be added for better performance. When starting the virtual machine for the first time, disk image setup must be finalized using the following command:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjihhubj)}(h'/debootstrap/debootstrap --second-stageh]h'/debootstrap/debootstrap --second-stage}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjihhubh)}(hkDirectory with the code built on the host as well as ``/proc`` and ``/sys`` need to be mounted as follows::h](h5Directory with the code built on the host as well as }(hjhhhNhNubj)}(h ``/proc``h]h/proc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h``/sys``h]h/sys}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh need to be mounted as follows:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjihhubj)}(hYmkdir -p /linux mount -t 9p linux /linux mount -t proc proc /proc mount -t sysfs sys /sysh]hYmkdir -p /linux mount -t 9p linux /linux mount -t proc proc /proc mount -t sysfs sys /sys}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjihhubh)}(hDAfter that, the test suite can be run using the following commands::h]hCAfter that, the test suite can be run using the following commands:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjihhubj)}(hFcd /linux/tools/testing/selftests/kselftest_install ./run_kselftest.shh]hFcd /linux/tools/testing/selftests/kselftest_install ./run_kselftest.sh}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjihhubh)}(h.As usual, tests can be also run individually::h]h-As usual, tests can be also run individually:}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjihhubj)}(h5cd /linux/tools/testing/selftests/bpf ./test_verifierh]h5cd /linux/tools/testing/selftests/bpf ./test_verifier}hj0sbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjihhubeh}(h]running-the-test-suiteah ]h"]4. running the test suiteah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h 5. Debuggingh]h 5. Debugging}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhhhhhKubh)}(hjIt is possible to debug the s390 kernel using QEMU GDB stub, which is activated by passing ``-s`` to QEMU.h](h[It is possible to debug the s390 kernel using QEMU GDB stub, which is activated by passing }(hjWhhhNhNubj)}(h``-s``h]h-s}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubh to QEMU.}(hjWhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjFhhubh)}(hIt is preferable to turn KASLR off, so that gdb would know where to find the kernel image in memory, by building the kernel with::h]hIt is preferable to turn KASLR off, so that gdb would know where to find the kernel image in memory, by building the kernel with:}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjFhhubj)}(hRANDOMIZE_BASE=nh]hRANDOMIZE_BASE=n}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjFhhubh)}(h6GDB can then be attached using the following command::h]h5GDB can then be attached using the following command:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjFhhubj)}(h:gdb-multiarch -ex 'target remote localhost:1234' ./vmlinuxh]h:gdb-multiarch -ex 'target remote localhost:1234' ./vmlinux}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjFhhubeh}(h] debuggingah ]h"] 5. debuggingah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h 6. Networkh]h 6. Network}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hIn case one needs to use the network in the virtual machine in order to e.g. install additional packages, it can be configured using::h]hIn case one needs to use the network in the virtual machine in order to e.g. install additional packages, it can be configured using:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h dhclient eth0h]h dhclient eth0}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubeh}(h]networkah ]h"] 6. networkah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h7. Linksh]h7. Links}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hzThis document is a compilation of techniques, whose more comprehensive descriptions can be found by following these links:h]hzThis document is a compilation of techniques, whose more comprehensive descriptions can be found by following these links:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hhh](j )}(hB`Debootstrap `_h]h)}(hjh](h reference)}(hjh]h Debootstrap}(hjhhhNhNubah}(h]h ]h"]h$]h&]name Debootstraprefuri1https://wiki.debian.org/EmDebian/CrossDebootstrapuh1jhjubhtarget)}(h4 h]h}(h] debootstrapah ]h"] debootstrapah$]h&]refurij'uh1j( referencedKhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hj hhhhhNubj )}(h6`Multiarch `_h]h)}(hjFh](j)}(hjFh]h Multiarch}(hjKhhhNhNubah}(h]h ]h"]h$]h&]name Multiarchj&'https://wiki.debian.org/Multiarch/HOWTOuh1jhjHubj))}(h* h]h}(h] multiarchah ]h"] multiarchah$]h&]refurijZuh1j(j7KhjHubeh}(h]h ]h"]h$]h&]uh1hhhhKhjDubah}(h]h ]h"]h$]h&]uh1j hj hhhhhNubj )}(h3`Building LLVM `_h]h)}(hjvh](j)}(hjvh]h Building LLVM}(hj{hhhNhNubah}(h]h ]h"]h$]h&]name Building LLVMj& https://llvm.org/docs/CMake.htmluh1jhjxubj))}(h# h]h}(h] building-llvmah ]h"] building llvmah$]h&]refurijuh1j(j7Khjxubeh}(h]h ]h"]h$]h&]uh1hhhhKhjtubah}(h]h ]h"]h$]h&]uh1j hj hhhhhNubj )}(hq`Cross-compiling the kernel `_h]h)}(hjh](j)}(hjh]hCross-compiling the kernel}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameCross-compiling the kernelj&Qhttps://wiki.gentoo.org/wiki/Embedded_Handbook/General/Cross-compiling_the_kerneluh1jhjubj))}(hT h]h}(h]cross-compiling-the-kernelah ]h"]cross-compiling the kernelah$]h&]refurijuh1j(j7Khjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hj hhhhhNubj )}(hQ`QEMU s390x Guest Support `_h]h)}(hjh](j)}(hjh]hQEMU s390x Guest Support}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameQEMU s390x Guest Supportj&3https://wiki.qemu.org/Documentation/Platforms/S390Xuh1jhjubj))}(h6 h]h}(h]qemu-s390x-guest-supportah ]h"]qemu s390x guest supportah$]h&]refurijuh1j(j7Khjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hj hhhhhNubj )}(hR`Plan 9 folder sharing over Virtio `_h]h)}(hjh](j)}(hjh]h!Plan 9 folder sharing over Virtio}(hj hhhNhNubah}(h]h ]h"]h$]h&]name!Plan 9 folder sharing over Virtioj&+https://wiki.qemu.org/Documentation/9psetupuh1jhjubj))}(h. h]h}(h]!plan-9-folder-sharing-over-virtioah ]h"]!plan 9 folder sharing over virtioah$]h&]refurijuh1j(j7Khjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j hj hhhhhNubj )}(hR`Using GDB with QEMU `_h]h)}(hj6h](j)}(hj6h]hUsing GDB with QEMU}(hj;hhhNhNubah}(h]h ]h"]h$]h&]nameUsing GDB with QEMUj&9https://wiki.osdev.org/Kernel_Debugging#Use_GDB_with_QEMUuh1jhj8ubj))}(h< h]h}(h]using-gdb-with-qemuah ]h"]using gdb with qemuah$]h&]refurijJuh1j(j7Khj8ubeh}(h]h ]h"]h$]h&]uh1hhhhKhj4ubah}(h]h ]h"]h$]h&]uh1j hj hhhhhNubeh}(h]h ]h"]h$]h&]j-uh1jhhhKhjhhubeh}(h]linksah ]h"]7. linksah$]h&]uh1hhhhhhhhKubeh}(h]testing-bpf-on-s390ah ]h"]testing bpf on s390ah$]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_handlerjerror_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}(jxjuhhjjjfjcjCj@jjjjjpjmj3j0jdjajjjjjjj$j!jTjQu nametypes}(jxh݉jjfjCjjjpj3jdjjjj$jTuh}(juhhhjhjcj j@jijjFjjjmjj0j*jaj[jjjjjjj!jjQjKu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.