From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mahesh Jagannath Salgaonkar Date: Wed, 27 Jan 2016 05:14:31 +0000 Subject: Re: [PATCH v3 2/2] KVM: PPC: Exit guest upon MCE when FWNMI capability is enabled Message-Id: <56A84F67.8050109@linux.vnet.ibm.com> List-Id: References: <20160113070759.20248.86252.stgit@aravindap> <20160113070809.20248.80811.stgit@aravindap> <20160123102847.GB11916@fergus.ozlabs.ibm.com> <56A377CF.8040706@linux.vnet.ibm.com> <20160123212448.GC11916@fergus.ozlabs.ibm.com> In-Reply-To: <20160123212448.GC11916@fergus.ozlabs.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Paul Mackerras , Aravinda Prasad Cc: kvm@vger.kernel.org, gleb@kernel.org, agraf@suse.de, kvm-ppc@vger.kernel.org, linuxppc-dev@ozlabs.org, pbonzini@redhat.com, david@gibson.dropbear.id.au On 01/24/2016 02:54 AM, Paul Mackerras wrote: > On Sat, Jan 23, 2016 at 06:23:35PM +0530, Aravinda Prasad wrote: >> >> >> On Saturday 23 January 2016 03:58 PM, Paul Mackerras wrote: >>> On Wed, Jan 13, 2016 at 12:38:09PM +0530, Aravinda Prasad wrote: >>>> Enhance KVM to cause a guest exit with KVM_EXIT_NMI >>>> exit reasons upon a machine check exception (MCE) in >>>> the guest address space if the KVM_CAP_PPC_FWNMI >>>> capability is enabled (instead of delivering 0x200 >>>> interrupt to guest). This enables QEMU to build error >>>> log and deliver machine check exception to guest via >>>> guest registered machine check handler. >>>> >>>> This approach simplifies the delivering of machine >>>> check exception to guest OS compared to the earlier >>>> approach of KVM directly invoking 0x200 guest interrupt >>>> vector. In the earlier approach QEMU was enhanced to >>>> patch the 0x200 interrupt vector during boot. The >>>> patched code at 0x200 issued a private hcall to pass >>>> the control to QEMU to build the error log. >>>> >>>> This design/approach is based on the feedback for the >>>> QEMU patches to handle machine check exception. Details >>>> of earlier approach of handling machine check exception >>>> in QEMU and related discussions can be found at: >>> >>> [snip] >>> >>>> --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S >>>> +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S >>>> @@ -133,21 +133,18 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) >>>> stb r0, HSTATE_HWTHREAD_REQ(r13) >>>> >>>> /* >>>> - * For external and machine check interrupts, we need >>>> - * to call the Linux handler to process the interrupt. >>>> - * We do that by jumping to absolute address 0x500 for >>>> - * external interrupts, or the machine_check_fwnmi label >>>> - * for machine checks (since firmware might have patched >>>> - * the vector area at 0x200). The [h]rfid at the end of the >>>> - * handler will return to the book3s_hv_interrupts.S code. >>>> - * For other interrupts we do the rfid to get back >>>> - * to the book3s_hv_interrupts.S code here. >>>> + * For external interrupts we need to call the Linux >>>> + * handler to process the interrupt. We do that by jumping >>>> + * to absolute address 0x500 for external interrupts. >>>> + * The [h]rfid at the end of the handler will return to >>>> + * the book3s_hv_interrupts.S code. For other interrupts >>>> + * we do the rfid to get back to the book3s_hv_interrupts.S >>>> + * code here. >>>> */ >>>> ld r8, 112+PPC_LR_STKOFF(r1) >>>> addi r1, r1, 112 >>>> ld r7, HSTATE_HOST_MSR(r13) >>>> >>>> - cmpwi cr1, r12, BOOK3S_INTERRUPT_MACHINE_CHECK >>>> cmpwi r12, BOOK3S_INTERRUPT_EXTERNAL >>>> beq 11f >>>> cmpwi r12, BOOK3S_INTERRUPT_H_DOORBELL >>>> @@ -162,7 +159,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) >>>> mtmsrd r6, 1 /* Clear RI in MSR */ >>>> mtsrr0 r8 >>>> mtsrr1 r7 >>>> - beq cr1, 13f /* machine check */ >>>> RFI >>>> >>>> /* On POWER7, we have external interrupts set to use HSRR0/1 */ >>>> @@ -170,8 +166,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) >>>> mtspr SPRN_HSRR1, r7 >>>> ba 0x500 >>>> >>>> -13: b machine_check_fwnmi >>>> - >>> >>> So, what you're disabling here is the host-side handling of the >>> machine check after completing the guest->host switch. This has >>> nothing to do with how the machine check gets communicated to the >>> guest. >>> >>> Now, part of the host-side machine check handling has already >>> happened, but I thought there was more that was done in host kernel >>> virtual mode. If this change really is needed then I would want an >>> ack from Mahesh that this is correct, and it will need to be explained >>> in detail in the patch description. >> >> If we don't do that we will end up running into >> panic() in opal_machine_check() if UE belonged to guest. >> >> Details in this link: >> http://marc.info/?l=kvm-ppc&m4730552720044&w=2 > > Well maybe the panic call needs to be changed. But the way you have > it, we *never* get to opal_machine_check for any machine check > interrupt, and I have a hard time believing that is correct. We do still go to opal_machine_check for MCE in host kernel/user space. The host virtual mode prints the event and then checks whether MCE is in kernel or user space context and acts accordingly. For machine check while in guest, when we fall through machine_check_fwnmi, the register context points to host kernel module (__kvmppc_vcore_entry [kvm_hv]). And opal_machine_check thinks that memory UE is in host kernel rather than in guest and goes down the panic path. It becomes bit difficult to figure out whether MCE happened in guest OR in host kernel by looking at the register set received by opal_machine_check in this case. Aravinda's implementation requires him to go back to KVM kernel module which would end up in NMI exit inside QEMU and then he can handle Memory error for guest inside QEMU and deliver it to guest. Hence he needs to bypass machine_check_fwnmi. But by this time we would have already hooked the mce event to work queue for console logging. The other approach could be to add additional field into machine check event that can help opal_machine_check to identify that MCE is from guest and then just return from interrupt after printing event instead of going down to panic path. But this could be bit messy. Thanks, -Mahesh. > > Paul. > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ozlabs.org (ozlabs.org [IPv6:2401:3900:2:1::2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id DFD071A0174 for ; Wed, 27 Jan 2016 18:28:06 +1100 (AEDT) Received: from e28smtp04.in.ibm.com (e28smtp04.in.ibm.com [125.16.236.4]) (using TLSv1 with cipher CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3516D140BE0 for ; Wed, 27 Jan 2016 18:28:06 +1100 (AEDT) Received: from localhost by e28smtp04.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 27 Jan 2016 12:58:01 +0530 Subject: Re: [PATCH v3 2/2] KVM: PPC: Exit guest upon MCE when FWNMI capability is enabled To: Paul Mackerras , Aravinda Prasad References: <20160113070759.20248.86252.stgit@aravindap> <20160113070809.20248.80811.stgit@aravindap> <20160123102847.GB11916@fergus.ozlabs.ibm.com> <56A377CF.8040706@linux.vnet.ibm.com> <20160123212448.GC11916@fergus.ozlabs.ibm.com> Cc: gleb@kernel.org, agraf@suse.de, kvm-ppc@vger.kernel.org, linuxppc-dev@ozlabs.org, pbonzini@redhat.com, david@gibson.dropbear.id.au, kvm@vger.kernel.org, mpe@ellerman.id.au From: Mahesh Jagannath Salgaonkar Message-ID: <56A84F67.8050109@linux.vnet.ibm.com> Date: Wed, 27 Jan 2016 10:32:31 +0530 MIME-Version: 1.0 In-Reply-To: <20160123212448.GC11916@fergus.ozlabs.ibm.com> Content-Type: text/plain; charset=windows-1252 List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , On 01/24/2016 02:54 AM, Paul Mackerras wrote: > On Sat, Jan 23, 2016 at 06:23:35PM +0530, Aravinda Prasad wrote: >> >> >> On Saturday 23 January 2016 03:58 PM, Paul Mackerras wrote: >>> On Wed, Jan 13, 2016 at 12:38:09PM +0530, Aravinda Prasad wrote: >>>> Enhance KVM to cause a guest exit with KVM_EXIT_NMI >>>> exit reasons upon a machine check exception (MCE) in >>>> the guest address space if the KVM_CAP_PPC_FWNMI >>>> capability is enabled (instead of delivering 0x200 >>>> interrupt to guest). This enables QEMU to build error >>>> log and deliver machine check exception to guest via >>>> guest registered machine check handler. >>>> >>>> This approach simplifies the delivering of machine >>>> check exception to guest OS compared to the earlier >>>> approach of KVM directly invoking 0x200 guest interrupt >>>> vector. In the earlier approach QEMU was enhanced to >>>> patch the 0x200 interrupt vector during boot. The >>>> patched code at 0x200 issued a private hcall to pass >>>> the control to QEMU to build the error log. >>>> >>>> This design/approach is based on the feedback for the >>>> QEMU patches to handle machine check exception. Details >>>> of earlier approach of handling machine check exception >>>> in QEMU and related discussions can be found at: >>> >>> [snip] >>> >>>> --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S >>>> +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S >>>> @@ -133,21 +133,18 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) >>>> stb r0, HSTATE_HWTHREAD_REQ(r13) >>>> >>>> /* >>>> - * For external and machine check interrupts, we need >>>> - * to call the Linux handler to process the interrupt. >>>> - * We do that by jumping to absolute address 0x500 for >>>> - * external interrupts, or the machine_check_fwnmi label >>>> - * for machine checks (since firmware might have patched >>>> - * the vector area at 0x200). The [h]rfid at the end of the >>>> - * handler will return to the book3s_hv_interrupts.S code. >>>> - * For other interrupts we do the rfid to get back >>>> - * to the book3s_hv_interrupts.S code here. >>>> + * For external interrupts we need to call the Linux >>>> + * handler to process the interrupt. We do that by jumping >>>> + * to absolute address 0x500 for external interrupts. >>>> + * The [h]rfid at the end of the handler will return to >>>> + * the book3s_hv_interrupts.S code. For other interrupts >>>> + * we do the rfid to get back to the book3s_hv_interrupts.S >>>> + * code here. >>>> */ >>>> ld r8, 112+PPC_LR_STKOFF(r1) >>>> addi r1, r1, 112 >>>> ld r7, HSTATE_HOST_MSR(r13) >>>> >>>> - cmpwi cr1, r12, BOOK3S_INTERRUPT_MACHINE_CHECK >>>> cmpwi r12, BOOK3S_INTERRUPT_EXTERNAL >>>> beq 11f >>>> cmpwi r12, BOOK3S_INTERRUPT_H_DOORBELL >>>> @@ -162,7 +159,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) >>>> mtmsrd r6, 1 /* Clear RI in MSR */ >>>> mtsrr0 r8 >>>> mtsrr1 r7 >>>> - beq cr1, 13f /* machine check */ >>>> RFI >>>> >>>> /* On POWER7, we have external interrupts set to use HSRR0/1 */ >>>> @@ -170,8 +166,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) >>>> mtspr SPRN_HSRR1, r7 >>>> ba 0x500 >>>> >>>> -13: b machine_check_fwnmi >>>> - >>> >>> So, what you're disabling here is the host-side handling of the >>> machine check after completing the guest->host switch. This has >>> nothing to do with how the machine check gets communicated to the >>> guest. >>> >>> Now, part of the host-side machine check handling has already >>> happened, but I thought there was more that was done in host kernel >>> virtual mode. If this change really is needed then I would want an >>> ack from Mahesh that this is correct, and it will need to be explained >>> in detail in the patch description. >> >> If we don't do that we will end up running into >> panic() in opal_machine_check() if UE belonged to guest. >> >> Details in this link: >> http://marc.info/?l=kvm-ppc&m=144730552720044&w=2 > > Well maybe the panic call needs to be changed. But the way you have > it, we *never* get to opal_machine_check for any machine check > interrupt, and I have a hard time believing that is correct. We do still go to opal_machine_check for MCE in host kernel/user space. The host virtual mode prints the event and then checks whether MCE is in kernel or user space context and acts accordingly. For machine check while in guest, when we fall through machine_check_fwnmi, the register context points to host kernel module (__kvmppc_vcore_entry [kvm_hv]). And opal_machine_check thinks that memory UE is in host kernel rather than in guest and goes down the panic path. It becomes bit difficult to figure out whether MCE happened in guest OR in host kernel by looking at the register set received by opal_machine_check in this case. Aravinda's implementation requires him to go back to KVM kernel module which would end up in NMI exit inside QEMU and then he can handle Memory error for guest inside QEMU and deliver it to guest. Hence he needs to bypass machine_check_fwnmi. But by this time we would have already hooked the mce event to work queue for console logging. The other approach could be to add additional field into machine check event that can help opal_machine_check to identify that MCE is from guest and then just return from interrupt after printing event instead of going down to panic path. But this could be bit messy. Thanks, -Mahesh. > > Paul. > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mahesh Jagannath Salgaonkar Subject: Re: [PATCH v3 2/2] KVM: PPC: Exit guest upon MCE when FWNMI capability is enabled Date: Wed, 27 Jan 2016 10:32:31 +0530 Message-ID: <56A84F67.8050109@linux.vnet.ibm.com> References: <20160113070759.20248.86252.stgit@aravindap> <20160113070809.20248.80811.stgit@aravindap> <20160123102847.GB11916@fergus.ozlabs.ibm.com> <56A377CF.8040706@linux.vnet.ibm.com> <20160123212448.GC11916@fergus.ozlabs.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Cc: kvm@vger.kernel.org, gleb@kernel.org, agraf@suse.de, kvm-ppc@vger.kernel.org, linuxppc-dev@ozlabs.org, pbonzini@redhat.com, david@gibson.dropbear.id.au To: Paul Mackerras , Aravinda Prasad Return-path: In-Reply-To: <20160123212448.GC11916@fergus.ozlabs.ibm.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linuxppc-dev-bounces+glppe-linuxppc-embedded-2=m.gmane.org@lists.ozlabs.org Sender: "Linuxppc-dev" List-Id: kvm.vger.kernel.org T24gMDEvMjQvMjAxNiAwMjo1NCBBTSwgUGF1bCBNYWNrZXJyYXMgd3JvdGU6Cj4gT24gU2F0LCBK YW4gMjMsIDIwMTYgYXQgMDY6MjM6MzVQTSArMDUzMCwgQXJhdmluZGEgUHJhc2FkIHdyb3RlOgo+ Pgo+Pgo+PiBPbiBTYXR1cmRheSAyMyBKYW51YXJ5IDIwMTYgMDM6NTggUE0sIFBhdWwgTWFja2Vy cmFzIHdyb3RlOgo+Pj4gT24gV2VkLCBKYW4gMTMsIDIwMTYgYXQgMTI6Mzg6MDlQTSArMDUzMCwg QXJhdmluZGEgUHJhc2FkIHdyb3RlOgo+Pj4+IEVuaGFuY2UgS1ZNIHRvIGNhdXNlIGEgZ3Vlc3Qg ZXhpdCB3aXRoIEtWTV9FWElUX05NSQo+Pj4+IGV4aXQgcmVhc29ucyB1cG9uIGEgbWFjaGluZSBj aGVjayBleGNlcHRpb24gKE1DRSkgaW4KPj4+PiB0aGUgZ3Vlc3QgYWRkcmVzcyBzcGFjZSBpZiB0 aGUgS1ZNX0NBUF9QUENfRldOTUkKPj4+PiBjYXBhYmlsaXR5IGlzIGVuYWJsZWQgKGluc3RlYWQg b2YgZGVsaXZlcmluZyAweDIwMAo+Pj4+IGludGVycnVwdCB0byBndWVzdCkuIFRoaXMgZW5hYmxl cyBRRU1VIHRvIGJ1aWxkIGVycm9yCj4+Pj4gbG9nIGFuZCBkZWxpdmVyIG1hY2hpbmUgY2hlY2sg ZXhjZXB0aW9uIHRvIGd1ZXN0IHZpYQo+Pj4+IGd1ZXN0IHJlZ2lzdGVyZWQgbWFjaGluZSBjaGVj ayBoYW5kbGVyLgo+Pj4+Cj4+Pj4gVGhpcyBhcHByb2FjaCBzaW1wbGlmaWVzIHRoZSBkZWxpdmVy aW5nIG9mIG1hY2hpbmUKPj4+PiBjaGVjayBleGNlcHRpb24gdG8gZ3Vlc3QgT1MgY29tcGFyZWQg dG8gdGhlIGVhcmxpZXIKPj4+PiBhcHByb2FjaCBvZiBLVk0gZGlyZWN0bHkgaW52b2tpbmcgMHgy MDAgZ3Vlc3QgaW50ZXJydXB0Cj4+Pj4gdmVjdG9yLiBJbiB0aGUgZWFybGllciBhcHByb2FjaCBR RU1VIHdhcyBlbmhhbmNlZCB0bwo+Pj4+IHBhdGNoIHRoZSAweDIwMCBpbnRlcnJ1cHQgdmVjdG9y IGR1cmluZyBib290LiBUaGUKPj4+PiBwYXRjaGVkIGNvZGUgYXQgMHgyMDAgaXNzdWVkIGEgcHJp dmF0ZSBoY2FsbCB0byBwYXNzCj4+Pj4gdGhlIGNvbnRyb2wgdG8gUUVNVSB0byBidWlsZCB0aGUg ZXJyb3IgbG9nLgo+Pj4+Cj4+Pj4gVGhpcyBkZXNpZ24vYXBwcm9hY2ggaXMgYmFzZWQgb24gdGhl IGZlZWRiYWNrIGZvciB0aGUKPj4+PiBRRU1VIHBhdGNoZXMgdG8gaGFuZGxlIG1hY2hpbmUgY2hl Y2sgZXhjZXB0aW9uLiBEZXRhaWxzCj4+Pj4gb2YgZWFybGllciBhcHByb2FjaCBvZiBoYW5kbGlu ZyBtYWNoaW5lIGNoZWNrIGV4Y2VwdGlvbgo+Pj4+IGluIFFFTVUgYW5kIHJlbGF0ZWQgZGlzY3Vz c2lvbnMgY2FuIGJlIGZvdW5kIGF0Ogo+Pj4KPj4+IFtzbmlwXQo+Pj4KPj4+PiAtLS0gYS9hcmNo L3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybWhhbmRsZXJzLlMKPj4+PiArKysgYi9hcmNoL3Bvd2Vy cGMva3ZtL2Jvb2szc19odl9ybWhhbmRsZXJzLlMKPj4+PiBAQCAtMTMzLDIxICsxMzMsMTggQEAg RU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQVJDSF8yMDdTKQo+Pj4+ICAJc3RiCXIwLCBI U1RBVEVfSFdUSFJFQURfUkVRKHIxMykKPj4+PiAgCj4+Pj4gIAkvKgo+Pj4+IC0JICogRm9yIGV4 dGVybmFsIGFuZCBtYWNoaW5lIGNoZWNrIGludGVycnVwdHMsIHdlIG5lZWQKPj4+PiAtCSAqIHRv IGNhbGwgdGhlIExpbnV4IGhhbmRsZXIgdG8gcHJvY2VzcyB0aGUgaW50ZXJydXB0Lgo+Pj4+IC0J ICogV2UgZG8gdGhhdCBieSBqdW1waW5nIHRvIGFic29sdXRlIGFkZHJlc3MgMHg1MDAgZm9yCj4+ Pj4gLQkgKiBleHRlcm5hbCBpbnRlcnJ1cHRzLCBvciB0aGUgbWFjaGluZV9jaGVja19md25taSBs YWJlbAo+Pj4+IC0JICogZm9yIG1hY2hpbmUgY2hlY2tzIChzaW5jZSBmaXJtd2FyZSBtaWdodCBo YXZlIHBhdGNoZWQKPj4+PiAtCSAqIHRoZSB2ZWN0b3IgYXJlYSBhdCAweDIwMCkuICBUaGUgW2hd cmZpZCBhdCB0aGUgZW5kIG9mIHRoZQo+Pj4+IC0JICogaGFuZGxlciB3aWxsIHJldHVybiB0byB0 aGUgYm9vazNzX2h2X2ludGVycnVwdHMuUyBjb2RlLgo+Pj4+IC0JICogRm9yIG90aGVyIGludGVy cnVwdHMgd2UgZG8gdGhlIHJmaWQgdG8gZ2V0IGJhY2sKPj4+PiAtCSAqIHRvIHRoZSBib29rM3Nf aHZfaW50ZXJydXB0cy5TIGNvZGUgaGVyZS4KPj4+PiArCSAqIEZvciBleHRlcm5hbCBpbnRlcnJ1 cHRzIHdlIG5lZWQgdG8gY2FsbCB0aGUgTGludXgKPj4+PiArCSAqIGhhbmRsZXIgdG8gcHJvY2Vz cyB0aGUgaW50ZXJydXB0LiBXZSBkbyB0aGF0IGJ5IGp1bXBpbmcKPj4+PiArCSAqIHRvIGFic29s dXRlIGFkZHJlc3MgMHg1MDAgZm9yIGV4dGVybmFsIGludGVycnVwdHMuCj4+Pj4gKwkgKiBUaGUg W2hdcmZpZCBhdCB0aGUgZW5kIG9mIHRoZSBoYW5kbGVyIHdpbGwgcmV0dXJuIHRvCj4+Pj4gKwkg KiB0aGUgYm9vazNzX2h2X2ludGVycnVwdHMuUyBjb2RlLiBGb3Igb3RoZXIgaW50ZXJydXB0cwo+ Pj4+ICsJICogd2UgZG8gdGhlIHJmaWQgdG8gZ2V0IGJhY2sgdG8gdGhlIGJvb2szc19odl9pbnRl cnJ1cHRzLlMKPj4+PiArCSAqIGNvZGUgaGVyZS4KPj4+PiAgCSAqLwo+Pj4+ICAJbGQJcjgsIDEx MitQUENfTFJfU1RLT0ZGKHIxKQo+Pj4+ICAJYWRkaQlyMSwgcjEsIDExMgo+Pj4+ICAJbGQJcjcs IEhTVEFURV9IT1NUX01TUihyMTMpCj4+Pj4gIAo+Pj4+IC0JY21wd2kJY3IxLCByMTIsIEJPT0sz U19JTlRFUlJVUFRfTUFDSElORV9DSEVDSwo+Pj4+ICAJY21wd2kJcjEyLCBCT09LM1NfSU5URVJS VVBUX0VYVEVSTkFMCj4+Pj4gIAliZXEJMTFmCj4+Pj4gIAljbXB3aQlyMTIsIEJPT0szU19JTlRF UlJVUFRfSF9ET09SQkVMTAo+Pj4+IEBAIC0xNjIsNyArMTU5LDYgQEAgRU5EX0ZUUl9TRUNUSU9O X0lGU0VUKENQVV9GVFJfQVJDSF8yMDdTKQo+Pj4+ICAJbXRtc3JkCXI2LCAxCQkJLyogQ2xlYXIg UkkgaW4gTVNSICovCj4+Pj4gIAltdHNycjAJcjgKPj4+PiAgCW10c3JyMQlyNwo+Pj4+IC0JYmVx CWNyMSwgMTNmCQkvKiBtYWNoaW5lIGNoZWNrICovCj4+Pj4gIAlSRkkKPj4+PiAgCj4+Pj4gIAkv KiBPbiBQT1dFUjcsIHdlIGhhdmUgZXh0ZXJuYWwgaW50ZXJydXB0cyBzZXQgdG8gdXNlIEhTUlIw LzEgKi8KPj4+PiBAQCAtMTcwLDggKzE2Niw2IEBAIEVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVf RlRSX0FSQ0hfMjA3UykKPj4+PiAgCW10c3ByCVNQUk5fSFNSUjEsIHI3Cj4+Pj4gIAliYQkweDUw MAo+Pj4+ICAKPj4+PiAtMTM6CWIJbWFjaGluZV9jaGVja19md25taQo+Pj4+IC0KPj4+Cj4+PiBT bywgd2hhdCB5b3UncmUgZGlzYWJsaW5nIGhlcmUgaXMgdGhlIGhvc3Qtc2lkZSBoYW5kbGluZyBv ZiB0aGUKPj4+IG1hY2hpbmUgY2hlY2sgYWZ0ZXIgY29tcGxldGluZyB0aGUgZ3Vlc3QtPmhvc3Qg c3dpdGNoLiAgVGhpcyBoYXMKPj4+IG5vdGhpbmcgdG8gZG8gd2l0aCBob3cgdGhlIG1hY2hpbmUg Y2hlY2sgZ2V0cyBjb21tdW5pY2F0ZWQgdG8gdGhlCj4+PiBndWVzdC4KPj4+Cj4+PiBOb3csIHBh cnQgb2YgdGhlIGhvc3Qtc2lkZSBtYWNoaW5lIGNoZWNrIGhhbmRsaW5nIGhhcyBhbHJlYWR5Cj4+ PiBoYXBwZW5lZCwgYnV0IEkgdGhvdWdodCB0aGVyZSB3YXMgbW9yZSB0aGF0IHdhcyBkb25lIGlu IGhvc3Qga2VybmVsCj4+PiB2aXJ0dWFsIG1vZGUuICBJZiB0aGlzIGNoYW5nZSByZWFsbHkgaXMg bmVlZGVkIHRoZW4gSSB3b3VsZCB3YW50IGFuCj4+PiBhY2sgZnJvbSBNYWhlc2ggdGhhdCB0aGlz IGlzIGNvcnJlY3QsIGFuZCBpdCB3aWxsIG5lZWQgdG8gYmUgZXhwbGFpbmVkCj4+PiBpbiBkZXRh aWwgaW4gdGhlIHBhdGNoIGRlc2NyaXB0aW9uLgo+Pgo+PiBJZiB3ZSBkb24ndCBkbyB0aGF0IHdl IHdpbGwgZW5kIHVwIHJ1bm5pbmcgaW50bwo+PiBwYW5pYygpIGluIG9wYWxfbWFjaGluZV9jaGVj aygpIGlmIFVFIGJlbG9uZ2VkIHRvIGd1ZXN0Lgo+Pgo+PiBEZXRhaWxzIGluIHRoaXMgbGluazoK Pj4gaHR0cDovL21hcmMuaW5mby8/bD1rdm0tcHBjJm09MTQ0NzMwNTUyNzIwMDQ0Jnc9Mgo+IAo+ IFdlbGwgbWF5YmUgdGhlIHBhbmljIGNhbGwgbmVlZHMgdG8gYmUgY2hhbmdlZC4gIEJ1dCB0aGUg d2F5IHlvdSBoYXZlCj4gaXQsIHdlICpuZXZlciogZ2V0IHRvIG9wYWxfbWFjaGluZV9jaGVjayBm b3IgYW55IG1hY2hpbmUgY2hlY2sKPiBpbnRlcnJ1cHQsIGFuZCBJIGhhdmUgYSBoYXJkIHRpbWUg YmVsaWV2aW5nIHRoYXQgaXMgY29ycmVjdC4KCldlIGRvIHN0aWxsIGdvIHRvIG9wYWxfbWFjaGlu ZV9jaGVjayBmb3IgTUNFIGluIGhvc3Qga2VybmVsL3VzZXIgc3BhY2UuClRoZSBob3N0IHZpcnR1 YWwgbW9kZSBwcmludHMgdGhlIGV2ZW50IGFuZCB0aGVuIGNoZWNrcyB3aGV0aGVyIE1DRSBpcyBp bgprZXJuZWwgb3IgdXNlciBzcGFjZSBjb250ZXh0IGFuZCBhY3RzIGFjY29yZGluZ2x5LgoKRm9y IG1hY2hpbmUgY2hlY2sgd2hpbGUgaW4gZ3Vlc3QsIHdoZW4gd2UgZmFsbCB0aHJvdWdoCm1hY2hp bmVfY2hlY2tfZndubWksIHRoZSByZWdpc3RlciBjb250ZXh0IHBvaW50cyB0byBob3N0IGtlcm5l bCBtb2R1bGUKKF9fa3ZtcHBjX3Zjb3JlX2VudHJ5IFtrdm1faHZdKS4gQW5kIG9wYWxfbWFjaGlu ZV9jaGVjayB0aGlua3MgdGhhdAptZW1vcnkgVUUgaXMgaW4gaG9zdCBrZXJuZWwgcmF0aGVyIHRo YW4gaW4gZ3Vlc3QgYW5kIGdvZXMgZG93biB0aGUgcGFuaWMKcGF0aC4gSXQgYmVjb21lcyBiaXQg ZGlmZmljdWx0IHRvIGZpZ3VyZSBvdXQgd2hldGhlciBNQ0UgaGFwcGVuZWQgaW4KZ3Vlc3QgT1Ig aW4gaG9zdCBrZXJuZWwgYnkgbG9va2luZyBhdCB0aGUgcmVnaXN0ZXIgc2V0IHJlY2VpdmVkIGJ5 Cm9wYWxfbWFjaGluZV9jaGVjayBpbiB0aGlzIGNhc2UuCgpBcmF2aW5kYSdzIGltcGxlbWVudGF0 aW9uIHJlcXVpcmVzIGhpbSB0byBnbyBiYWNrIHRvIEtWTSBrZXJuZWwgbW9kdWxlCndoaWNoIHdv dWxkIGVuZCB1cCBpbiBOTUkgZXhpdCBpbnNpZGUgUUVNVSBhbmQgdGhlbiBoZSBjYW4gaGFuZGxl IE1lbW9yeQplcnJvciBmb3IgZ3Vlc3QgaW5zaWRlIFFFTVUgYW5kIGRlbGl2ZXIgaXQgdG8gZ3Vl c3QuIEhlbmNlIGhlIG5lZWRzIHRvCmJ5cGFzcyBtYWNoaW5lX2NoZWNrX2Z3bm1pLiBCdXQgYnkg dGhpcyB0aW1lIHdlIHdvdWxkIGhhdmUgYWxyZWFkeQpob29rZWQgdGhlIG1jZSBldmVudCB0byB3 b3JrIHF1ZXVlIGZvciBjb25zb2xlIGxvZ2dpbmcuCgpUaGUgb3RoZXIgYXBwcm9hY2ggY291bGQg YmUgdG8gYWRkIGFkZGl0aW9uYWwgZmllbGQgaW50byBtYWNoaW5lIGNoZWNrCmV2ZW50IHRoYXQg Y2FuIGhlbHAgb3BhbF9tYWNoaW5lX2NoZWNrIHRvIGlkZW50aWZ5IHRoYXQgTUNFIGlzIGZyb20K Z3Vlc3QgYW5kIHRoZW4ganVzdCByZXR1cm4gZnJvbSBpbnRlcnJ1cHQgYWZ0ZXIgcHJpbnRpbmcg ZXZlbnQgaW5zdGVhZApvZiBnb2luZyBkb3duIHRvIHBhbmljIHBhdGguIEJ1dCB0aGlzIGNvdWxk IGJlIGJpdCBtZXNzeS4KClRoYW5rcywKLU1haGVzaC4KCj4gCj4gUGF1bC4KPiAKCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4cHBjLWRldiBtYWls aW5nIGxpc3QKTGludXhwcGMtZGV2QGxpc3RzLm96bGFicy5vcmcKaHR0cHM6Ly9saXN0cy5vemxh YnMub3JnL2xpc3RpbmZvL2xpbnV4cHBjLWRldg==