From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753984AbdJIJMp (ORCPT ); Mon, 9 Oct 2017 05:12:45 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:33703 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750795AbdJIJMj (ORCPT ); Mon, 9 Oct 2017 05:12:39 -0400 X-Google-Smtp-Source: AOwi7QAgq6tXfvtSH/bPHysdxblCAD1jerXSC4miD0iFSgAF7UErIBZ6FGlKsbOjOZ0DBW+idKM1cQ== Date: Mon, 9 Oct 2017 11:12:35 +0200 From: Daniel Vetter To: Chris Wilson Cc: Daniel Vetter , Daniel Vetter , Intel Graphics Development , LKML , Mika Kuoppala , Thomas Gleixner , Marta Lofstedt , Daniel Vetter Subject: Re: [PATCH 2/2] drm/i915: Use rcu instead of stop_machine in set_wedged Message-ID: <20171009091235.ay4yoy6ffbczduqp@phenom.ffwll.local> Mail-Followup-To: Chris Wilson , Intel Graphics Development , LKML , Mika Kuoppala , Thomas Gleixner , Marta Lofstedt , Daniel Vetter References: <20171006090637.25545-1-daniel.vetter@ffwll.ch> <20171006090637.25545-2-daniel.vetter@ffwll.ch> <150728782908.14660.8438180235890645166@mail.alporthouse.com> <20171006142009.xfhlchig374eew4h@phenom.ffwll.local> <150731094807.1676.8763340289583726886@mail.alporthouse.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <150731094807.1676.8763340289583726886@mail.alporthouse.com> X-Operating-System: Linux phenom 4.12.0-1-amd64 User-Agent: NeoMutt/20170609 (1.8.3) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Oct 06, 2017 at 06:29:08PM +0100, Chris Wilson wrote: > Quoting Daniel Vetter (2017-10-06 15:20:09) > > On Fri, Oct 06, 2017 at 12:03:49PM +0100, Chris Wilson wrote: > > > Quoting Daniel Vetter (2017-10-06 10:06:37) > > > > stop_machine is not really a locking primitive we should use, except > > > > when the hw folks tell us the hw is broken and that's the only way to > > > > work around it. > > > > > > > > This patch tries to address the locking abuse of stop_machine() from > > > > > > > > commit 20e4933c478a1ca694b38fa4ac44d99e659941f5 > > > > Author: Chris Wilson > > > > Date: Tue Nov 22 14:41:21 2016 +0000 > > > > > > > > drm/i915: Stop the machine as we install the wedged submit_request handler > > > > > > > > Chris said parts of the reasons for going with stop_machine() was that > > > > it's no overhead for the fast-path. But these callbacks use irqsave > > > > spinlocks and do a bunch of MMIO, and rcu_read_lock is _real_ fast. > > > > > > > > To stay as close as possible to the stop_machine semantics we first > > > > update all the submit function pointers to the nop handler, then call > > > > synchronize_rcu() to make sure no new requests can be submitted. This > > > > should give us exactly the huge barrier we want. > > > > > > > > I pondered whether we should annotate engine->submit_request as __rcu > > > > and use rcu_assign_pointer and rcu_dereference on it. But the reason > > > > behind those is to make sure the compiler/cpu barriers are there for > > > > when you have an actual data structure you point at, to make sure all > > > > the writes are seen correctly on the read side. But we just have a > > > > function pointer, and .text isn't changed, so no need for these > > > > barriers and hence no need for annotations. > > > > > > > > This should fix the followwing lockdep splat: > > > > > > > > ====================================================== > > > > WARNING: possible circular locking dependency detected > > > > 4.14.0-rc3-CI-CI_DRM_3179+ #1 Tainted: G U > > > > ------------------------------------------------------ > > > > kworker/3:4/562 is trying to acquire lock: > > > > (cpu_hotplug_lock.rw_sem){++++}, at: [] stop_machine+0x1c/0x40 > > > > > > > > but task is already holding lock: > > > > (&dev->struct_mutex){+.+.}, at: [] i915_reset_device+0x1e8/0x260 [i915] > > > > > > > > which lock already depends on the new lock. > > > > > > > > the existing dependency chain (in reverse order) is: > > > > > > > > -> #6 (&dev->struct_mutex){+.+.}: > > > > __lock_acquire+0x1420/0x15e0 > > > > lock_acquire+0xb0/0x200 > > > > __mutex_lock+0x86/0x9b0 > > > > mutex_lock_interruptible_nested+0x1b/0x20 > > > > i915_mutex_lock_interruptible+0x51/0x130 [i915] > > > > i915_gem_fault+0x209/0x650 [i915] > > > > __do_fault+0x1e/0x80 > > > > __handle_mm_fault+0xa08/0xed0 > > > > handle_mm_fault+0x156/0x300 > > > > __do_page_fault+0x2c5/0x570 > > > > do_page_fault+0x28/0x250 > > > > page_fault+0x22/0x30 > > > > > > > > -> #5 (&mm->mmap_sem){++++}: > > > > __lock_acquire+0x1420/0x15e0 > > > > lock_acquire+0xb0/0x200 > > > > __might_fault+0x68/0x90 > > > > _copy_to_user+0x23/0x70 > > > > filldir+0xa5/0x120 > > > > dcache_readdir+0xf9/0x170 > > > > iterate_dir+0x69/0x1a0 > > > > SyS_getdents+0xa5/0x140 > > > > entry_SYSCALL_64_fastpath+0x1c/0xb1 > > > > > > > > -> #4 (&sb->s_type->i_mutex_key#5){++++}: > > > > down_write+0x3b/0x70 > > > > handle_create+0xcb/0x1e0 > > > > devtmpfsd+0x139/0x180 > > > > kthread+0x152/0x190 > > > > ret_from_fork+0x27/0x40 > > > > > > > > -> #3 ((complete)&req.done){+.+.}: > > > > __lock_acquire+0x1420/0x15e0 > > > > lock_acquire+0xb0/0x200 > > > > wait_for_common+0x58/0x210 > > > > wait_for_completion+0x1d/0x20 > > > > devtmpfs_create_node+0x13d/0x160 > > > > device_add+0x5eb/0x620 > > > > device_create_groups_vargs+0xe0/0xf0 > > > > device_create+0x3a/0x40 > > > > msr_device_create+0x2b/0x40 > > > > cpuhp_invoke_callback+0xc9/0xbf0 > > > > cpuhp_thread_fun+0x17b/0x240 > > > > smpboot_thread_fn+0x18a/0x280 > > > > kthread+0x152/0x190 > > > > ret_from_fork+0x27/0x40 > > > > > > > > -> #2 (cpuhp_state-up){+.+.}: > > > > __lock_acquire+0x1420/0x15e0 > > > > lock_acquire+0xb0/0x200 > > > > cpuhp_issue_call+0x133/0x1c0 > > > > __cpuhp_setup_state_cpuslocked+0x139/0x2a0 > > > > __cpuhp_setup_state+0x46/0x60 > > > > page_writeback_init+0x43/0x67 > > > > pagecache_init+0x3d/0x42 > > > > start_kernel+0x3a8/0x3fc > > > > x86_64_start_reservations+0x2a/0x2c > > > > x86_64_start_kernel+0x6d/0x70 > > > > verify_cpu+0x0/0xfb > > > > > > > > -> #1 (cpuhp_state_mutex){+.+.}: > > > > __lock_acquire+0x1420/0x15e0 > > > > lock_acquire+0xb0/0x200 > > > > __mutex_lock+0x86/0x9b0 > > > > mutex_lock_nested+0x1b/0x20 > > > > __cpuhp_setup_state_cpuslocked+0x53/0x2a0 > > > > __cpuhp_setup_state+0x46/0x60 > > > > page_alloc_init+0x28/0x30 > > > > start_kernel+0x145/0x3fc > > > > x86_64_start_reservations+0x2a/0x2c > > > > x86_64_start_kernel+0x6d/0x70 > > > > verify_cpu+0x0/0xfb > > > > > > > > -> #0 (cpu_hotplug_lock.rw_sem){++++}: > > > > check_prev_add+0x430/0x840 > > > > __lock_acquire+0x1420/0x15e0 > > > > lock_acquire+0xb0/0x200 > > > > cpus_read_lock+0x3d/0xb0 > > > > stop_machine+0x1c/0x40 > > > > i915_gem_set_wedged+0x1a/0x20 [i915] > > > > i915_reset+0xb9/0x230 [i915] > > > > i915_reset_device+0x1f6/0x260 [i915] > > > > i915_handle_error+0x2d8/0x430 [i915] > > > > hangcheck_declare_hang+0xd3/0xf0 [i915] > > > > i915_hangcheck_elapsed+0x262/0x2d0 [i915] > > > > process_one_work+0x233/0x660 > > > > worker_thread+0x4e/0x3b0 > > > > kthread+0x152/0x190 > > > > ret_from_fork+0x27/0x40 > > > > > > > > other info that might help us debug this: > > > > > > > > Chain exists of: > > > > cpu_hotplug_lock.rw_sem --> &mm->mmap_sem --> &dev->struct_mutex > > > > > > > > Possible unsafe locking scenario: > > > > > > > > CPU0 CPU1 > > > > ---- ---- > > > > lock(&dev->struct_mutex); > > > > lock(&mm->mmap_sem); > > > > lock(&dev->struct_mutex); > > > > lock(cpu_hotplug_lock.rw_sem); > > > > > > > > *** DEADLOCK *** > > > > > > > > 3 locks held by kworker/3:4/562: > > > > #0: ("events_long"){+.+.}, at: [] process_one_work+0x1aa/0x660 > > > > #1: ((&(&i915->gpu_error.hangcheck_work)->work)){+.+.}, at: [] process_one_work+0x1aa/0x660 > > > > #2: (&dev->struct_mutex){+.+.}, at: [] i915_reset_device+0x1e8/0x260 [i915] > > > > > > > > stack backtrace: > > > > CPU: 3 PID: 562 Comm: kworker/3:4 Tainted: G U 4.14.0-rc3-CI-CI_DRM_3179+ #1 > > > > Hardware name: /NUC7i5BNB, BIOS BNKBL357.86A.0048.2017.0704.1415 07/04/2017 > > > > Workqueue: events_long i915_hangcheck_elapsed [i915] > > > > Call Trace: > > > > dump_stack+0x68/0x9f > > > > print_circular_bug+0x235/0x3c0 > > > > ? lockdep_init_map_crosslock+0x20/0x20 > > > > check_prev_add+0x430/0x840 > > > > ? irq_work_queue+0x86/0xe0 > > > > ? wake_up_klogd+0x53/0x70 > > > > __lock_acquire+0x1420/0x15e0 > > > > ? __lock_acquire+0x1420/0x15e0 > > > > ? lockdep_init_map_crosslock+0x20/0x20 > > > > lock_acquire+0xb0/0x200 > > > > ? stop_machine+0x1c/0x40 > > > > ? i915_gem_object_truncate+0x50/0x50 [i915] > > > > cpus_read_lock+0x3d/0xb0 > > > > ? stop_machine+0x1c/0x40 > > > > stop_machine+0x1c/0x40 > > > > i915_gem_set_wedged+0x1a/0x20 [i915] > > > > i915_reset+0xb9/0x230 [i915] > > > > i915_reset_device+0x1f6/0x260 [i915] > > > > ? gen8_gt_irq_ack+0x170/0x170 [i915] > > > > ? work_on_cpu_safe+0x60/0x60 > > > > i915_handle_error+0x2d8/0x430 [i915] > > > > ? vsnprintf+0xd1/0x4b0 > > > > ? scnprintf+0x3a/0x70 > > > > hangcheck_declare_hang+0xd3/0xf0 [i915] > > > > ? intel_runtime_pm_put+0x56/0xa0 [i915] > > > > i915_hangcheck_elapsed+0x262/0x2d0 [i915] > > > > process_one_work+0x233/0x660 > > > > worker_thread+0x4e/0x3b0 > > > > kthread+0x152/0x190 > > > > ? process_one_work+0x660/0x660 > > > > ? kthread_create_on_node+0x40/0x40 > > > > ret_from_fork+0x27/0x40 > > > > Setting dangerous option reset - tainting kernel > > > > i915 0000:00:02.0: Resetting chip after gpu hang > > > > Setting dangerous option reset - tainting kernel > > > > i915 0000:00:02.0: Resetting chip after gpu hang > > > > > > > > v2: Have 1 global synchronize_rcu() barrier across all engines, and > > > > improve commit message. > > > > > > > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=102886 > > > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103096 > > > > Cc: Chris Wilson > > > > Cc: Mika Kuoppala > > > > Cc: Thomas Gleixner > > > > Cc: Marta Lofstedt > > > > Signed-off-by: Daniel Vetter > > > > --- > > > > drivers/gpu/drm/i915/i915_gem.c | 31 +++++++++-------------- > > > > drivers/gpu/drm/i915/i915_gem_request.c | 2 ++ > > > > drivers/gpu/drm/i915/selftests/i915_gem_request.c | 2 ++ > > > > 3 files changed, 16 insertions(+), 19 deletions(-) > > > > > > > > diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c > > > > index ab8c6946fea4..e79a6ca60265 100644 > > > > --- a/drivers/gpu/drm/i915/i915_gem.c > > > > +++ b/drivers/gpu/drm/i915/i915_gem.c > > > > @@ -3020,16 +3020,8 @@ static void nop_submit_request(struct drm_i915_gem_request *request) > > > > intel_engine_init_global_seqno(request->engine, request->global_seqno); > > > > } > > > > > > > > -static void engine_set_wedged(struct intel_engine_cs *engine) > > > > +static void engine_complete_requests(struct intel_engine_cs *engine) > > > > { > > > > - /* We need to be sure that no thread is running the old callback as > > > > - * we install the nop handler (otherwise we would submit a request > > > > - * to hardware that will never complete). In order to prevent this > > > > - * race, we wait until the machine is idle before making the swap > > > > - * (using stop_machine()). > > > > - */ > > > > - engine->submit_request = nop_submit_request; > > > > - > > > > /* Mark all executing requests as skipped */ > > > > engine->cancel_requests(engine); > > > > > > How are we planning to serialise the intel_engine_init_global_seqno() > > > here with the in-flight nop_submit? With sufficient thrust we will get a > > > stale breadcrumb and an incomplete request. > > > > Yeah that part looks indeed fishy. Well the entire "let the nop handler > > fake-complete requests" logic is something I don't really understand. I > > guess there's an exclusive relationship between requests handled directly > > (and cancelled in engine->cancel_request) and requests with external > > dma_fence dependencies. > > > > But then I'm not really seeing what I'm changing, since even with the stop > > machine you might end up with a bunch of requests depending upon external > > fences, which then all complete at roughly the same time and race multiple > > calls to intel_engine_init_global_seqno with each another. > > The stop_machine serialised the update here with the nop_handlers, > that's the bit that changes. > > > With the fake submission, do we really need to call intel_engine_init_global_seqno? > > Yes. Completion is still determined by i915_seqno_passed() comparing the > rq against the engine. > > You need this > > @@ -3246,6 +3246,8 @@ static void nop_submit_request(struct drm_i915_gem_request *request) > > static void engine_set_wedged(struct intel_engine_cs *engine) > { > + unsigned long flags; > + > /* We need to be sure that no thread is running the old callback as > * we install the nop handler (otherwise we would submit a request > * to hardware that will never complete). In order to prevent this > @@ -3261,8 +3263,10 @@ static void engine_set_wedged(struct intel_engine_cs *engine) > * (lockless) lookup doesn't try and wait upon the request as we > * reset it. > */ > + spin_lock_irqsave(&request->engine->timeline->lock, flags); > intel_engine_init_global_seqno(engine, > intel_engine_last_submit(engine)); > + spin_unlock_irqrestore(&request->engine->timeline->lock, flags); > } > > So that the seqno written is ordered with the same spinlock used inside > the nop submission. Makes sense, I entirely missed the spinlock on Fri evening. Call me blind :-) All amend the patch. Thanks, Daniel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH 2/2] drm/i915: Use rcu instead of stop_machine in set_wedged Date: Mon, 9 Oct 2017 11:12:35 +0200 Message-ID: <20171009091235.ay4yoy6ffbczduqp@phenom.ffwll.local> References: <20171006090637.25545-1-daniel.vetter@ffwll.ch> <20171006090637.25545-2-daniel.vetter@ffwll.ch> <150728782908.14660.8438180235890645166@mail.alporthouse.com> <20171006142009.xfhlchig374eew4h@phenom.ffwll.local> <150731094807.1676.8763340289583726886@mail.alporthouse.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-x243.google.com (mail-wm0-x243.google.com [IPv6:2a00:1450:400c:c09::243]) by gabe.freedesktop.org (Postfix) with ESMTPS id 94C9F89AB3 for ; Mon, 9 Oct 2017 09:12:39 +0000 (UTC) Received: by mail-wm0-x243.google.com with SMTP id l10so17213114wmg.1 for ; Mon, 09 Oct 2017 02:12:39 -0700 (PDT) Content-Disposition: inline In-Reply-To: <150731094807.1676.8763340289583726886@mail.alporthouse.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Chris Wilson Cc: Daniel Vetter , Intel Graphics Development , LKML , Daniel Vetter , Thomas Gleixner , Mika Kuoppala List-Id: intel-gfx@lists.freedesktop.org T24gRnJpLCBPY3QgMDYsIDIwMTcgYXQgMDY6Mjk6MDhQTSArMDEwMCwgQ2hyaXMgV2lsc29uIHdy b3RlOgo+IFF1b3RpbmcgRGFuaWVsIFZldHRlciAoMjAxNy0xMC0wNiAxNToyMDowOSkKPiA+IE9u IEZyaSwgT2N0IDA2LCAyMDE3IGF0IDEyOjAzOjQ5UE0gKzAxMDAsIENocmlzIFdpbHNvbiB3cm90 ZToKPiA+ID4gUXVvdGluZyBEYW5pZWwgVmV0dGVyICgyMDE3LTEwLTA2IDEwOjA2OjM3KQo+ID4g PiA+IHN0b3BfbWFjaGluZSBpcyBub3QgcmVhbGx5IGEgbG9ja2luZyBwcmltaXRpdmUgd2Ugc2hv dWxkIHVzZSwgZXhjZXB0Cj4gPiA+ID4gd2hlbiB0aGUgaHcgZm9sa3MgdGVsbCB1cyB0aGUgaHcg aXMgYnJva2VuIGFuZCB0aGF0J3MgdGhlIG9ubHkgd2F5IHRvCj4gPiA+ID4gd29yayBhcm91bmQg aXQuCj4gPiA+ID4gCj4gPiA+ID4gVGhpcyBwYXRjaCB0cmllcyB0byBhZGRyZXNzIHRoZSBsb2Nr aW5nIGFidXNlIG9mIHN0b3BfbWFjaGluZSgpIGZyb20KPiA+ID4gPiAKPiA+ID4gPiBjb21taXQg MjBlNDkzM2M0NzhhMWNhNjk0YjM4ZmE0YWM0NGQ5OWU2NTk5NDFmNQo+ID4gPiA+IEF1dGhvcjog Q2hyaXMgV2lsc29uIDxjaHJpc0BjaHJpcy13aWxzb24uY28udWs+Cj4gPiA+ID4gRGF0ZTogICBU dWUgTm92IDIyIDE0OjQxOjIxIDIwMTYgKzAwMDAKPiA+ID4gPiAKPiA+ID4gPiAgICAgZHJtL2k5 MTU6IFN0b3AgdGhlIG1hY2hpbmUgYXMgd2UgaW5zdGFsbCB0aGUgd2VkZ2VkIHN1Ym1pdF9yZXF1 ZXN0IGhhbmRsZXIKPiA+ID4gPiAKPiA+ID4gPiBDaHJpcyBzYWlkIHBhcnRzIG9mIHRoZSByZWFz b25zIGZvciBnb2luZyB3aXRoIHN0b3BfbWFjaGluZSgpIHdhcyB0aGF0Cj4gPiA+ID4gaXQncyBu byBvdmVyaGVhZCBmb3IgdGhlIGZhc3QtcGF0aC4gQnV0IHRoZXNlIGNhbGxiYWNrcyB1c2UgaXJx c2F2ZQo+ID4gPiA+IHNwaW5sb2NrcyBhbmQgZG8gYSBidW5jaCBvZiBNTUlPLCBhbmQgcmN1X3Jl YWRfbG9jayBpcyBfcmVhbF8gZmFzdC4KPiA+ID4gPiAKPiA+ID4gPiBUbyBzdGF5IGFzIGNsb3Nl IGFzIHBvc3NpYmxlIHRvIHRoZSBzdG9wX21hY2hpbmUgc2VtYW50aWNzIHdlIGZpcnN0Cj4gPiA+ ID4gdXBkYXRlIGFsbCB0aGUgc3VibWl0IGZ1bmN0aW9uIHBvaW50ZXJzIHRvIHRoZSBub3AgaGFu ZGxlciwgdGhlbiBjYWxsCj4gPiA+ID4gc3luY2hyb25pemVfcmN1KCkgdG8gbWFrZSBzdXJlIG5v IG5ldyByZXF1ZXN0cyBjYW4gYmUgc3VibWl0dGVkLiBUaGlzCj4gPiA+ID4gc2hvdWxkIGdpdmUg dXMgZXhhY3RseSB0aGUgaHVnZSBiYXJyaWVyIHdlIHdhbnQuCj4gPiA+ID4gCj4gPiA+ID4gSSBw b25kZXJlZCB3aGV0aGVyIHdlIHNob3VsZCBhbm5vdGF0ZSBlbmdpbmUtPnN1Ym1pdF9yZXF1ZXN0 IGFzIF9fcmN1Cj4gPiA+ID4gYW5kIHVzZSByY3VfYXNzaWduX3BvaW50ZXIgYW5kIHJjdV9kZXJl ZmVyZW5jZSBvbiBpdC4gQnV0IHRoZSByZWFzb24KPiA+ID4gPiBiZWhpbmQgdGhvc2UgaXMgdG8g bWFrZSBzdXJlIHRoZSBjb21waWxlci9jcHUgYmFycmllcnMgYXJlIHRoZXJlIGZvcgo+ID4gPiA+ IHdoZW4geW91IGhhdmUgYW4gYWN0dWFsIGRhdGEgc3RydWN0dXJlIHlvdSBwb2ludCBhdCwgdG8g bWFrZSBzdXJlIGFsbAo+ID4gPiA+IHRoZSB3cml0ZXMgYXJlIHNlZW4gY29ycmVjdGx5IG9uIHRo ZSByZWFkIHNpZGUuIEJ1dCB3ZSBqdXN0IGhhdmUgYQo+ID4gPiA+IGZ1bmN0aW9uIHBvaW50ZXIs IGFuZCAudGV4dCBpc24ndCBjaGFuZ2VkLCBzbyBubyBuZWVkIGZvciB0aGVzZQo+ID4gPiA+IGJh cnJpZXJzIGFuZCBoZW5jZSBubyBuZWVkIGZvciBhbm5vdGF0aW9ucy4KPiA+ID4gPiAKPiA+ID4g PiBUaGlzIHNob3VsZCBmaXggdGhlIGZvbGxvd3dpbmcgbG9ja2RlcCBzcGxhdDoKPiA+ID4gPiAK PiA+ID4gPiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KPiA+ID4gPiBXQVJOSU5HOiBwb3NzaWJsZSBjaXJjdWxhciBsb2NraW5nIGRlcGVuZGVu Y3kgZGV0ZWN0ZWQKPiA+ID4gPiA0LjE0LjAtcmMzLUNJLUNJX0RSTV8zMTc5KyAjMSBUYWludGVk OiBHICAgICBVCj4gPiA+ID4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCj4gPiA+ID4ga3dvcmtlci8zOjQvNTYyIGlzIHRyeWluZyB0byBhY3F1 aXJlIGxvY2s6Cj4gPiA+ID4gIChjcHVfaG90cGx1Z19sb2NrLnJ3X3NlbSl7KysrK30sIGF0OiBb PGZmZmZmZmZmODExM2Q0YmM+XSBzdG9wX21hY2hpbmUrMHgxYy8weDQwCj4gPiA+ID4gCj4gPiA+ ID4gYnV0IHRhc2sgaXMgYWxyZWFkeSBob2xkaW5nIGxvY2s6Cj4gPiA+ID4gICgmZGV2LT5zdHJ1 Y3RfbXV0ZXgpeysuKy59LCBhdDogWzxmZmZmZmZmZmEwMTM2NTg4Pl0gaTkxNV9yZXNldF9kZXZp Y2UrMHgxZTgvMHgyNjAgW2k5MTVdCj4gPiA+ID4gCj4gPiA+ID4gd2hpY2ggbG9jayBhbHJlYWR5 IGRlcGVuZHMgb24gdGhlIG5ldyBsb2NrLgo+ID4gPiA+IAo+ID4gPiA+IHRoZSBleGlzdGluZyBk ZXBlbmRlbmN5IGNoYWluIChpbiByZXZlcnNlIG9yZGVyKSBpczoKPiA+ID4gPiAKPiA+ID4gPiAt PiAjNiAoJmRldi0+c3RydWN0X211dGV4KXsrLisufToKPiA+ID4gPiAgICAgICAgX19sb2NrX2Fj cXVpcmUrMHgxNDIwLzB4MTVlMAo+ID4gPiA+ICAgICAgICBsb2NrX2FjcXVpcmUrMHhiMC8weDIw MAo+ID4gPiA+ICAgICAgICBfX211dGV4X2xvY2srMHg4Ni8weDliMAo+ID4gPiA+ICAgICAgICBt dXRleF9sb2NrX2ludGVycnVwdGlibGVfbmVzdGVkKzB4MWIvMHgyMAo+ID4gPiA+ICAgICAgICBp OTE1X211dGV4X2xvY2tfaW50ZXJydXB0aWJsZSsweDUxLzB4MTMwIFtpOTE1XQo+ID4gPiA+ICAg ICAgICBpOTE1X2dlbV9mYXVsdCsweDIwOS8weDY1MCBbaTkxNV0KPiA+ID4gPiAgICAgICAgX19k b19mYXVsdCsweDFlLzB4ODAKPiA+ID4gPiAgICAgICAgX19oYW5kbGVfbW1fZmF1bHQrMHhhMDgv MHhlZDAKPiA+ID4gPiAgICAgICAgaGFuZGxlX21tX2ZhdWx0KzB4MTU2LzB4MzAwCj4gPiA+ID4g ICAgICAgIF9fZG9fcGFnZV9mYXVsdCsweDJjNS8weDU3MAo+ID4gPiA+ICAgICAgICBkb19wYWdl X2ZhdWx0KzB4MjgvMHgyNTAKPiA+ID4gPiAgICAgICAgcGFnZV9mYXVsdCsweDIyLzB4MzAKPiA+ ID4gPiAKPiA+ID4gPiAtPiAjNSAoJm1tLT5tbWFwX3NlbSl7KysrK306Cj4gPiA+ID4gICAgICAg IF9fbG9ja19hY3F1aXJlKzB4MTQyMC8weDE1ZTAKPiA+ID4gPiAgICAgICAgbG9ja19hY3F1aXJl KzB4YjAvMHgyMDAKPiA+ID4gPiAgICAgICAgX19taWdodF9mYXVsdCsweDY4LzB4OTAKPiA+ID4g PiAgICAgICAgX2NvcHlfdG9fdXNlcisweDIzLzB4NzAKPiA+ID4gPiAgICAgICAgZmlsbGRpcisw eGE1LzB4MTIwCj4gPiA+ID4gICAgICAgIGRjYWNoZV9yZWFkZGlyKzB4ZjkvMHgxNzAKPiA+ID4g PiAgICAgICAgaXRlcmF0ZV9kaXIrMHg2OS8weDFhMAo+ID4gPiA+ICAgICAgICBTeVNfZ2V0ZGVu dHMrMHhhNS8weDE0MAo+ID4gPiA+ICAgICAgICBlbnRyeV9TWVNDQUxMXzY0X2Zhc3RwYXRoKzB4 MWMvMHhiMQo+ID4gPiA+IAo+ID4gPiA+IC0+ICM0ICgmc2ItPnNfdHlwZS0+aV9tdXRleF9rZXkj NSl7KysrK306Cj4gPiA+ID4gICAgICAgIGRvd25fd3JpdGUrMHgzYi8weDcwCj4gPiA+ID4gICAg ICAgIGhhbmRsZV9jcmVhdGUrMHhjYi8weDFlMAo+ID4gPiA+ICAgICAgICBkZXZ0bXBmc2QrMHgx MzkvMHgxODAKPiA+ID4gPiAgICAgICAga3RocmVhZCsweDE1Mi8weDE5MAo+ID4gPiA+ICAgICAg ICByZXRfZnJvbV9mb3JrKzB4MjcvMHg0MAo+ID4gPiA+IAo+ID4gPiA+IC0+ICMzICgoY29tcGxl dGUpJnJlcS5kb25lKXsrLisufToKPiA+ID4gPiAgICAgICAgX19sb2NrX2FjcXVpcmUrMHgxNDIw LzB4MTVlMAo+ID4gPiA+ICAgICAgICBsb2NrX2FjcXVpcmUrMHhiMC8weDIwMAo+ID4gPiA+ICAg ICAgICB3YWl0X2Zvcl9jb21tb24rMHg1OC8weDIxMAo+ID4gPiA+ICAgICAgICB3YWl0X2Zvcl9j b21wbGV0aW9uKzB4MWQvMHgyMAo+ID4gPiA+ICAgICAgICBkZXZ0bXBmc19jcmVhdGVfbm9kZSsw eDEzZC8weDE2MAo+ID4gPiA+ICAgICAgICBkZXZpY2VfYWRkKzB4NWViLzB4NjIwCj4gPiA+ID4g ICAgICAgIGRldmljZV9jcmVhdGVfZ3JvdXBzX3ZhcmdzKzB4ZTAvMHhmMAo+ID4gPiA+ICAgICAg ICBkZXZpY2VfY3JlYXRlKzB4M2EvMHg0MAo+ID4gPiA+ICAgICAgICBtc3JfZGV2aWNlX2NyZWF0 ZSsweDJiLzB4NDAKPiA+ID4gPiAgICAgICAgY3B1aHBfaW52b2tlX2NhbGxiYWNrKzB4YzkvMHhi ZjAKPiA+ID4gPiAgICAgICAgY3B1aHBfdGhyZWFkX2Z1bisweDE3Yi8weDI0MAo+ID4gPiA+ICAg ICAgICBzbXBib290X3RocmVhZF9mbisweDE4YS8weDI4MAo+ID4gPiA+ICAgICAgICBrdGhyZWFk KzB4MTUyLzB4MTkwCj4gPiA+ID4gICAgICAgIHJldF9mcm9tX2ZvcmsrMHgyNy8weDQwCj4gPiA+ ID4gCj4gPiA+ID4gLT4gIzIgKGNwdWhwX3N0YXRlLXVwKXsrLisufToKPiA+ID4gPiAgICAgICAg X19sb2NrX2FjcXVpcmUrMHgxNDIwLzB4MTVlMAo+ID4gPiA+ICAgICAgICBsb2NrX2FjcXVpcmUr MHhiMC8weDIwMAo+ID4gPiA+ICAgICAgICBjcHVocF9pc3N1ZV9jYWxsKzB4MTMzLzB4MWMwCj4g PiA+ID4gICAgICAgIF9fY3B1aHBfc2V0dXBfc3RhdGVfY3B1c2xvY2tlZCsweDEzOS8weDJhMAo+ ID4gPiA+ICAgICAgICBfX2NwdWhwX3NldHVwX3N0YXRlKzB4NDYvMHg2MAo+ID4gPiA+ICAgICAg ICBwYWdlX3dyaXRlYmFja19pbml0KzB4NDMvMHg2Nwo+ID4gPiA+ICAgICAgICBwYWdlY2FjaGVf aW5pdCsweDNkLzB4NDIKPiA+ID4gPiAgICAgICAgc3RhcnRfa2VybmVsKzB4M2E4LzB4M2ZjCj4g PiA+ID4gICAgICAgIHg4Nl82NF9zdGFydF9yZXNlcnZhdGlvbnMrMHgyYS8weDJjCj4gPiA+ID4g ICAgICAgIHg4Nl82NF9zdGFydF9rZXJuZWwrMHg2ZC8weDcwCj4gPiA+ID4gICAgICAgIHZlcmlm eV9jcHUrMHgwLzB4ZmIKPiA+ID4gPiAKPiA+ID4gPiAtPiAjMSAoY3B1aHBfc3RhdGVfbXV0ZXgp eysuKy59Ogo+ID4gPiA+ICAgICAgICBfX2xvY2tfYWNxdWlyZSsweDE0MjAvMHgxNWUwCj4gPiA+ ID4gICAgICAgIGxvY2tfYWNxdWlyZSsweGIwLzB4MjAwCj4gPiA+ID4gICAgICAgIF9fbXV0ZXhf bG9jaysweDg2LzB4OWIwCj4gPiA+ID4gICAgICAgIG11dGV4X2xvY2tfbmVzdGVkKzB4MWIvMHgy MAo+ID4gPiA+ICAgICAgICBfX2NwdWhwX3NldHVwX3N0YXRlX2NwdXNsb2NrZWQrMHg1My8weDJh MAo+ID4gPiA+ICAgICAgICBfX2NwdWhwX3NldHVwX3N0YXRlKzB4NDYvMHg2MAo+ID4gPiA+ICAg ICAgICBwYWdlX2FsbG9jX2luaXQrMHgyOC8weDMwCj4gPiA+ID4gICAgICAgIHN0YXJ0X2tlcm5l bCsweDE0NS8weDNmYwo+ID4gPiA+ICAgICAgICB4ODZfNjRfc3RhcnRfcmVzZXJ2YXRpb25zKzB4 MmEvMHgyYwo+ID4gPiA+ICAgICAgICB4ODZfNjRfc3RhcnRfa2VybmVsKzB4NmQvMHg3MAo+ID4g PiA+ICAgICAgICB2ZXJpZnlfY3B1KzB4MC8weGZiCj4gPiA+ID4gCj4gPiA+ID4gLT4gIzAgKGNw dV9ob3RwbHVnX2xvY2sucndfc2VtKXsrKysrfToKPiA+ID4gPiAgICAgICAgY2hlY2tfcHJldl9h ZGQrMHg0MzAvMHg4NDAKPiA+ID4gPiAgICAgICAgX19sb2NrX2FjcXVpcmUrMHgxNDIwLzB4MTVl MAo+ID4gPiA+ICAgICAgICBsb2NrX2FjcXVpcmUrMHhiMC8weDIwMAo+ID4gPiA+ICAgICAgICBj cHVzX3JlYWRfbG9jaysweDNkLzB4YjAKPiA+ID4gPiAgICAgICAgc3RvcF9tYWNoaW5lKzB4MWMv MHg0MAo+ID4gPiA+ICAgICAgICBpOTE1X2dlbV9zZXRfd2VkZ2VkKzB4MWEvMHgyMCBbaTkxNV0K PiA+ID4gPiAgICAgICAgaTkxNV9yZXNldCsweGI5LzB4MjMwIFtpOTE1XQo+ID4gPiA+ICAgICAg ICBpOTE1X3Jlc2V0X2RldmljZSsweDFmNi8weDI2MCBbaTkxNV0KPiA+ID4gPiAgICAgICAgaTkx NV9oYW5kbGVfZXJyb3IrMHgyZDgvMHg0MzAgW2k5MTVdCj4gPiA+ID4gICAgICAgIGhhbmdjaGVj a19kZWNsYXJlX2hhbmcrMHhkMy8weGYwIFtpOTE1XQo+ID4gPiA+ICAgICAgICBpOTE1X2hhbmdj aGVja19lbGFwc2VkKzB4MjYyLzB4MmQwIFtpOTE1XQo+ID4gPiA+ICAgICAgICBwcm9jZXNzX29u ZV93b3JrKzB4MjMzLzB4NjYwCj4gPiA+ID4gICAgICAgIHdvcmtlcl90aHJlYWQrMHg0ZS8weDNi MAo+ID4gPiA+ICAgICAgICBrdGhyZWFkKzB4MTUyLzB4MTkwCj4gPiA+ID4gICAgICAgIHJldF9m cm9tX2ZvcmsrMHgyNy8weDQwCj4gPiA+ID4gCj4gPiA+ID4gb3RoZXIgaW5mbyB0aGF0IG1pZ2h0 IGhlbHAgdXMgZGVidWcgdGhpczoKPiA+ID4gPiAKPiA+ID4gPiBDaGFpbiBleGlzdHMgb2Y6Cj4g PiA+ID4gICBjcHVfaG90cGx1Z19sb2NrLnJ3X3NlbSAtLT4gJm1tLT5tbWFwX3NlbSAtLT4gJmRl di0+c3RydWN0X211dGV4Cj4gPiA+ID4gCj4gPiA+ID4gIFBvc3NpYmxlIHVuc2FmZSBsb2NraW5n IHNjZW5hcmlvOgo+ID4gPiA+IAo+ID4gPiA+ICAgICAgICBDUFUwICAgICAgICAgICAgICAgICAg ICBDUFUxCj4gPiA+ID4gICAgICAgIC0tLS0gICAgICAgICAgICAgICAgICAgIC0tLS0KPiA+ID4g PiAgIGxvY2soJmRldi0+c3RydWN0X211dGV4KTsKPiA+ID4gPiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgbG9jaygmbW0tPm1tYXBfc2VtKTsKPiA+ID4gPiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwo+ID4gPiA+ICAgbG9jayhj cHVfaG90cGx1Z19sb2NrLnJ3X3NlbSk7Cj4gPiA+ID4gCj4gPiA+ID4gICoqKiBERUFETE9DSyAq KioKPiA+ID4gPiAKPiA+ID4gPiAzIGxvY2tzIGhlbGQgYnkga3dvcmtlci8zOjQvNTYyOgo+ID4g PiA+ICAjMDogICgiZXZlbnRzX2xvbmciKXsrLisufSwgYXQ6IFs8ZmZmZmZmZmY4MTA5YzY0YT5d IHByb2Nlc3Nfb25lX3dvcmsrMHgxYWEvMHg2NjAKPiA+ID4gPiAgIzE6ICAoKCYoJmk5MTUtPmdw dV9lcnJvci5oYW5nY2hlY2tfd29yayktPndvcmspKXsrLisufSwgYXQ6IFs8ZmZmZmZmZmY4MTA5 YzY0YT5dIHByb2Nlc3Nfb25lX3dvcmsrMHgxYWEvMHg2NjAKPiA+ID4gPiAgIzI6ICAoJmRldi0+ c3RydWN0X211dGV4KXsrLisufSwgYXQ6IFs8ZmZmZmZmZmZhMDEzNjU4OD5dIGk5MTVfcmVzZXRf ZGV2aWNlKzB4MWU4LzB4MjYwIFtpOTE1XQo+ID4gPiA+IAo+ID4gPiA+IHN0YWNrIGJhY2t0cmFj ZToKPiA+ID4gPiBDUFU6IDMgUElEOiA1NjIgQ29tbToga3dvcmtlci8zOjQgVGFpbnRlZDogRyAg ICAgVSAgICAgICAgICA0LjE0LjAtcmMzLUNJLUNJX0RSTV8zMTc5KyAjMQo+ID4gPiA+IEhhcmR3 YXJlIG5hbWU6ICAgICAgICAgICAgICAgICAgL05VQzdpNUJOQiwgQklPUyBCTktCTDM1Ny44NkEu MDA0OC4yMDE3LjA3MDQuMTQxNSAwNy8wNC8yMDE3Cj4gPiA+ID4gV29ya3F1ZXVlOiBldmVudHNf bG9uZyBpOTE1X2hhbmdjaGVja19lbGFwc2VkIFtpOTE1XQo+ID4gPiA+IENhbGwgVHJhY2U6Cj4g PiA+ID4gIGR1bXBfc3RhY2srMHg2OC8weDlmCj4gPiA+ID4gIHByaW50X2NpcmN1bGFyX2J1Zysw eDIzNS8weDNjMAo+ID4gPiA+ICA/IGxvY2tkZXBfaW5pdF9tYXBfY3Jvc3Nsb2NrKzB4MjAvMHgy MAo+ID4gPiA+ICBjaGVja19wcmV2X2FkZCsweDQzMC8weDg0MAo+ID4gPiA+ICA/IGlycV93b3Jr X3F1ZXVlKzB4ODYvMHhlMAo+ID4gPiA+ICA/IHdha2VfdXBfa2xvZ2QrMHg1My8weDcwCj4gPiA+ ID4gIF9fbG9ja19hY3F1aXJlKzB4MTQyMC8weDE1ZTAKPiA+ID4gPiAgPyBfX2xvY2tfYWNxdWly ZSsweDE0MjAvMHgxNWUwCj4gPiA+ID4gID8gbG9ja2RlcF9pbml0X21hcF9jcm9zc2xvY2srMHgy MC8weDIwCj4gPiA+ID4gIGxvY2tfYWNxdWlyZSsweGIwLzB4MjAwCj4gPiA+ID4gID8gc3RvcF9t YWNoaW5lKzB4MWMvMHg0MAo+ID4gPiA+ICA/IGk5MTVfZ2VtX29iamVjdF90cnVuY2F0ZSsweDUw LzB4NTAgW2k5MTVdCj4gPiA+ID4gIGNwdXNfcmVhZF9sb2NrKzB4M2QvMHhiMAo+ID4gPiA+ICA/ IHN0b3BfbWFjaGluZSsweDFjLzB4NDAKPiA+ID4gPiAgc3RvcF9tYWNoaW5lKzB4MWMvMHg0MAo+ ID4gPiA+ICBpOTE1X2dlbV9zZXRfd2VkZ2VkKzB4MWEvMHgyMCBbaTkxNV0KPiA+ID4gPiAgaTkx NV9yZXNldCsweGI5LzB4MjMwIFtpOTE1XQo+ID4gPiA+ICBpOTE1X3Jlc2V0X2RldmljZSsweDFm Ni8weDI2MCBbaTkxNV0KPiA+ID4gPiAgPyBnZW44X2d0X2lycV9hY2srMHgxNzAvMHgxNzAgW2k5 MTVdCj4gPiA+ID4gID8gd29ya19vbl9jcHVfc2FmZSsweDYwLzB4NjAKPiA+ID4gPiAgaTkxNV9o YW5kbGVfZXJyb3IrMHgyZDgvMHg0MzAgW2k5MTVdCj4gPiA+ID4gID8gdnNucHJpbnRmKzB4ZDEv MHg0YjAKPiA+ID4gPiAgPyBzY25wcmludGYrMHgzYS8weDcwCj4gPiA+ID4gIGhhbmdjaGVja19k ZWNsYXJlX2hhbmcrMHhkMy8weGYwIFtpOTE1XQo+ID4gPiA+ICA/IGludGVsX3J1bnRpbWVfcG1f cHV0KzB4NTYvMHhhMCBbaTkxNV0KPiA+ID4gPiAgaTkxNV9oYW5nY2hlY2tfZWxhcHNlZCsweDI2 Mi8weDJkMCBbaTkxNV0KPiA+ID4gPiAgcHJvY2Vzc19vbmVfd29yaysweDIzMy8weDY2MAo+ID4g PiA+ICB3b3JrZXJfdGhyZWFkKzB4NGUvMHgzYjAKPiA+ID4gPiAga3RocmVhZCsweDE1Mi8weDE5 MAo+ID4gPiA+ICA/IHByb2Nlc3Nfb25lX3dvcmsrMHg2NjAvMHg2NjAKPiA+ID4gPiAgPyBrdGhy ZWFkX2NyZWF0ZV9vbl9ub2RlKzB4NDAvMHg0MAo+ID4gPiA+ICByZXRfZnJvbV9mb3JrKzB4Mjcv MHg0MAo+ID4gPiA+IFNldHRpbmcgZGFuZ2Vyb3VzIG9wdGlvbiByZXNldCAtIHRhaW50aW5nIGtl cm5lbAo+ID4gPiA+IGk5MTUgMDAwMDowMDowMi4wOiBSZXNldHRpbmcgY2hpcCBhZnRlciBncHUg aGFuZwo+ID4gPiA+IFNldHRpbmcgZGFuZ2Vyb3VzIG9wdGlvbiByZXNldCAtIHRhaW50aW5nIGtl cm5lbAo+ID4gPiA+IGk5MTUgMDAwMDowMDowMi4wOiBSZXNldHRpbmcgY2hpcCBhZnRlciBncHUg aGFuZwo+ID4gPiA+IAo+ID4gPiA+IHYyOiBIYXZlIDEgZ2xvYmFsIHN5bmNocm9uaXplX3JjdSgp IGJhcnJpZXIgYWNyb3NzIGFsbCBlbmdpbmVzLCBhbmQKPiA+ID4gPiBpbXByb3ZlIGNvbW1pdCBt ZXNzYWdlLgo+ID4gPiA+IAo+ID4gPiA+IEJ1Z3ppbGxhOiBodHRwczovL2J1Z3MuZnJlZWRlc2t0 b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDI4ODYKPiA+ID4gPiBCdWd6aWxsYTogaHR0cHM6Ly9i dWdzLmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTAzMDk2Cj4gPiA+ID4gQ2M6IENo cmlzIFdpbHNvbiA8Y2hyaXNAY2hyaXMtd2lsc29uLmNvLnVrPgo+ID4gPiA+IENjOiBNaWthIEt1 b3BwYWxhIDxtaWthLmt1b3BwYWxhQGludGVsLmNvbT4KPiA+ID4gPiBDYzogVGhvbWFzIEdsZWl4 bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+Cj4gPiA+ID4gQ2M6IE1hcnRhIExvZnN0ZWR0IDxtYXJ0 YS5sb2ZzdGVkdEBpbnRlbC5jb20+Cj4gPiA+ID4gU2lnbmVkLW9mZi1ieTogRGFuaWVsIFZldHRl ciA8ZGFuaWVsLnZldHRlckBpbnRlbC5jb20+Cj4gPiA+ID4gLS0tCj4gPiA+ID4gIGRyaXZlcnMv Z3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMgICAgICAgICAgICAgICAgICAgfCAzMSArKysrKysrKyst LS0tLS0tLS0tLS0tLQo+ID4gPiA+ICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9yZXF1 ZXN0LmMgICAgICAgICAgIHwgIDIgKysKPiA+ID4gPiAgZHJpdmVycy9ncHUvZHJtL2k5MTUvc2Vs ZnRlc3RzL2k5MTVfZ2VtX3JlcXVlc3QuYyB8ICAyICsrCj4gPiA+ID4gIDMgZmlsZXMgY2hhbmdl ZCwgMTYgaW5zZXJ0aW9ucygrKSwgMTkgZGVsZXRpb25zKC0pCj4gPiA+ID4gCj4gPiA+ID4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS9pOTE1X2dlbS5jCj4gPiA+ID4gaW5kZXggYWI4YzY5NDZmZWE0Li5lNzlhNmNhNjAy NjUgMTAwNjQ0Cj4gPiA+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwo+ ID4gPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKPiA+ID4gPiBAQCAt MzAyMCwxNiArMzAyMCw4IEBAIHN0YXRpYyB2b2lkIG5vcF9zdWJtaXRfcmVxdWVzdChzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcXVlc3QpCj4gPiA+ID4gICAgICAgICBpbnRlbF9lbmdp bmVfaW5pdF9nbG9iYWxfc2Vxbm8ocmVxdWVzdC0+ZW5naW5lLCByZXF1ZXN0LT5nbG9iYWxfc2Vx bm8pOwo+ID4gPiA+ICB9Cj4gPiA+ID4gIAo+ID4gPiA+IC1zdGF0aWMgdm9pZCBlbmdpbmVfc2V0 X3dlZGdlZChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCj4gPiA+ID4gK3N0YXRpYyB2 b2lkIGVuZ2luZV9jb21wbGV0ZV9yZXF1ZXN0cyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdp bmUpCj4gPiA+ID4gIHsKPiA+ID4gPiAtICAgICAgIC8qIFdlIG5lZWQgdG8gYmUgc3VyZSB0aGF0 IG5vIHRocmVhZCBpcyBydW5uaW5nIHRoZSBvbGQgY2FsbGJhY2sgYXMKPiA+ID4gPiAtICAgICAg ICAqIHdlIGluc3RhbGwgdGhlIG5vcCBoYW5kbGVyIChvdGhlcndpc2Ugd2Ugd291bGQgc3VibWl0 IGEgcmVxdWVzdAo+ID4gPiA+IC0gICAgICAgICogdG8gaGFyZHdhcmUgdGhhdCB3aWxsIG5ldmVy IGNvbXBsZXRlKS4gSW4gb3JkZXIgdG8gcHJldmVudCB0aGlzCj4gPiA+ID4gLSAgICAgICAgKiBy YWNlLCB3ZSB3YWl0IHVudGlsIHRoZSBtYWNoaW5lIGlzIGlkbGUgYmVmb3JlIG1ha2luZyB0aGUg c3dhcAo+ID4gPiA+IC0gICAgICAgICogKHVzaW5nIHN0b3BfbWFjaGluZSgpKS4KPiA+ID4gPiAt ICAgICAgICAqLwo+ID4gPiA+IC0gICAgICAgZW5naW5lLT5zdWJtaXRfcmVxdWVzdCA9IG5vcF9z dWJtaXRfcmVxdWVzdDsKPiA+ID4gPiAtCj4gPiA+ID4gICAgICAgICAvKiBNYXJrIGFsbCBleGVj dXRpbmcgcmVxdWVzdHMgYXMgc2tpcHBlZCAqLwo+ID4gPiA+ICAgICAgICAgZW5naW5lLT5jYW5j ZWxfcmVxdWVzdHMoZW5naW5lKTsKPiA+ID4gCj4gPiA+IEhvdyBhcmUgd2UgcGxhbm5pbmcgdG8g c2VyaWFsaXNlIHRoZSBpbnRlbF9lbmdpbmVfaW5pdF9nbG9iYWxfc2Vxbm8oKQo+ID4gPiBoZXJl IHdpdGggdGhlIGluLWZsaWdodCBub3Bfc3VibWl0PyBXaXRoIHN1ZmZpY2llbnQgdGhydXN0IHdl IHdpbGwgZ2V0IGEKPiA+ID4gc3RhbGUgYnJlYWRjcnVtYiBhbmQgYW4gaW5jb21wbGV0ZSByZXF1 ZXN0Lgo+ID4gCj4gPiBZZWFoIHRoYXQgcGFydCBsb29rcyBpbmRlZWQgZmlzaHkuIFdlbGwgdGhl IGVudGlyZSAibGV0IHRoZSBub3AgaGFuZGxlcgo+ID4gZmFrZS1jb21wbGV0ZSByZXF1ZXN0cyIg bG9naWMgaXMgc29tZXRoaW5nIEkgZG9uJ3QgcmVhbGx5IHVuZGVyc3RhbmQuIEkKPiA+IGd1ZXNz IHRoZXJlJ3MgYW4gZXhjbHVzaXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHJlcXVlc3RzIGhhbmRs ZWQgZGlyZWN0bHkKPiA+IChhbmQgY2FuY2VsbGVkIGluIGVuZ2luZS0+Y2FuY2VsX3JlcXVlc3Qp IGFuZCByZXF1ZXN0cyB3aXRoIGV4dGVybmFsCj4gPiBkbWFfZmVuY2UgZGVwZW5kZW5jaWVzLgo+ ID4gCj4gPiBCdXQgdGhlbiBJJ20gbm90IHJlYWxseSBzZWVpbmcgd2hhdCBJJ20gY2hhbmdpbmcs IHNpbmNlIGV2ZW4gd2l0aCB0aGUgc3RvcAo+ID4gbWFjaGluZSB5b3UgbWlnaHQgZW5kIHVwIHdp dGggYSBidW5jaCBvZiByZXF1ZXN0cyBkZXBlbmRpbmcgdXBvbiBleHRlcm5hbAo+ID4gZmVuY2Vz LCB3aGljaCB0aGVuIGFsbCBjb21wbGV0ZSBhdCByb3VnaGx5IHRoZSBzYW1lIHRpbWUgYW5kIHJh Y2UgbXVsdGlwbGUKPiA+IGNhbGxzIHRvIGludGVsX2VuZ2luZV9pbml0X2dsb2JhbF9zZXFubyB3 aXRoIGVhY2ggYW5vdGhlci4KPiAKPiBUaGUgc3RvcF9tYWNoaW5lIHNlcmlhbGlzZWQgdGhlIHVw ZGF0ZSBoZXJlIHdpdGggdGhlIG5vcF9oYW5kbGVycywKPiB0aGF0J3MgdGhlIGJpdCB0aGF0IGNo YW5nZXMuCj4gIAo+ID4gV2l0aCB0aGUgZmFrZSBzdWJtaXNzaW9uLCBkbyB3ZSByZWFsbHkgbmVl ZCB0byBjYWxsIGludGVsX2VuZ2luZV9pbml0X2dsb2JhbF9zZXFubz8KPiAKPiBZZXMuIENvbXBs ZXRpb24gaXMgc3RpbGwgZGV0ZXJtaW5lZCBieSBpOTE1X3NlcW5vX3Bhc3NlZCgpIGNvbXBhcmlu ZyB0aGUKPiBycSBhZ2FpbnN0IHRoZSBlbmdpbmUuCj4gCj4gWW91IG5lZWQgdGhpcwo+IAo+IEBA IC0zMjQ2LDYgKzMyNDYsOCBAQCBzdGF0aWMgdm9pZCBub3Bfc3VibWl0X3JlcXVlc3Qoc3RydWN0 IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXF1ZXN0KQo+ICAKPiAgc3RhdGljIHZvaWQgZW5naW5l X3NldF93ZWRnZWQoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQo+ICB7Cj4gKyAgICAg ICB1bnNpZ25lZCBsb25nIGZsYWdzOwo+ICsKPiAgICAgICAgIC8qIFdlIG5lZWQgdG8gYmUgc3Vy ZSB0aGF0IG5vIHRocmVhZCBpcyBydW5uaW5nIHRoZSBvbGQgY2FsbGJhY2sgYXMKPiAgICAgICAg ICAqIHdlIGluc3RhbGwgdGhlIG5vcCBoYW5kbGVyIChvdGhlcndpc2Ugd2Ugd291bGQgc3VibWl0 IGEgcmVxdWVzdAo+ICAgICAgICAgICogdG8gaGFyZHdhcmUgdGhhdCB3aWxsIG5ldmVyIGNvbXBs ZXRlKS4gSW4gb3JkZXIgdG8gcHJldmVudCB0aGlzCj4gQEAgLTMyNjEsOCArMzI2MywxMCBAQCBz dGF0aWMgdm9pZCBlbmdpbmVfc2V0X3dlZGdlZChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdp bmUpCj4gICAgICAgICAgKiAobG9ja2xlc3MpIGxvb2t1cCBkb2Vzbid0IHRyeSBhbmQgd2FpdCB1 cG9uIHRoZSByZXF1ZXN0IGFzIHdlCj4gICAgICAgICAgKiByZXNldCBpdC4KPiAgICAgICAgICAq Lwo+ICsgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnJlcXVlc3QtPmVuZ2luZS0+dGltZWxpbmUt PmxvY2ssIGZsYWdzKTsKPiAgICAgICAgIGludGVsX2VuZ2luZV9pbml0X2dsb2JhbF9zZXFubyhl bmdpbmUsCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWxfZW5n aW5lX2xhc3Rfc3VibWl0KGVuZ2luZSkpOwo+ICsgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmcmVxdWVzdC0+ZW5naW5lLT50aW1lbGluZS0+bG9jaywgZmxhZ3MpOwo+ICB9Cj4gIAo+IFNv IHRoYXQgdGhlIHNlcW5vIHdyaXR0ZW4gaXMgb3JkZXJlZCB3aXRoIHRoZSBzYW1lIHNwaW5sb2Nr IHVzZWQgaW5zaWRlCj4gdGhlIG5vcCBzdWJtaXNzaW9uLgoKTWFrZXMgc2Vuc2UsIEkgZW50aXJl bHkgbWlzc2VkIHRoZSBzcGlubG9jayBvbiBGcmkgZXZlbmluZy4gQ2FsbCBtZSBibGluZAo6LSkK CkFsbCBhbWVuZCB0aGUgcGF0Y2guCgpUaGFua3MsIERhbmllbAotLSAKRGFuaWVsIFZldHRlcgpT b2Z0d2FyZSBFbmdpbmVlciwgSW50ZWwgQ29ycG9yYXRpb24KaHR0cDovL2Jsb2cuZmZ3bGwuY2gK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4 IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlz dHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==