From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.3 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 91EF5C433FF for ; Tue, 30 Jul 2019 12:12:37 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 610D52087F for ; Tue, 30 Jul 2019 12:12:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728820AbfG3MMg (ORCPT ); Tue, 30 Jul 2019 08:12:36 -0400 Received: from mail-wr1-f65.google.com ([209.85.221.65]:37357 "EHLO mail-wr1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726557AbfG3MMf (ORCPT ); Tue, 30 Jul 2019 08:12:35 -0400 Received: by mail-wr1-f65.google.com with SMTP id n9so40431165wrr.4 for ; Tue, 30 Jul 2019 05:12:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:openpgp:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=HhV8xTaSmerML9zVZ7qS6UxHrCqZLDARfYvjhVb7WHE=; b=FJKHo5m5gRJi1175JXUzLw1YgvyyDGX95fa7KwAJFuN5g+fXJ2Bv1gX5x0JgCDU4z/ uYWRAx3tkpxG3AXYHHxPAI8KAJ1YqUOwlxHd0au+tup1re2vy1fq3GE6ukG2XZSK7flG YBTtNJo+W7CvhiK9P+b/wYbYBSaFP0hzHtXn2b3jfx42s7jbQICs3+EyS+JE7TeHbvj8 bhTz42uRNnS5z6WEprHvzxYbEoAtaUT6a9wy8kJ5BpgvV1NW5Ia8EIzKci4K191d0Rqz MBcGClWF6Qs9kYhvvviB5l1c6yL9hYV2Q6E/e9Nmduex/iZxeMpxfjSXeqcbcbe7vjEw f92g== X-Gm-Message-State: APjAAAXrPVGNOo6Fkx2jE//NbnwJAhLlH2TE2GphQDBNV2nrfNGoLj1r 9hTZvQKtfpSAGyrruJe4WQpbYstjMHc= X-Google-Smtp-Source: APXvYqzLXsF6w2xUhox2ex1h6rvuDdDtF/ILVJYVETLp5rg3aTjB58ta3pfCc+xmAu/XbDqGhN+TTA== X-Received: by 2002:adf:8183:: with SMTP id 3mr128267214wra.181.1564488752845; Tue, 30 Jul 2019 05:12:32 -0700 (PDT) Received: from ?IPv6:2001:b07:6468:f312:29d3:6123:6d5f:2c04? ([2001:b07:6468:f312:29d3:6123:6d5f:2c04]) by smtp.gmail.com with ESMTPSA id a8sm51199553wma.31.2019.07.30.05.12.31 (version=TLS1_3 cipher=AEAD-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 05:12:32 -0700 (PDT) Subject: Re: [RFC PATCH 05/16] RISC-V: KVM: Implement VCPU interrupts and requests handling To: Anup Patel Cc: Anup Patel , Palmer Dabbelt , Paul Walmsley , Radim K , Daniel Lezcano , Thomas Gleixner , Atish Patra , Alistair Francis , Damien Le Moal , Christoph Hellwig , "kvm@vger.kernel.org" , "linux-riscv@lists.infradead.org" , "linux-kernel@vger.kernel.org" References: <20190729115544.17895-1-anup.patel@wdc.com> <20190729115544.17895-6-anup.patel@wdc.com> <9f9d09e5-49bc-f8e3-cfe1-bd5221e3b683@redhat.com> From: Paolo Bonzini Openpgp: preference=signencrypt Message-ID: <66c4e468-7a69-31e7-778b-228908f0e737@redhat.com> Date: Tue, 30 Jul 2019 14:12:15 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 30/07/19 14:00, Anup Patel wrote: > On Tue, Jul 30, 2019 at 4:47 PM Paolo Bonzini wrote: >> >> First, something that is not clear to me: how do you deal with a guest >> writing 1 to VSIP.SSIP? I think that could lead to lost interrupts if >> you have the following sequence >> >> 1) guest writes 1 to VSIP.SSIP >> >> 2) guest leaves VS-mode >> >> 3) host syncs VSIP >> >> 4) user mode triggers interrupt >> >> 5) host reenters guest >> >> 6) host moves irqs_pending to VSIP and clears VSIP.SSIP in the process > > This reasoning also apply to M-mode firmware (OpenSBI) providing timer > and IPI services to HS-mode software. We had some discussion around > it in a different context. > (Refer, https://github.com/riscv/opensbi/issues/128) > > The thing is SIP CSR is supposed to be read-only for any S-mode SW. This > means HS-mode/VS-mode SW modifications to SIP CSR should have no > effect. Is it? The privileged specification says Interprocessor interrupts are sent to other harts by implementation- specific means, which will ultimately cause the SSIP bit to be set in the recipient hart’s sip register. All bits besides SSIP in the sip register are read-only. Meaning that sending an IPI to self by writing 1 to sip.SSIP is well-defined. The same should be true of vsip.SSIP while in VS mode. > Do you still an issue here? Do you see any issues in the pseudocode I sent? It gets away with the spinlock and request so it may be a good idea anyway. :) Paolo > Regards, > Anup > >> >> Perhaps irqs_pending needs to be split in two fields, irqs_pending and >> irqs_pending_mask, and then you can do this: >> >> /* >> * irqs_pending and irqs_pending_mask have multiple-producer/single- >> * consumer semantics; therefore bits can be set in the mask without >> * a lock, but clearing the bits requires vcpu_lock. Furthermore, >> * consumers should never write to irqs_pending, and should not >> * use bits of irqs_pending that weren't 1 in the mask. >> */ >> >> int kvm_riscv_vcpu_set_interrupt(struct kvm_vcpu *vcpu, unsigned int irq) >> { >> ... >> set_bit(irq, &vcpu->arch.irqs_pending); >> smp_mb__before_atomic(); >> set_bit(irq, &vcpu->arch.irqs_pending_mask); >> kvm_vcpu_kick(vcpu); >> } >> >> int kvm_riscv_vcpu_unset_interrupt(struct kvm_vcpu *vcpu, unsigned int irq) >> { >> ... >> clear_bit(irq, &vcpu->arch.irqs_pending); >> smp_mb__before_atomic(); >> set_bit(irq, &vcpu->arch.irqs_pending_mask); >> } >> >> static void kvm_riscv_reset_vcpu(struct kvm_vcpu *vcpu) >> { >> ... >> WRITE_ONCE(vcpu->arch.irqs_pending_mask, 0); >> } >> >> and kvm_riscv_vcpu_flush_interrupts can leave aside VSIP bits that >> aren't in vcpu->arch.irqs_pending_mask: >> >> if (atomic_read(&vcpu->arch.irqs_pending_mask)) { >> u32 mask, val; >> >> mask = xchg_acquire(&vcpu->arch.irqs_pending_mask, 0); >> val = READ_ONCE(vcpu->arch.irqs_pending) & mask; >> >> vcpu->arch.guest_csr.vsip &= ~mask; >> vcpu->arch.guest_csr.vsip |= val; >> csr_write(CSR_VSIP, vsip); >> } >> >> Also, the getter of CSR_VSIP should call >> kvm_riscv_vcpu_flush_interrupts, while the setter should clear >> irqs_pending_mask. >> >> On 29/07/19 13:56, Anup Patel wrote: >>> + kvm_make_request(KVM_REQ_IRQ_PENDING, vcpu); >>> + kvm_vcpu_kick(vcpu); >> >> The request is not needed as long as kvm_riscv_vcpu_flush_interrupts is >> called *after* smp_store_mb(vcpu->mode, IN_GUEST_MODE) in >> kvm_arch_vcpu_ioctl_run. This is the "request-less vCPU kick" pattern >> in Documentation/virtual/kvm/vcpu-requests.rst. The smp_store_mb then >> orders the write of IN_GUEST_MODE before the read of irqs_pending (or >> irqs_pending_mask in my proposal above); in the producers, there is a >> dual memory barrier in kvm_vcpu_exiting_guest_mode(), ordering the write >> of irqs_pending(_mask) before the read of vcpu->mode. >> >> Similar to other VS* CSRs, I'd rather have a ONE_REG interface for VSIE >> and VSIP from the beginning as well. Note that the VSIP setter would >> clear irqs_pending_mask, while the getter would call >> kvm_riscv_vcpu_flush_interrupts before reading. It's up to userspace to >> ensure that no interrupt injections happen between the calls to the >> getter and the setter. >> >> Paolo >> >>> + csr_write(CSR_VSIP, vcpu->arch.irqs_pending); >>> + vcpu->arch.guest_csr.vsip = vcpu->arch.irqs_pending; >>> + } >> From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E58BFC0650F for ; Tue, 30 Jul 2019 12:12:38 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id BAE362089E for ; Tue, 30 Jul 2019 12:12:38 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="aJT0gsEK" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BAE362089E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+infradead-linux-riscv=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date: Message-ID:From:References:To:Subject:Reply-To:Content-ID:Content-Description :Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=+Cgo8EhFQ3Cf3rXbpDYzLr2cijX9w+Ke/ONOG21xKks=; b=aJT0gsEKuxHdqA esRpr1JqespJsWf0o7Zis2TCFqa7Oyrnmt7JI4Fm4tshVKpDOAxJJvXvCapzZiDG8S9JBxa636UGe zOLkrHng+Db1OTBV1W25d/M7Y2pdZSHZY4d1UXytMRAFbpmwT2esiIXjzfzig/Bq/eMh3KI2EjnO9 15wG7QhFq/WWJve9VeK+dE4BSaNdyrriS3Z+tMA62m6G4QPakFRsL3D9cZ5mOPsMEpszemcml0L9H pxTBpzHL4q1wLPSkV71IcKP/c1S2APv616vN3LAG96pgRf6KcLo1VRIseIaXQuR3mRRmhZszfbxmH 5KAQ1DNpizvHY0N4ZzIQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1hsQzd-00047C-Kk; Tue, 30 Jul 2019 12:12:37 +0000 Received: from mail-wr1-f66.google.com ([209.85.221.66]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1hsQza-00046f-FV for linux-riscv@lists.infradead.org; Tue, 30 Jul 2019 12:12:36 +0000 Received: by mail-wr1-f66.google.com with SMTP id p17so65491795wrf.11 for ; Tue, 30 Jul 2019 05:12:34 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:openpgp:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=HhV8xTaSmerML9zVZ7qS6UxHrCqZLDARfYvjhVb7WHE=; b=Ouh7pSMEyGSV7jSOYQW02FoqlAhka7ELZvs7ChbDd93qRjsZPVSV46ySRjllT8m7Ck 8UCm/JSjie7WsX4r6NNNRoiDv5Adqv5MRPhFYmtwB2DIHp+tmFtoJvOOWNFCbHCZgylG qmKyheqAiXqbSZa61tSSZ2N9OccIPxp1dW02bzzT8UGD5qq3CTSruDvHHHiMXHrZ+txa 42RC96JrODmG824/KNQ3PmtV0Ku8KkW+Y3PNQ/E/pnBXx/DyvTL/KG+9eeizOCK0qK/g 5X1GVNQy4DvU8uLJ/Q7Zfu4YMs/sGqwK8O1NESvoFv2MC3nLgVnA9dqhlSdCRSO0u1ej Fkuw== X-Gm-Message-State: APjAAAV3KDYv9n4G1n61bQQNCGl62bnfNMJLkmi+mPFa7+qjNxN/ZCte GI+ygkP0b9fS7XRUJT3IPzYM/w== X-Google-Smtp-Source: APXvYqzLXsF6w2xUhox2ex1h6rvuDdDtF/ILVJYVETLp5rg3aTjB58ta3pfCc+xmAu/XbDqGhN+TTA== X-Received: by 2002:adf:8183:: with SMTP id 3mr128267214wra.181.1564488752845; Tue, 30 Jul 2019 05:12:32 -0700 (PDT) Received: from ?IPv6:2001:b07:6468:f312:29d3:6123:6d5f:2c04? ([2001:b07:6468:f312:29d3:6123:6d5f:2c04]) by smtp.gmail.com with ESMTPSA id a8sm51199553wma.31.2019.07.30.05.12.31 (version=TLS1_3 cipher=AEAD-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jul 2019 05:12:32 -0700 (PDT) Subject: Re: [RFC PATCH 05/16] RISC-V: KVM: Implement VCPU interrupts and requests handling To: Anup Patel References: <20190729115544.17895-1-anup.patel@wdc.com> <20190729115544.17895-6-anup.patel@wdc.com> <9f9d09e5-49bc-f8e3-cfe1-bd5221e3b683@redhat.com> From: Paolo Bonzini Openpgp: preference=signencrypt Message-ID: <66c4e468-7a69-31e7-778b-228908f0e737@redhat.com> Date: Tue, 30 Jul 2019 14:12:15 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190730_051234_516291_9B81699A X-CRM114-Status: GOOD ( 19.00 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Damien Le Moal , Palmer Dabbelt , Daniel Lezcano , "kvm@vger.kernel.org" , Radim K , Anup Patel , "linux-kernel@vger.kernel.org" , Christoph Hellwig , Atish Patra , Alistair Francis , Paul Walmsley , Thomas Gleixner , "linux-riscv@lists.infradead.org" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+infradead-linux-riscv=archiver.kernel.org@lists.infradead.org T24gMzAvMDcvMTkgMTQ6MDAsIEFudXAgUGF0ZWwgd3JvdGU6Cj4gT24gVHVlLCBKdWwgMzAsIDIw MTkgYXQgNDo0NyBQTSBQYW9sbyBCb256aW5pIDxwYm9uemluaUByZWRoYXQuY29tPiB3cm90ZToK Pj4KPj4gRmlyc3QsIHNvbWV0aGluZyB0aGF0IGlzIG5vdCBjbGVhciB0byBtZTogaG93IGRvIHlv dSBkZWFsIHdpdGggYSBndWVzdAo+PiB3cml0aW5nIDEgdG8gVlNJUC5TU0lQPyAgSSB0aGluayB0 aGF0IGNvdWxkIGxlYWQgdG8gbG9zdCBpbnRlcnJ1cHRzIGlmCj4+IHlvdSBoYXZlIHRoZSBmb2xs b3dpbmcgc2VxdWVuY2UKPj4KPj4gMSkgZ3Vlc3Qgd3JpdGVzIDEgdG8gVlNJUC5TU0lQCj4+Cj4+ IDIpIGd1ZXN0IGxlYXZlcyBWUy1tb2RlCj4+Cj4+IDMpIGhvc3Qgc3luY3MgVlNJUAo+Pgo+PiA0 KSB1c2VyIG1vZGUgdHJpZ2dlcnMgaW50ZXJydXB0Cj4+Cj4+IDUpIGhvc3QgcmVlbnRlcnMgZ3Vl c3QKPj4KPj4gNikgaG9zdCBtb3ZlcyBpcnFzX3BlbmRpbmcgdG8gVlNJUCBhbmQgY2xlYXJzIFZT SVAuU1NJUCBpbiB0aGUgcHJvY2Vzcwo+IAo+IFRoaXMgcmVhc29uaW5nIGFsc28gYXBwbHkgdG8g TS1tb2RlIGZpcm13YXJlIChPcGVuU0JJKSBwcm92aWRpbmcgdGltZXIKPiBhbmQgSVBJIHNlcnZp Y2VzIHRvIEhTLW1vZGUgc29mdHdhcmUuIFdlIGhhZCBzb21lIGRpc2N1c3Npb24gYXJvdW5kCj4g aXQgaW4gYSBkaWZmZXJlbnQgY29udGV4dC4KPiAoUmVmZXIsIGh0dHBzOi8vZ2l0aHViLmNvbS9y aXNjdi9vcGVuc2JpL2lzc3Vlcy8xMjgpCj4gCj4gVGhlIHRoaW5nIGlzIFNJUCBDU1IgaXMgc3Vw cG9zZWQgdG8gYmUgcmVhZC1vbmx5IGZvciBhbnkgUy1tb2RlIFNXLiBUaGlzCj4gbWVhbnMgSFMt bW9kZS9WUy1tb2RlIFNXIG1vZGlmaWNhdGlvbnMgdG8gU0lQIENTUiBzaG91bGQgaGF2ZSBubwo+ IGVmZmVjdC4KCklzIGl0PyAgVGhlIHByaXZpbGVnZWQgc3BlY2lmaWNhdGlvbiBzYXlzCgogIElu dGVycHJvY2Vzc29yIGludGVycnVwdHMgYXJlIHNlbnQgdG8gb3RoZXIgaGFydHMgYnkgaW1wbGVt ZW50YXRpb24tCiAgc3BlY2lmaWMgbWVhbnMsIHdoaWNoIHdpbGwgdWx0aW1hdGVseSBjYXVzZSB0 aGUgU1NJUCBiaXQgdG8gYmUgc2V0IGluCiAgdGhlIHJlY2lwaWVudCBoYXJ04oCZcyBzaXAgcmVn aXN0ZXIuCgogIEFsbCBiaXRzIGJlc2lkZXMgU1NJUCBpbiB0aGUgc2lwIHJlZ2lzdGVyIGFyZSBy ZWFkLW9ubHkuCgpNZWFuaW5nIHRoYXQgc2VuZGluZyBhbiBJUEkgdG8gc2VsZiBieSB3cml0aW5n IDEgdG8gc2lwLlNTSVAgaXMKd2VsbC1kZWZpbmVkLiAgVGhlIHNhbWUgc2hvdWxkIGJlIHRydWUg b2YgdnNpcC5TU0lQIHdoaWxlIGluIFZTIG1vZGUuCgo+IERvIHlvdSBzdGlsbCBhbiBpc3N1ZSBo ZXJlPwoKRG8geW91IHNlZSBhbnkgaXNzdWVzIGluIHRoZSBwc2V1ZG9jb2RlIEkgc2VudD8gIEl0 IGdldHMgYXdheSB3aXRoIHRoZQpzcGlubG9jayBhbmQgcmVxdWVzdCBzbyBpdCBtYXkgYmUgYSBn b29kIGlkZWEgYW55d2F5LiA6KQoKUGFvbG8KCj4gUmVnYXJkcywKPiBBbnVwCj4gCj4+Cj4+IFBl cmhhcHMgaXJxc19wZW5kaW5nIG5lZWRzIHRvIGJlIHNwbGl0IGluIHR3byBmaWVsZHMsIGlycXNf cGVuZGluZyBhbmQKPj4gaXJxc19wZW5kaW5nX21hc2ssIGFuZCB0aGVuIHlvdSBjYW4gZG8gdGhp czoKPj4KPj4gLyoKPj4gICogaXJxc19wZW5kaW5nIGFuZCBpcnFzX3BlbmRpbmdfbWFzayBoYXZl IG11bHRpcGxlLXByb2R1Y2VyL3NpbmdsZS0KPj4gICogY29uc3VtZXIgc2VtYW50aWNzOyB0aGVy ZWZvcmUgYml0cyBjYW4gYmUgc2V0IGluIHRoZSBtYXNrIHdpdGhvdXQKPj4gICogYSBsb2NrLCBi dXQgY2xlYXJpbmcgdGhlIGJpdHMgcmVxdWlyZXMgdmNwdV9sb2NrLiAgRnVydGhlcm1vcmUsCj4+ ICAqIGNvbnN1bWVycyBzaG91bGQgbmV2ZXIgd3JpdGUgdG8gaXJxc19wZW5kaW5nLCBhbmQgc2hv dWxkIG5vdAo+PiAgKiB1c2UgYml0cyBvZiBpcnFzX3BlbmRpbmcgdGhhdCB3ZXJlbid0IDEgaW4g dGhlIG1hc2suCj4+ICAqLwo+Pgo+PiBpbnQga3ZtX3Jpc2N2X3ZjcHVfc2V0X2ludGVycnVwdChz dHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGludCBpcnEpCj4+IHsKPj4gICAgICAgICAu Li4KPj4gICAgICAgICBzZXRfYml0KGlycSwgJnZjcHUtPmFyY2guaXJxc19wZW5kaW5nKTsKPj4g ICAgICAgICBzbXBfbWJfX2JlZm9yZV9hdG9taWMoKTsKPj4gICAgICAgICBzZXRfYml0KGlycSwg JnZjcHUtPmFyY2guaXJxc19wZW5kaW5nX21hc2spOwo+PiAgICAgICAgIGt2bV92Y3B1X2tpY2so dmNwdSk7Cj4+IH0KPj4KPj4gaW50IGt2bV9yaXNjdl92Y3B1X3Vuc2V0X2ludGVycnVwdChzdHJ1 Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGludCBpcnEpCj4+IHsKPj4gICAgICAgICAuLi4K Pj4gICAgICAgICBjbGVhcl9iaXQoaXJxLCAmdmNwdS0+YXJjaC5pcnFzX3BlbmRpbmcpOwo+PiAg ICAgICAgIHNtcF9tYl9fYmVmb3JlX2F0b21pYygpOwo+PiAgICAgICAgIHNldF9iaXQoaXJxLCAm dmNwdS0+YXJjaC5pcnFzX3BlbmRpbmdfbWFzayk7Cj4+IH0KPj4KPj4gc3RhdGljIHZvaWQga3Zt X3Jpc2N2X3Jlc2V0X3ZjcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQo+PiB7Cj4+ICAgICAgICAg Li4uCj4+ICAgICAgICAgV1JJVEVfT05DRSh2Y3B1LT5hcmNoLmlycXNfcGVuZGluZ19tYXNrLCAw KTsKPj4gfQo+Pgo+PiBhbmQga3ZtX3Jpc2N2X3ZjcHVfZmx1c2hfaW50ZXJydXB0cyBjYW4gbGVh dmUgYXNpZGUgVlNJUCBiaXRzIHRoYXQKPj4gYXJlbid0IGluIHZjcHUtPmFyY2guaXJxc19wZW5k aW5nX21hc2s6Cj4+Cj4+ICAgICAgICAgaWYgKGF0b21pY19yZWFkKCZ2Y3B1LT5hcmNoLmlycXNf cGVuZGluZ19tYXNrKSkgewo+PiAgICAgICAgICAgICAgICAgdTMyIG1hc2ssIHZhbDsKPj4KPj4g ICAgICAgICAgICAgICAgIG1hc2sgPSB4Y2hnX2FjcXVpcmUoJnZjcHUtPmFyY2guaXJxc19wZW5k aW5nX21hc2ssIDApOwo+PiAgICAgICAgICAgICAgICAgdmFsID0gUkVBRF9PTkNFKHZjcHUtPmFy Y2guaXJxc19wZW5kaW5nKSAmIG1hc2s7Cj4+Cj4+ICAgICAgICAgICAgICAgICB2Y3B1LT5hcmNo Lmd1ZXN0X2Nzci52c2lwICY9IH5tYXNrOwo+PiAgICAgICAgICAgICAgICAgdmNwdS0+YXJjaC5n dWVzdF9jc3IudnNpcCB8PSB2YWw7Cj4+ICAgICAgICAgICAgICAgICBjc3Jfd3JpdGUoQ1NSX1ZT SVAsIHZzaXApOwo+PiAgICAgICAgIH0KPj4KPj4gQWxzbywgdGhlIGdldHRlciBvZiBDU1JfVlNJ UCBzaG91bGQgY2FsbAo+PiBrdm1fcmlzY3ZfdmNwdV9mbHVzaF9pbnRlcnJ1cHRzLCB3aGlsZSB0 aGUgc2V0dGVyIHNob3VsZCBjbGVhcgo+PiBpcnFzX3BlbmRpbmdfbWFzay4KPj4KPj4gT24gMjkv MDcvMTkgMTM6NTYsIEFudXAgUGF0ZWwgd3JvdGU6Cj4+PiArICAgICBrdm1fbWFrZV9yZXF1ZXN0 KEtWTV9SRVFfSVJRX1BFTkRJTkcsIHZjcHUpOwo+Pj4gKyAgICAga3ZtX3ZjcHVfa2ljayh2Y3B1 KTsKPj4KPj4gVGhlIHJlcXVlc3QgaXMgbm90IG5lZWRlZCBhcyBsb25nIGFzIGt2bV9yaXNjdl92 Y3B1X2ZsdXNoX2ludGVycnVwdHMgaXMKPj4gY2FsbGVkICphZnRlciogc21wX3N0b3JlX21iKHZj cHUtPm1vZGUsIElOX0dVRVNUX01PREUpIGluCj4+IGt2bV9hcmNoX3ZjcHVfaW9jdGxfcnVuLiAg VGhpcyBpcyB0aGUgInJlcXVlc3QtbGVzcyB2Q1BVIGtpY2siIHBhdHRlcm4KPj4gaW4gRG9jdW1l bnRhdGlvbi92aXJ0dWFsL2t2bS92Y3B1LXJlcXVlc3RzLnJzdC4gIFRoZSBzbXBfc3RvcmVfbWIg dGhlbgo+PiBvcmRlcnMgdGhlIHdyaXRlIG9mIElOX0dVRVNUX01PREUgYmVmb3JlIHRoZSByZWFk IG9mIGlycXNfcGVuZGluZyAob3IKPj4gaXJxc19wZW5kaW5nX21hc2sgaW4gbXkgcHJvcG9zYWwg YWJvdmUpOyBpbiB0aGUgcHJvZHVjZXJzLCB0aGVyZSBpcyBhCj4+IGR1YWwgbWVtb3J5IGJhcnJp ZXIgaW4ga3ZtX3ZjcHVfZXhpdGluZ19ndWVzdF9tb2RlKCksIG9yZGVyaW5nIHRoZSB3cml0ZQo+ PiBvZiBpcnFzX3BlbmRpbmcoX21hc2spIGJlZm9yZSB0aGUgcmVhZCBvZiB2Y3B1LT5tb2RlLgo+ Pgo+PiBTaW1pbGFyIHRvIG90aGVyIFZTKiBDU1JzLCBJJ2QgcmF0aGVyIGhhdmUgYSBPTkVfUkVH IGludGVyZmFjZSBmb3IgVlNJRQo+PiBhbmQgVlNJUCBmcm9tIHRoZSBiZWdpbm5pbmcgYXMgd2Vs bC4gIE5vdGUgdGhhdCB0aGUgVlNJUCBzZXR0ZXIgd291bGQKPj4gY2xlYXIgaXJxc19wZW5kaW5n X21hc2ssIHdoaWxlIHRoZSBnZXR0ZXIgd291bGQgY2FsbAo+PiBrdm1fcmlzY3ZfdmNwdV9mbHVz aF9pbnRlcnJ1cHRzIGJlZm9yZSByZWFkaW5nLiAgSXQncyB1cCB0byB1c2Vyc3BhY2UgdG8KPj4g ZW5zdXJlIHRoYXQgbm8gaW50ZXJydXB0IGluamVjdGlvbnMgaGFwcGVuIGJldHdlZW4gdGhlIGNh bGxzIHRvIHRoZQo+PiBnZXR0ZXIgYW5kIHRoZSBzZXR0ZXIuCj4+Cj4+IFBhb2xvCj4+Cj4+PiAr ICAgICAgICAgICAgIGNzcl93cml0ZShDU1JfVlNJUCwgdmNwdS0+YXJjaC5pcnFzX3BlbmRpbmcp Owo+Pj4gKyAgICAgICAgICAgICB2Y3B1LT5hcmNoLmd1ZXN0X2Nzci52c2lwID0gdmNwdS0+YXJj aC5pcnFzX3BlbmRpbmc7Cj4+PiArICAgICB9Cj4+CgoKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KbGludXgtcmlzY3YgbWFpbGluZyBsaXN0CmxpbnV4LXJp c2N2QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1h bi9saXN0aW5mby9saW51eC1yaXNjdgo=