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=-1.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_PASS 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 C9C9AC43142 for ; Tue, 31 Jul 2018 00:40:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 78CBC208A3 for ; Tue, 31 Jul 2018 00:40:21 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 78CBC208A3 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-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732291AbeGaCRk (ORCPT ); Mon, 30 Jul 2018 22:17:40 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:33534 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1732206AbeGaCRj (ORCPT ); Mon, 30 Jul 2018 22:17:39 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 866E6CFB53; Tue, 31 Jul 2018 00:40:04 +0000 (UTC) Received: from malachite.bss.redhat.com (dhcp-10-20-1-11.bss.redhat.com [10.20.1.11]) by smtp.corp.redhat.com (Postfix) with ESMTP id 293CA16791; Tue, 31 Jul 2018 00:40:04 +0000 (UTC) From: Lyude Paul To: nouveau@lists.freedesktop.org Cc: stable@vger.kernel.org, Lukas Wunner , Karol Herbst , Gustavo Padovan , Maarten Lankhorst , Sean Paul , David Airlie , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 3/8] drm/fb_helper: Introduce hotplug_suspend/resume() Date: Mon, 30 Jul 2018 20:39:48 -0400 Message-Id: <20180731003954.19962-4-lyude@redhat.com> In-Reply-To: <20180731003954.19962-1-lyude@redhat.com> References: <20180731003954.19962-1-lyude@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Tue, 31 Jul 2018 00:40:04 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Tue, 31 Jul 2018 00:40:04 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'lyude@redhat.com' RCPT:'' Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org I'm sure I don't need to tell you that fb_helper's locking is a mess. That being said; fb_helper's locking mess can seriously complicate the runtime suspend/resume operations of drivers because it can invoke atomic commits and connector probing from anywhere that calls drm_fb_helper_hotplug_event(). Since most drivers use drm_fb_helper_output_poll_changed() as their output_poll_changed handler, this can happen in every single context that can fire off a hotplug event. An example: [ 246.669625] INFO: task kworker/4:0:37 blocked for more than 120 seconds. [ 246.673398] Not tainted 4.18.0-rc5Lyude-Test+ #2 [ 246.675271] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 246.676527] kworker/4:0 D 0 37 2 0x80000000 [ 246.677580] Workqueue: events output_poll_execute [drm_kms_helper] [ 246.678704] Call Trace: [ 246.679753] __schedule+0x322/0xaf0 [ 246.680916] schedule+0x33/0x90 [ 246.681924] schedule_preempt_disabled+0x15/0x20 [ 246.683023] __mutex_lock+0x569/0x9a0 [ 246.684035] ? kobject_uevent_env+0x117/0x7b0 [ 246.685132] ? drm_fb_helper_hotplug_event.part.28+0x20/0xb0 [drm_kms_helper] [ 246.686179] mutex_lock_nested+0x1b/0x20 [ 246.687278] ? mutex_lock_nested+0x1b/0x20 [ 246.688307] drm_fb_helper_hotplug_event.part.28+0x20/0xb0 [drm_kms_helper] [ 246.689420] drm_fb_helper_output_poll_changed+0x23/0x30 [drm_kms_helper] [ 246.690462] drm_kms_helper_hotplug_event+0x2a/0x30 [drm_kms_helper] [ 246.691570] output_poll_execute+0x198/0x1c0 [drm_kms_helper] [ 246.692611] process_one_work+0x231/0x620 [ 246.693725] worker_thread+0x214/0x3a0 [ 246.694756] kthread+0x12b/0x150 [ 246.695856] ? wq_pool_ids_show+0x140/0x140 [ 246.696888] ? kthread_create_worker_on_cpu+0x70/0x70 [ 246.697998] ret_from_fork+0x3a/0x50 [ 246.699034] INFO: task kworker/0:1:60 blocked for more than 120 seconds. [ 246.700153] Not tainted 4.18.0-rc5Lyude-Test+ #2 [ 246.701182] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 246.702278] kworker/0:1 D 0 60 2 0x80000000 [ 246.703293] Workqueue: pm pm_runtime_work [ 246.704393] Call Trace: [ 246.705403] __schedule+0x322/0xaf0 [ 246.706439] ? wait_for_completion+0x104/0x190 [ 246.707393] schedule+0x33/0x90 [ 246.708375] schedule_timeout+0x3a5/0x590 [ 246.709289] ? mark_held_locks+0x58/0x80 [ 246.710208] ? _raw_spin_unlock_irq+0x2c/0x40 [ 246.711222] ? wait_for_completion+0x104/0x190 [ 246.712134] ? trace_hardirqs_on_caller+0xf4/0x190 [ 246.713094] ? wait_for_completion+0x104/0x190 [ 246.713964] wait_for_completion+0x12c/0x190 [ 246.714895] ? wake_up_q+0x80/0x80 [ 246.715727] ? get_work_pool+0x90/0x90 [ 246.716649] flush_work+0x1c9/0x280 [ 246.717483] ? flush_workqueue_prep_pwqs+0x1b0/0x1b0 [ 246.718442] __cancel_work_timer+0x146/0x1d0 [ 246.719247] cancel_delayed_work_sync+0x13/0x20 [ 246.720043] drm_kms_helper_poll_disable+0x1f/0x30 [drm_kms_helper] [ 246.721123] nouveau_pmops_runtime_suspend+0x3d/0xb0 [nouveau] [ 246.721897] pci_pm_runtime_suspend+0x6b/0x190 [ 246.722825] ? pci_has_legacy_pm_support+0x70/0x70 [ 246.723737] __rpm_callback+0x7a/0x1d0 [ 246.724721] ? pci_has_legacy_pm_support+0x70/0x70 [ 246.725607] rpm_callback+0x24/0x80 [ 246.726553] ? pci_has_legacy_pm_support+0x70/0x70 [ 246.727376] rpm_suspend+0x142/0x6b0 [ 246.728185] pm_runtime_work+0x97/0xc0 [ 246.728938] process_one_work+0x231/0x620 [ 246.729796] worker_thread+0x44/0x3a0 [ 246.730614] kthread+0x12b/0x150 [ 246.731395] ? wq_pool_ids_show+0x140/0x140 [ 246.732202] ? kthread_create_worker_on_cpu+0x70/0x70 [ 246.732878] ret_from_fork+0x3a/0x50 [ 246.733768] INFO: task kworker/4:2:422 blocked for more than 120 seconds. [ 246.734587] Not tainted 4.18.0-rc5Lyude-Test+ #2 [ 246.735393] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 246.736113] kworker/4:2 D 0 422 2 0x80000080 [ 246.736789] Workqueue: events_long drm_dp_mst_link_probe_work [drm_kms_helper] [ 246.737665] Call Trace: [ 246.738490] __schedule+0x322/0xaf0 [ 246.739250] schedule+0x33/0x90 [ 246.739908] rpm_resume+0x19c/0x850 [ 246.740750] ? finish_wait+0x90/0x90 [ 246.741541] __pm_runtime_resume+0x4e/0x90 [ 246.742370] nv50_disp_atomic_commit+0x31/0x210 [nouveau] [ 246.743124] drm_atomic_commit+0x4a/0x50 [drm] [ 246.743775] restore_fbdev_mode_atomic+0x1c8/0x240 [drm_kms_helper] [ 246.744603] restore_fbdev_mode+0x31/0x140 [drm_kms_helper] [ 246.745373] drm_fb_helper_restore_fbdev_mode_unlocked+0x54/0xb0 [drm_kms_helper] [ 246.746220] drm_fb_helper_set_par+0x2d/0x50 [drm_kms_helper] [ 246.746884] drm_fb_helper_hotplug_event.part.28+0x96/0xb0 [drm_kms_helper] [ 246.747675] drm_fb_helper_output_poll_changed+0x23/0x30 [drm_kms_helper] [ 246.748544] drm_kms_helper_hotplug_event+0x2a/0x30 [drm_kms_helper] [ 246.749439] nv50_mstm_hotplug+0x15/0x20 [nouveau] [ 246.750111] drm_dp_send_link_address+0x177/0x1c0 [drm_kms_helper] [ 246.750764] drm_dp_check_and_send_link_address+0xa8/0xd0 [drm_kms_helper] [ 246.751602] drm_dp_mst_link_probe_work+0x51/0x90 [drm_kms_helper] [ 246.752314] process_one_work+0x231/0x620 [ 246.752979] worker_thread+0x44/0x3a0 [ 246.753838] kthread+0x12b/0x150 [ 246.754619] ? wq_pool_ids_show+0x140/0x140 [ 246.755386] ? kthread_create_worker_on_cpu+0x70/0x70 [ 246.756162] ret_from_fork+0x3a/0x50 [ 246.756847] Showing all locks held in the system: [ 246.758261] 3 locks held by kworker/4:0/37: [ 246.759016] #0: 00000000f8df4d2d ((wq_completion)"events"){+.+.}, at: process_one_work+0x1b3/0x620 [ 246.759856] #1: 00000000e6065461 ((work_completion)(&(&dev->mode_config.output_poll_work)->work)){+.+.}, at: process_one_work+0x1b3/0x620 [ 246.760670] #2: 00000000cb66735f (&helper->lock){+.+.}, at: drm_fb_helper_hotplug_event.part.28+0x20/0xb0 [drm_kms_helper] [ 246.761516] 2 locks held by kworker/0:1/60: [ 246.762274] #0: 00000000fff6be0f ((wq_completion)"pm"){+.+.}, at: process_one_work+0x1b3/0x620 [ 246.762982] #1: 000000005ab44fb4 ((work_completion)(&dev->power.work)){+.+.}, at: process_one_work+0x1b3/0x620 [ 246.763890] 1 lock held by khungtaskd/64: [ 246.764664] #0: 000000008cb8b5c3 (rcu_read_lock){....}, at: debug_show_all_locks+0x23/0x185 [ 246.765588] 5 locks held by kworker/4:2/422: [ 246.766440] #0: 00000000232f0959 ((wq_completion)"events_long"){+.+.}, at: process_one_work+0x1b3/0x620 [ 246.767390] #1: 00000000bb59b134 ((work_completion)(&mgr->work)){+.+.}, at: process_one_work+0x1b3/0x620 [ 246.768154] #2: 00000000cb66735f (&helper->lock){+.+.}, at: drm_fb_helper_restore_fbdev_mode_unlocked+0x4c/0xb0 [drm_kms_helper] [ 246.768966] #3: 000000004c8f0b6b (crtc_ww_class_acquire){+.+.}, at: restore_fbdev_mode_atomic+0x4b/0x240 [drm_kms_helper] [ 246.769921] #4: 000000004c34a296 (crtc_ww_class_mutex){+.+.}, at: drm_modeset_backoff+0x8a/0x1b0 [drm] [ 246.770839] 1 lock held by dmesg/1038: [ 246.771739] 2 locks held by zsh/1172: [ 246.772650] #0: 00000000836d0438 (&tty->ldisc_sem){++++}, at: ldsem_down_read+0x37/0x40 [ 246.773680] #1: 000000001f4f4d48 (&ldata->atomic_read_lock){+.+.}, at: n_tty_read+0xc1/0x870 [ 246.775522] ============================================= Because of this, there's an unreasonable number of places that drm drivers would need to insert special handling to prevent trying to resume the device from all of these contexts that can deadlock. It's difficult even to try synchronizing with fb_helper in these contexts as well, since any of them could introduce a deadlock by waiting to acquire the top-level fb_helper mutex, while it's being held by another thread that might potentially call down to pm_runtime_get_sync(). Luckily-there's no actual reason we need to allow fb_helper to handle hotplugging at all when runtime suspending a device. If a hotplug happens during a runtime suspend operation, there's no reason the driver can't just re-enable fbcon's hotplug handling and bring it up to speed with hotplugging events it may have missed by calling drm_fb_helper_hotplug_event(). So, let's make this easy and just add helpers to handle disabling and enabling fb_helper connector probing() without having to potentially wait on fb_helper to finish it's work. This will let us fix the runtime suspend/resume deadlocks that we've been experiencing with nouveau, along with being able to fix some of the incorrect runtime PM core interaction that other DRM drivers currently perform to work around these issues. Signed-off-by: Lyude Paul Cc: stable@vger.kernel.org Cc: Lukas Wunner Cc: Karol Herbst --- drivers/gpu/drm/drm_fb_helper.c | 65 +++++++++++++++++++++++++++++++++ include/drm/drm_fb_helper.h | 20 ++++++++++ 2 files changed, 85 insertions(+) diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 2ee1eaa66188..28d59befbc92 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -2733,6 +2733,66 @@ int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel) } EXPORT_SYMBOL(drm_fb_helper_initial_config); +/** + * drm_fb_helper_resume_hotplug - Allow fb_helper to handle probing new + * connectors again, and bring it up to date + * with the current device's connector status + * fb_helper: driver-allocated fbdev helper, can be NULL + * + * Allow fb_helper to react to connector status changes again after having + * been disabled through drm_fb_helper_suspend_hotplug(). This also schedules + * a fb_helper hotplug event to bring fb_helper up to date with the current + * status of the DRM device's connectors. + */ +void +drm_fb_helper_resume_hotplug(struct drm_fb_helper *fb_helper) +{ + fb_helper->hotplug_suspended = false; + drm_fb_helper_hotplug_event(fb_helper); +} +EXPORT_SYMBOL(drm_fb_helper_resume_hotplug); + +/** + * drm_fb_helper_suspend_hotplug - Attempt to temporarily inhibit fb_helper's + * ability to respond to connector changes + * without waiting + * @fb_helper: driver-allocated fbdev helper, can be NULL + * + * Temporarily prevent fb_helper from being able to handle connector changes, + * but only if it isn't busy doing something else. The connector probing + * routines in fb_helper can potentially grab any modesetting lock imaginable, + * which dramatically complicates the runtime suspend process. This helper can + * be used to simplify the process of runtime suspend by allowing the driver + * to disable unpredictable fb_helper operations as early as possible, without + * requiring that we try waiting on fb_helper (as this could lead to very + * difficult to solve deadlocks with runtime suspend code if fb_helper ends up + * needing to acquire a runtime PM reference). + * + * This call should be put at the very start of a driver's runtime suspend + * operation if desired. The driver must be responsible for re-enabling + * fb_helper hotplug handling when normal hotplug detection becomes available + * on the device again. This will usually happen if runtime suspend is + * aborted, or when the device is runtime resumed. + * + * Returns: true if hotplug handling was disabled, false if disabling hotplug + * handling would mean waiting on fb_helper. + */ +bool +drm_fb_helper_suspend_hotplug(struct drm_fb_helper *fb_helper) +{ + int ret; + + ret = mutex_trylock(&fb_helper->lock); + if (!ret) + return false; + + fb_helper->hotplug_suspended = true; + mutex_unlock(&fb_helper->lock); + + return true; +} +EXPORT_SYMBOL(drm_fb_helper_suspend_hotplug); + /** * drm_fb_helper_hotplug_event - respond to a hotplug notification by * probing all the outputs attached to the fb @@ -2774,6 +2834,11 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper) return err; } + if (fb_helper->hotplug_suspended) { + mutex_unlock(&fb_helper->lock); + return err; + } + DRM_DEBUG_KMS("\n"); drm_setup_crtcs(fb_helper, fb_helper->fb->width, fb_helper->fb->height); diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h index b069433e7fc1..30881131075c 100644 --- a/include/drm/drm_fb_helper.h +++ b/include/drm/drm_fb_helper.h @@ -232,6 +232,14 @@ struct drm_fb_helper { * See also: @deferred_setup */ int preferred_bpp; + + /** + * @hotplug_suspended: + * + * Whether or not we can currently handle hotplug events, or if we + * need to wait for the DRM device to uninhibit us. + */ + bool hotplug_suspended; }; /** @@ -330,6 +338,10 @@ void drm_fb_helper_fbdev_teardown(struct drm_device *dev); void drm_fb_helper_lastclose(struct drm_device *dev); void drm_fb_helper_output_poll_changed(struct drm_device *dev); + +void drm_fb_helper_resume_hotplug(struct drm_fb_helper *fb_helper); +bool drm_fb_helper_suspend_hotplug(struct drm_fb_helper *fb_helper); + #else static inline void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper, @@ -564,6 +576,14 @@ static inline void drm_fb_helper_output_poll_changed(struct drm_device *dev) { } +static inline void +drm_fb_helper_resume_hotplug(struct drm_fb_helper *fb_helper) +{ +} +static inline bool +drm_fb_helper_suspend_hotplug(struct drm_fb_helper *fb_helper) +{ +} #endif static inline int -- 2.17.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lyude Paul Subject: [PATCH v3 3/8] drm/fb_helper: Introduce hotplug_suspend/resume() Date: Mon, 30 Jul 2018 20:39:48 -0400 Message-ID: <20180731003954.19962-4-lyude@redhat.com> References: <20180731003954.19962-1-lyude@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180731003954.19962-1-lyude-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: nouveau-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Nouveau" To: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Cc: David Airlie , Gustavo Padovan , Maarten Lankhorst , stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Sean Paul , dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org List-Id: nouveau.vger.kernel.org SSdtIHN1cmUgSSBkb24ndCBuZWVkIHRvIHRlbGwgeW91IHRoYXQgZmJfaGVscGVyJ3MgbG9ja2lu ZyBpcyBhIG1lc3MuClRoYXQgYmVpbmcgc2FpZDsgZmJfaGVscGVyJ3MgbG9ja2luZyBtZXNzIGNh biBzZXJpb3VzbHkgY29tcGxpY2F0ZSB0aGUKcnVudGltZSBzdXNwZW5kL3Jlc3VtZSBvcGVyYXRp b25zIG9mIGRyaXZlcnMgYmVjYXVzZSBpdCBjYW4gaW52b2tlCmF0b21pYyBjb21taXRzIGFuZCBj b25uZWN0b3IgcHJvYmluZyBmcm9tIGFueXdoZXJlIHRoYXQgY2FsbHMKZHJtX2ZiX2hlbHBlcl9o b3RwbHVnX2V2ZW50KCkuIFNpbmNlIG1vc3QgZHJpdmVycyB1c2UKZHJtX2ZiX2hlbHBlcl9vdXRw dXRfcG9sbF9jaGFuZ2VkKCkgYXMgdGhlaXIgb3V0cHV0X3BvbGxfY2hhbmdlZApoYW5kbGVyLCB0 aGlzIGNhbiBoYXBwZW4gaW4gZXZlcnkgc2luZ2xlIGNvbnRleHQgdGhhdCBjYW4gZmlyZSBvZmYg YQpob3RwbHVnIGV2ZW50LiBBbiBleGFtcGxlOgoKWyAgMjQ2LjY2OTYyNV0gSU5GTzogdGFzayBr d29ya2VyLzQ6MDozNyBibG9ja2VkIGZvciBtb3JlIHRoYW4gMTIwIHNlY29uZHMuClsgIDI0Ni42 NzMzOThdICAgICAgIE5vdCB0YWludGVkIDQuMTguMC1yYzVMeXVkZS1UZXN0KyAjMgpbICAyNDYu Njc1MjcxXSAiZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9odW5nX3Rhc2tfdGltZW91dF9zZWNz IiBkaXNhYmxlcyB0aGlzIG1lc3NhZ2UuClsgIDI0Ni42NzY1MjddIGt3b3JrZXIvNDowICAgICBE ICAgIDAgICAgMzcgICAgICAyIDB4ODAwMDAwMDAKWyAgMjQ2LjY3NzU4MF0gV29ya3F1ZXVlOiBl dmVudHMgb3V0cHV0X3BvbGxfZXhlY3V0ZSBbZHJtX2ttc19oZWxwZXJdClsgIDI0Ni42Nzg3MDRd IENhbGwgVHJhY2U6ClsgIDI0Ni42Nzk3NTNdICBfX3NjaGVkdWxlKzB4MzIyLzB4YWYwClsgIDI0 Ni42ODA5MTZdICBzY2hlZHVsZSsweDMzLzB4OTAKWyAgMjQ2LjY4MTkyNF0gIHNjaGVkdWxlX3By ZWVtcHRfZGlzYWJsZWQrMHgxNS8weDIwClsgIDI0Ni42ODMwMjNdICBfX211dGV4X2xvY2srMHg1 NjkvMHg5YTAKWyAgMjQ2LjY4NDAzNV0gID8ga29iamVjdF91ZXZlbnRfZW52KzB4MTE3LzB4N2Iw ClsgIDI0Ni42ODUxMzJdICA/IGRybV9mYl9oZWxwZXJfaG90cGx1Z19ldmVudC5wYXJ0LjI4KzB4 MjAvMHhiMCBbZHJtX2ttc19oZWxwZXJdClsgIDI0Ni42ODYxNzldICBtdXRleF9sb2NrX25lc3Rl ZCsweDFiLzB4MjAKWyAgMjQ2LjY4NzI3OF0gID8gbXV0ZXhfbG9ja19uZXN0ZWQrMHgxYi8weDIw ClsgIDI0Ni42ODgzMDddICBkcm1fZmJfaGVscGVyX2hvdHBsdWdfZXZlbnQucGFydC4yOCsweDIw LzB4YjAgW2RybV9rbXNfaGVscGVyXQpbICAyNDYuNjg5NDIwXSAgZHJtX2ZiX2hlbHBlcl9vdXRw dXRfcG9sbF9jaGFuZ2VkKzB4MjMvMHgzMCBbZHJtX2ttc19oZWxwZXJdClsgIDI0Ni42OTA0NjJd ICBkcm1fa21zX2hlbHBlcl9ob3RwbHVnX2V2ZW50KzB4MmEvMHgzMCBbZHJtX2ttc19oZWxwZXJd ClsgIDI0Ni42OTE1NzBdICBvdXRwdXRfcG9sbF9leGVjdXRlKzB4MTk4LzB4MWMwIFtkcm1fa21z X2hlbHBlcl0KWyAgMjQ2LjY5MjYxMV0gIHByb2Nlc3Nfb25lX3dvcmsrMHgyMzEvMHg2MjAKWyAg MjQ2LjY5MzcyNV0gIHdvcmtlcl90aHJlYWQrMHgyMTQvMHgzYTAKWyAgMjQ2LjY5NDc1Nl0gIGt0 aHJlYWQrMHgxMmIvMHgxNTAKWyAgMjQ2LjY5NTg1Nl0gID8gd3FfcG9vbF9pZHNfc2hvdysweDE0 MC8weDE0MApbICAyNDYuNjk2ODg4XSAgPyBrdGhyZWFkX2NyZWF0ZV93b3JrZXJfb25fY3B1KzB4 NzAvMHg3MApbICAyNDYuNjk3OTk4XSAgcmV0X2Zyb21fZm9yaysweDNhLzB4NTAKWyAgMjQ2LjY5 OTAzNF0gSU5GTzogdGFzayBrd29ya2VyLzA6MTo2MCBibG9ja2VkIGZvciBtb3JlIHRoYW4gMTIw IHNlY29uZHMuClsgIDI0Ni43MDAxNTNdICAgICAgIE5vdCB0YWludGVkIDQuMTguMC1yYzVMeXVk ZS1UZXN0KyAjMgpbICAyNDYuNzAxMTgyXSAiZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9odW5n X3Rhc2tfdGltZW91dF9zZWNzIiBkaXNhYmxlcyB0aGlzIG1lc3NhZ2UuClsgIDI0Ni43MDIyNzhd IGt3b3JrZXIvMDoxICAgICBEICAgIDAgICAgNjAgICAgICAyIDB4ODAwMDAwMDAKWyAgMjQ2Ljcw MzI5M10gV29ya3F1ZXVlOiBwbSBwbV9ydW50aW1lX3dvcmsKWyAgMjQ2LjcwNDM5M10gQ2FsbCBU cmFjZToKWyAgMjQ2LjcwNTQwM10gIF9fc2NoZWR1bGUrMHgzMjIvMHhhZjAKWyAgMjQ2LjcwNjQz OV0gID8gd2FpdF9mb3JfY29tcGxldGlvbisweDEwNC8weDE5MApbICAyNDYuNzA3MzkzXSAgc2No ZWR1bGUrMHgzMy8weDkwClsgIDI0Ni43MDgzNzVdICBzY2hlZHVsZV90aW1lb3V0KzB4M2E1LzB4 NTkwClsgIDI0Ni43MDkyODldICA/IG1hcmtfaGVsZF9sb2NrcysweDU4LzB4ODAKWyAgMjQ2Ljcx MDIwOF0gID8gX3Jhd19zcGluX3VubG9ja19pcnErMHgyYy8weDQwClsgIDI0Ni43MTEyMjJdICA/ IHdhaXRfZm9yX2NvbXBsZXRpb24rMHgxMDQvMHgxOTAKWyAgMjQ2LjcxMjEzNF0gID8gdHJhY2Vf aGFyZGlycXNfb25fY2FsbGVyKzB4ZjQvMHgxOTAKWyAgMjQ2LjcxMzA5NF0gID8gd2FpdF9mb3Jf Y29tcGxldGlvbisweDEwNC8weDE5MApbICAyNDYuNzEzOTY0XSAgd2FpdF9mb3JfY29tcGxldGlv bisweDEyYy8weDE5MApbICAyNDYuNzE0ODk1XSAgPyB3YWtlX3VwX3ErMHg4MC8weDgwClsgIDI0 Ni43MTU3MjddICA/IGdldF93b3JrX3Bvb2wrMHg5MC8weDkwClsgIDI0Ni43MTY2NDldICBmbHVz aF93b3JrKzB4MWM5LzB4MjgwClsgIDI0Ni43MTc0ODNdICA/IGZsdXNoX3dvcmtxdWV1ZV9wcmVw X3B3cXMrMHgxYjAvMHgxYjAKWyAgMjQ2LjcxODQ0Ml0gIF9fY2FuY2VsX3dvcmtfdGltZXIrMHgx NDYvMHgxZDAKWyAgMjQ2LjcxOTI0N10gIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYysweDEzLzB4 MjAKWyAgMjQ2LjcyMDA0M10gIGRybV9rbXNfaGVscGVyX3BvbGxfZGlzYWJsZSsweDFmLzB4MzAg W2RybV9rbXNfaGVscGVyXQpbICAyNDYuNzIxMTIzXSAgbm91dmVhdV9wbW9wc19ydW50aW1lX3N1 c3BlbmQrMHgzZC8weGIwIFtub3V2ZWF1XQpbICAyNDYuNzIxODk3XSAgcGNpX3BtX3J1bnRpbWVf c3VzcGVuZCsweDZiLzB4MTkwClsgIDI0Ni43MjI4MjVdICA/IHBjaV9oYXNfbGVnYWN5X3BtX3N1 cHBvcnQrMHg3MC8weDcwClsgIDI0Ni43MjM3MzddICBfX3JwbV9jYWxsYmFjaysweDdhLzB4MWQw ClsgIDI0Ni43MjQ3MjFdICA/IHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQrMHg3MC8weDcwClsg IDI0Ni43MjU2MDddICBycG1fY2FsbGJhY2srMHgyNC8weDgwClsgIDI0Ni43MjY1NTNdICA/IHBj aV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQrMHg3MC8weDcwClsgIDI0Ni43MjczNzZdICBycG1fc3Vz cGVuZCsweDE0Mi8weDZiMApbICAyNDYuNzI4MTg1XSAgcG1fcnVudGltZV93b3JrKzB4OTcvMHhj MApbICAyNDYuNzI4OTM4XSAgcHJvY2Vzc19vbmVfd29yaysweDIzMS8weDYyMApbICAyNDYuNzI5 Nzk2XSAgd29ya2VyX3RocmVhZCsweDQ0LzB4M2EwClsgIDI0Ni43MzA2MTRdICBrdGhyZWFkKzB4 MTJiLzB4MTUwClsgIDI0Ni43MzEzOTVdICA/IHdxX3Bvb2xfaWRzX3Nob3crMHgxNDAvMHgxNDAK WyAgMjQ2LjczMjIwMl0gID8ga3RocmVhZF9jcmVhdGVfd29ya2VyX29uX2NwdSsweDcwLzB4NzAK WyAgMjQ2LjczMjg3OF0gIHJldF9mcm9tX2ZvcmsrMHgzYS8weDUwClsgIDI0Ni43MzM3NjhdIElO Rk86IHRhc2sga3dvcmtlci80OjI6NDIyIGJsb2NrZWQgZm9yIG1vcmUgdGhhbiAxMjAgc2Vjb25k cy4KWyAgMjQ2LjczNDU4N10gICAgICAgTm90IHRhaW50ZWQgNC4xOC4wLXJjNUx5dWRlLVRlc3Qr ICMyClsgIDI0Ni43MzUzOTNdICJlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL2h1bmdfdGFza190 aW1lb3V0X3NlY3MiIGRpc2FibGVzIHRoaXMgbWVzc2FnZS4KWyAgMjQ2LjczNjExM10ga3dvcmtl ci80OjIgICAgIEQgICAgMCAgIDQyMiAgICAgIDIgMHg4MDAwMDA4MApbICAyNDYuNzM2Nzg5XSBX b3JrcXVldWU6IGV2ZW50c19sb25nIGRybV9kcF9tc3RfbGlua19wcm9iZV93b3JrIFtkcm1fa21z X2hlbHBlcl0KWyAgMjQ2LjczNzY2NV0gQ2FsbCBUcmFjZToKWyAgMjQ2LjczODQ5MF0gIF9fc2No ZWR1bGUrMHgzMjIvMHhhZjAKWyAgMjQ2LjczOTI1MF0gIHNjaGVkdWxlKzB4MzMvMHg5MApbICAy NDYuNzM5OTA4XSAgcnBtX3Jlc3VtZSsweDE5Yy8weDg1MApbICAyNDYuNzQwNzUwXSAgPyBmaW5p c2hfd2FpdCsweDkwLzB4OTAKWyAgMjQ2Ljc0MTU0MV0gIF9fcG1fcnVudGltZV9yZXN1bWUrMHg0 ZS8weDkwClsgIDI0Ni43NDIzNzBdICBudjUwX2Rpc3BfYXRvbWljX2NvbW1pdCsweDMxLzB4MjEw IFtub3V2ZWF1XQpbICAyNDYuNzQzMTI0XSAgZHJtX2F0b21pY19jb21taXQrMHg0YS8weDUwIFtk cm1dClsgIDI0Ni43NDM3NzVdICByZXN0b3JlX2ZiZGV2X21vZGVfYXRvbWljKzB4MWM4LzB4MjQw IFtkcm1fa21zX2hlbHBlcl0KWyAgMjQ2Ljc0NDYwM10gIHJlc3RvcmVfZmJkZXZfbW9kZSsweDMx LzB4MTQwIFtkcm1fa21zX2hlbHBlcl0KWyAgMjQ2Ljc0NTM3M10gIGRybV9mYl9oZWxwZXJfcmVz dG9yZV9mYmRldl9tb2RlX3VubG9ja2VkKzB4NTQvMHhiMCBbZHJtX2ttc19oZWxwZXJdClsgIDI0 Ni43NDYyMjBdICBkcm1fZmJfaGVscGVyX3NldF9wYXIrMHgyZC8weDUwIFtkcm1fa21zX2hlbHBl cl0KWyAgMjQ2Ljc0Njg4NF0gIGRybV9mYl9oZWxwZXJfaG90cGx1Z19ldmVudC5wYXJ0LjI4KzB4 OTYvMHhiMCBbZHJtX2ttc19oZWxwZXJdClsgIDI0Ni43NDc2NzVdICBkcm1fZmJfaGVscGVyX291 dHB1dF9wb2xsX2NoYW5nZWQrMHgyMy8weDMwIFtkcm1fa21zX2hlbHBlcl0KWyAgMjQ2Ljc0ODU0 NF0gIGRybV9rbXNfaGVscGVyX2hvdHBsdWdfZXZlbnQrMHgyYS8weDMwIFtkcm1fa21zX2hlbHBl cl0KWyAgMjQ2Ljc0OTQzOV0gIG52NTBfbXN0bV9ob3RwbHVnKzB4MTUvMHgyMCBbbm91dmVhdV0K WyAgMjQ2Ljc1MDExMV0gIGRybV9kcF9zZW5kX2xpbmtfYWRkcmVzcysweDE3Ny8weDFjMCBbZHJt X2ttc19oZWxwZXJdClsgIDI0Ni43NTA3NjRdICBkcm1fZHBfY2hlY2tfYW5kX3NlbmRfbGlua19h ZGRyZXNzKzB4YTgvMHhkMCBbZHJtX2ttc19oZWxwZXJdClsgIDI0Ni43NTE2MDJdICBkcm1fZHBf bXN0X2xpbmtfcHJvYmVfd29yaysweDUxLzB4OTAgW2RybV9rbXNfaGVscGVyXQpbICAyNDYuNzUy MzE0XSAgcHJvY2Vzc19vbmVfd29yaysweDIzMS8weDYyMApbICAyNDYuNzUyOTc5XSAgd29ya2Vy X3RocmVhZCsweDQ0LzB4M2EwClsgIDI0Ni43NTM4MzhdICBrdGhyZWFkKzB4MTJiLzB4MTUwClsg IDI0Ni43NTQ2MTldICA/IHdxX3Bvb2xfaWRzX3Nob3crMHgxNDAvMHgxNDAKWyAgMjQ2Ljc1NTM4 Nl0gID8ga3RocmVhZF9jcmVhdGVfd29ya2VyX29uX2NwdSsweDcwLzB4NzAKWyAgMjQ2Ljc1NjE2 Ml0gIHJldF9mcm9tX2ZvcmsrMHgzYS8weDUwClsgIDI0Ni43NTY4NDddCgkgICBTaG93aW5nIGFs bCBsb2NrcyBoZWxkIGluIHRoZSBzeXN0ZW06ClsgIDI0Ni43NTgyNjFdIDMgbG9ja3MgaGVsZCBi eSBrd29ya2VyLzQ6MC8zNzoKWyAgMjQ2Ljc1OTAxNl0gICMwOiAwMDAwMDAwMGY4ZGY0ZDJkICgo d3FfY29tcGxldGlvbikiZXZlbnRzIil7Ky4rLn0sIGF0OiBwcm9jZXNzX29uZV93b3JrKzB4MWIz LzB4NjIwClsgIDI0Ni43NTk4NTZdICAjMTogMDAwMDAwMDBlNjA2NTQ2MSAoKHdvcmtfY29tcGxl dGlvbikoJigmZGV2LT5tb2RlX2NvbmZpZy5vdXRwdXRfcG9sbF93b3JrKS0+d29yaykpeysuKy59 LCBhdDogcHJvY2Vzc19vbmVfd29yaysweDFiMy8weDYyMApbICAyNDYuNzYwNjcwXSAgIzI6IDAw MDAwMDAwY2I2NjczNWYgKCZoZWxwZXItPmxvY2speysuKy59LCBhdDogZHJtX2ZiX2hlbHBlcl9o b3RwbHVnX2V2ZW50LnBhcnQuMjgrMHgyMC8weGIwIFtkcm1fa21zX2hlbHBlcl0KWyAgMjQ2Ljc2 MTUxNl0gMiBsb2NrcyBoZWxkIGJ5IGt3b3JrZXIvMDoxLzYwOgpbICAyNDYuNzYyMjc0XSAgIzA6 IDAwMDAwMDAwZmZmNmJlMGYgKCh3cV9jb21wbGV0aW9uKSJwbSIpeysuKy59LCBhdDogcHJvY2Vz c19vbmVfd29yaysweDFiMy8weDYyMApbICAyNDYuNzYyOTgyXSAgIzE6IDAwMDAwMDAwNWFiNDRm YjQgKCh3b3JrX2NvbXBsZXRpb24pKCZkZXYtPnBvd2VyLndvcmspKXsrLisufSwgYXQ6IHByb2Nl c3Nfb25lX3dvcmsrMHgxYjMvMHg2MjAKWyAgMjQ2Ljc2Mzg5MF0gMSBsb2NrIGhlbGQgYnkga2h1 bmd0YXNrZC82NDoKWyAgMjQ2Ljc2NDY2NF0gICMwOiAwMDAwMDAwMDhjYjhiNWMzIChyY3VfcmVh ZF9sb2NrKXsuLi4ufSwgYXQ6IGRlYnVnX3Nob3dfYWxsX2xvY2tzKzB4MjMvMHgxODUKWyAgMjQ2 Ljc2NTU4OF0gNSBsb2NrcyBoZWxkIGJ5IGt3b3JrZXIvNDoyLzQyMjoKWyAgMjQ2Ljc2NjQ0MF0g ICMwOiAwMDAwMDAwMDIzMmYwOTU5ICgod3FfY29tcGxldGlvbikiZXZlbnRzX2xvbmciKXsrLisu fSwgYXQ6IHByb2Nlc3Nfb25lX3dvcmsrMHgxYjMvMHg2MjAKWyAgMjQ2Ljc2NzM5MF0gICMxOiAw MDAwMDAwMGJiNTliMTM0ICgod29ya19jb21wbGV0aW9uKSgmbWdyLT53b3JrKSl7Ky4rLn0sIGF0 OiBwcm9jZXNzX29uZV93b3JrKzB4MWIzLzB4NjIwClsgIDI0Ni43NjgxNTRdICAjMjogMDAwMDAw MDBjYjY2NzM1ZiAoJmhlbHBlci0+bG9jayl7Ky4rLn0sIGF0OiBkcm1fZmJfaGVscGVyX3Jlc3Rv cmVfZmJkZXZfbW9kZV91bmxvY2tlZCsweDRjLzB4YjAgW2RybV9rbXNfaGVscGVyXQpbICAyNDYu NzY4OTY2XSAgIzM6IDAwMDAwMDAwNGM4ZjBiNmIgKGNydGNfd3dfY2xhc3NfYWNxdWlyZSl7Ky4r Ln0sIGF0OiByZXN0b3JlX2ZiZGV2X21vZGVfYXRvbWljKzB4NGIvMHgyNDAgW2RybV9rbXNfaGVs cGVyXQpbICAyNDYuNzY5OTIxXSAgIzQ6IDAwMDAwMDAwNGMzNGEyOTYgKGNydGNfd3dfY2xhc3Nf bXV0ZXgpeysuKy59LCBhdDogZHJtX21vZGVzZXRfYmFja29mZisweDhhLzB4MWIwIFtkcm1dClsg IDI0Ni43NzA4MzldIDEgbG9jayBoZWxkIGJ5IGRtZXNnLzEwMzg6ClsgIDI0Ni43NzE3MzldIDIg bG9ja3MgaGVsZCBieSB6c2gvMTE3MjoKWyAgMjQ2Ljc3MjY1MF0gICMwOiAwMDAwMDAwMDgzNmQw NDM4ICgmdHR5LT5sZGlzY19zZW0peysrKyt9LCBhdDogbGRzZW1fZG93bl9yZWFkKzB4MzcvMHg0 MApbICAyNDYuNzczNjgwXSAgIzE6IDAwMDAwMDAwMWY0ZjRkNDggKCZsZGF0YS0+YXRvbWljX3Jl YWRfbG9jayl7Ky4rLn0sIGF0OiBuX3R0eV9yZWFkKzB4YzEvMHg4NzAKClsgIDI0Ni43NzU1MjJd ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQmVjYXVzZSBv ZiB0aGlzLCB0aGVyZSdzIGFuIHVucmVhc29uYWJsZSBudW1iZXIgb2YgcGxhY2VzIHRoYXQgZHJt CmRyaXZlcnMgd291bGQgbmVlZCB0byBpbnNlcnQgc3BlY2lhbCBoYW5kbGluZyB0byBwcmV2ZW50 IHRyeWluZyB0bwpyZXN1bWUgdGhlIGRldmljZSBmcm9tIGFsbCBvZiB0aGVzZSBjb250ZXh0cyB0 aGF0IGNhbiBkZWFkbG9jay4gSXQncwpkaWZmaWN1bHQgZXZlbiB0byB0cnkgc3luY2hyb25pemlu ZyB3aXRoIGZiX2hlbHBlciBpbiB0aGVzZSBjb250ZXh0cyBhcwp3ZWxsLCBzaW5jZSBhbnkgb2Yg dGhlbSBjb3VsZCBpbnRyb2R1Y2UgYSBkZWFkbG9jayBieSB3YWl0aW5nIHRvIGFjcXVpcmUKdGhl IHRvcC1sZXZlbCBmYl9oZWxwZXIgbXV0ZXgsIHdoaWxlIGl0J3MgYmVpbmcgaGVsZCBieSBhbm90 aGVyIHRocmVhZAp0aGF0IG1pZ2h0IHBvdGVudGlhbGx5IGNhbGwgZG93biB0byBwbV9ydW50aW1l X2dldF9zeW5jKCkuCgpMdWNraWx5LXRoZXJlJ3Mgbm8gYWN0dWFsIHJlYXNvbiB3ZSBuZWVkIHRv IGFsbG93IGZiX2hlbHBlciB0byBoYW5kbGUKaG90cGx1Z2dpbmcgYXQgYWxsIHdoZW4gcnVudGlt ZSBzdXNwZW5kaW5nIGEgZGV2aWNlLiBJZiBhIGhvdHBsdWcKaGFwcGVucyBkdXJpbmcgYSBydW50 aW1lIHN1c3BlbmQgb3BlcmF0aW9uLCB0aGVyZSdzIG5vIHJlYXNvbiB0aGUgZHJpdmVyCmNhbid0 IGp1c3QgcmUtZW5hYmxlIGZiY29uJ3MgaG90cGx1ZyBoYW5kbGluZyBhbmQgYnJpbmcgaXQgdXAg dG8gc3BlZWQKd2l0aCBob3RwbHVnZ2luZyBldmVudHMgaXQgbWF5IGhhdmUgbWlzc2VkIGJ5IGNh bGxpbmcKZHJtX2ZiX2hlbHBlcl9ob3RwbHVnX2V2ZW50KCkuCgpTbywgbGV0J3MgbWFrZSB0aGlz IGVhc3kgYW5kIGp1c3QgYWRkIGhlbHBlcnMgdG8gaGFuZGxlIGRpc2FibGluZyBhbmQKZW5hYmxp bmcgZmJfaGVscGVyIGNvbm5lY3RvciBwcm9iaW5nKCkgd2l0aG91dCBoYXZpbmcgdG8gcG90ZW50 aWFsbHkKd2FpdCBvbiBmYl9oZWxwZXIgdG8gZmluaXNoIGl0J3Mgd29yay4gVGhpcyB3aWxsIGxl dCB1cyBmaXggdGhlIHJ1bnRpbWUKc3VzcGVuZC9yZXN1bWUgZGVhZGxvY2tzIHRoYXQgd2UndmUg YmVlbiBleHBlcmllbmNpbmcgd2l0aCBub3V2ZWF1LAphbG9uZyB3aXRoIGJlaW5nIGFibGUgdG8g Zml4IHNvbWUgb2YgdGhlIGluY29ycmVjdCBydW50aW1lIFBNIGNvcmUKaW50ZXJhY3Rpb24gdGhh dCBvdGhlciBEUk0gZHJpdmVycyBjdXJyZW50bHkgcGVyZm9ybSB0byB3b3JrIGFyb3VuZAp0aGVz ZSBpc3N1ZXMuCgpTaWduZWQtb2ZmLWJ5OiBMeXVkZSBQYXVsIDxseXVkZUByZWRoYXQuY29tPgpD Yzogc3RhYmxlQHZnZXIua2VybmVsLm9yZwpDYzogTHVrYXMgV3VubmVyIDxsdWthc0B3dW5uZXIu ZGU+CkNjOiBLYXJvbCBIZXJic3QgPGthcm9saGVyYnN0QGdtYWlsLmNvbT4KLS0tCiBkcml2ZXJz L2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jIHwgNjUgKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrCiBpbmNsdWRlL2RybS9kcm1fZmJfaGVscGVyLmggICAgIHwgMjAgKysrKysrKysrKwog MiBmaWxlcyBjaGFuZ2VkLCA4NSBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2RybV9mYl9oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMK aW5kZXggMmVlMWVhYTY2MTg4Li4yOGQ1OWJlZmJjOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1 L2RybS9kcm1fZmJfaGVscGVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIu YwpAQCAtMjczMyw2ICsyNzMzLDY2IEBAIGludCBkcm1fZmJfaGVscGVyX2luaXRpYWxfY29uZmln KHN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIsIGludCBicHBfc2VsKQogfQogRVhQT1JU X1NZTUJPTChkcm1fZmJfaGVscGVyX2luaXRpYWxfY29uZmlnKTsKIAorLyoqCisgKiBkcm1fZmJf aGVscGVyX3Jlc3VtZV9ob3RwbHVnIC0gQWxsb3cgZmJfaGVscGVyIHRvIGhhbmRsZSBwcm9iaW5n IG5ldworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvcnMgYWdhaW4s IGFuZCBicmluZyBpdCB1cCB0byBkYXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgd2l0aCB0aGUgY3VycmVudCBkZXZpY2UncyBjb25uZWN0b3Igc3RhdHVzCisgKiBmYl9oZWxw ZXI6IGRyaXZlci1hbGxvY2F0ZWQgZmJkZXYgaGVscGVyLCBjYW4gYmUgTlVMTAorICoKKyAqIEFs bG93IGZiX2hlbHBlciB0byByZWFjdCB0byBjb25uZWN0b3Igc3RhdHVzIGNoYW5nZXMgYWdhaW4g YWZ0ZXIgaGF2aW5nCisgKiBiZWVuIGRpc2FibGVkIHRocm91Z2ggZHJtX2ZiX2hlbHBlcl9zdXNw ZW5kX2hvdHBsdWcoKS4gVGhpcyBhbHNvIHNjaGVkdWxlcworICogYSBmYl9oZWxwZXIgaG90cGx1 ZyBldmVudCB0byBicmluZyBmYl9oZWxwZXIgdXAgdG8gZGF0ZSB3aXRoIHRoZSBjdXJyZW50Cisg KiBzdGF0dXMgb2YgdGhlIERSTSBkZXZpY2UncyBjb25uZWN0b3JzLgorICovCit2b2lkCitkcm1f ZmJfaGVscGVyX3Jlc3VtZV9ob3RwbHVnKHN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIp Cit7CisJZmJfaGVscGVyLT5ob3RwbHVnX3N1c3BlbmRlZCA9IGZhbHNlOworCWRybV9mYl9oZWxw ZXJfaG90cGx1Z19ldmVudChmYl9oZWxwZXIpOworfQorRVhQT1JUX1NZTUJPTChkcm1fZmJfaGVs cGVyX3Jlc3VtZV9ob3RwbHVnKTsKKworLyoqCisgKiBkcm1fZmJfaGVscGVyX3N1c3BlbmRfaG90 cGx1ZyAtIEF0dGVtcHQgdG8gdGVtcG9yYXJpbHkgaW5oaWJpdCBmYl9oZWxwZXIncworICogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYmlsaXR5IHRvIHJlc3BvbmQgdG8gY29ubmVj dG9yIGNoYW5nZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCB3 YWl0aW5nCisgKiBAZmJfaGVscGVyOiBkcml2ZXItYWxsb2NhdGVkIGZiZGV2IGhlbHBlciwgY2Fu IGJlIE5VTEwKKyAqCisgKiBUZW1wb3JhcmlseSBwcmV2ZW50IGZiX2hlbHBlciBmcm9tIGJlaW5n IGFibGUgdG8gaGFuZGxlIGNvbm5lY3RvciBjaGFuZ2VzLAorICogYnV0IG9ubHkgaWYgaXQgaXNu J3QgYnVzeSBkb2luZyBzb21ldGhpbmcgZWxzZS4gVGhlIGNvbm5lY3RvciBwcm9iaW5nCisgKiBy b3V0aW5lcyBpbiBmYl9oZWxwZXIgY2FuIHBvdGVudGlhbGx5IGdyYWIgYW55IG1vZGVzZXR0aW5n IGxvY2sgaW1hZ2luYWJsZSwKKyAqIHdoaWNoIGRyYW1hdGljYWxseSBjb21wbGljYXRlcyB0aGUg cnVudGltZSBzdXNwZW5kIHByb2Nlc3MuIFRoaXMgaGVscGVyIGNhbgorICogYmUgdXNlZCB0byBz aW1wbGlmeSB0aGUgcHJvY2VzcyBvZiBydW50aW1lIHN1c3BlbmQgYnkgYWxsb3dpbmcgdGhlIGRy aXZlcgorICogdG8gZGlzYWJsZSB1bnByZWRpY3RhYmxlIGZiX2hlbHBlciBvcGVyYXRpb25zIGFz IGVhcmx5IGFzIHBvc3NpYmxlLCB3aXRob3V0CisgKiByZXF1aXJpbmcgdGhhdCB3ZSB0cnkgd2Fp dGluZyBvbiBmYl9oZWxwZXIgKGFzIHRoaXMgY291bGQgbGVhZCB0byB2ZXJ5CisgKiBkaWZmaWN1 bHQgdG8gc29sdmUgZGVhZGxvY2tzIHdpdGggcnVudGltZSBzdXNwZW5kIGNvZGUgaWYgZmJfaGVs cGVyIGVuZHMgdXAKKyAqIG5lZWRpbmcgdG8gYWNxdWlyZSBhIHJ1bnRpbWUgUE0gcmVmZXJlbmNl KS4KKyAqCisgKiBUaGlzIGNhbGwgc2hvdWxkIGJlIHB1dCBhdCB0aGUgdmVyeSBzdGFydCBvZiBh IGRyaXZlcidzIHJ1bnRpbWUgc3VzcGVuZAorICogb3BlcmF0aW9uIGlmIGRlc2lyZWQuIFRoZSBk cml2ZXIgbXVzdCBiZSByZXNwb25zaWJsZSBmb3IgcmUtZW5hYmxpbmcKKyAqIGZiX2hlbHBlciBo b3RwbHVnIGhhbmRsaW5nIHdoZW4gbm9ybWFsIGhvdHBsdWcgZGV0ZWN0aW9uIGJlY29tZXMgYXZh aWxhYmxlCisgKiBvbiB0aGUgZGV2aWNlIGFnYWluLiBUaGlzIHdpbGwgdXN1YWxseSBoYXBwZW4g aWYgcnVudGltZSBzdXNwZW5kIGlzCisgKiBhYm9ydGVkLCBvciB3aGVuIHRoZSBkZXZpY2UgaXMg cnVudGltZSByZXN1bWVkLgorICoKKyAqIFJldHVybnM6IHRydWUgaWYgaG90cGx1ZyBoYW5kbGlu ZyB3YXMgZGlzYWJsZWQsIGZhbHNlIGlmIGRpc2FibGluZyBob3RwbHVnCisgKiBoYW5kbGluZyB3 b3VsZCBtZWFuIHdhaXRpbmcgb24gZmJfaGVscGVyLgorICovCitib29sCitkcm1fZmJfaGVscGVy X3N1c3BlbmRfaG90cGx1ZyhzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqZmJfaGVscGVyKQoreworCWlu dCByZXQ7CisKKwlyZXQgPSBtdXRleF90cnlsb2NrKCZmYl9oZWxwZXItPmxvY2spOworCWlmICgh cmV0KQorCQlyZXR1cm4gZmFsc2U7CisKKwlmYl9oZWxwZXItPmhvdHBsdWdfc3VzcGVuZGVkID0g dHJ1ZTsKKwltdXRleF91bmxvY2soJmZiX2hlbHBlci0+bG9jayk7CisKKwlyZXR1cm4gdHJ1ZTsK K30KK0VYUE9SVF9TWU1CT0woZHJtX2ZiX2hlbHBlcl9zdXNwZW5kX2hvdHBsdWcpOworCiAvKioK ICAqIGRybV9mYl9oZWxwZXJfaG90cGx1Z19ldmVudCAtIHJlc3BvbmQgdG8gYSBob3RwbHVnIG5v dGlmaWNhdGlvbiBieQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmluZyBh bGwgdGhlIG91dHB1dHMgYXR0YWNoZWQgdG8gdGhlIGZiCkBAIC0yNzc0LDYgKzI4MzQsMTEgQEAg aW50IGRybV9mYl9oZWxwZXJfaG90cGx1Z19ldmVudChzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqZmJf aGVscGVyKQogCQlyZXR1cm4gZXJyOwogCX0KIAorCWlmIChmYl9oZWxwZXItPmhvdHBsdWdfc3Vz cGVuZGVkKSB7CisJCW11dGV4X3VubG9jaygmZmJfaGVscGVyLT5sb2NrKTsKKwkJcmV0dXJuIGVy cjsKKwl9CisKIAlEUk1fREVCVUdfS01TKCJcbiIpOwogCiAJZHJtX3NldHVwX2NydGNzKGZiX2hl bHBlciwgZmJfaGVscGVyLT5mYi0+d2lkdGgsIGZiX2hlbHBlci0+ZmItPmhlaWdodCk7CmRpZmYg LS1naXQgYS9pbmNsdWRlL2RybS9kcm1fZmJfaGVscGVyLmggYi9pbmNsdWRlL2RybS9kcm1fZmJf aGVscGVyLmgKaW5kZXggYjA2OTQzM2U3ZmMxLi4zMDg4MTEzMTA3NWMgMTAwNjQ0Ci0tLSBhL2lu Y2x1ZGUvZHJtL2RybV9mYl9oZWxwZXIuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fZmJfaGVscGVy LmgKQEAgLTIzMiw2ICsyMzIsMTQgQEAgc3RydWN0IGRybV9mYl9oZWxwZXIgewogCSAqIFNlZSBh bHNvOiBAZGVmZXJyZWRfc2V0dXAKIAkgKi8KIAlpbnQgcHJlZmVycmVkX2JwcDsKKworCS8qKgor CSAqIEBob3RwbHVnX3N1c3BlbmRlZDoKKwkgKgorCSAqIFdoZXRoZXIgb3Igbm90IHdlIGNhbiBj dXJyZW50bHkgaGFuZGxlIGhvdHBsdWcgZXZlbnRzLCBvciBpZiB3ZQorCSAqIG5lZWQgdG8gd2Fp dCBmb3IgdGhlIERSTSBkZXZpY2UgdG8gdW5pbmhpYml0IHVzLgorCSAqLworCWJvb2wgaG90cGx1 Z19zdXNwZW5kZWQ7CiB9OwogCiAvKioKQEAgLTMzMCw2ICszMzgsMTAgQEAgdm9pZCBkcm1fZmJf aGVscGVyX2ZiZGV2X3RlYXJkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiB2b2lkIGRy bV9mYl9oZWxwZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogdm9pZCBkcm1f ZmJfaGVscGVyX291dHB1dF9wb2xsX2NoYW5nZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisK K3ZvaWQgZHJtX2ZiX2hlbHBlcl9yZXN1bWVfaG90cGx1ZyhzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAq ZmJfaGVscGVyKTsKK2Jvb2wgZHJtX2ZiX2hlbHBlcl9zdXNwZW5kX2hvdHBsdWcoc3RydWN0IGRy bV9mYl9oZWxwZXIgKmZiX2hlbHBlcik7CisKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgZHJt X2ZiX2hlbHBlcl9wcmVwYXJlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCXN0cnVjdCBk cm1fZmJfaGVscGVyICpoZWxwZXIsCkBAIC01NjQsNiArNTc2LDE0IEBAIHN0YXRpYyBpbmxpbmUg dm9pZCBkcm1fZmJfaGVscGVyX291dHB1dF9wb2xsX2NoYW5nZWQoc3RydWN0IGRybV9kZXZpY2Ug KmRldikKIHsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkCitkcm1fZmJfaGVscGVyX3Jlc3VtZV9o b3RwbHVnKHN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIpCit7Cit9CitzdGF0aWMgaW5s aW5lIGJvb2wKK2RybV9mYl9oZWxwZXJfc3VzcGVuZF9ob3RwbHVnKHN0cnVjdCBkcm1fZmJfaGVs cGVyICpmYl9oZWxwZXIpCit7Cit9CiAjZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQKLS0gCjIu MTcuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KTm91 dmVhdSBtYWlsaW5nIGxpc3QKTm91dmVhdUBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9s aXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9ub3V2ZWF1Cg==