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=-8.1 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,HK_RANDOM_FROM,HK_RANDOM_REPLYTO,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS 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 6B585C433E8 for ; Mon, 27 Jul 2020 23:42:31 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 40DAD20786 for ; Mon, 27 Jul 2020 23:42:31 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=protonmail.com header.i=@protonmail.com header.b="WPaKlK87" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726975AbgG0Xm1 (ORCPT ); Mon, 27 Jul 2020 19:42:27 -0400 Received: from mail-40141.protonmail.ch ([185.70.40.141]:13434 "EHLO mail-40141.protonmail.ch" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726196AbgG0Xm0 (ORCPT ); Mon, 27 Jul 2020 19:42:26 -0400 Date: Mon, 27 Jul 2020 23:42:14 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com; s=protonmail; t=1595893340; bh=AQmh+uIpMfdES2g/A6HYV2B7dFrVRubFbvwlphZUT8g=; h=Date:To:From:Cc:Reply-To:Subject:In-Reply-To:References:From; b=WPaKlK87v5tMlYboefBGF39WRaUFU27b7wQRzJkJ9uB7fbY/ytSsgHkgcbkkq8cfV /OJfCX1otKSQfRrp98/he37W9RmEybcs/bJZU4qBd4/ja2FdEBxx0mVv06ZN9wj9JT W/xhMBV3amEPPZj0xrA5KyRlcMg2flG8EQszcoG4= To: Daniel Vetter From: Mazin Rezk Cc: Mazin Rezk , =?utf-8?Q?Christian_K=C3=B6nig?= , "Kazlauskas, Nicholas" , "linux-kernel@vger.kernel.org" , "amd-gfx@lists.freedesktop.org" , "dri-devel@lists.freedesktop.org" , Paul Menzel , "anthony.ruhier@gmail.com" , Duncan <1i5t5.duncan@cox.net>, Kees Cook , "sunpeng.li@amd.com" , "regressions@leemhuis.info" , Alexander Deucher , Andrew Morton , "mphantomx@yahoo.com.br" Reply-To: Mazin Rezk Subject: Re: [PATCH] drm/amd/display: Clear dm_state for fast updates Message-ID: In-Reply-To: References: <3b7e3e50-2ff7-eff3-2ffc-abaa4b36ce7f@amd.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Monday, July 27, 2020 5:32 PM, Daniel Vetter wrote: > On Mon, Jul 27, 2020 at 11:11 PM Mazin Rezk wrote: > > > > On Monday, July 27, 2020 4:29 PM, Daniel Vetter wrote= : > > > > > On Mon, Jul 27, 2020 at 9:28 PM Christian K=C3=B6nig > > > wrote: > > > > > > > > Am 27.07.20 um 16:05 schrieb Kazlauskas, Nicholas: > > > > > On 2020-07-27 9:39 a.m., Christian K=C3=B6nig wrote: > > > > >> Am 27.07.20 um 07:40 schrieb Mazin Rezk: > > > > >>> This patch fixes a race condition that causes a use-after-free = during > > > > >>> amdgpu_dm_atomic_commit_tail. This can occur when 2 non-blockin= g > > > > >>> commits > > > > >>> are requested and the second one finishes before the first. > > > > >>> Essentially, > > > > >>> this bug occurs when the following sequence of events happens: > > > > >>> > > > > >>> 1. Non-blocking commit #1 is requested w/ a new dm_state #1 and= is > > > > >>> deferred to the workqueue. > > > > >>> > > > > >>> 2. Non-blocking commit #2 is requested w/ a new dm_state #2 and= is > > > > >>> deferred to the workqueue. > > > > >>> > > > > >>> 3. Commit #2 starts before commit #1, dm_state #1 is used in th= e > > > > >>> commit_tail and commit #2 completes, freeing dm_state #1. > > > > >>> > > > > >>> 4. Commit #1 starts after commit #2 completes, uses the freed d= m_state > > > > >>> 1 and dereferences a freelist pointer while setting the context= . > > > > >> > > > > >> Well I only have a one mile high view on this, but why don't you= let > > > > >> the work items execute in order? > > > > >> > > > > >> That would be better anyway cause this way we don't trigger a ca= che > > > > >> line ping pong between CPUs. > > > > >> > > > > >> Christian. > > > > > > > > > > We use the DRM helpers for managing drm_atomic_commit_state and t= hose > > > > > helpers internally push non-blocking commit work into the system > > > > > unbound work queue. > > > > > > > > Mhm, well if you send those helper atomic commits in the order A,B = and > > > > they execute it in the order B,A I would call that a bug :) > > > > > > The way it works is it pushes all commits into unbound work queue, bu= t > > > then forces serialization as needed. We do _not_ want e.g. updates on > > > different CRTC to be serialized, that would result in lots of judder. > > > And hw is funny enough that there's all kinds of dependencies. > > > > > > The way you force synchronization is by adding other CRTC state > > > objects. So if DC is busted and can only handle a single update per > > > work item, then I guess you always need all CRTC states and everythin= g > > > will be run in order. But that also totally kills modern multi-screen > > > compositors. Xorg isn't modern, just in case that's not clear :-) > > > > > > Lucking at the code it seems like you indeed have only a single dm > > > state, so yeah global sync is what you'll need as immediate fix, and > > > then maybe fix up DM to not be quite so silly ... or at least only do > > > the dm state stuff when really needed. > > > > > > We could also sprinkle the drm_crtc_commit structure around a bit > > > (it's the glue that provides the synchronization across commits), but > > > since your dm state is global just grabbing all crtc states > > > unconditionally as part of that is probably best. > > > > > > > > While we could duplicate a copy of that code with nothing but the > > > > > workqueue changed that isn't something I'd really like to maintai= n > > > > > going forward. > > > > > > > > I'm not talking about duplicating the code, I'm talking about fixin= g the > > > > helpers. I don't know that code well, but from the outside it sound= s > > > > like a bug there. > > > > > > > > And executing work items in the order they are submitted is trivial= . > > > > > > > > Had anybody pinged Daniel or other people familiar with the helper = code > > > > about it? > > > > > > Yeah something is wrong here, and the fix looks horrible :-) > > > > > > Aside, I've also seen some recent discussion flare up about > > > drm_atomic_state_get/put used to paper over some other use-after-free= , > > > but this time related to interrupt handlers. Maybe a few rules about > > > that: > > > - dont > > > - especially not when it's interrupt handlers, because you can't call > > > drm_atomic_state_put from interrupt handlers. > > > > > > Instead have an spin_lock_irq to protect the shared date with your > > > interrupt handler, and _copy_ the date over. This is e.g. what > > > drm_crtc_arm_vblank_event does. > > > > Nicholas wrote a patch that attempted to resolve the issue by adding ev= ery > > CRTC into the commit to use use the stall checks. [1] While this forces > > synchronisation on commits, it's kind of a hacky method that may take a > > toll on performance. > > > > Is it possible to have a DRM helper that forces synchronisation on some > > commits without having to add every CRTC into the commit? > > > > Also, is synchronisation really necessary for fast updates in amdgpu? > > I'll admit, the idea of eliminating the use-after-free bug by eliminati= ng > > the use entirely doesn't seem ideal; but is forcing synchronisation on > > these updates that much better? > > Well clearing the dc_state pointer here and then allocating another > one in atomic_commit_tail also looks fishy. The proper fix is probably > a lot more involved, but yeah interim fix is to grab all crtc states > iff you also grabbed the dm_atomic_state structure. Real fix is to > only do this when necessary, which pretty much means the dc_state > needs to be somehow split up, or there needs to be some guarantees > about when it's necessary and when not. Otherwise parallel commits on > different CRTC are not possible with the current dc backend code. In that case, I'll test out Nicholas' patch right now and see if it works. Unlike Duncan, something about my setup seems to trigger the bug rather quickly, so I should be able to tell if it works in the next couple of hours with a reasonable degree of accuracy. Thanks, Mazin Rezk > > See also my dma-fence annotation fixup patch, there dc_state also gets > in the way: > > https://lore.kernel.org/dri-devel/20200707201229.472834-21-daniel.vetter@= ffwll.ch/ > > Nicholas, btw I'm still waiting for some dc feedback on that entire > series, and what/if there's plans to fix these issues properly. > > Maybe even going back to the subclassed drm_atomic_state might be > better than what we currently have. > -Daniel > > > > [1] https://bugzilla.kernel.org/show_bug.cgi?id=3D207383#c96 > > > > Thanks, > > Mazin Rezk > > > > > > > > Cheers, Daniel > > > > > > > > > > > Regards, > > > > Christian. > > > > > > > > > > > > > > Regards, > > > > > Nicholas Kazlauskas > > > > > > > > > >> > > > > >>> > > > > >>> Since this bug has only been spotted with fast commits, this pa= tch > > > > >>> fixes > > > > >>> the bug by clearing the dm_state instead of using the old dc_st= ate for > > > > >>> fast updates. In addition, since dm_state is only used for its = dc_state > > > > >>> and amdgpu_dm_atomic_commit_tail will retain the dc_state if no= ne is > > > > >>> found, > > > > >>> removing the dm_state should not have any consequences in fast = updates. > > > > >>> > > > > >>> This use-after-free bug has existed for a while now, but only c= aused a > > > > >>> noticeable issue starting from 5.7-rc1 due to 3202fa62f ("slub: > > > > >>> relocate > > > > >>> freelist pointer to middle of object") moving the freelist poin= ter from > > > > >>> dm_state->base (which was unused) to dm_state->context (which i= s > > > > >>> dereferenced). > > > > >>> > > > > >>> Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=3D207383 > > > > >>> Fixes: bd200d190f45 ("drm/amd/display: Don't replace the dc_sta= te > > > > >>> for fast updates") > > > > >>> Reported-by: Duncan <1i5t5.duncan@cox.net> > > > > >>> Signed-off-by: Mazin Rezk > > > > >>> --- > > > > >>> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 36 > > > > >>> ++++++++++++++----- > > > > >>> 1 file changed, 27 insertions(+), 9 deletions(-) > > > > >>> > > > > >>> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c > > > > >>> b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c > > > > >>> index 86ffa0c2880f..710edc70e37e 100644 > > > > >>> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c > > > > >>> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c > > > > >>> @@ -8717,20 +8717,38 @@ static int amdgpu_dm_atomic_check(struc= t > > > > >>> drm_device *dev, > > > > >>> * the same resource. If we have a new DC context as = part of > > > > >>> * the DM atomic state from validation we need to fre= e it and > > > > >>> * retain the existing one instead. > > > > >>> + * > > > > >>> + * Furthermore, since the DM atomic state only contain= s the DC > > > > >>> + * context and can safely be annulled, we can free the= state > > > > >>> + * and clear the associated private object now to free > > > > >>> + * some memory and avoid a possible use-after-free lat= er. > > > > >>> */ > > > > >>> - struct dm_atomic_state *new_dm_state, *old_dm_state; > > > > >>> > > > > >>> - new_dm_state =3D dm_atomic_get_new_state(state); > > > > >>> - old_dm_state =3D dm_atomic_get_old_state(state); > > > > >>> + for (i =3D 0; i < state->num_private_objs; i++) { > > > > >>> + struct drm_private_obj *obj =3D state->private_obj= s[i].ptr; > > > > >>> > > > > >>> - if (new_dm_state && old_dm_state) { > > > > >>> - if (new_dm_state->context) > > > > >>> - dc_release_state(new_dm_state->context); > > > > >>> + if (obj->funcs =3D=3D adev->dm.atomic_obj.funcs) { > > > > >>> + int j =3D state->num_private_objs-1; > > > > >>> > > > > >>> - new_dm_state->context =3D old_dm_state->context; > > > > >>> + dm_atomic_destroy_state(obj, > > > > >>> + state->private_objs[i].state); > > > > >>> + > > > > >>> + /* If i is not at the end of the array then th= e > > > > >>> + * last element needs to be moved to where i w= as > > > > >>> + * before the array can safely be truncated. > > > > >>> + */ > > > > >>> + if (i !=3D j) > > > > >>> + state->private_objs[i] =3D > > > > >>> + state->private_objs[j]; > > > > >>> > > > > >>> - if (old_dm_state->context) > > > > >>> - dc_retain_state(old_dm_state->context); > > > > >>> + state->private_objs[j].ptr =3D NULL; > > > > >>> + state->private_objs[j].state =3D NULL; > > > > >>> + state->private_objs[j].old_state =3D NULL; > > > > >>> + state->private_objs[j].new_state =3D NULL; > > > > >>> + > > > > >>> + state->num_private_objs =3D j; > > > > >>> + break; > > > > >>> + } > > > > >>> } > > > > >>> } > > > > >>> > > > > >>> -- > > > > >>> 2.27.0 > > > > >>> > > > > >> > > > > > > > > > > > > > _______________________________________________ > > > > dri-devel mailing list > > > > dri-devel@lists.freedesktop.org > > > > https://lists.freedesktop.org/mailman/listinfo/dri-devel > > > > > > > > > > > > -- > > > Daniel Vetter > > > Software Engineer, Intel Corporation > > > http://blog.ffwll.ch > > > > -- > Daniel Vetter > Software Engineer, Intel Corporation > http://blog.ffwll.ch 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.8 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,HK_RANDOM_FROM,HK_RANDOM_REPLYTO,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=no 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 2BE82C433E1 for ; Tue, 28 Jul 2020 07:17:29 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 B5899207E8 for ; Tue, 28 Jul 2020 07:17:28 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=protonmail.com header.i=@protonmail.com header.b="WPaKlK87" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B5899207E8 Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=protonmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id B33206E183; Tue, 28 Jul 2020 07:17:27 +0000 (UTC) Received: from mail-40140.protonmail.ch (mail-40140.protonmail.ch [185.70.40.140]) by gabe.freedesktop.org (Postfix) with ESMTPS id 454836E12F for ; Mon, 27 Jul 2020 23:42:23 +0000 (UTC) Date: Mon, 27 Jul 2020 23:42:14 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com; s=protonmail; t=1595893340; bh=AQmh+uIpMfdES2g/A6HYV2B7dFrVRubFbvwlphZUT8g=; h=Date:To:From:Cc:Reply-To:Subject:In-Reply-To:References:From; b=WPaKlK87v5tMlYboefBGF39WRaUFU27b7wQRzJkJ9uB7fbY/ytSsgHkgcbkkq8cfV /OJfCX1otKSQfRrp98/he37W9RmEybcs/bJZU4qBd4/ja2FdEBxx0mVv06ZN9wj9JT W/xhMBV3amEPPZj0xrA5KyRlcMg2flG8EQszcoG4= To: Daniel Vetter From: Mazin Rezk Subject: Re: [PATCH] drm/amd/display: Clear dm_state for fast updates Message-ID: In-Reply-To: References: <3b7e3e50-2ff7-eff3-2ffc-abaa4b36ce7f@amd.com> MIME-Version: 1.0 X-Mailman-Approved-At: Tue, 28 Jul 2020 07:17:27 +0000 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Mazin Rezk Cc: Paul Menzel , "mphantomx@yahoo.com.br" , Duncan <1i5t5.duncan@cox.net>, Kees Cook , "sunpeng.li@amd.com" , Mazin Rezk , "linux-kernel@vger.kernel.org" , "dri-devel@lists.freedesktop.org" , "Kazlauskas, Nicholas" , "regressions@leemhuis.info" , "amd-gfx@lists.freedesktop.org" , Alexander Deucher , Andrew Morton , "anthony.ruhier@gmail.com" , =?utf-8?Q?Christian_K=C3=B6nig?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" T24gTW9uZGF5LCBKdWx5IDI3LCAyMDIwIDU6MzIgUE0sIERhbmllbCBWZXR0ZXIgPGRhbmllbEBm ZndsbC5jaD4gd3JvdGU6Cgo+IE9uIE1vbiwgSnVsIDI3LCAyMDIwIGF0IDExOjExIFBNIE1hemlu IFJlemsgPG1ucnprQHByb3Rvbm1haWwuY29tPiB3cm90ZToKPiA+Cj4gPiBPbiBNb25kYXksIEp1 bHkgMjcsIDIwMjAgNDoyOSBQTSwgRGFuaWVsIFZldHRlciA8ZGFuaWVsQGZmd2xsLmNoPiB3cm90 ZToKPiA+Cj4gPiA+IE9uIE1vbiwgSnVsIDI3LCAyMDIwIGF0IDk6MjggUE0gQ2hyaXN0aWFuIEvD tm5pZwo+ID4gPiA8Y2hyaXN0aWFuLmtvZW5pZ0BhbWQuY29tPiB3cm90ZToKPiA+ID4gPgo+ID4g PiA+IEFtIDI3LjA3LjIwIHVtIDE2OjA1IHNjaHJpZWIgS2F6bGF1c2thcywgTmljaG9sYXM6Cj4g PiA+ID4gPiBPbiAyMDIwLTA3LTI3IDk6MzkgYS5tLiwgQ2hyaXN0aWFuIEvDtm5pZyB3cm90ZToK PiA+ID4gPiA+PiBBbSAyNy4wNy4yMCB1bSAwNzo0MCBzY2hyaWViIE1hemluIFJlems6Cj4gPiA+ ID4gPj4+IFRoaXMgcGF0Y2ggZml4ZXMgYSByYWNlIGNvbmRpdGlvbiB0aGF0IGNhdXNlcyBhIHVz ZS1hZnRlci1mcmVlIGR1cmluZwo+ID4gPiA+ID4+PiBhbWRncHVfZG1fYXRvbWljX2NvbW1pdF90 YWlsLiBUaGlzIGNhbiBvY2N1ciB3aGVuIDIgbm9uLWJsb2NraW5nCj4gPiA+ID4gPj4+IGNvbW1p dHMKPiA+ID4gPiA+Pj4gYXJlIHJlcXVlc3RlZCBhbmQgdGhlIHNlY29uZCBvbmUgZmluaXNoZXMg YmVmb3JlIHRoZSBmaXJzdC4KPiA+ID4gPiA+Pj4gRXNzZW50aWFsbHksCj4gPiA+ID4gPj4+IHRo aXMgYnVnIG9jY3VycyB3aGVuIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2Ugb2YgZXZlbnRzIGhhcHBl bnM6Cj4gPiA+ID4gPj4+Cj4gPiA+ID4gPj4+IDEuIE5vbi1ibG9ja2luZyBjb21taXQgIzEgaXMg cmVxdWVzdGVkIHcvIGEgbmV3IGRtX3N0YXRlICMxIGFuZCBpcwo+ID4gPiA+ID4+PiBkZWZlcnJl ZCB0byB0aGUgd29ya3F1ZXVlLgo+ID4gPiA+ID4+Pgo+ID4gPiA+ID4+PiAyLiBOb24tYmxvY2tp bmcgY29tbWl0ICMyIGlzIHJlcXVlc3RlZCB3LyBhIG5ldyBkbV9zdGF0ZSAjMiBhbmQgaXMKPiA+ ID4gPiA+Pj4gZGVmZXJyZWQgdG8gdGhlIHdvcmtxdWV1ZS4KPiA+ID4gPiA+Pj4KPiA+ID4gPiA+ Pj4gMy4gQ29tbWl0ICMyIHN0YXJ0cyBiZWZvcmUgY29tbWl0ICMxLCBkbV9zdGF0ZSAjMSBpcyB1 c2VkIGluIHRoZQo+ID4gPiA+ID4+PiBjb21taXRfdGFpbCBhbmQgY29tbWl0ICMyIGNvbXBsZXRl cywgZnJlZWluZyBkbV9zdGF0ZSAjMS4KPiA+ID4gPiA+Pj4KPiA+ID4gPiA+Pj4gNC4gQ29tbWl0 ICMxIHN0YXJ0cyBhZnRlciBjb21taXQgIzIgY29tcGxldGVzLCB1c2VzIHRoZSBmcmVlZCBkbV9z dGF0ZQo+ID4gPiA+ID4+PiAxIGFuZCBkZXJlZmVyZW5jZXMgYSBmcmVlbGlzdCBwb2ludGVyIHdo aWxlIHNldHRpbmcgdGhlIGNvbnRleHQuCj4gPiA+ID4gPj4KPiA+ID4gPiA+PiBXZWxsIEkgb25s eSBoYXZlIGEgb25lIG1pbGUgaGlnaCB2aWV3IG9uIHRoaXMsIGJ1dCB3aHkgZG9uJ3QgeW91IGxl dAo+ID4gPiA+ID4+IHRoZSB3b3JrIGl0ZW1zIGV4ZWN1dGUgaW4gb3JkZXI/Cj4gPiA+ID4gPj4K PiA+ID4gPiA+PiBUaGF0IHdvdWxkIGJlIGJldHRlciBhbnl3YXkgY2F1c2UgdGhpcyB3YXkgd2Ug ZG9uJ3QgdHJpZ2dlciBhIGNhY2hlCj4gPiA+ID4gPj4gbGluZSBwaW5nIHBvbmcgYmV0d2VlbiBD UFVzLgo+ID4gPiA+ID4+Cj4gPiA+ID4gPj4gQ2hyaXN0aWFuLgo+ID4gPiA+ID4KPiA+ID4gPiA+ IFdlIHVzZSB0aGUgRFJNIGhlbHBlcnMgZm9yIG1hbmFnaW5nIGRybV9hdG9taWNfY29tbWl0X3N0 YXRlIGFuZCB0aG9zZQo+ID4gPiA+ID4gaGVscGVycyBpbnRlcm5hbGx5IHB1c2ggbm9uLWJsb2Nr aW5nIGNvbW1pdCB3b3JrIGludG8gdGhlIHN5c3RlbQo+ID4gPiA+ID4gdW5ib3VuZCB3b3JrIHF1 ZXVlLgo+ID4gPiA+Cj4gPiA+ID4gTWhtLCB3ZWxsIGlmIHlvdSBzZW5kIHRob3NlIGhlbHBlciBh dG9taWMgY29tbWl0cyBpbiB0aGUgb3JkZXIgQSxCIGFuZAo+ID4gPiA+IHRoZXkgZXhlY3V0ZSBp dCBpbiB0aGUgb3JkZXIgQixBIEkgd291bGQgY2FsbCB0aGF0IGEgYnVnIDopCj4gPiA+Cj4gPiA+ IFRoZSB3YXkgaXQgd29ya3MgaXMgaXQgcHVzaGVzIGFsbCBjb21taXRzIGludG8gdW5ib3VuZCB3 b3JrIHF1ZXVlLCBidXQKPiA+ID4gdGhlbiBmb3JjZXMgc2VyaWFsaXphdGlvbiBhcyBuZWVkZWQu IFdlIGRvIF9ub3RfIHdhbnQgZS5nLiB1cGRhdGVzIG9uCj4gPiA+IGRpZmZlcmVudCBDUlRDIHRv IGJlIHNlcmlhbGl6ZWQsIHRoYXQgd291bGQgcmVzdWx0IGluIGxvdHMgb2YganVkZGVyLgo+ID4g PiBBbmQgaHcgaXMgZnVubnkgZW5vdWdoIHRoYXQgdGhlcmUncyBhbGwga2luZHMgb2YgZGVwZW5k ZW5jaWVzLgo+ID4gPgo+ID4gPiBUaGUgd2F5IHlvdSBmb3JjZSBzeW5jaHJvbml6YXRpb24gaXMg YnkgYWRkaW5nIG90aGVyIENSVEMgc3RhdGUKPiA+ID4gb2JqZWN0cy4gU28gaWYgREMgaXMgYnVz dGVkIGFuZCBjYW4gb25seSBoYW5kbGUgYSBzaW5nbGUgdXBkYXRlIHBlcgo+ID4gPiB3b3JrIGl0 ZW0sIHRoZW4gSSBndWVzcyB5b3UgYWx3YXlzIG5lZWQgYWxsIENSVEMgc3RhdGVzIGFuZCBldmVy eXRoaW5nCj4gPiA+IHdpbGwgYmUgcnVuIGluIG9yZGVyLiBCdXQgdGhhdCBhbHNvIHRvdGFsbHkg a2lsbHMgbW9kZXJuIG11bHRpLXNjcmVlbgo+ID4gPiBjb21wb3NpdG9ycy4gWG9yZyBpc24ndCBt b2Rlcm4sIGp1c3QgaW4gY2FzZSB0aGF0J3Mgbm90IGNsZWFyIDotKQo+ID4gPgo+ID4gPiBMdWNr aW5nIGF0IHRoZSBjb2RlIGl0IHNlZW1zIGxpa2UgeW91IGluZGVlZCBoYXZlIG9ubHkgYSBzaW5n bGUgZG0KPiA+ID4gc3RhdGUsIHNvIHllYWggZ2xvYmFsIHN5bmMgaXMgd2hhdCB5b3UnbGwgbmVl ZCBhcyBpbW1lZGlhdGUgZml4LCBhbmQKPiA+ID4gdGhlbiBtYXliZSBmaXggdXAgRE0gdG8gbm90 IGJlIHF1aXRlIHNvIHNpbGx5IC4uLiBvciBhdCBsZWFzdCBvbmx5IGRvCj4gPiA+IHRoZSBkbSBz dGF0ZSBzdHVmZiB3aGVuIHJlYWxseSBuZWVkZWQuCj4gPiA+Cj4gPiA+IFdlIGNvdWxkIGFsc28g c3ByaW5rbGUgdGhlIGRybV9jcnRjX2NvbW1pdCBzdHJ1Y3R1cmUgYXJvdW5kIGEgYml0Cj4gPiA+ IChpdCdzIHRoZSBnbHVlIHRoYXQgcHJvdmlkZXMgdGhlIHN5bmNocm9uaXphdGlvbiBhY3Jvc3Mg Y29tbWl0cyksIGJ1dAo+ID4gPiBzaW5jZSB5b3VyIGRtIHN0YXRlIGlzIGdsb2JhbCBqdXN0IGdy YWJiaW5nIGFsbCBjcnRjIHN0YXRlcwo+ID4gPiB1bmNvbmRpdGlvbmFsbHkgYXMgcGFydCBvZiB0 aGF0IGlzIHByb2JhYmx5IGJlc3QuCj4gPiA+Cj4gPiA+ID4gPiBXaGlsZSB3ZSBjb3VsZCBkdXBs aWNhdGUgYSBjb3B5IG9mIHRoYXQgY29kZSB3aXRoIG5vdGhpbmcgYnV0IHRoZQo+ID4gPiA+ID4g d29ya3F1ZXVlIGNoYW5nZWQgdGhhdCBpc24ndCBzb21ldGhpbmcgSSdkIHJlYWxseSBsaWtlIHRv IG1haW50YWluCj4gPiA+ID4gPiBnb2luZyBmb3J3YXJkLgo+ID4gPiA+Cj4gPiA+ID4gSSdtIG5v dCB0YWxraW5nIGFib3V0IGR1cGxpY2F0aW5nIHRoZSBjb2RlLCBJJ20gdGFsa2luZyBhYm91dCBm aXhpbmcgdGhlCj4gPiA+ID4gaGVscGVycy4gSSBkb24ndCBrbm93IHRoYXQgY29kZSB3ZWxsLCBi dXQgZnJvbSB0aGUgb3V0c2lkZSBpdCBzb3VuZHMKPiA+ID4gPiBsaWtlIGEgYnVnIHRoZXJlLgo+ ID4gPiA+Cj4gPiA+ID4gQW5kIGV4ZWN1dGluZyB3b3JrIGl0ZW1zIGluIHRoZSBvcmRlciB0aGV5 IGFyZSBzdWJtaXR0ZWQgaXMgdHJpdmlhbC4KPiA+ID4gPgo+ID4gPiA+IEhhZCBhbnlib2R5IHBp bmdlZCBEYW5pZWwgb3Igb3RoZXIgcGVvcGxlIGZhbWlsaWFyIHdpdGggdGhlIGhlbHBlciBjb2Rl Cj4gPiA+ID4gYWJvdXQgaXQ/Cj4gPiA+Cj4gPiA+IFllYWggc29tZXRoaW5nIGlzIHdyb25nIGhl cmUsIGFuZCB0aGUgZml4IGxvb2tzIGhvcnJpYmxlIDotKQo+ID4gPgo+ID4gPiBBc2lkZSwgSSd2 ZSBhbHNvIHNlZW4gc29tZSByZWNlbnQgZGlzY3Vzc2lvbiBmbGFyZSB1cCBhYm91dAo+ID4gPiBk cm1fYXRvbWljX3N0YXRlX2dldC9wdXQgdXNlZCB0byBwYXBlciBvdmVyIHNvbWUgb3RoZXIgdXNl LWFmdGVyLWZyZWUsCj4gPiA+IGJ1dCB0aGlzIHRpbWUgcmVsYXRlZCB0byBpbnRlcnJ1cHQgaGFu ZGxlcnMuIE1heWJlIGEgZmV3IHJ1bGVzIGFib3V0Cj4gPiA+IHRoYXQ6Cj4gPiA+IC0gZG9udAo+ ID4gPiAtIGVzcGVjaWFsbHkgbm90IHdoZW4gaXQncyBpbnRlcnJ1cHQgaGFuZGxlcnMsIGJlY2F1 c2UgeW91IGNhbid0IGNhbGwKPiA+ID4gZHJtX2F0b21pY19zdGF0ZV9wdXQgZnJvbSBpbnRlcnJ1 cHQgaGFuZGxlcnMuCj4gPiA+Cj4gPiA+IEluc3RlYWQgaGF2ZSBhbiBzcGluX2xvY2tfaXJxIHRv IHByb3RlY3QgdGhlIHNoYXJlZCBkYXRlIHdpdGggeW91cgo+ID4gPiBpbnRlcnJ1cHQgaGFuZGxl ciwgYW5kIF9jb3B5XyB0aGUgZGF0ZSBvdmVyLiBUaGlzIGlzIGUuZy4gd2hhdAo+ID4gPiBkcm1f Y3J0Y19hcm1fdmJsYW5rX2V2ZW50IGRvZXMuCj4gPgo+ID4gTmljaG9sYXMgd3JvdGUgYSBwYXRj aCB0aGF0IGF0dGVtcHRlZCB0byByZXNvbHZlIHRoZSBpc3N1ZSBieSBhZGRpbmcgZXZlcnkKPiA+ IENSVEMgaW50byB0aGUgY29tbWl0IHRvIHVzZSB1c2UgdGhlIHN0YWxsIGNoZWNrcy4gWzFdIFdo aWxlIHRoaXMgZm9yY2VzCj4gPiBzeW5jaHJvbmlzYXRpb24gb24gY29tbWl0cywgaXQncyBraW5k IG9mIGEgaGFja3kgbWV0aG9kIHRoYXQgbWF5IHRha2UgYQo+ID4gdG9sbCBvbiBwZXJmb3JtYW5j ZS4KPiA+Cj4gPiBJcyBpdCBwb3NzaWJsZSB0byBoYXZlIGEgRFJNIGhlbHBlciB0aGF0IGZvcmNl cyBzeW5jaHJvbmlzYXRpb24gb24gc29tZQo+ID4gY29tbWl0cyB3aXRob3V0IGhhdmluZyB0byBh ZGQgZXZlcnkgQ1JUQyBpbnRvIHRoZSBjb21taXQ/Cj4gPgo+ID4gQWxzbywgaXMgc3luY2hyb25p c2F0aW9uIHJlYWxseSBuZWNlc3NhcnkgZm9yIGZhc3QgdXBkYXRlcyBpbiBhbWRncHU/Cj4gPiBJ J2xsIGFkbWl0LCB0aGUgaWRlYSBvZiBlbGltaW5hdGluZyB0aGUgdXNlLWFmdGVyLWZyZWUgYnVn IGJ5IGVsaW1pbmF0aW5nCj4gPiB0aGUgdXNlIGVudGlyZWx5IGRvZXNuJ3Qgc2VlbSBpZGVhbDsg YnV0IGlzIGZvcmNpbmcgc3luY2hyb25pc2F0aW9uIG9uCj4gPiB0aGVzZSB1cGRhdGVzIHRoYXQg bXVjaCBiZXR0ZXI/Cj4KPiBXZWxsIGNsZWFyaW5nIHRoZSBkY19zdGF0ZSBwb2ludGVyIGhlcmUg YW5kIHRoZW4gYWxsb2NhdGluZyBhbm90aGVyCj4gb25lIGluIGF0b21pY19jb21taXRfdGFpbCBh bHNvIGxvb2tzIGZpc2h5LiBUaGUgcHJvcGVyIGZpeCBpcyBwcm9iYWJseQo+IGEgbG90IG1vcmUg aW52b2x2ZWQsIGJ1dCB5ZWFoIGludGVyaW0gZml4IGlzIHRvIGdyYWIgYWxsIGNydGMgc3RhdGVz Cj4gaWZmIHlvdSBhbHNvIGdyYWJiZWQgdGhlIGRtX2F0b21pY19zdGF0ZSBzdHJ1Y3R1cmUuIFJl YWwgZml4IGlzIHRvCj4gb25seSBkbyB0aGlzIHdoZW4gbmVjZXNzYXJ5LCB3aGljaCBwcmV0dHkg bXVjaCBtZWFucyB0aGUgZGNfc3RhdGUKPiBuZWVkcyB0byBiZSBzb21laG93IHNwbGl0IHVwLCBv ciB0aGVyZSBuZWVkcyB0byBiZSBzb21lIGd1YXJhbnRlZXMKPiBhYm91dCB3aGVuIGl0J3MgbmVj ZXNzYXJ5IGFuZCB3aGVuIG5vdC4gT3RoZXJ3aXNlIHBhcmFsbGVsIGNvbW1pdHMgb24KPiBkaWZm ZXJlbnQgQ1JUQyBhcmUgbm90IHBvc3NpYmxlIHdpdGggdGhlIGN1cnJlbnQgZGMgYmFja2VuZCBj b2RlLgoKSW4gdGhhdCBjYXNlLCBJJ2xsIHRlc3Qgb3V0IE5pY2hvbGFzJyBwYXRjaCByaWdodCBu b3cgYW5kIHNlZSBpZiBpdCB3b3Jrcy4KVW5saWtlIER1bmNhbiwgc29tZXRoaW5nIGFib3V0IG15 IHNldHVwIHNlZW1zIHRvIHRyaWdnZXIgdGhlIGJ1ZyByYXRoZXIKcXVpY2tseSwgc28gSSBzaG91 bGQgYmUgYWJsZSB0byB0ZWxsIGlmIGl0IHdvcmtzIGluIHRoZSBuZXh0IGNvdXBsZSBvZgpob3Vy cyB3aXRoIGEgcmVhc29uYWJsZSBkZWdyZWUgb2YgYWNjdXJhY3kuCgpUaGFua3MsCk1hemluIFJl emsKCj4KPiBTZWUgYWxzbyBteSBkbWEtZmVuY2UgYW5ub3RhdGlvbiBmaXh1cCBwYXRjaCwgdGhl cmUgZGNfc3RhdGUgYWxzbyBnZXRzCj4gaW4gdGhlIHdheToKPgo+IGh0dHBzOi8vbG9yZS5rZXJu ZWwub3JnL2RyaS1kZXZlbC8yMDIwMDcwNzIwMTIyOS40NzI4MzQtMjEtZGFuaWVsLnZldHRlckBm ZndsbC5jaC8KPgo+IE5pY2hvbGFzLCBidHcgSSdtIHN0aWxsIHdhaXRpbmcgZm9yIHNvbWUgZGMg ZmVlZGJhY2sgb24gdGhhdCBlbnRpcmUKPiBzZXJpZXMsIGFuZCB3aGF0L2lmIHRoZXJlJ3MgcGxh bnMgdG8gZml4IHRoZXNlIGlzc3VlcyBwcm9wZXJseS4KPgo+IE1heWJlIGV2ZW4gZ29pbmcgYmFj ayB0byB0aGUgc3ViY2xhc3NlZCBkcm1fYXRvbWljX3N0YXRlIG1pZ2h0IGJlCj4gYmV0dGVyIHRo YW4gd2hhdCB3ZSBjdXJyZW50bHkgaGF2ZS4KPiAtRGFuaWVsCj4gPgo+ID4gWzFdIGh0dHBzOi8v YnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjA3MzgzI2M5Ngo+ID4KPiA+IFRo YW5rcywKPiA+IE1hemluIFJlemsKPiA+Cj4gPiA+Cj4gPiA+IENoZWVycywgRGFuaWVsCj4gPiA+ Cj4gPiA+ID4KPiA+ID4gPiBSZWdhcmRzLAo+ID4gPiA+IENocmlzdGlhbi4KPiA+ID4gPgo+ID4g PiA+ID4KPiA+ID4gPiA+IFJlZ2FyZHMsCj4gPiA+ID4gPiBOaWNob2xhcyBLYXpsYXVza2FzCj4g PiA+ID4gPgo+ID4gPiA+ID4+Cj4gPiA+ID4gPj4+Cj4gPiA+ID4gPj4+IFNpbmNlIHRoaXMgYnVn IGhhcyBvbmx5IGJlZW4gc3BvdHRlZCB3aXRoIGZhc3QgY29tbWl0cywgdGhpcyBwYXRjaAo+ID4g PiA+ID4+PiBmaXhlcwo+ID4gPiA+ID4+PiB0aGUgYnVnIGJ5IGNsZWFyaW5nIHRoZSBkbV9zdGF0 ZSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBvbGQgZGNfc3RhdGUgZm9yCj4gPiA+ID4gPj4+IGZhc3Qg dXBkYXRlcy4gSW4gYWRkaXRpb24sIHNpbmNlIGRtX3N0YXRlIGlzIG9ubHkgdXNlZCBmb3IgaXRz IGRjX3N0YXRlCj4gPiA+ID4gPj4+IGFuZCBhbWRncHVfZG1fYXRvbWljX2NvbW1pdF90YWlsIHdp bGwgcmV0YWluIHRoZSBkY19zdGF0ZSBpZiBub25lIGlzCj4gPiA+ID4gPj4+IGZvdW5kLAo+ID4g PiA+ID4+PiByZW1vdmluZyB0aGUgZG1fc3RhdGUgc2hvdWxkIG5vdCBoYXZlIGFueSBjb25zZXF1 ZW5jZXMgaW4gZmFzdCB1cGRhdGVzLgo+ID4gPiA+ID4+Pgo+ID4gPiA+ID4+PiBUaGlzIHVzZS1h ZnRlci1mcmVlIGJ1ZyBoYXMgZXhpc3RlZCBmb3IgYSB3aGlsZSBub3csIGJ1dCBvbmx5IGNhdXNl ZCBhCj4gPiA+ID4gPj4+IG5vdGljZWFibGUgaXNzdWUgc3RhcnRpbmcgZnJvbSA1LjctcmMxIGR1 ZSB0byAzMjAyZmE2MmYgKCJzbHViOgo+ID4gPiA+ID4+PiByZWxvY2F0ZQo+ID4gPiA+ID4+PiBm cmVlbGlzdCBwb2ludGVyIHRvIG1pZGRsZSBvZiBvYmplY3QiKSBtb3ZpbmcgdGhlIGZyZWVsaXN0 IHBvaW50ZXIgZnJvbQo+ID4gPiA+ID4+PiBkbV9zdGF0ZS0+YmFzZSAod2hpY2ggd2FzIHVudXNl ZCkgdG8gZG1fc3RhdGUtPmNvbnRleHQgKHdoaWNoIGlzCj4gPiA+ID4gPj4+IGRlcmVmZXJlbmNl ZCkuCj4gPiA+ID4gPj4+Cj4gPiA+ID4gPj4+IEJ1Z3ppbGxhOiBodHRwczovL2J1Z3ppbGxhLmtl cm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTIwNzM4Mwo+ID4gPiA+ID4+PiBGaXhlczogYmQyMDBk MTkwZjQ1ICgiZHJtL2FtZC9kaXNwbGF5OiBEb24ndCByZXBsYWNlIHRoZSBkY19zdGF0ZQo+ID4g PiA+ID4+PiBmb3IgZmFzdCB1cGRhdGVzIikKPiA+ID4gPiA+Pj4gUmVwb3J0ZWQtYnk6IER1bmNh biA8MWk1dDUuZHVuY2FuQGNveC5uZXQ+Cj4gPiA+ID4gPj4+IFNpZ25lZC1vZmYtYnk6IE1hemlu IFJlemsgPG1ucnprQHByb3Rvbm1haWwuY29tPgo+ID4gPiA+ID4+PiAtLS0KPiA+ID4gPiA+Pj4g ICAuLi4vZ3B1L2RybS9hbWQvZGlzcGxheS9hbWRncHVfZG0vYW1kZ3B1X2RtLmMgfCAzNgo+ID4g PiA+ID4+PiArKysrKysrKysrKysrKy0tLS0tCj4gPiA+ID4gPj4+ICAgMSBmaWxlIGNoYW5nZWQs IDI3IGluc2VydGlvbnMoKyksIDkgZGVsZXRpb25zKC0pCj4gPiA+ID4gPj4+Cj4gPiA+ID4gPj4+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2Rpc3BsYXkvYW1kZ3B1X2RtL2FtZGdw dV9kbS5jCj4gPiA+ID4gPj4+IGIvZHJpdmVycy9ncHUvZHJtL2FtZC9kaXNwbGF5L2FtZGdwdV9k bS9hbWRncHVfZG0uYwo+ID4gPiA+ID4+PiBpbmRleCA4NmZmYTBjMjg4MGYuLjcxMGVkYzcwZTM3 ZSAxMDA2NDQKPiA+ID4gPiA+Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9kaXNwbGF5L2Ft ZGdwdV9kbS9hbWRncHVfZG0uYwo+ID4gPiA+ID4+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1k L2Rpc3BsYXkvYW1kZ3B1X2RtL2FtZGdwdV9kbS5jCj4gPiA+ID4gPj4+IEBAIC04NzE3LDIwICs4 NzE3LDM4IEBAIHN0YXRpYyBpbnQgYW1kZ3B1X2RtX2F0b21pY19jaGVjayhzdHJ1Y3QKPiA+ID4g PiA+Pj4gZHJtX2RldmljZSAqZGV2LAo+ID4gPiA+ID4+PiAgICAgICAgICAgICogdGhlIHNhbWUg cmVzb3VyY2UuIElmIHdlIGhhdmUgYSBuZXcgREMgY29udGV4dCBhcyBwYXJ0IG9mCj4gPiA+ID4g Pj4+ICAgICAgICAgICAgKiB0aGUgRE0gYXRvbWljIHN0YXRlIGZyb20gdmFsaWRhdGlvbiB3ZSBu ZWVkIHRvIGZyZWUgaXQgYW5kCj4gPiA+ID4gPj4+ICAgICAgICAgICAgKiByZXRhaW4gdGhlIGV4 aXN0aW5nIG9uZSBpbnN0ZWFkLgo+ID4gPiA+ID4+PiArICAgICAgICAgKgo+ID4gPiA+ID4+PiAr ICAgICAgICAgKiBGdXJ0aGVybW9yZSwgc2luY2UgdGhlIERNIGF0b21pYyBzdGF0ZSBvbmx5IGNv bnRhaW5zIHRoZSBEQwo+ID4gPiA+ID4+PiArICAgICAgICAgKiBjb250ZXh0IGFuZCBjYW4gc2Fm ZWx5IGJlIGFubnVsbGVkLCB3ZSBjYW4gZnJlZSB0aGUgc3RhdGUKPiA+ID4gPiA+Pj4gKyAgICAg ICAgICogYW5kIGNsZWFyIHRoZSBhc3NvY2lhdGVkIHByaXZhdGUgb2JqZWN0IG5vdyB0byBmcmVl Cj4gPiA+ID4gPj4+ICsgICAgICAgICAqIHNvbWUgbWVtb3J5IGFuZCBhdm9pZCBhIHBvc3NpYmxl IHVzZS1hZnRlci1mcmVlIGxhdGVyLgo+ID4gPiA+ID4+PiAgICAgICAgICAgICovCj4gPiA+ID4g Pj4+IC0gICAgICAgIHN0cnVjdCBkbV9hdG9taWNfc3RhdGUgKm5ld19kbV9zdGF0ZSwgKm9sZF9k bV9zdGF0ZTsKPiA+ID4gPiA+Pj4KPiA+ID4gPiA+Pj4gLSAgICAgICAgbmV3X2RtX3N0YXRlID0g ZG1fYXRvbWljX2dldF9uZXdfc3RhdGUoc3RhdGUpOwo+ID4gPiA+ID4+PiAtICAgICAgICBvbGRf ZG1fc3RhdGUgPSBkbV9hdG9taWNfZ2V0X29sZF9zdGF0ZShzdGF0ZSk7Cj4gPiA+ID4gPj4+ICsg ICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+bnVtX3ByaXZhdGVfb2JqczsgaSsrKSB7Cj4g PiA+ID4gPj4+ICsgICAgICAgICAgICBzdHJ1Y3QgZHJtX3ByaXZhdGVfb2JqICpvYmogPSBzdGF0 ZS0+cHJpdmF0ZV9vYmpzW2ldLnB0cjsKPiA+ID4gPiA+Pj4KPiA+ID4gPiA+Pj4gLSAgICAgICAg aWYgKG5ld19kbV9zdGF0ZSAmJiBvbGRfZG1fc3RhdGUpIHsKPiA+ID4gPiA+Pj4gLSAgICAgICAg ICAgIGlmIChuZXdfZG1fc3RhdGUtPmNvbnRleHQpCj4gPiA+ID4gPj4+IC0gICAgICAgICAgICAg ICAgZGNfcmVsZWFzZV9zdGF0ZShuZXdfZG1fc3RhdGUtPmNvbnRleHQpOwo+ID4gPiA+ID4+PiAr ICAgICAgICAgICAgaWYgKG9iai0+ZnVuY3MgPT0gYWRldi0+ZG0uYXRvbWljX29iai5mdW5jcykg ewo+ID4gPiA+ID4+PiArICAgICAgICAgICAgICAgIGludCBqID0gc3RhdGUtPm51bV9wcml2YXRl X29ianMtMTsKPiA+ID4gPiA+Pj4KPiA+ID4gPiA+Pj4gLSAgICAgICAgICAgIG5ld19kbV9zdGF0 ZS0+Y29udGV4dCA9IG9sZF9kbV9zdGF0ZS0+Y29udGV4dDsKPiA+ID4gPiA+Pj4gKyAgICAgICAg ICAgICAgICBkbV9hdG9taWNfZGVzdHJveV9zdGF0ZShvYmosCj4gPiA+ID4gPj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICBzdGF0ZS0+cHJpdmF0ZV9vYmpzW2ldLnN0YXRlKTsKPiA+ID4gPiA+ Pj4gKwo+ID4gPiA+ID4+PiArICAgICAgICAgICAgICAgIC8qIElmIGkgaXMgbm90IGF0IHRoZSBl bmQgb2YgdGhlIGFycmF5IHRoZW4gdGhlCj4gPiA+ID4gPj4+ICsgICAgICAgICAgICAgICAgICog bGFzdCBlbGVtZW50IG5lZWRzIHRvIGJlIG1vdmVkIHRvIHdoZXJlIGkgd2FzCj4gPiA+ID4gPj4+ ICsgICAgICAgICAgICAgICAgICogYmVmb3JlIHRoZSBhcnJheSBjYW4gc2FmZWx5IGJlIHRydW5j YXRlZC4KPiA+ID4gPiA+Pj4gKyAgICAgICAgICAgICAgICAgKi8KPiA+ID4gPiA+Pj4gKyAgICAg ICAgICAgICAgICBpZiAoaSAhPSBqKQo+ID4gPiA+ID4+PiArICAgICAgICAgICAgICAgICAgICBz dGF0ZS0+cHJpdmF0ZV9vYmpzW2ldID0KPiA+ID4gPiA+Pj4gKyAgICAgICAgICAgICAgICAgICAg ICAgIHN0YXRlLT5wcml2YXRlX29ianNbal07Cj4gPiA+ID4gPj4+Cj4gPiA+ID4gPj4+IC0gICAg ICAgICAgICBpZiAob2xkX2RtX3N0YXRlLT5jb250ZXh0KQo+ID4gPiA+ID4+PiAtICAgICAgICAg ICAgICAgIGRjX3JldGFpbl9zdGF0ZShvbGRfZG1fc3RhdGUtPmNvbnRleHQpOwo+ID4gPiA+ID4+ PiArICAgICAgICAgICAgICAgIHN0YXRlLT5wcml2YXRlX29ianNbal0ucHRyID0gTlVMTDsKPiA+ ID4gPiA+Pj4gKyAgICAgICAgICAgICAgICBzdGF0ZS0+cHJpdmF0ZV9vYmpzW2pdLnN0YXRlID0g TlVMTDsKPiA+ID4gPiA+Pj4gKyAgICAgICAgICAgICAgICBzdGF0ZS0+cHJpdmF0ZV9vYmpzW2pd Lm9sZF9zdGF0ZSA9IE5VTEw7Cj4gPiA+ID4gPj4+ICsgICAgICAgICAgICAgICAgc3RhdGUtPnBy aXZhdGVfb2Jqc1tqXS5uZXdfc3RhdGUgPSBOVUxMOwo+ID4gPiA+ID4+PiArCj4gPiA+ID4gPj4+ ICsgICAgICAgICAgICAgICAgc3RhdGUtPm51bV9wcml2YXRlX29ianMgPSBqOwo+ID4gPiA+ID4+ PiArICAgICAgICAgICAgICAgIGJyZWFrOwo+ID4gPiA+ID4+PiArICAgICAgICAgICAgfQo+ID4g PiA+ID4+PiAgICAgICAgICAgfQo+ID4gPiA+ID4+PiAgICAgICB9Cj4gPiA+ID4gPj4+Cj4gPiA+ ID4gPj4+IC0tCj4gPiA+ID4gPj4+IDIuMjcuMAo+ID4gPiA+ID4+Pgo+ID4gPiA+ID4+Cj4gPiA+ ID4gPgo+ID4gPiA+Cj4gPiA+ID4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KPiA+ID4gPiBkcmktZGV2ZWwgbWFpbGluZyBsaXN0Cj4gPiA+ID4gZHJpLWRl dmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+ID4gPiA+IGh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0 b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCj4gPiA+Cj4gPiA+Cj4gPiA+Cj4gPiA+ IC0tCj4gPiA+IERhbmllbCBWZXR0ZXIKPiA+ID4gU29mdHdhcmUgRW5naW5lZXIsIEludGVsIENv cnBvcmF0aW9uCj4gPiA+IGh0dHA6Ly9ibG9nLmZmd2xsLmNoCj4KPgo+Cj4gLS0KPiBEYW5pZWwg VmV0dGVyCj4gU29mdHdhcmUgRW5naW5lZXIsIEludGVsIENvcnBvcmF0aW9uCj4gaHR0cDovL2Js b2cuZmZ3bGwuY2gKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3Jn Cmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVs Cg== 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.8 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,HK_RANDOM_FROM,HK_RANDOM_REPLYTO,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=no 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 245E0C433EB for ; Tue, 28 Jul 2020 07:41:27 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 EF52F21D95 for ; Tue, 28 Jul 2020 07:41:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=protonmail.com header.i=@protonmail.com header.b="WPaKlK87" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EF52F21D95 Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=protonmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=amd-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 0E57E6E1F6; Tue, 28 Jul 2020 07:41:22 +0000 (UTC) Received: from mail-40141.protonmail.ch (mail-40141.protonmail.ch [185.70.40.141]) by gabe.freedesktop.org (Postfix) with ESMTPS id 507D46E137 for ; Mon, 27 Jul 2020 23:42:23 +0000 (UTC) Date: Mon, 27 Jul 2020 23:42:14 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com; s=protonmail; t=1595893340; bh=AQmh+uIpMfdES2g/A6HYV2B7dFrVRubFbvwlphZUT8g=; h=Date:To:From:Cc:Reply-To:Subject:In-Reply-To:References:From; b=WPaKlK87v5tMlYboefBGF39WRaUFU27b7wQRzJkJ9uB7fbY/ytSsgHkgcbkkq8cfV /OJfCX1otKSQfRrp98/he37W9RmEybcs/bJZU4qBd4/ja2FdEBxx0mVv06ZN9wj9JT W/xhMBV3amEPPZj0xrA5KyRlcMg2flG8EQszcoG4= To: Daniel Vetter From: Mazin Rezk Subject: Re: [PATCH] drm/amd/display: Clear dm_state for fast updates Message-ID: In-Reply-To: References: <3b7e3e50-2ff7-eff3-2ffc-abaa4b36ce7f@amd.com> MIME-Version: 1.0 X-Mailman-Approved-At: Tue, 28 Jul 2020 07:41:20 +0000 X-BeenThere: amd-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Discussion list for AMD gfx List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Mazin Rezk Cc: Paul Menzel , "mphantomx@yahoo.com.br" , Duncan <1i5t5.duncan@cox.net>, Kees Cook , "sunpeng.li@amd.com" , Mazin Rezk , "linux-kernel@vger.kernel.org" , "dri-devel@lists.freedesktop.org" , "Kazlauskas, Nicholas" , "regressions@leemhuis.info" , "amd-gfx@lists.freedesktop.org" , Alexander Deucher , Andrew Morton , "anthony.ruhier@gmail.com" , =?utf-8?Q?Christian_K=C3=B6nig?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: amd-gfx-bounces@lists.freedesktop.org Sender: "amd-gfx" T24gTW9uZGF5LCBKdWx5IDI3LCAyMDIwIDU6MzIgUE0sIERhbmllbCBWZXR0ZXIgPGRhbmllbEBm ZndsbC5jaD4gd3JvdGU6Cgo+IE9uIE1vbiwgSnVsIDI3LCAyMDIwIGF0IDExOjExIFBNIE1hemlu IFJlemsgPG1ucnprQHByb3Rvbm1haWwuY29tPiB3cm90ZToKPiA+Cj4gPiBPbiBNb25kYXksIEp1 bHkgMjcsIDIwMjAgNDoyOSBQTSwgRGFuaWVsIFZldHRlciA8ZGFuaWVsQGZmd2xsLmNoPiB3cm90 ZToKPiA+Cj4gPiA+IE9uIE1vbiwgSnVsIDI3LCAyMDIwIGF0IDk6MjggUE0gQ2hyaXN0aWFuIEvD tm5pZwo+ID4gPiA8Y2hyaXN0aWFuLmtvZW5pZ0BhbWQuY29tPiB3cm90ZToKPiA+ID4gPgo+ID4g PiA+IEFtIDI3LjA3LjIwIHVtIDE2OjA1IHNjaHJpZWIgS2F6bGF1c2thcywgTmljaG9sYXM6Cj4g PiA+ID4gPiBPbiAyMDIwLTA3LTI3IDk6MzkgYS5tLiwgQ2hyaXN0aWFuIEvDtm5pZyB3cm90ZToK PiA+ID4gPiA+PiBBbSAyNy4wNy4yMCB1bSAwNzo0MCBzY2hyaWViIE1hemluIFJlems6Cj4gPiA+ ID4gPj4+IFRoaXMgcGF0Y2ggZml4ZXMgYSByYWNlIGNvbmRpdGlvbiB0aGF0IGNhdXNlcyBhIHVz ZS1hZnRlci1mcmVlIGR1cmluZwo+ID4gPiA+ID4+PiBhbWRncHVfZG1fYXRvbWljX2NvbW1pdF90 YWlsLiBUaGlzIGNhbiBvY2N1ciB3aGVuIDIgbm9uLWJsb2NraW5nCj4gPiA+ID4gPj4+IGNvbW1p dHMKPiA+ID4gPiA+Pj4gYXJlIHJlcXVlc3RlZCBhbmQgdGhlIHNlY29uZCBvbmUgZmluaXNoZXMg YmVmb3JlIHRoZSBmaXJzdC4KPiA+ID4gPiA+Pj4gRXNzZW50aWFsbHksCj4gPiA+ID4gPj4+IHRo aXMgYnVnIG9jY3VycyB3aGVuIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2Ugb2YgZXZlbnRzIGhhcHBl bnM6Cj4gPiA+ID4gPj4+Cj4gPiA+ID4gPj4+IDEuIE5vbi1ibG9ja2luZyBjb21taXQgIzEgaXMg cmVxdWVzdGVkIHcvIGEgbmV3IGRtX3N0YXRlICMxIGFuZCBpcwo+ID4gPiA+ID4+PiBkZWZlcnJl ZCB0byB0aGUgd29ya3F1ZXVlLgo+ID4gPiA+ID4+Pgo+ID4gPiA+ID4+PiAyLiBOb24tYmxvY2tp bmcgY29tbWl0ICMyIGlzIHJlcXVlc3RlZCB3LyBhIG5ldyBkbV9zdGF0ZSAjMiBhbmQgaXMKPiA+ ID4gPiA+Pj4gZGVmZXJyZWQgdG8gdGhlIHdvcmtxdWV1ZS4KPiA+ID4gPiA+Pj4KPiA+ID4gPiA+ Pj4gMy4gQ29tbWl0ICMyIHN0YXJ0cyBiZWZvcmUgY29tbWl0ICMxLCBkbV9zdGF0ZSAjMSBpcyB1 c2VkIGluIHRoZQo+ID4gPiA+ID4+PiBjb21taXRfdGFpbCBhbmQgY29tbWl0ICMyIGNvbXBsZXRl cywgZnJlZWluZyBkbV9zdGF0ZSAjMS4KPiA+ID4gPiA+Pj4KPiA+ID4gPiA+Pj4gNC4gQ29tbWl0 ICMxIHN0YXJ0cyBhZnRlciBjb21taXQgIzIgY29tcGxldGVzLCB1c2VzIHRoZSBmcmVlZCBkbV9z dGF0ZQo+ID4gPiA+ID4+PiAxIGFuZCBkZXJlZmVyZW5jZXMgYSBmcmVlbGlzdCBwb2ludGVyIHdo aWxlIHNldHRpbmcgdGhlIGNvbnRleHQuCj4gPiA+ID4gPj4KPiA+ID4gPiA+PiBXZWxsIEkgb25s eSBoYXZlIGEgb25lIG1pbGUgaGlnaCB2aWV3IG9uIHRoaXMsIGJ1dCB3aHkgZG9uJ3QgeW91IGxl dAo+ID4gPiA+ID4+IHRoZSB3b3JrIGl0ZW1zIGV4ZWN1dGUgaW4gb3JkZXI/Cj4gPiA+ID4gPj4K PiA+ID4gPiA+PiBUaGF0IHdvdWxkIGJlIGJldHRlciBhbnl3YXkgY2F1c2UgdGhpcyB3YXkgd2Ug ZG9uJ3QgdHJpZ2dlciBhIGNhY2hlCj4gPiA+ID4gPj4gbGluZSBwaW5nIHBvbmcgYmV0d2VlbiBD UFVzLgo+ID4gPiA+ID4+Cj4gPiA+ID4gPj4gQ2hyaXN0aWFuLgo+ID4gPiA+ID4KPiA+ID4gPiA+ IFdlIHVzZSB0aGUgRFJNIGhlbHBlcnMgZm9yIG1hbmFnaW5nIGRybV9hdG9taWNfY29tbWl0X3N0 YXRlIGFuZCB0aG9zZQo+ID4gPiA+ID4gaGVscGVycyBpbnRlcm5hbGx5IHB1c2ggbm9uLWJsb2Nr aW5nIGNvbW1pdCB3b3JrIGludG8gdGhlIHN5c3RlbQo+ID4gPiA+ID4gdW5ib3VuZCB3b3JrIHF1 ZXVlLgo+ID4gPiA+Cj4gPiA+ID4gTWhtLCB3ZWxsIGlmIHlvdSBzZW5kIHRob3NlIGhlbHBlciBh dG9taWMgY29tbWl0cyBpbiB0aGUgb3JkZXIgQSxCIGFuZAo+ID4gPiA+IHRoZXkgZXhlY3V0ZSBp dCBpbiB0aGUgb3JkZXIgQixBIEkgd291bGQgY2FsbCB0aGF0IGEgYnVnIDopCj4gPiA+Cj4gPiA+ IFRoZSB3YXkgaXQgd29ya3MgaXMgaXQgcHVzaGVzIGFsbCBjb21taXRzIGludG8gdW5ib3VuZCB3 b3JrIHF1ZXVlLCBidXQKPiA+ID4gdGhlbiBmb3JjZXMgc2VyaWFsaXphdGlvbiBhcyBuZWVkZWQu IFdlIGRvIF9ub3RfIHdhbnQgZS5nLiB1cGRhdGVzIG9uCj4gPiA+IGRpZmZlcmVudCBDUlRDIHRv IGJlIHNlcmlhbGl6ZWQsIHRoYXQgd291bGQgcmVzdWx0IGluIGxvdHMgb2YganVkZGVyLgo+ID4g PiBBbmQgaHcgaXMgZnVubnkgZW5vdWdoIHRoYXQgdGhlcmUncyBhbGwga2luZHMgb2YgZGVwZW5k ZW5jaWVzLgo+ID4gPgo+ID4gPiBUaGUgd2F5IHlvdSBmb3JjZSBzeW5jaHJvbml6YXRpb24gaXMg YnkgYWRkaW5nIG90aGVyIENSVEMgc3RhdGUKPiA+ID4gb2JqZWN0cy4gU28gaWYgREMgaXMgYnVz dGVkIGFuZCBjYW4gb25seSBoYW5kbGUgYSBzaW5nbGUgdXBkYXRlIHBlcgo+ID4gPiB3b3JrIGl0 ZW0sIHRoZW4gSSBndWVzcyB5b3UgYWx3YXlzIG5lZWQgYWxsIENSVEMgc3RhdGVzIGFuZCBldmVy eXRoaW5nCj4gPiA+IHdpbGwgYmUgcnVuIGluIG9yZGVyLiBCdXQgdGhhdCBhbHNvIHRvdGFsbHkg a2lsbHMgbW9kZXJuIG11bHRpLXNjcmVlbgo+ID4gPiBjb21wb3NpdG9ycy4gWG9yZyBpc24ndCBt b2Rlcm4sIGp1c3QgaW4gY2FzZSB0aGF0J3Mgbm90IGNsZWFyIDotKQo+ID4gPgo+ID4gPiBMdWNr aW5nIGF0IHRoZSBjb2RlIGl0IHNlZW1zIGxpa2UgeW91IGluZGVlZCBoYXZlIG9ubHkgYSBzaW5n bGUgZG0KPiA+ID4gc3RhdGUsIHNvIHllYWggZ2xvYmFsIHN5bmMgaXMgd2hhdCB5b3UnbGwgbmVl ZCBhcyBpbW1lZGlhdGUgZml4LCBhbmQKPiA+ID4gdGhlbiBtYXliZSBmaXggdXAgRE0gdG8gbm90 IGJlIHF1aXRlIHNvIHNpbGx5IC4uLiBvciBhdCBsZWFzdCBvbmx5IGRvCj4gPiA+IHRoZSBkbSBz dGF0ZSBzdHVmZiB3aGVuIHJlYWxseSBuZWVkZWQuCj4gPiA+Cj4gPiA+IFdlIGNvdWxkIGFsc28g c3ByaW5rbGUgdGhlIGRybV9jcnRjX2NvbW1pdCBzdHJ1Y3R1cmUgYXJvdW5kIGEgYml0Cj4gPiA+ IChpdCdzIHRoZSBnbHVlIHRoYXQgcHJvdmlkZXMgdGhlIHN5bmNocm9uaXphdGlvbiBhY3Jvc3Mg Y29tbWl0cyksIGJ1dAo+ID4gPiBzaW5jZSB5b3VyIGRtIHN0YXRlIGlzIGdsb2JhbCBqdXN0IGdy YWJiaW5nIGFsbCBjcnRjIHN0YXRlcwo+ID4gPiB1bmNvbmRpdGlvbmFsbHkgYXMgcGFydCBvZiB0 aGF0IGlzIHByb2JhYmx5IGJlc3QuCj4gPiA+Cj4gPiA+ID4gPiBXaGlsZSB3ZSBjb3VsZCBkdXBs aWNhdGUgYSBjb3B5IG9mIHRoYXQgY29kZSB3aXRoIG5vdGhpbmcgYnV0IHRoZQo+ID4gPiA+ID4g d29ya3F1ZXVlIGNoYW5nZWQgdGhhdCBpc24ndCBzb21ldGhpbmcgSSdkIHJlYWxseSBsaWtlIHRv IG1haW50YWluCj4gPiA+ID4gPiBnb2luZyBmb3J3YXJkLgo+ID4gPiA+Cj4gPiA+ID4gSSdtIG5v dCB0YWxraW5nIGFib3V0IGR1cGxpY2F0aW5nIHRoZSBjb2RlLCBJJ20gdGFsa2luZyBhYm91dCBm aXhpbmcgdGhlCj4gPiA+ID4gaGVscGVycy4gSSBkb24ndCBrbm93IHRoYXQgY29kZSB3ZWxsLCBi dXQgZnJvbSB0aGUgb3V0c2lkZSBpdCBzb3VuZHMKPiA+ID4gPiBsaWtlIGEgYnVnIHRoZXJlLgo+ ID4gPiA+Cj4gPiA+ID4gQW5kIGV4ZWN1dGluZyB3b3JrIGl0ZW1zIGluIHRoZSBvcmRlciB0aGV5 IGFyZSBzdWJtaXR0ZWQgaXMgdHJpdmlhbC4KPiA+ID4gPgo+ID4gPiA+IEhhZCBhbnlib2R5IHBp bmdlZCBEYW5pZWwgb3Igb3RoZXIgcGVvcGxlIGZhbWlsaWFyIHdpdGggdGhlIGhlbHBlciBjb2Rl Cj4gPiA+ID4gYWJvdXQgaXQ/Cj4gPiA+Cj4gPiA+IFllYWggc29tZXRoaW5nIGlzIHdyb25nIGhl cmUsIGFuZCB0aGUgZml4IGxvb2tzIGhvcnJpYmxlIDotKQo+ID4gPgo+ID4gPiBBc2lkZSwgSSd2 ZSBhbHNvIHNlZW4gc29tZSByZWNlbnQgZGlzY3Vzc2lvbiBmbGFyZSB1cCBhYm91dAo+ID4gPiBk cm1fYXRvbWljX3N0YXRlX2dldC9wdXQgdXNlZCB0byBwYXBlciBvdmVyIHNvbWUgb3RoZXIgdXNl LWFmdGVyLWZyZWUsCj4gPiA+IGJ1dCB0aGlzIHRpbWUgcmVsYXRlZCB0byBpbnRlcnJ1cHQgaGFu ZGxlcnMuIE1heWJlIGEgZmV3IHJ1bGVzIGFib3V0Cj4gPiA+IHRoYXQ6Cj4gPiA+IC0gZG9udAo+ ID4gPiAtIGVzcGVjaWFsbHkgbm90IHdoZW4gaXQncyBpbnRlcnJ1cHQgaGFuZGxlcnMsIGJlY2F1 c2UgeW91IGNhbid0IGNhbGwKPiA+ID4gZHJtX2F0b21pY19zdGF0ZV9wdXQgZnJvbSBpbnRlcnJ1 cHQgaGFuZGxlcnMuCj4gPiA+Cj4gPiA+IEluc3RlYWQgaGF2ZSBhbiBzcGluX2xvY2tfaXJxIHRv IHByb3RlY3QgdGhlIHNoYXJlZCBkYXRlIHdpdGggeW91cgo+ID4gPiBpbnRlcnJ1cHQgaGFuZGxl ciwgYW5kIF9jb3B5XyB0aGUgZGF0ZSBvdmVyLiBUaGlzIGlzIGUuZy4gd2hhdAo+ID4gPiBkcm1f Y3J0Y19hcm1fdmJsYW5rX2V2ZW50IGRvZXMuCj4gPgo+ID4gTmljaG9sYXMgd3JvdGUgYSBwYXRj aCB0aGF0IGF0dGVtcHRlZCB0byByZXNvbHZlIHRoZSBpc3N1ZSBieSBhZGRpbmcgZXZlcnkKPiA+ IENSVEMgaW50byB0aGUgY29tbWl0IHRvIHVzZSB1c2UgdGhlIHN0YWxsIGNoZWNrcy4gWzFdIFdo aWxlIHRoaXMgZm9yY2VzCj4gPiBzeW5jaHJvbmlzYXRpb24gb24gY29tbWl0cywgaXQncyBraW5k IG9mIGEgaGFja3kgbWV0aG9kIHRoYXQgbWF5IHRha2UgYQo+ID4gdG9sbCBvbiBwZXJmb3JtYW5j ZS4KPiA+Cj4gPiBJcyBpdCBwb3NzaWJsZSB0byBoYXZlIGEgRFJNIGhlbHBlciB0aGF0IGZvcmNl cyBzeW5jaHJvbmlzYXRpb24gb24gc29tZQo+ID4gY29tbWl0cyB3aXRob3V0IGhhdmluZyB0byBh ZGQgZXZlcnkgQ1JUQyBpbnRvIHRoZSBjb21taXQ/Cj4gPgo+ID4gQWxzbywgaXMgc3luY2hyb25p c2F0aW9uIHJlYWxseSBuZWNlc3NhcnkgZm9yIGZhc3QgdXBkYXRlcyBpbiBhbWRncHU/Cj4gPiBJ J2xsIGFkbWl0LCB0aGUgaWRlYSBvZiBlbGltaW5hdGluZyB0aGUgdXNlLWFmdGVyLWZyZWUgYnVn IGJ5IGVsaW1pbmF0aW5nCj4gPiB0aGUgdXNlIGVudGlyZWx5IGRvZXNuJ3Qgc2VlbSBpZGVhbDsg YnV0IGlzIGZvcmNpbmcgc3luY2hyb25pc2F0aW9uIG9uCj4gPiB0aGVzZSB1cGRhdGVzIHRoYXQg bXVjaCBiZXR0ZXI/Cj4KPiBXZWxsIGNsZWFyaW5nIHRoZSBkY19zdGF0ZSBwb2ludGVyIGhlcmUg YW5kIHRoZW4gYWxsb2NhdGluZyBhbm90aGVyCj4gb25lIGluIGF0b21pY19jb21taXRfdGFpbCBh bHNvIGxvb2tzIGZpc2h5LiBUaGUgcHJvcGVyIGZpeCBpcyBwcm9iYWJseQo+IGEgbG90IG1vcmUg aW52b2x2ZWQsIGJ1dCB5ZWFoIGludGVyaW0gZml4IGlzIHRvIGdyYWIgYWxsIGNydGMgc3RhdGVz Cj4gaWZmIHlvdSBhbHNvIGdyYWJiZWQgdGhlIGRtX2F0b21pY19zdGF0ZSBzdHJ1Y3R1cmUuIFJl YWwgZml4IGlzIHRvCj4gb25seSBkbyB0aGlzIHdoZW4gbmVjZXNzYXJ5LCB3aGljaCBwcmV0dHkg bXVjaCBtZWFucyB0aGUgZGNfc3RhdGUKPiBuZWVkcyB0byBiZSBzb21laG93IHNwbGl0IHVwLCBv ciB0aGVyZSBuZWVkcyB0byBiZSBzb21lIGd1YXJhbnRlZXMKPiBhYm91dCB3aGVuIGl0J3MgbmVj ZXNzYXJ5IGFuZCB3aGVuIG5vdC4gT3RoZXJ3aXNlIHBhcmFsbGVsIGNvbW1pdHMgb24KPiBkaWZm ZXJlbnQgQ1JUQyBhcmUgbm90IHBvc3NpYmxlIHdpdGggdGhlIGN1cnJlbnQgZGMgYmFja2VuZCBj b2RlLgoKSW4gdGhhdCBjYXNlLCBJJ2xsIHRlc3Qgb3V0IE5pY2hvbGFzJyBwYXRjaCByaWdodCBu b3cgYW5kIHNlZSBpZiBpdCB3b3Jrcy4KVW5saWtlIER1bmNhbiwgc29tZXRoaW5nIGFib3V0IG15 IHNldHVwIHNlZW1zIHRvIHRyaWdnZXIgdGhlIGJ1ZyByYXRoZXIKcXVpY2tseSwgc28gSSBzaG91 bGQgYmUgYWJsZSB0byB0ZWxsIGlmIGl0IHdvcmtzIGluIHRoZSBuZXh0IGNvdXBsZSBvZgpob3Vy cyB3aXRoIGEgcmVhc29uYWJsZSBkZWdyZWUgb2YgYWNjdXJhY3kuCgpUaGFua3MsCk1hemluIFJl emsKCj4KPiBTZWUgYWxzbyBteSBkbWEtZmVuY2UgYW5ub3RhdGlvbiBmaXh1cCBwYXRjaCwgdGhl cmUgZGNfc3RhdGUgYWxzbyBnZXRzCj4gaW4gdGhlIHdheToKPgo+IGh0dHBzOi8vbG9yZS5rZXJu ZWwub3JnL2RyaS1kZXZlbC8yMDIwMDcwNzIwMTIyOS40NzI4MzQtMjEtZGFuaWVsLnZldHRlckBm ZndsbC5jaC8KPgo+IE5pY2hvbGFzLCBidHcgSSdtIHN0aWxsIHdhaXRpbmcgZm9yIHNvbWUgZGMg ZmVlZGJhY2sgb24gdGhhdCBlbnRpcmUKPiBzZXJpZXMsIGFuZCB3aGF0L2lmIHRoZXJlJ3MgcGxh bnMgdG8gZml4IHRoZXNlIGlzc3VlcyBwcm9wZXJseS4KPgo+IE1heWJlIGV2ZW4gZ29pbmcgYmFj ayB0byB0aGUgc3ViY2xhc3NlZCBkcm1fYXRvbWljX3N0YXRlIG1pZ2h0IGJlCj4gYmV0dGVyIHRo YW4gd2hhdCB3ZSBjdXJyZW50bHkgaGF2ZS4KPiAtRGFuaWVsCj4gPgo+ID4gWzFdIGh0dHBzOi8v YnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjA3MzgzI2M5Ngo+ID4KPiA+IFRo YW5rcywKPiA+IE1hemluIFJlemsKPiA+Cj4gPiA+Cj4gPiA+IENoZWVycywgRGFuaWVsCj4gPiA+ Cj4gPiA+ID4KPiA+ID4gPiBSZWdhcmRzLAo+ID4gPiA+IENocmlzdGlhbi4KPiA+ID4gPgo+ID4g PiA+ID4KPiA+ID4gPiA+IFJlZ2FyZHMsCj4gPiA+ID4gPiBOaWNob2xhcyBLYXpsYXVza2FzCj4g PiA+ID4gPgo+ID4gPiA+ID4+Cj4gPiA+ID4gPj4+Cj4gPiA+ID4gPj4+IFNpbmNlIHRoaXMgYnVn IGhhcyBvbmx5IGJlZW4gc3BvdHRlZCB3aXRoIGZhc3QgY29tbWl0cywgdGhpcyBwYXRjaAo+ID4g PiA+ID4+PiBmaXhlcwo+ID4gPiA+ID4+PiB0aGUgYnVnIGJ5IGNsZWFyaW5nIHRoZSBkbV9zdGF0 ZSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBvbGQgZGNfc3RhdGUgZm9yCj4gPiA+ID4gPj4+IGZhc3Qg dXBkYXRlcy4gSW4gYWRkaXRpb24sIHNpbmNlIGRtX3N0YXRlIGlzIG9ubHkgdXNlZCBmb3IgaXRz IGRjX3N0YXRlCj4gPiA+ID4gPj4+IGFuZCBhbWRncHVfZG1fYXRvbWljX2NvbW1pdF90YWlsIHdp bGwgcmV0YWluIHRoZSBkY19zdGF0ZSBpZiBub25lIGlzCj4gPiA+ID4gPj4+IGZvdW5kLAo+ID4g PiA+ID4+PiByZW1vdmluZyB0aGUgZG1fc3RhdGUgc2hvdWxkIG5vdCBoYXZlIGFueSBjb25zZXF1 ZW5jZXMgaW4gZmFzdCB1cGRhdGVzLgo+ID4gPiA+ID4+Pgo+ID4gPiA+ID4+PiBUaGlzIHVzZS1h ZnRlci1mcmVlIGJ1ZyBoYXMgZXhpc3RlZCBmb3IgYSB3aGlsZSBub3csIGJ1dCBvbmx5IGNhdXNl ZCBhCj4gPiA+ID4gPj4+IG5vdGljZWFibGUgaXNzdWUgc3RhcnRpbmcgZnJvbSA1LjctcmMxIGR1 ZSB0byAzMjAyZmE2MmYgKCJzbHViOgo+ID4gPiA+ID4+PiByZWxvY2F0ZQo+ID4gPiA+ID4+PiBm cmVlbGlzdCBwb2ludGVyIHRvIG1pZGRsZSBvZiBvYmplY3QiKSBtb3ZpbmcgdGhlIGZyZWVsaXN0 IHBvaW50ZXIgZnJvbQo+ID4gPiA+ID4+PiBkbV9zdGF0ZS0+YmFzZSAod2hpY2ggd2FzIHVudXNl ZCkgdG8gZG1fc3RhdGUtPmNvbnRleHQgKHdoaWNoIGlzCj4gPiA+ID4gPj4+IGRlcmVmZXJlbmNl ZCkuCj4gPiA+ID4gPj4+Cj4gPiA+ID4gPj4+IEJ1Z3ppbGxhOiBodHRwczovL2J1Z3ppbGxhLmtl cm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTIwNzM4Mwo+ID4gPiA+ID4+PiBGaXhlczogYmQyMDBk MTkwZjQ1ICgiZHJtL2FtZC9kaXNwbGF5OiBEb24ndCByZXBsYWNlIHRoZSBkY19zdGF0ZQo+ID4g PiA+ID4+PiBmb3IgZmFzdCB1cGRhdGVzIikKPiA+ID4gPiA+Pj4gUmVwb3J0ZWQtYnk6IER1bmNh biA8MWk1dDUuZHVuY2FuQGNveC5uZXQ+Cj4gPiA+ID4gPj4+IFNpZ25lZC1vZmYtYnk6IE1hemlu IFJlemsgPG1ucnprQHByb3Rvbm1haWwuY29tPgo+ID4gPiA+ID4+PiAtLS0KPiA+ID4gPiA+Pj4g ICAuLi4vZ3B1L2RybS9hbWQvZGlzcGxheS9hbWRncHVfZG0vYW1kZ3B1X2RtLmMgfCAzNgo+ID4g PiA+ID4+PiArKysrKysrKysrKysrKy0tLS0tCj4gPiA+ID4gPj4+ICAgMSBmaWxlIGNoYW5nZWQs IDI3IGluc2VydGlvbnMoKyksIDkgZGVsZXRpb25zKC0pCj4gPiA+ID4gPj4+Cj4gPiA+ID4gPj4+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2Rpc3BsYXkvYW1kZ3B1X2RtL2FtZGdw dV9kbS5jCj4gPiA+ID4gPj4+IGIvZHJpdmVycy9ncHUvZHJtL2FtZC9kaXNwbGF5L2FtZGdwdV9k bS9hbWRncHVfZG0uYwo+ID4gPiA+ID4+PiBpbmRleCA4NmZmYTBjMjg4MGYuLjcxMGVkYzcwZTM3 ZSAxMDA2NDQKPiA+ID4gPiA+Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9kaXNwbGF5L2Ft ZGdwdV9kbS9hbWRncHVfZG0uYwo+ID4gPiA+ID4+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1k L2Rpc3BsYXkvYW1kZ3B1X2RtL2FtZGdwdV9kbS5jCj4gPiA+ID4gPj4+IEBAIC04NzE3LDIwICs4 NzE3LDM4IEBAIHN0YXRpYyBpbnQgYW1kZ3B1X2RtX2F0b21pY19jaGVjayhzdHJ1Y3QKPiA+ID4g PiA+Pj4gZHJtX2RldmljZSAqZGV2LAo+ID4gPiA+ID4+PiAgICAgICAgICAgICogdGhlIHNhbWUg cmVzb3VyY2UuIElmIHdlIGhhdmUgYSBuZXcgREMgY29udGV4dCBhcyBwYXJ0IG9mCj4gPiA+ID4g Pj4+ICAgICAgICAgICAgKiB0aGUgRE0gYXRvbWljIHN0YXRlIGZyb20gdmFsaWRhdGlvbiB3ZSBu ZWVkIHRvIGZyZWUgaXQgYW5kCj4gPiA+ID4gPj4+ICAgICAgICAgICAgKiByZXRhaW4gdGhlIGV4 aXN0aW5nIG9uZSBpbnN0ZWFkLgo+ID4gPiA+ID4+PiArICAgICAgICAgKgo+ID4gPiA+ID4+PiAr ICAgICAgICAgKiBGdXJ0aGVybW9yZSwgc2luY2UgdGhlIERNIGF0b21pYyBzdGF0ZSBvbmx5IGNv bnRhaW5zIHRoZSBEQwo+ID4gPiA+ID4+PiArICAgICAgICAgKiBjb250ZXh0IGFuZCBjYW4gc2Fm ZWx5IGJlIGFubnVsbGVkLCB3ZSBjYW4gZnJlZSB0aGUgc3RhdGUKPiA+ID4gPiA+Pj4gKyAgICAg ICAgICogYW5kIGNsZWFyIHRoZSBhc3NvY2lhdGVkIHByaXZhdGUgb2JqZWN0IG5vdyB0byBmcmVl Cj4gPiA+ID4gPj4+ICsgICAgICAgICAqIHNvbWUgbWVtb3J5IGFuZCBhdm9pZCBhIHBvc3NpYmxl IHVzZS1hZnRlci1mcmVlIGxhdGVyLgo+ID4gPiA+ID4+PiAgICAgICAgICAgICovCj4gPiA+ID4g Pj4+IC0gICAgICAgIHN0cnVjdCBkbV9hdG9taWNfc3RhdGUgKm5ld19kbV9zdGF0ZSwgKm9sZF9k bV9zdGF0ZTsKPiA+ID4gPiA+Pj4KPiA+ID4gPiA+Pj4gLSAgICAgICAgbmV3X2RtX3N0YXRlID0g ZG1fYXRvbWljX2dldF9uZXdfc3RhdGUoc3RhdGUpOwo+ID4gPiA+ID4+PiAtICAgICAgICBvbGRf ZG1fc3RhdGUgPSBkbV9hdG9taWNfZ2V0X29sZF9zdGF0ZShzdGF0ZSk7Cj4gPiA+ID4gPj4+ICsg ICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+bnVtX3ByaXZhdGVfb2JqczsgaSsrKSB7Cj4g PiA+ID4gPj4+ICsgICAgICAgICAgICBzdHJ1Y3QgZHJtX3ByaXZhdGVfb2JqICpvYmogPSBzdGF0 ZS0+cHJpdmF0ZV9vYmpzW2ldLnB0cjsKPiA+ID4gPiA+Pj4KPiA+ID4gPiA+Pj4gLSAgICAgICAg aWYgKG5ld19kbV9zdGF0ZSAmJiBvbGRfZG1fc3RhdGUpIHsKPiA+ID4gPiA+Pj4gLSAgICAgICAg ICAgIGlmIChuZXdfZG1fc3RhdGUtPmNvbnRleHQpCj4gPiA+ID4gPj4+IC0gICAgICAgICAgICAg ICAgZGNfcmVsZWFzZV9zdGF0ZShuZXdfZG1fc3RhdGUtPmNvbnRleHQpOwo+ID4gPiA+ID4+PiAr ICAgICAgICAgICAgaWYgKG9iai0+ZnVuY3MgPT0gYWRldi0+ZG0uYXRvbWljX29iai5mdW5jcykg ewo+ID4gPiA+ID4+PiArICAgICAgICAgICAgICAgIGludCBqID0gc3RhdGUtPm51bV9wcml2YXRl X29ianMtMTsKPiA+ID4gPiA+Pj4KPiA+ID4gPiA+Pj4gLSAgICAgICAgICAgIG5ld19kbV9zdGF0 ZS0+Y29udGV4dCA9IG9sZF9kbV9zdGF0ZS0+Y29udGV4dDsKPiA+ID4gPiA+Pj4gKyAgICAgICAg ICAgICAgICBkbV9hdG9taWNfZGVzdHJveV9zdGF0ZShvYmosCj4gPiA+ID4gPj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICBzdGF0ZS0+cHJpdmF0ZV9vYmpzW2ldLnN0YXRlKTsKPiA+ID4gPiA+ Pj4gKwo+ID4gPiA+ID4+PiArICAgICAgICAgICAgICAgIC8qIElmIGkgaXMgbm90IGF0IHRoZSBl bmQgb2YgdGhlIGFycmF5IHRoZW4gdGhlCj4gPiA+ID4gPj4+ICsgICAgICAgICAgICAgICAgICog bGFzdCBlbGVtZW50IG5lZWRzIHRvIGJlIG1vdmVkIHRvIHdoZXJlIGkgd2FzCj4gPiA+ID4gPj4+ ICsgICAgICAgICAgICAgICAgICogYmVmb3JlIHRoZSBhcnJheSBjYW4gc2FmZWx5IGJlIHRydW5j YXRlZC4KPiA+ID4gPiA+Pj4gKyAgICAgICAgICAgICAgICAgKi8KPiA+ID4gPiA+Pj4gKyAgICAg ICAgICAgICAgICBpZiAoaSAhPSBqKQo+ID4gPiA+ID4+PiArICAgICAgICAgICAgICAgICAgICBz dGF0ZS0+cHJpdmF0ZV9vYmpzW2ldID0KPiA+ID4gPiA+Pj4gKyAgICAgICAgICAgICAgICAgICAg ICAgIHN0YXRlLT5wcml2YXRlX29ianNbal07Cj4gPiA+ID4gPj4+Cj4gPiA+ID4gPj4+IC0gICAg ICAgICAgICBpZiAob2xkX2RtX3N0YXRlLT5jb250ZXh0KQo+ID4gPiA+ID4+PiAtICAgICAgICAg ICAgICAgIGRjX3JldGFpbl9zdGF0ZShvbGRfZG1fc3RhdGUtPmNvbnRleHQpOwo+ID4gPiA+ID4+ PiArICAgICAgICAgICAgICAgIHN0YXRlLT5wcml2YXRlX29ianNbal0ucHRyID0gTlVMTDsKPiA+ ID4gPiA+Pj4gKyAgICAgICAgICAgICAgICBzdGF0ZS0+cHJpdmF0ZV9vYmpzW2pdLnN0YXRlID0g TlVMTDsKPiA+ID4gPiA+Pj4gKyAgICAgICAgICAgICAgICBzdGF0ZS0+cHJpdmF0ZV9vYmpzW2pd Lm9sZF9zdGF0ZSA9IE5VTEw7Cj4gPiA+ID4gPj4+ICsgICAgICAgICAgICAgICAgc3RhdGUtPnBy aXZhdGVfb2Jqc1tqXS5uZXdfc3RhdGUgPSBOVUxMOwo+ID4gPiA+ID4+PiArCj4gPiA+ID4gPj4+ ICsgICAgICAgICAgICAgICAgc3RhdGUtPm51bV9wcml2YXRlX29ianMgPSBqOwo+ID4gPiA+ID4+ PiArICAgICAgICAgICAgICAgIGJyZWFrOwo+ID4gPiA+ID4+PiArICAgICAgICAgICAgfQo+ID4g PiA+ID4+PiAgICAgICAgICAgfQo+ID4gPiA+ID4+PiAgICAgICB9Cj4gPiA+ID4gPj4+Cj4gPiA+ ID4gPj4+IC0tCj4gPiA+ID4gPj4+IDIuMjcuMAo+ID4gPiA+ID4+Pgo+ID4gPiA+ID4+Cj4gPiA+ ID4gPgo+ID4gPiA+Cj4gPiA+ID4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KPiA+ID4gPiBkcmktZGV2ZWwgbWFpbGluZyBsaXN0Cj4gPiA+ID4gZHJpLWRl dmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+ID4gPiA+IGh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0 b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCj4gPiA+Cj4gPiA+Cj4gPiA+Cj4gPiA+ IC0tCj4gPiA+IERhbmllbCBWZXR0ZXIKPiA+ID4gU29mdHdhcmUgRW5naW5lZXIsIEludGVsIENv cnBvcmF0aW9uCj4gPiA+IGh0dHA6Ly9ibG9nLmZmd2xsLmNoCj4KPgo+Cj4gLS0KPiBEYW5pZWwg VmV0dGVyCj4gU29mdHdhcmUgRW5naW5lZXIsIEludGVsIENvcnBvcmF0aW9uCj4gaHR0cDovL2Js b2cuZmZ3bGwuY2gKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KYW1kLWdmeCBtYWlsaW5nIGxpc3QKYW1kLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0 cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9hbWQtZ2Z4Cg==