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/virt/kvm/ppc-pvmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/zh_TW/virt/kvm/ppc-pvmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/it_IT/virt/kvm/ppc-pvmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/ja_JP/virt/kvm/ppc-pvmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/ko_KR/virt/kvm/ppc-pvmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget#/translations/sp_SP/virt/kvm/ppc-pvmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhh=/var/lib/git/docbuild/linux/Documentation/virt/kvm/ppc-pv.rsthKubhsection)}(hhh](htitle)}(h!The PPC KVM paravirtual interfaceh]h!The PPC KVM paravirtual interface}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hThe basic execution principle by which KVM on PowerPC works is to run all kernel space code in PR=1 which is user space. This way we trap all privileged instructions and can emulate them accordingly.h]hThe basic execution principle by which KVM on PowerPC works is to run all kernel space code in PR=1 which is user space. This way we trap all privileged instructions and can emulate them accordingly.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hUnfortunately that is also the downfall. There are quite some privileged instructions that needlessly return us to the hypervisor even though they could be handled differently.h]hUnfortunately that is also the downfall. There are quite some privileged instructions that needlessly return us to the hypervisor even though they could be handled differently.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hThis is what the PPC PV interface helps with. It takes privileged instructions and transforms them into unprivileged ones with some help from the hypervisor. This cuts down virtualization costs by about 50% on some of my benchmarks.h]hThis is what the PPC PV interface helps with. It takes privileged instructions and transforms them into unprivileged ones with some help from the hypervisor. This cuts down virtualization costs by about 50% on some of my benchmarks.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hDThe code for that interface can be found in arch/powerpc/kernel/kvm*h]hDThe code for that interface can be found in arch/powerpc/kernel/kvm*}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hQuerying for existenceh]hQuerying for existence}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hTo find out if we're running on KVM or not, we leverage the device tree. When Linux is running on KVM, a node /hypervisor exists. That node contains a compatible property with the value "linux,kvm".h]hTo find out if we’re running on KVM or not, we leverage the device tree. When Linux is running on KVM, a node /hypervisor exists. That node contains a compatible property with the value “linux,kvm”.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hiOnce you determined you're running under a PV capable KVM, you can now use hypercalls as described below.h]hkOnce you determined you’re running under a PV capable KVM, you can now use hypercalls as described below.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]querying-for-existenceah ]h"]querying for existenceah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hKVM hypercallsh]hKVM hypercalls}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hhhhhK ubh)}(hInside the device tree's /hypervisor node there's a property called 'hypercall-instructions'. This property contains at most 4 opcodes that make up the hypercall. To call a hypercall, just call these instructions.h]hInside the device tree’s /hypervisor node there’s a property called ‘hypercall-instructions’. This property contains at most 4 opcodes that make up the hypercall. To call a hypercall, just call these instructions.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK"hj8hhubh)}(hThe parameters are as follows:h]hThe parameters are as follows:}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hj8hhubh block_quote)}(hX5======== ================ ================ Register IN OUT ======== ================ ================ r0 - volatile r3 1st parameter Return code r4 2nd parameter 1st output value r5 3rd parameter 2nd output value r6 4th parameter 3rd output value r7 5th parameter 4th output value r8 6th parameter 5th output value r9 7th parameter 6th output value r10 8th parameter 7th output value r11 hypercall number 8th output value r12 - volatile ======== ================ ================ h]htable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1juhjrubjv)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1juhjrubjv)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1juhjrubhthead)}(hhh]hrow)}(hhh](hentry)}(hhh]h)}(hRegisterh]hRegister}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK)hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hINh]hIN}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK)hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hOUTh]hOUT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK)hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhjrubhtbody)}(hhh](j)}(hhh](j)}(hhh]h)}(hr0h]hr0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK+hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h bullet_list)}(hhh]h list_item)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]bullet-uh1jhhhK+hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hvolatileh]hvolatile}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK+hj2ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hr3h]hr3}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjRubah}(h]h ]h"]h$]h&]uh1jhjOubj)}(hhh]h)}(h 1st parameterh]h 1st parameter}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjiubah}(h]h ]h"]h$]h&]uh1jhjOubj)}(hhh]h)}(h Return codeh]h Return code}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjubah}(h]h ]h"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hr4h]hr4}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK-hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h 2nd parameterh]h 2nd parameter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK-hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h1st output valueh]h1st output value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK-hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hr5h]hr5}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h 3rd parameterh]h 3rd parameter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h2nd output valueh]h2nd output value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hr6h]hr6}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK/hj<ubah}(h]h ]h"]h$]h&]uh1jhj9ubj)}(hhh]h)}(h 4th parameterh]h 4th parameter}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK/hjSubah}(h]h ]h"]h$]h&]uh1jhj9ubj)}(hhh]h)}(h3rd output valueh]h3rd output value}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK/hjjubah}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hr7h]hr7}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h 5th parameterh]h 5th parameter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h4th output valueh]h4th output value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hr8h]hr8}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK1hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h 6th parameterh]h 6th parameter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK1hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h5th output valueh]h5th output value}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK1hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hr9h]hr9}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK2hj&ubah}(h]h ]h"]h$]h&]uh1jhj#ubj)}(hhh]h)}(h 7th parameterh]h 7th parameter}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK2hj=ubah}(h]h ]h"]h$]h&]uh1jhj#ubj)}(hhh]h)}(h6th output valueh]h6th output value}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK2hjTubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hr10h]hr10}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK3hjtubah}(h]h ]h"]h$]h&]uh1jhjqubj)}(hhh]h)}(h 8th parameterh]h 8th parameter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK3hjubah}(h]h ]h"]h$]h&]uh1jhjqubj)}(hhh]h)}(h7th output valueh]h7th output value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK3hjubah}(h]h ]h"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hr11h]hr11}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hhypercall numberh]hhypercall number}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h8th output valueh]h8th output value}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh](j)}(hhh]h)}(hr12h]hr12}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK5hjubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]j)}(hhh]j)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]j*j+uh1jhhhK5hj'ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hvolatileh]hvolatile}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK5hjBubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]colsKuh1jphjmubah}(h]h ]h"]h$]h&]uh1jkhjgubah}(h]h ]h"]h$]h&]uh1jehhhK(hj8hhubh)}(hHypercall definitions are shared in generic code, so the same hypercall numbers apply for x86 and powerpc alike with the exception that each KVM hypercall also needs to be ORed with the KVM vendor code which is (42 << 16).h]hHypercall definitions are shared in generic code, so the same hypercall numbers apply for x86 and powerpc alike with the exception that each KVM hypercall also needs to be ORed with the KVM vendor code which is (42 << 16).}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK8hj8hhubh)}(hReturn codes can be as follows:h]hReturn codes can be as follows:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj8hhubeh}(h]kvm-hypercallsah ]h"]kvm hypercallsah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(hThe magic pageh]hThe magic page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKGubh)}(hTo enable communication between the hypervisor and guest there is a new shared page that contains parts of supervisor visible register state. The guest can map this shared page using the KVM hypercall KVM_HC_PPC_MAP_MAGIC_PAGE.h]hTo enable communication between the hypervisor and guest there is a new shared page that contains parts of supervisor visible register state. The guest can map this shared page using the KVM hypercall KVM_HC_PPC_MAP_MAGIC_PAGE.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKIhjhhubh)}(hXWith this hypercall issued the guest always gets the magic page mapped at the desired location. The first parameter indicates the effective address when the MMU is enabled. The second parameter indicates the address in real mode, if applicable to the target. For now, we always map the page to -4096. This way we can access it using absolute load and store functions. The following instruction reads the first field of the magic page::h]hXWith this hypercall issued the guest always gets the magic page mapped at the desired location. The first parameter indicates the effective address when the MMU is enabled. The second parameter indicates the address in real mode, if applicable to the target. For now, we always map the page to -4096. This way we can access it using absolute load and store functions. The following instruction reads the first field of the magic page:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKMhjhhubh literal_block)}(hld rX, -4096(0)h]hld rX, -4096(0)}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKThjhhubh)}(hX9The interface is designed to be extensible should there be need later to add additional registers to the magic page. If you add fields to the magic page, also define a new hypercall feature to indicate that the host can give you more registers. Only if the host supports the additional features, make use of them.h]hX9The interface is designed to be extensible should there be need later to add additional registers to the magic page. If you add fields to the magic page, also define a new hypercall feature to indicate that the host can give you more registers. Only if the host supports the additional features, make use of them.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKVhjhhubh)}(hnThe magic page layout is described by struct kvm_vcpu_arch_shared in arch/powerpc/include/uapi/asm/kvm_para.h.h]hnThe magic page layout is described by struct kvm_vcpu_arch_shared in arch/powerpc/include/uapi/asm/kvm_para.h.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK[hjhhubeh}(h]the-magic-pageah ]h"]the magic pageah$]h&]uh1hhhhhhhhKGubh)}(hhh](h)}(hMagic page featuresh]hMagic page features}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK_ubh)}(hWhen mapping the magic page using the KVM hypercall KVM_HC_PPC_MAP_MAGIC_PAGE, a second return value is passed to the guest. This second return value contains a bitmap of available features inside the magic page.h]hWhen mapping the magic page using the KVM hypercall KVM_HC_PPC_MAP_MAGIC_PAGE, a second return value is passed to the guest. This second return value contains a bitmap of available features inside the magic page.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKahjhhubh)}(hEThe following enhancements to the magic page are currently available:h]hEThe following enhancements to the magic page are currently available:}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKehjhhubjf)}(hX============================ ======================================= KVM_MAGIC_FEAT_SR Maps SR registers r/w in the magic page KVM_MAGIC_FEAT_MAS0_TO_SPRG7 Maps MASn, ESR, PIR and high SPRGs ============================ ======================================= h]jl)}(hhh]jq)}(hhh](jv)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1juhjPubjv)}(hhh]h}(h]h ]h"]h$]h&]colwidthK'uh1juhjPubj)}(hhh](j)}(hhh](j)}(hhh]h)}(hKVM_MAGIC_FEAT_SRh]hKVM_MAGIC_FEAT_SR}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhjmubah}(h]h ]h"]h$]h&]uh1jhjjubj)}(hhh]h)}(h'Maps SR registers r/w in the magic pageh]h'Maps SR registers r/w in the magic page}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhjubah}(h]h ]h"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]uh1jhjgubj)}(hhh](j)}(hhh]h)}(hKVM_MAGIC_FEAT_MAS0_TO_SPRG7h]hKVM_MAGIC_FEAT_MAS0_TO_SPRG7}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKihjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h"Maps MASn, ESR, PIR and high SPRGsh]h"Maps MASn, ESR, PIR and high SPRGs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKihjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]colsKuh1jphjMubah}(h]h ]h"]h$]h&]uh1jkhjIubah}(h]h ]h"]h$]h&]uh1jehhhKghjhhubh)}(hiFor enhanced features in the magic page, please check for the existence of the feature before using them!h]hiFor enhanced features in the magic page, please check for the existence of the feature before using them!}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKlhjhhubeh}(h]magic-page-featuresah ]h"]magic page featuresah$]h&]uh1hhhhhhhhK_ubh)}(hhh](h)}(hMagic page flagsh]hMagic page flags}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKpubh)}(hIn addition to features that indicate whether a host is capable of a particular feature we also have a channel for a guest to tell the host whether it's capable of something. This is what we call "flags".h]hIn addition to features that indicate whether a host is capable of a particular feature we also have a channel for a guest to tell the host whether it’s capable of something. This is what we call “flags”.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKrhjhhubh)}(hIFlags are passed to the host in the low 12 bits of the Effective Address.h]hIFlags are passed to the host in the low 12 bits of the Effective Address.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKvhjhhubh)}(hBThe following flags are currently available for a guest to expose:h]hBThe following flags are currently available for a guest to expose:}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKxhjhhubjf)}(hMMAGIC_PAGE_FLAG_NOT_MAPPED_NX Guest handles NX bits correctly wrt magic page h]h)}(hLMAGIC_PAGE_FLAG_NOT_MAPPED_NX Guest handles NX bits correctly wrt magic pageh]hLMAGIC_PAGE_FLAG_NOT_MAPPED_NX Guest handles NX bits correctly wrt magic page}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKzhjBubah}(h]h ]h"]h$]h&]uh1jehhhKzhjhhubeh}(h]magic-page-flagsah ]h"]magic page flagsah$]h&]uh1hhhhhhhhKpubh)}(hhh](h)}(hMSR bitsh]hMSR bits}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjbhhhhhK}ubh)}(hThe MSR contains bits that require hypervisor intervention and bits that do not require direct hypervisor intervention because they only get interpreted when entering the guest or don't have any impact on the hypervisor's behavior.h]hThe MSR contains bits that require hypervisor intervention and bits that do not require direct hypervisor intervention because they only get interpreted when entering the guest or don’t have any impact on the hypervisor’s behavior.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjbhhubh)}(h7The following bits are safe to be set inside the guest:h]h7The following bits are safe to be set inside the guest:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjbhhubjf)}(h- MSR_EE - MSR_RI h]j)}(hhh](j)}(hMSR_EEh]h)}(hjh]hMSR_EE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hMSR_RI h]h)}(hMSR_RIh]hMSR_RI}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]j*j+uh1jhhhKhjubah}(h]h ]h"]h$]h&]uh1jehhhKhjbhhubh)}(h?If any other bit changes in the MSR, please still use mtmsr(d).h]h?If any other bit changes in the MSR, please still use mtmsr(d).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjbhhubeh}(h]msr-bitsah ]h"]msr bitsah$]h&]uh1hhhhhhhhK}ubh)}(hhh](h)}(hPatched instructionsh]hPatched instructions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hThe "ld" and "std" instructions are transformed to "lwz" and "stw" instructions respectively on 32-bit systems with an added offset of 4 to accommodate for big endianness.h]hThe “ld” and “std” instructions are transformed to “lwz” and “stw” instructions respectively on 32-bit systems with an added offset of 4 to accommodate for big endianness.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hThe following is a list of mapping the Linux kernel performs when running as guest. Implementing any of those mappings is optional, as the instruction traps also act on the shared page. So calling privileged instructions still works as before.h]hThe following is a list of mapping the Linux kernel performs when running as guest. Implementing any of those mappings is optional, as the instruction traps also act on the shared page. So calling privileged instructions still works as before.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubjl)}(hhh]jq)}(hhh](jv)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1juhj ubjv)}(hhh]h}(h]h ]h"]h$]h&]colwidthK uh1juhj ubj)}(hhh]j)}(hhh](j)}(hhh]h)}(hFromh]hFrom}(hj7 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj4 ubah}(h]h ]h"]h$]h&]uh1jhj1 ubj)}(hhh]h)}(hToh]hTo}(hjN hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjK ubah}(h]h ]h"]h$]h&]uh1jhj1 ubeh}(h]h ]h"]h$]h&]uh1jhj. ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh](j)}(hhh](j)}(hhh]h)}(h mfmsr rXh]h mfmsr rX}(hjw hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjt ubah}(h]h ]h"]h$]h&]uh1jhjq ubj)}(hhh]h)}(hld rX, magic_page->msrh]hld rX, magic_page->msr}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhjq ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mfsprg rX, 0h]h mfsprg rX, 0}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hld rX, magic_page->sprg0h]hld rX, magic_page->sprg0}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mfsprg rX, 1h]h mfsprg rX, 1}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hld rX, magic_page->sprg1h]hld rX, magic_page->sprg1}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mfsprg rX, 2h]h mfsprg rX, 2}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hld rX, magic_page->sprg2h]hld rX, magic_page->sprg2}(hj3 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj0 ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mfsprg rX, 3h]h mfsprg rX, 3}(hjS hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjP ubah}(h]h ]h"]h$]h&]uh1jhjM ubj)}(hhh]h)}(hld rX, magic_page->sprg3h]hld rX, magic_page->sprg3}(hjj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjg ubah}(h]h ]h"]h$]h&]uh1jhjM ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mfsrr0 rXh]h mfsrr0 rX}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hld rX, magic_page->srr0h]hld rX, magic_page->srr0}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mfsrr1 rXh]h mfsrr1 rX}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hld rX, magic_page->srr1h]hld rX, magic_page->srr1}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mfdar rXh]h mfdar rX}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hld rX, magic_page->darh]hld rX, magic_page->dar}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mfdsisr rXh]h mfdsisr rX}(hj/ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj, ubah}(h]h ]h"]h$]h&]uh1jhj) ubj)}(hhh]h)}(hlwz rX, magic_page->dsisrh]hlwz rX, magic_page->dsisr}(hjF hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjC ubah}(h]h ]h"]h$]h&]uh1jhj) ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mtmsr rXh]h mtmsr rX}(hjf hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjc ubah}(h]h ]h"]h$]h&]uh1jhj` ubj)}(hhh]h)}(hstd rX, magic_page->msrh]hstd rX, magic_page->msr}(hj} hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjz ubah}(h]h ]h"]h$]h&]uh1jhj` ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mtsprg 0, rXh]h mtsprg 0, rX}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hstd rX, magic_page->sprg0h]hstd rX, magic_page->sprg0}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mtsprg 1, rXh]h mtsprg 1, rX}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hstd rX, magic_page->sprg1h]hstd rX, magic_page->sprg1}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mtsprg 2, rXh]h mtsprg 2, rX}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hstd rX, magic_page->sprg2h]hstd rX, magic_page->sprg2}(hj" hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mtsprg 3, rXh]h mtsprg 3, rX}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj? ubah}(h]h ]h"]h$]h&]uh1jhj< ubj)}(hhh]h)}(hstd rX, magic_page->sprg3h]hstd rX, magic_page->sprg3}(hjY hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjV ubah}(h]h ]h"]h$]h&]uh1jhj< ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mtsrr0 rXh]h mtsrr0 rX}(hjy hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjv ubah}(h]h ]h"]h$]h&]uh1jhjs ubj)}(hhh]h)}(hstd rX, magic_page->srr0h]hstd rX, magic_page->srr0}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhjs ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mtsrr1 rXh]h mtsrr1 rX}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hstd rX, magic_page->srr1h]hstd rX, magic_page->srr1}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mtdar rXh]h mtdar rX}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hstd rX, magic_page->darh]hstd rX, magic_page->dar}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mtdsisr rXh]h mtdsisr rX}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hstw rX, magic_page->dsisrh]hstw rX, magic_page->dsisr}(hj5 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj2 ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(htlbsynch]htlbsync}(hjU hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjR ubah}(h]h ]h"]h$]h&]uh1jhjO ubj)}(hhh]h)}(hnoph]hnop}(hjl hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhji ubah}(h]h ]h"]h$]h&]uh1jhjO ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mtmsrd rX, 0h]h mtmsrd rX, 0}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hb h]hb }(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mtmsr rXh]h mtmsr rX}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(hb h]hb }(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h mtmsrd rX, 1h]h mtmsrd rX, 1}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hhh]h)}(h b h]h b }(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h [Book3S only]h]h [Book3S only]}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj.ubah}(h]h ]h"]h$]h&]uh1jhj+ubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(hmtsrin rX, rYh]hmtsrin rX, rY}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjWubah}(h]h ]h"]h$]h&]uh1jhjTubj)}(hhh]h)}(h b h]h b }(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjnubah}(h]h ]h"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h [BookE only]h]h [BookE only]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjn ubj)}(hhh](j)}(hhh]h)}(h wrteei [0|1]h]h wrteei [0|1]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(h b h]h b }(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjn ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]colsKuh1jphj ubah}(h]h ]h"]h$]h&]uh1jkhjhhhhhNubh)}(hSome instructions require more logic to determine what's going on than a load or store instruction can deliver. To enable patching of those, we keep some RAM around where we can live translate instructions to. What happens is the following:h]hSome instructions require more logic to determine what’s going on than a load or store instruction can deliver. To enable patching of those, we keep some RAM around where we can live translate instructions to. What happens is the following:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubjf)}(h1) copy emulation code to memory 2) patch that code to fit the emulated instruction 3) patch that code to return to the original pc + 4 4) patch the original instruction to branch to the new code h]henumerated_list)}(hhh](j)}(hcopy emulation code to memoryh]h)}(hjh]hcopy emulation code to memory}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h/patch that code to fit the emulated instructionh]h)}(hj.h]h/patch that code to fit the emulated instruction}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj,ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h0patch that code to return to the original pc + 4h]h)}(hjEh]h0patch that code to return to the original pc + 4}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjCubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h9patch the original instruction to branch to the new code h]h)}(h8patch the original instruction to branch to the new codeh]h8patch the original instruction to branch to the new code}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjZubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix)uh1jhj ubah}(h]h ]h"]h$]h&]uh1jehhhKhjhhubh)}(hThat way we can inject an arbitrary amount of code as replacement for a single instruction. This allows us to check for pending interrupts when setting EE=1 for example.h]hThat way we can inject an arbitrary amount of code as replacement for a single instruction. This allows us to check for pending interrupts when setting EE=1 for example.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]patched-instructionsah ]h"]patched instructionsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Hypercall ABIs in KVM on PowerPCh]h Hypercall ABIs in KVM on PowerPC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubj)}(hhh]j)}(hKVM hypercalls (ePAPR) h]h)}(hKVM hypercalls (ePAPR)h]hKVM hypercalls (ePAPR)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubah}(h]h ]h"]h$]h&]jxjyjzhj{j|uh1jhjhhhhhKubh)}(hThese are ePAPR compliant hypercall implementation (mentioned above). Even generic hypercalls are implemented here, like the ePAPR idle hcall. These are available on all targets.h]hThese are ePAPR compliant hypercall implementation (mentioned above). Even generic hypercalls are implemented here, like the ePAPR idle hcall. These are available on all targets.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hhh]j)}(hPAPR hypercalls h]h)}(hPAPR hypercallsh]hPAPR hypercalls}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubah}(h]h ]h"]h$]h&]jxjyjzhj{j|startKuh1jhjhhhhhKubh)}(hX PAPR hypercalls are needed to run server PowerPC PAPR guests (-M pseries in QEMU). These are the same hypercalls that pHyp, the POWER hypervisor, implements. Some of them are handled in the kernel, some are handled in user space. This is only available on book3s_64.h]hX PAPR hypercalls are needed to run server PowerPC PAPR guests (-M pseries in QEMU). These are the same hypercalls that pHyp, the POWER hypervisor, implements. Some of them are handled in the kernel, some are handled in user space. This is only available on book3s_64.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hhh]j)}(hOSI hypercalls h]h)}(hOSI hypercallsh]hOSI hypercalls}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubah}(h]h ]h"]h$]h&]jxjyjzhj{j|jKuh1jhjhhhhhKubh)}(hXMac-on-Linux is another user of KVM on PowerPC, which has its own hypercall (long before KVM). This is supported to maintain compatibility. All these hypercalls get forwarded to user space. This is only useful on book3s_32, but can be used with book3s_64 as well.h]hXMac-on-Linux is another user of KVM on PowerPC, which has its own hypercall (long before KVM). This is supported to maintain compatibility. All these hypercalls get forwarded to user space. This is only useful on book3s_32, but can be used with book3s_64 as well.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h] hypercall-abis-in-kvm-on-powerpcah ]h"] hypercall abis in kvm on powerpcah$]h&]uh1hhhhhhhhKubeh}(h]!the-ppc-kvm-paravirtual-interfaceah ]h"]!the ppc kvm paravirtual interfaceah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksjfootnote_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_handlerjjerror_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}(jEjBj5j2jjjjjjj_j\jjjjj=j:u nametypes}(jEj5jjjj_jjj=uh}(jBhj2jjj8jjjjj\jjjbjjj:ju 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: "2" (ordinal 2)h]h>Enumerated list start value not ordinal-1: “2” (ordinal 2)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypeINFOsourcehlineKuh1jhjhhhhhKubj)}(hhh]h)}(h:Enumerated list start value not ordinal-1: "3" (ordinal 3)h]h>Enumerated list start value not ordinal-1: “3” (ordinal 3)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypejsourcehlineKuh1jhjhhhhhKubetransform_messages] transformerN include_log] decorationNhhub.