From mboxrd@z Thu Jan 1 00:00:00 1970 From: Madhavan Srinivasan Date: Fri, 04 Jul 2014 07:44:28 +0000 Subject: Re: [PATCH v2] powerpc/kvm: support to handle sw breakpoint Message-Id: <53B6588C.4090502@linux.vnet.ibm.com> List-Id: References: <1404204062-19635-1-git-send-email-maddy@linux.vnet.ibm.com> <53B543C5.0@suse.de> <53B62EEE.7010804@linux.vnet.ibm.com> <53B64E4D.1010802@suse.de> In-Reply-To: <53B64E4D.1010802@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Alexander Graf , benh@kernel.crashing.org, paulus@samba.org Cc: linuxppc-dev@lists.ozlabs.org, kvm@vger.kernel.org, kvm-ppc@vger.kernel.org On Friday 04 July 2014 12:18 PM, Alexander Graf wrote: > > On 04.07.14 06:34, Madhavan Srinivasan wrote: >> On Thursday 03 July 2014 05:21 PM, Alexander Graf wrote: >>> On 01.07.14 10:41, Madhavan Srinivasan wrote: >>>> This patch adds kernel side support for software breakpoint. >>>> Design is that, by using an illegal instruction, we trap to hypervisor >>>> via Emulation Assistance interrupt, where we check for the illegal >>>> instruction >>>> and accordingly we return to Host or Guest. Patch also adds support for >>>> software breakpoint in PR KVM. >>>> >>>> Patch mandates use of "abs" instruction as sw breakpoint instruction >>>> (primary opcode 31 and extended opcode 360). Based on PowerISA v2.01, >>>> ABS instruction has been dropped from the architecture and treated an >>>> illegal instruction. >>>> >>>> Changes v1->v2: >>>> >>>> Moved the debug instruction #def to kvm_book3s.h. This way PR_KVM >>>> can also share it. >>>> Added code to use KVM get one reg infrastructure to get debug >>>> opcode. >>>> Updated emulate.c to include emulation of debug instruction incase >>>> of PR_KVM. >>>> Made changes to commit message. >>>> >>>> Signed-off-by: Madhavan Srinivasan >>>> --- >>>> arch/powerpc/include/asm/kvm_book3s.h | 8 ++++++++ >>>> arch/powerpc/include/asm/ppc-opcode.h | 5 +++++ >>>> arch/powerpc/kvm/book3s.c | 3 ++- >>>> arch/powerpc/kvm/book3s_hv.c | 9 +++++++++ >>>> arch/powerpc/kvm/book3s_pr.c | 3 +++ >>>> arch/powerpc/kvm/emulate.c | 10 ++++++++++ >>>> 6 files changed, 37 insertions(+), 1 deletion(-) >>>> >>>> diff --git a/arch/powerpc/include/asm/kvm_book3s.h >>>> b/arch/powerpc/include/asm/kvm_book3s.h >>>> index f52f656..180d549 100644 >>>> --- a/arch/powerpc/include/asm/kvm_book3s.h >>>> +++ b/arch/powerpc/include/asm/kvm_book3s.h >>>> @@ -24,6 +24,14 @@ >>>> #include >>>> #include >>>> +/* >>>> + * KVMPPC_INST_BOOK3S_DEBUG is debug Instruction for supporting >>>> Software Breakpoint. >>>> + * Instruction mnemonic is ABS, primary opcode is 31 and extended >>>> opcode is 360. >>>> + * Based on PowerISA v2.01, ABS instruction has been dropped from the >>>> architecture >>>> + * and treated an illegal instruction. >>>> + */ >>>> +#define KVMPPC_INST_BOOK3S_DEBUG 0x7c0002d0 >>> This will still break with LE guests. >>> >> I am told to try with all 0s opcode. So rewriting the patch. > > The problem with "all 0s" is that it's reasonably likely to occur on > real world code. Hence Segher was proposing something like 0x00dddd00 > which should be the same regardless of endianness, but has a certain > appeal of intentional placement ;). > Ok Sure. >> >>>> + >>>> struct kvmppc_bat { >>>> u64 raw; >>>> u32 bepi; >>>> diff --git a/arch/powerpc/include/asm/ppc-opcode.h >>>> b/arch/powerpc/include/asm/ppc-opcode.h >>>> index 3132bb9..3fbb4c1 100644 >>>> --- a/arch/powerpc/include/asm/ppc-opcode.h >>>> +++ b/arch/powerpc/include/asm/ppc-opcode.h >>>> @@ -111,6 +111,11 @@ >>>> #define OP_31_XOP_LHBRX 790 >>>> #define OP_31_XOP_STHBRX 918 >>>> +/* KVMPPC_INST_BOOK3S_DEBUG -- Software breakpoint Instruction >>>> + * Instruction mnemonic is ABS, primary opcode is 31 and extended >>>> opcode is 360. >>>> + */ >>>> +#define OP_31_XOP_ABS 360 >>>> + >>>> #define OP_LWZ 32 >>>> #define OP_LD 58 >>>> #define OP_LWZU 33 >>>> diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c >>>> index c254c27..b40fe5d 100644 >>>> --- a/arch/powerpc/kvm/book3s.c >>>> +++ b/arch/powerpc/kvm/book3s.c >>>> @@ -789,7 +789,8 @@ int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu >>>> *vcpu, >>>> int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, >>>> struct kvm_guest_debug *dbg) >>>> { >>>> - return -EINVAL; >>>> + vcpu->guest_debug = dbg->control; >>>> + return 0; >>>> } >>>> void kvmppc_decrementer_func(unsigned long data) >>>> diff --git a/arch/powerpc/kvm/book3s_hv.c >>>> b/arch/powerpc/kvm/book3s_hv.c >>>> index 7a12edb..402c1ec 100644 >>>> --- a/arch/powerpc/kvm/book3s_hv.c >>>> +++ b/arch/powerpc/kvm/book3s_hv.c >>>> @@ -725,8 +725,14 @@ static int kvmppc_handle_exit_hv(struct kvm_run >>>> *run, struct kvm_vcpu *vcpu, >>>> * we don't emulate any guest instructions at this stage. >>>> */ >>>> case BOOK3S_INTERRUPT_H_EMUL_ASSIST: >>>> + if (kvmppc_get_last_inst(vcpu) = KVMPPC_INST_BOOK3S_DEBUG ) { >>>> + run->exit_reason = KVM_EXIT_DEBUG; >>>> + run->debug.arch.address = kvmppc_get_pc(vcpu); >>>> + r = RESUME_HOST; >>> Phew - why can't we just go into the normal instruction emulator for >>> EMUL_ASSIST? >>> >> IIUC, using the emulation_assist_interrupt function (kernel/trap.c) ? > > I was more thinking of kvmppc_emulate_instruction() :). > This makes sense. Can use the same call for pr kvm also. awesome :) > > Alex > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from e23smtp03.au.ibm.com (e23smtp03.au.ibm.com [202.81.31.145]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id C75AB1A0016 for ; Fri, 4 Jul 2014 17:32:53 +1000 (EST) Received: from /spool/local by e23smtp03.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 4 Jul 2014 17:32:51 +1000 Received: from d23relay03.au.ibm.com (d23relay03.au.ibm.com [9.190.235.21]) by d23dlp03.au.ibm.com (Postfix) with ESMTP id E4686357805F for ; Fri, 4 Jul 2014 17:32:31 +1000 (EST) Received: from d23av02.au.ibm.com (d23av02.au.ibm.com [9.190.235.138]) by d23relay03.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id s647WFbN54394896 for ; Fri, 4 Jul 2014 17:32:15 +1000 Received: from d23av02.au.ibm.com (localhost [127.0.0.1]) by d23av02.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id s647WVfu021771 for ; Fri, 4 Jul 2014 17:32:31 +1000 Message-ID: <53B6588C.4090502@linux.vnet.ibm.com> Date: Fri, 04 Jul 2014 13:02:28 +0530 From: Madhavan Srinivasan MIME-Version: 1.0 To: Alexander Graf , benh@kernel.crashing.org, paulus@samba.org Subject: Re: [PATCH v2] powerpc/kvm: support to handle sw breakpoint References: <1404204062-19635-1-git-send-email-maddy@linux.vnet.ibm.com> <53B543C5.0@suse.de> <53B62EEE.7010804@linux.vnet.ibm.com> <53B64E4D.1010802@suse.de> In-Reply-To: <53B64E4D.1010802@suse.de> Content-Type: text/plain; charset=ISO-8859-1 Cc: linuxppc-dev@lists.ozlabs.org, kvm@vger.kernel.org, kvm-ppc@vger.kernel.org List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , On Friday 04 July 2014 12:18 PM, Alexander Graf wrote: > > On 04.07.14 06:34, Madhavan Srinivasan wrote: >> On Thursday 03 July 2014 05:21 PM, Alexander Graf wrote: >>> On 01.07.14 10:41, Madhavan Srinivasan wrote: >>>> This patch adds kernel side support for software breakpoint. >>>> Design is that, by using an illegal instruction, we trap to hypervisor >>>> via Emulation Assistance interrupt, where we check for the illegal >>>> instruction >>>> and accordingly we return to Host or Guest. Patch also adds support for >>>> software breakpoint in PR KVM. >>>> >>>> Patch mandates use of "abs" instruction as sw breakpoint instruction >>>> (primary opcode 31 and extended opcode 360). Based on PowerISA v2.01, >>>> ABS instruction has been dropped from the architecture and treated an >>>> illegal instruction. >>>> >>>> Changes v1->v2: >>>> >>>> Moved the debug instruction #def to kvm_book3s.h. This way PR_KVM >>>> can also share it. >>>> Added code to use KVM get one reg infrastructure to get debug >>>> opcode. >>>> Updated emulate.c to include emulation of debug instruction incase >>>> of PR_KVM. >>>> Made changes to commit message. >>>> >>>> Signed-off-by: Madhavan Srinivasan >>>> --- >>>> arch/powerpc/include/asm/kvm_book3s.h | 8 ++++++++ >>>> arch/powerpc/include/asm/ppc-opcode.h | 5 +++++ >>>> arch/powerpc/kvm/book3s.c | 3 ++- >>>> arch/powerpc/kvm/book3s_hv.c | 9 +++++++++ >>>> arch/powerpc/kvm/book3s_pr.c | 3 +++ >>>> arch/powerpc/kvm/emulate.c | 10 ++++++++++ >>>> 6 files changed, 37 insertions(+), 1 deletion(-) >>>> >>>> diff --git a/arch/powerpc/include/asm/kvm_book3s.h >>>> b/arch/powerpc/include/asm/kvm_book3s.h >>>> index f52f656..180d549 100644 >>>> --- a/arch/powerpc/include/asm/kvm_book3s.h >>>> +++ b/arch/powerpc/include/asm/kvm_book3s.h >>>> @@ -24,6 +24,14 @@ >>>> #include >>>> #include >>>> +/* >>>> + * KVMPPC_INST_BOOK3S_DEBUG is debug Instruction for supporting >>>> Software Breakpoint. >>>> + * Instruction mnemonic is ABS, primary opcode is 31 and extended >>>> opcode is 360. >>>> + * Based on PowerISA v2.01, ABS instruction has been dropped from the >>>> architecture >>>> + * and treated an illegal instruction. >>>> + */ >>>> +#define KVMPPC_INST_BOOK3S_DEBUG 0x7c0002d0 >>> This will still break with LE guests. >>> >> I am told to try with all 0s opcode. So rewriting the patch. > > The problem with "all 0s" is that it's reasonably likely to occur on > real world code. Hence Segher was proposing something like 0x00dddd00 > which should be the same regardless of endianness, but has a certain > appeal of intentional placement ;). > Ok Sure. >> >>>> + >>>> struct kvmppc_bat { >>>> u64 raw; >>>> u32 bepi; >>>> diff --git a/arch/powerpc/include/asm/ppc-opcode.h >>>> b/arch/powerpc/include/asm/ppc-opcode.h >>>> index 3132bb9..3fbb4c1 100644 >>>> --- a/arch/powerpc/include/asm/ppc-opcode.h >>>> +++ b/arch/powerpc/include/asm/ppc-opcode.h >>>> @@ -111,6 +111,11 @@ >>>> #define OP_31_XOP_LHBRX 790 >>>> #define OP_31_XOP_STHBRX 918 >>>> +/* KVMPPC_INST_BOOK3S_DEBUG -- Software breakpoint Instruction >>>> + * Instruction mnemonic is ABS, primary opcode is 31 and extended >>>> opcode is 360. >>>> + */ >>>> +#define OP_31_XOP_ABS 360 >>>> + >>>> #define OP_LWZ 32 >>>> #define OP_LD 58 >>>> #define OP_LWZU 33 >>>> diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c >>>> index c254c27..b40fe5d 100644 >>>> --- a/arch/powerpc/kvm/book3s.c >>>> +++ b/arch/powerpc/kvm/book3s.c >>>> @@ -789,7 +789,8 @@ int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu >>>> *vcpu, >>>> int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, >>>> struct kvm_guest_debug *dbg) >>>> { >>>> - return -EINVAL; >>>> + vcpu->guest_debug = dbg->control; >>>> + return 0; >>>> } >>>> void kvmppc_decrementer_func(unsigned long data) >>>> diff --git a/arch/powerpc/kvm/book3s_hv.c >>>> b/arch/powerpc/kvm/book3s_hv.c >>>> index 7a12edb..402c1ec 100644 >>>> --- a/arch/powerpc/kvm/book3s_hv.c >>>> +++ b/arch/powerpc/kvm/book3s_hv.c >>>> @@ -725,8 +725,14 @@ static int kvmppc_handle_exit_hv(struct kvm_run >>>> *run, struct kvm_vcpu *vcpu, >>>> * we don't emulate any guest instructions at this stage. >>>> */ >>>> case BOOK3S_INTERRUPT_H_EMUL_ASSIST: >>>> + if (kvmppc_get_last_inst(vcpu) == KVMPPC_INST_BOOK3S_DEBUG ) { >>>> + run->exit_reason = KVM_EXIT_DEBUG; >>>> + run->debug.arch.address = kvmppc_get_pc(vcpu); >>>> + r = RESUME_HOST; >>> Phew - why can't we just go into the normal instruction emulator for >>> EMUL_ASSIST? >>> >> IIUC, using the emulation_assist_interrupt function (kernel/trap.c) ? > > I was more thinking of kvmppc_emulate_instruction() :). > This makes sense. Can use the same call for pr kvm also. awesome :) > > Alex > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Madhavan Srinivasan Subject: Re: [PATCH v2] powerpc/kvm: support to handle sw breakpoint Date: Fri, 04 Jul 2014 13:02:28 +0530 Message-ID: <53B6588C.4090502@linux.vnet.ibm.com> References: <1404204062-19635-1-git-send-email-maddy@linux.vnet.ibm.com> <53B543C5.0@suse.de> <53B62EEE.7010804@linux.vnet.ibm.com> <53B64E4D.1010802@suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Cc: linuxppc-dev@lists.ozlabs.org, kvm@vger.kernel.org, kvm-ppc@vger.kernel.org To: Alexander Graf , benh@kernel.crashing.org, paulus@samba.org Return-path: In-Reply-To: <53B64E4D.1010802@suse.de> 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 T24gRnJpZGF5IDA0IEp1bHkgMjAxNCAxMjoxOCBQTSwgQWxleGFuZGVyIEdyYWYgd3JvdGU6Cj4g Cj4gT24gMDQuMDcuMTQgMDY6MzQsIE1hZGhhdmFuIFNyaW5pdmFzYW4gd3JvdGU6Cj4+IE9uIFRo dXJzZGF5IDAzIEp1bHkgMjAxNCAwNToyMSBQTSwgQWxleGFuZGVyIEdyYWYgd3JvdGU6Cj4+PiBP biAwMS4wNy4xNCAxMDo0MSwgTWFkaGF2YW4gU3Jpbml2YXNhbiB3cm90ZToKPj4+PiBUaGlzIHBh dGNoIGFkZHMga2VybmVsIHNpZGUgc3VwcG9ydCBmb3Igc29mdHdhcmUgYnJlYWtwb2ludC4KPj4+ PiBEZXNpZ24gaXMgdGhhdCwgYnkgdXNpbmcgYW4gaWxsZWdhbCBpbnN0cnVjdGlvbiwgd2UgdHJh cCB0byBoeXBlcnZpc29yCj4+Pj4gdmlhIEVtdWxhdGlvbiBBc3Npc3RhbmNlIGludGVycnVwdCwg d2hlcmUgd2UgY2hlY2sgZm9yIHRoZSBpbGxlZ2FsCj4+Pj4gaW5zdHJ1Y3Rpb24KPj4+PiBhbmQg YWNjb3JkaW5nbHkgd2UgcmV0dXJuIHRvIEhvc3Qgb3IgR3Vlc3QuIFBhdGNoIGFsc28gYWRkcyBz dXBwb3J0IGZvcgo+Pj4+IHNvZnR3YXJlIGJyZWFrcG9pbnQgaW4gUFIgS1ZNLgo+Pj4+Cj4+Pj4g UGF0Y2ggbWFuZGF0ZXMgdXNlIG9mICJhYnMiIGluc3RydWN0aW9uIGFzIHN3IGJyZWFrcG9pbnQg aW5zdHJ1Y3Rpb24KPj4+PiAocHJpbWFyeSBvcGNvZGUgMzEgYW5kIGV4dGVuZGVkIG9wY29kZSAz NjApLiBCYXNlZCBvbiBQb3dlcklTQSB2Mi4wMSwKPj4+PiBBQlMgaW5zdHJ1Y3Rpb24gaGFzIGJl ZW4gZHJvcHBlZCBmcm9tIHRoZSBhcmNoaXRlY3R1cmUgYW5kIHRyZWF0ZWQgYW4KPj4+PiBpbGxl Z2FsIGluc3RydWN0aW9uLgo+Pj4+Cj4+Pj4gQ2hhbmdlcyB2MS0+djI6Cj4+Pj4KPj4+PiAgICBN b3ZlZCB0aGUgZGVidWcgaW5zdHJ1Y3Rpb24gI2RlZiB0byBrdm1fYm9vazNzLmguIFRoaXMgd2F5 IFBSX0tWTQo+Pj4+IGNhbiBhbHNvIHNoYXJlIGl0Lgo+Pj4+ICAgIEFkZGVkIGNvZGUgdG8gdXNl IEtWTSBnZXQgb25lIHJlZyBpbmZyYXN0cnVjdHVyZSB0byBnZXQgZGVidWcKPj4+PiBvcGNvZGUu Cj4+Pj4gICAgVXBkYXRlZCBlbXVsYXRlLmMgdG8gaW5jbHVkZSBlbXVsYXRpb24gb2YgZGVidWcg aW5zdHJ1Y3Rpb24gaW5jYXNlCj4+Pj4gb2YgUFJfS1ZNLgo+Pj4+ICAgIE1hZGUgY2hhbmdlcyB0 byBjb21taXQgbWVzc2FnZS4KPj4+Pgo+Pj4+IFNpZ25lZC1vZmYtYnk6IE1hZGhhdmFuIFNyaW5p dmFzYW4gPG1hZGR5QGxpbnV4LnZuZXQuaWJtLmNvbT4KPj4+PiAtLS0KPj4+PiAgICBhcmNoL3Bv d2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szcy5oIHwgICAgOCArKysrKysrKwo+Pj4+ICAgIGFy Y2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcGMtb3Bjb2RlLmggfCAgICA1ICsrKysrCj4+Pj4gICAg YXJjaC9wb3dlcnBjL2t2bS9ib29rM3MuYyAgICAgICAgICAgICB8ICAgIDMgKystCj4+Pj4gICAg YXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYyAgICAgICAgICB8ICAgIDkgKysrKysrKysrCj4+ Pj4gICAgYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfcHIuYyAgICAgICAgICB8ICAgIDMgKysrCj4+ Pj4gICAgYXJjaC9wb3dlcnBjL2t2bS9lbXVsYXRlLmMgICAgICAgICAgICB8ICAgMTAgKysrKysr KysrKwo+Pj4+ICAgIDYgZmlsZXMgY2hhbmdlZCwgMzcgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlv bigtKQo+Pj4+Cj4+Pj4gZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1f Ym9vazNzLmgKPj4+PiBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzLmgKPj4+ PiBpbmRleCBmNTJmNjU2Li4xODBkNTQ5IDEwMDY0NAo+Pj4+IC0tLSBhL2FyY2gvcG93ZXJwYy9p bmNsdWRlL2FzbS9rdm1fYm9vazNzLmgKPj4+PiArKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9h c20va3ZtX2Jvb2szcy5oCj4+Pj4gQEAgLTI0LDYgKzI0LDE0IEBACj4+Pj4gICAgI2luY2x1ZGUg PGxpbnV4L2t2bV9ob3N0Lmg+Cj4+Pj4gICAgI2luY2x1ZGUgPGFzbS9rdm1fYm9vazNzX2FzbS5o Pgo+Pj4+ICAgICsvKgo+Pj4+ICsgKiBLVk1QUENfSU5TVF9CT09LM1NfREVCVUcgaXMgZGVidWcg SW5zdHJ1Y3Rpb24gZm9yIHN1cHBvcnRpbmcKPj4+PiBTb2Z0d2FyZSBCcmVha3BvaW50Lgo+Pj4+ ICsgKiBJbnN0cnVjdGlvbiBtbmVtb25pYyBpcyBBQlMsIHByaW1hcnkgb3Bjb2RlIGlzIDMxIGFu ZCBleHRlbmRlZAo+Pj4+IG9wY29kZSBpcyAzNjAuCj4+Pj4gKyAqIEJhc2VkIG9uIFBvd2VySVNB IHYyLjAxLCBBQlMgaW5zdHJ1Y3Rpb24gaGFzIGJlZW4gZHJvcHBlZCBmcm9tIHRoZQo+Pj4+IGFy Y2hpdGVjdHVyZQo+Pj4+ICsgKiBhbmQgdHJlYXRlZCBhbiBpbGxlZ2FsIGluc3RydWN0aW9uLgo+ Pj4+ICsgKi8KPj4+PiArI2RlZmluZSBLVk1QUENfSU5TVF9CT09LM1NfREVCVUcgICAgMHg3YzAw MDJkMAo+Pj4gVGhpcyB3aWxsIHN0aWxsIGJyZWFrIHdpdGggTEUgZ3Vlc3RzLgo+Pj4KPj4gSSBh bSB0b2xkIHRvIHRyeSB3aXRoIGFsbCAwcyBvcGNvZGUuIFNvIHJld3JpdGluZyB0aGUgcGF0Y2gu Cj4gCj4gVGhlIHByb2JsZW0gd2l0aCAiYWxsIDBzIiBpcyB0aGF0IGl0J3MgcmVhc29uYWJseSBs aWtlbHkgdG8gb2NjdXIgb24KPiByZWFsIHdvcmxkIGNvZGUuIEhlbmNlIFNlZ2hlciB3YXMgcHJv cG9zaW5nIHNvbWV0aGluZyBsaWtlIDB4MDBkZGRkMDAKPiB3aGljaCBzaG91bGQgYmUgdGhlIHNh bWUgcmVnYXJkbGVzcyBvZiBlbmRpYW5uZXNzLCBidXQgaGFzIGEgY2VydGFpbgo+IGFwcGVhbCBv ZiBpbnRlbnRpb25hbCBwbGFjZW1lbnQgOykuCj4gCgpPayBTdXJlLgoKPj4KPj4+PiArCj4+Pj4g ICAgc3RydWN0IGt2bXBwY19iYXQgewo+Pj4+ICAgICAgICB1NjQgcmF3Owo+Pj4+ICAgICAgICB1 MzIgYmVwaTsKPj4+PiBkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BwYy1v cGNvZGUuaAo+Pj4+IGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BwYy1vcGNvZGUuaAo+Pj4+ IGluZGV4IDMxMzJiYjkuLjNmYmI0YzEgMTAwNjQ0Cj4+Pj4gLS0tIGEvYXJjaC9wb3dlcnBjL2lu Y2x1ZGUvYXNtL3BwYy1vcGNvZGUuaAo+Pj4+ICsrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2Fz bS9wcGMtb3Bjb2RlLmgKPj4+PiBAQCAtMTExLDYgKzExMSwxMSBAQAo+Pj4+ICAgICNkZWZpbmUg T1BfMzFfWE9QX0xIQlJYICAgICA3OTAKPj4+PiAgICAjZGVmaW5lIE9QXzMxX1hPUF9TVEhCUlgg ICAgOTE4Cj4+Pj4gICAgKy8qIEtWTVBQQ19JTlNUX0JPT0szU19ERUJVRyAtLSBTb2Z0d2FyZSBi cmVha3BvaW50IEluc3RydWN0aW9uCj4+Pj4gKyAqIEluc3RydWN0aW9uIG1uZW1vbmljIGlzIEFC UywgcHJpbWFyeSBvcGNvZGUgaXMgMzEgYW5kIGV4dGVuZGVkCj4+Pj4gb3Bjb2RlIGlzIDM2MC4K Pj4+PiArICovCj4+Pj4gKyNkZWZpbmUgT1BfMzFfWE9QX0FCUyAgICAgICAgMzYwCj4+Pj4gKwo+ Pj4+ICAgICNkZWZpbmUgT1BfTFdaICAzMgo+Pj4+ICAgICNkZWZpbmUgT1BfTEQgICA1OAo+Pj4+ ICAgICNkZWZpbmUgT1BfTFdaVSAzMwo+Pj4+IGRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3Zt L2Jvb2szcy5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3MuYwo+Pj4+IGluZGV4IGMyNTRjMjcu LmI0MGZlNWQgMTAwNjQ0Cj4+Pj4gLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3MuYwo+Pj4+ ICsrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzLmMKPj4+PiBAQCAtNzg5LDcgKzc4OSw4IEBA IGludCBrdm1fYXJjaF92Y3B1X2lvY3RsX3RyYW5zbGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUKPj4+PiAq dmNwdSwKPj4+PiAgICBpbnQga3ZtX2FyY2hfdmNwdV9pb2N0bF9zZXRfZ3Vlc3RfZGVidWcoc3Ry dWN0IGt2bV92Y3B1ICp2Y3B1LAo+Pj4+ICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGt2 bV9ndWVzdF9kZWJ1ZyAqZGJnKQo+Pj4+ICAgIHsKPj4+PiAtICAgIHJldHVybiAtRUlOVkFMOwo+ Pj4+ICsgICAgdmNwdS0+Z3Vlc3RfZGVidWcgPSBkYmctPmNvbnRyb2w7Cj4+Pj4gKyAgICByZXR1 cm4gMDsKPj4+PiAgICB9Cj4+Pj4gICAgICB2b2lkIGt2bXBwY19kZWNyZW1lbnRlcl9mdW5jKHVu c2lnbmVkIGxvbmcgZGF0YSkKPj4+PiBkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29r M3NfaHYuYwo+Pj4+IGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYwo+Pj4+IGluZGV4IDdh MTJlZGIuLjQwMmMxZWMgMTAwNjQ0Cj4+Pj4gLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3Nf aHYuYwo+Pj4+ICsrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2LmMKPj4+PiBAQCAtNzI1 LDggKzcyNSwxNCBAQCBzdGF0aWMgaW50IGt2bXBwY19oYW5kbGVfZXhpdF9odihzdHJ1Y3Qga3Zt X3J1bgo+Pj4+ICpydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKPj4+PiAgICAgICAgICogd2Ug ZG9uJ3QgZW11bGF0ZSBhbnkgZ3Vlc3QgaW5zdHJ1Y3Rpb25zIGF0IHRoaXMgc3RhZ2UuCj4+Pj4g ICAgICAgICAqLwo+Pj4+ICAgICAgICBjYXNlIEJPT0szU19JTlRFUlJVUFRfSF9FTVVMX0FTU0lT VDoKPj4+PiArICAgIGlmIChrdm1wcGNfZ2V0X2xhc3RfaW5zdCh2Y3B1KSA9PSBLVk1QUENfSU5T VF9CT09LM1NfREVCVUcgKSB7Cj4+Pj4gKyAgICAgICAgcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9F WElUX0RFQlVHOwo+Pj4+ICsgICAgICAgIHJ1bi0+ZGVidWcuYXJjaC5hZGRyZXNzID0ga3ZtcHBj X2dldF9wYyh2Y3B1KTsKPj4+PiArICAgICAgICByID0gUkVTVU1FX0hPU1Q7Cj4+PiBQaGV3IC0g d2h5IGNhbid0IHdlIGp1c3QgZ28gaW50byB0aGUgbm9ybWFsIGluc3RydWN0aW9uIGVtdWxhdG9y IGZvcgo+Pj4gRU1VTF9BU1NJU1Q/Cj4+Pgo+PiBJSVVDLCB1c2luZyB0aGUgZW11bGF0aW9uX2Fz c2lzdF9pbnRlcnJ1cHQgZnVuY3Rpb24gKGtlcm5lbC90cmFwLmMpID8KPiAKPiBJIHdhcyBtb3Jl IHRoaW5raW5nIG9mIGt2bXBwY19lbXVsYXRlX2luc3RydWN0aW9uKCkgOikuCj4gCgpUaGlzIG1h a2VzIHNlbnNlLiBDYW4gdXNlIHRoZSBzYW1lIGNhbGwgZm9yIHByIGt2bSBhbHNvLiBhd2Vzb21l IDopCgo+IAo+IEFsZXgKPiAKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fCkxpbnV4cHBjLWRldiBtYWlsaW5nIGxpc3QKTGludXhwcGMtZGV2QGxpc3RzLm96 bGFicy5vcmcKaHR0cHM6Ly9saXN0cy5vemxhYnMub3JnL2xpc3RpbmZvL2xpbnV4cHBjLWRldg==