From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7EA5836D510 for ; Sat, 25 Jul 2026 05:04:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784955882; cv=none; b=r+8f+5Z6uUR6RlQykz66Kj2KFBYwKJ/z9IiokF6q88f1M2EZ2eWrMs5bkoPGAbw0MN1Tk0voWd+5kFsB7leNppDOjnRRP4IQPqt1l4JDquiRA6yuzGyLzMKrhcf8lAhzuKpYm4QNukJpwRo3JXtBX0jpXBeUVRlIeuwn8veiPr8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784955882; c=relaxed/simple; bh=BSuU/qw3p4x2jbf1dgQkmWjohQLJ58GH2LiN3hMtujw=; h=From:Subject:To:Cc:In-Reply-To:References:Content-Type:Date: Message-Id; b=Kws5j6gZ4fas0LdatVs/FBVnI+rnT+KznLXPkXRzLA9yn1M7MvCFN7e4lBYih6FTQxptp3bQ3TBQj204706ANTW9cUhrX9W3T+lnR/3qSVpUMo9bhNgPM3bC6LlPzxJfjD77qxBrCF1itVoOnJ67H9kZw56vxpFVSOOZ+GkFaD4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Hr9jAH+Y; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Hr9jAH+Y" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 302CF1F000E9; Sat, 25 Jul 2026 05:04:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1784955878; bh=ScRUpYKSPgrAR31jwAZGd/CQy0c2eVCu1switjuiMik=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=Hr9jAH+YvHTEq0AGIB7/3HUqt0JXUefr/Es4AhZaem2ROXOxLiRtCOXz/H2Ya9Rvf fPDO1tOSGXYYbPe3QRutjzViVyJBE8rqJikvVr+ejOkgF/NfU0mYiA7e3EOsS28Nrw Iv/LNFLxwcJ1JT8QeLSbb+WBlcHPTF3hm0n26/92bn5b/skImha7/OMYBqGvQ2nt1j 1AC5HdKn9YpXtXi4dyTNdGhv3WKLoLN9gBgf7CC4QmTODKrePOJKKdXdDq1JJZJxbs VI4IivNw8nq4zPRqqEZu8zN/CBPQ9L/PW6JfxNBFJTAG7jtlggiJSOBGheTQ2VvpFb Z0CWTsYh1EeWw== From: sashiko-bot@kernel.org Subject: Re: [PATCH RESEND 12/17] drm/spacemit: add Innosilicon DP/eDP controller bridge driver Reply-To: sashiko-reviews@lists.linux.dev To: "Cody Kang" Cc: neil.armstrong@linaro.org, conor+dt@kernel.org, devicetree@vger.kernel.org, robh@kernel.org, linux-phy@lists.infradead.org, olteanv@gmail.com, dri-devel@lists.freedesktop.org, vkoul@kernel.org In-Reply-To: <20260725-k3-display-v1-12-6de34d80e86c@gmail.com> References: <20260725-k3-display-v1-0-6de34d80e86c@gmail.com> <20260725-k3-display-v1-12-6de34d80e86c@gmail.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Sat, 25 Jul 2026 05:04:37 +0000 Message-Id: <20260725050438.302CF1F000E9@smtp.kernel.org> Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Thank you for your contribution! Sashiko AI review found 11 potential issue= (s) to consider: - [High] Custom EDID read function bypasses DRM core and breaks I2C repeate= d-start (MOT) rules, corrupting EDID reads for blocks > 0 or on active adap= ters. - [High] The hardirq handler returns `IRQ_NONE` after clearing hardware int= errupt flags, permanently disabling the IRQ line. - [High] Late attachment of the eDP panel bridge violates drm_bridge_connec= tor architecture and breaks panel support if the panel probes asynchronousl= y. - [High] DP Transfer Unit (TU) miscalculation due to pixel clock truncation. - [High] The IRQ handler returns `IRQ_NONE` without clearing the hardware i= nterrupt when `drm_dev_enter()` fails, leading to an interrupt storm. - [High] `spacemit_dp_bridge_atomic_create_state` returns an error pointer = instead of `NULL` on allocation failure, causing a kernel crash in the DRM = core. - [High] The hardirq handler calls regmap functions which use a sleepable l= ock on PREEMPT_RT. - [Medium] The atomic_check and mode_valid callbacks access DPCD link capab= ilities without holding mode_lock, leading to data races with the hotplug I= RQ handler. - [Medium] The DP IRQ handler silently drops hotplug notifications because = drm_bridge_hpd_notify() is a no-op when DRM_BRIDGE_OP_HPD is omitted. - [Medium] Calling clk_set_parent() on an already enabled clock. - [Medium] Resetting the AUX controller without holding aux->hw_mutex races= with concurrent AUX transfers. -- --- Patch [12]: [PATCH RESEND 12/17] drm/spacemit: add Innosilicon DP/eDP c= ontroller bridge driver --- commit b7eace372254ab27e120213d38c3a656b2a195b8 Author: Cody Kang drm/spacemit: add Innosilicon DP/eDP controller bridge driver Add the DP/eDP controller that sits downstream of the Saturn DPU. Two identical instances share one compatible; the eDP-vs-DP role is board wiring, so it is taken from the devicetree. > diff --git a/drivers/gpu/drm/spacemit/spacemit_inno_dp.c b/drivers/gpu/dr= m/spacemit/spacemit_inno_dp.c > index 0000000000000..e88731d9b18bf > --- /dev/null > +++ b/drivers/gpu/drm/spacemit/spacemit_inno_dp.c > @@ -248,16 +248,10 @@ > static inline struct spacemit_dp_bridge_state * > to_spacemit_dp_bridge_state(struct drm_bridge_state *state) > { > return container_of(state, struct spacemit_dp_bridge_state, base); > } > =20 > static const struct regmap_config spacemit_dp_regmap_config =3D { > .name =3D "dp", > .reg_bits =3D 32, > .val_bits =3D 32, > .reg_stride =3D 4, > .max_register =3D 0x3ffc, /* full 0x4000 reg region from binding */ > }; [Severity: High] Is it safe to omit use_raw_spinlock from the regmap configuration? Because this is not set to true, the regmap defaults to a sleepable lock on PREEMPT_RT. This causes a BUG when regmap read/write functions are called from the hardirq handler spacemit_dp_irq_handler(). > [ ... ] > @@ -661,16 +661,10 @@ > static void spacemit_dp_link_disable(struct spacemit_dp_dev *dp) > { > regmap_write_bits(dp->regs, DP_VIDEO_VSAMPLE_REG, > DP_VIDEO_STREAM_ENABLE, > FIELD_PREP(DP_VIDEO_STREAM_ENABLE, 0)); > spacemit_dp_phy_off(dp); > =20 > regmap_write_bits(dp->regs, DP_SOFT_RESET, DP_AUX_RESET, > FIELD_PREP(DP_AUX_RESET, 0x1)); [Severity: Medium] Could this reset corrupt concurrent AUX transfers? Modifying the AUX hardware in spacemit_dp_link_disable() without holding the aux->hw_mutex could race against a userspace or deferred transfer, potentially wedging the controller. > [ ... ] > @@ -936,15 +936,10 @@ > static void spacemit_dp_hw_set_msa_and_enable_video(struct spacemit_dp_d= ev *dp, > const struct drm_display_mode *mode, > enum spacemit_dp_link_rate rate, > enum spacemit_dp_lane_count lanes, > u32 color_format) > { > u64 hb_num; > u32 link_rate; > u32 fp; /* Pixel clock in MHz */ > u32 bpp, misc0; > u32 tu, tu_frac, tu_int, rd_thres; > u32 hsync_len; > =20 > /* mode->clock unit is kHz, fp unit is MHz */ > if (dp->use_ext_pixel_clock) > fp =3D dp->pixel_clock / 1000; > else > fp =3D mode->clock / 1000; [Severity: High] Can this truncation of the pixel clock to an integer MHz value cause DP FIFO underflows or overflows? For non-integer MHz pixel clocks like 148.5 MHz, this truncates to 148, introducing precision errors in the Transfer Unit (TU) calculations which results in corrupted video. > [ ... ] > @@ -1286,13 +1286,10 @@ > static int spacemit_dp_conn_get_edid_block(void *data, u8 *buf, > unsigned int block, size_t len) > { > struct spacemit_dp_dev *dp =3D data; > unsigned int start =3D block * EDID_LENGTH; > u8 segment =3D block >> 1; > int ret, retry; > size_t offset; > =20 > if (segment) { > for (retry =3D 0; retry < 3; retry++) { > ret =3D spacemit_dp_aux_i2c_write(dp, > SPACEMIT_DP_DDC_SEGMENT_ADDR, &segment, 1); [Severity: High] Does this custom EDID read function bypass the Middle-Of-Transaction (MOT) rules for I2C repeated-start? Issuing writes and reads without the MOT flag resets the DDC segment pointer to 0, breaking EDID reads for displays with multiple EDID blocks (block >=3D 1) or on active adapters. > [ ... ] > @@ -1632,15 +1632,10 @@ > static int spacemit_dp_bridge_atomic_check(struct drm_bridge *bridge, > struct drm_bridge_state *bridge_state, > struct drm_crtc_state *crtc_state, > struct drm_connector_state *conn_state) > { > struct spacemit_dp_dev *dp =3D container_of(bridge, > struct spacemit_dp_dev, > bridge); > struct spacemit_dp_bridge_state *st =3D > to_spacemit_dp_bridge_state(bridge_state); > const struct drm_display_mode *mode =3D &crtc_state->adjusted_mode; > int bpp; > u32 req_bw; > int i; > =20 > /* A single output bus format, see ->atomic_get_output_bus_fmts(). */ > st->color_format =3D SOC_VIDEO_RGB_8BIT; > bpp =3D spacemit_dp_get_bpp(dp, st->color_format); > req_bw =3D spacemit_dp_calc_required_bw(mode, bpp); > =20 > /* No caps yet: leave idx unset and let ->atomic_enable() retry. */ > if (!dp->link.max_rate || !dp->link.max_num_lanes) { [Severity: Medium] Could reading the DPCD link capabilities here race with the hotplug IRQ handler? Accessing the dp->link capabilities in spacemit_dp_bridge_atomic_check() without holding mode_lock might observe intermediate or torn states if a concurrent interrupt triggers a capability re-read, leading to transient rejections of valid modes. > [ ... ] > @@ -1705,10 +1705,10 @@ > static struct drm_bridge_state * > spacemit_dp_bridge_atomic_create_state(struct drm_bridge *bridge) > { > struct spacemit_dp_bridge_state *new; > =20 > new =3D kzalloc_obj(*new); > if (!new) > return ERR_PTR(-ENOMEM); [Severity: High] Should this return NULL on allocation failure instead of an error pointer? The DRM core's reset helper assigns the returned state directly without checking for errors. Returning an error pointer here causes a fatal page fault when the DRM core later dereferences it. > [ ... ] > @@ -1742,16 +1742,10 @@ > static int spacemit_dp_edp_link_panel(struct drm_dp_aux *aux) > { > struct spacemit_dp_dev *dp =3D container_of(aux, struct spacemit_dp_dev, > aux); > struct drm_bridge *next; > int ret; > =20 > next =3D devm_drm_of_get_bridge(dp->dev, dp->dev->of_node, 1, 0); > if (IS_ERR(next)) > return PTR_ERR(next); > =20 > dp->next_bridge =3D next; > =20 > /* > * A non-NULL bridge.encoder means .attach already ran: late-chain > * panel-edp. > */ > if (dp->bridge.encoder) { > ret =3D drm_bridge_attach(dp->bridge.encoder, next, > &dp->bridge, > DRM_BRIDGE_ATTACH_NO_CONNECTOR); [Severity: High] Does dynamically attaching the panel bridge late bypass connector initialization? If the eDP panel defers its probe, drm_bridge_connector_init() builds the connector without the panel bridge. Attaching it here later violates the drm_bridge_connector architecture and breaks panel support, because the connector will lack the panel's mode or EDID operations. > [ ... ] > @@ -1782,10 +1782,10 @@ > static irqreturn_t spacemit_dp_irq_handler(int irq, void *data) > { > struct spacemit_dp_dev *dp =3D data; > irqreturn_t ret =3D IRQ_NONE; > int idx; > =20 > if (!drm_dev_enter(dp->drm, &idx)) > return IRQ_NONE; [Severity: High] Will returning IRQ_NONE here without clearing the hardware interrupt cause an interrupt storm? If an interrupt fires while the DRM device is unregistered (such as during module unload), the handler exits without acknowledging the hardware interrupt, causing it to continuously fire and stall the CPU. > [ ... ] > @@ -1796,11 +1796,10 @@ > /* > * Only compare here: the authoritative connector_status update > * happens in the thread under mode_lock, via .detect(). > */ > if (spacemit_dp_hw_detect_hpd(dp) !=3D READ_ONCE(dp->connector_status)) > ret =3D IRQ_WAKE_THREAD; /* Call hotplug_event */ > spacemit_dp_hw_clean_hpd(dp); > =20 > drm_dev_exit(idx); > return ret; > } [Severity: High] Is it safe to return IRQ_NONE after clearing the hardware interrupt flags? If the logical state has not changed (e.g. from a transient hardware glitch), returning IRQ_NONE causes the kernel's spurious interrupt detector to eventually disable the IRQ line, which results in all future hotplug events being permanently missed. > [ ... ] > @@ -1813,11 +1813,10 @@ > static irqreturn_t spacemit_dp_hotplug_event_handler(int irq, void *data) > { > struct spacemit_dp_dev *dp =3D data; > enum drm_connector_status status; > int idx; > =20 > if (!drm_dev_enter(dp->drm, &idx)) > return IRQ_HANDLED; > =20 > /* > * .detect() owns mode_lock and re-reads the sink caps on a fresh plug > */ > status =3D spacemit_dp_bridge_detect(&dp->bridge, dp->connector); > drm_bridge_hpd_notify(&dp->bridge, status); [Severity: Medium] Will this hotplug notification be silently dropped? Since DRM_BRIDGE_OP_HPD is not set for the DP bridge during inno_dp_probe(), the bridge->hpd_cb is NULL, making drm_bridge_hpd_notify() a no-op and forcing the DRM core to rely entirely on periodic polling. > [ ... ] > @@ -2338,10 +2338,15 @@ > static int inno_dp_probe(struct platform_device *pdev) > { > struct device *dev =3D &pdev->dev; > [ ... ] > if (dp->pxclk) { > ret =3D clk_prepare_enable(dp->pxclk); > if (ret) { > dev_err(dev, "failed to enable pxclk: %d\n", ret); > goto err_reset; > } > } > [ ... ] > if (dp->pxclk) { > ret =3D clk_set_parent(dp->pxclk, dp->pll_clk); [Severity: Medium] Can calling clk_set_parent() on an already enabled clock cause hardware glitches? The pxclk is prepared and enabled earlier in inno_dp_probe(), and reparenting a running clock without hardware-specific glitch-free muxing can lock up downstream logic. > [ ... ] --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20260725-k3-display= -v1-0-6de34d80e86c@gmail.com?part=3D12 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 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 37F15C531D0 for ; Sat, 25 Jul 2026 05:04:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Reply-To:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Message-Id:Date: References:In-Reply-To:Cc:To:Subject:From:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=zYfwJ+/kndErtowzLMElNmhveDAmOGs9IbuMz6kMGcg=; b=z7Zokskgl6ZR6M 5sHw9Spg9P34Djh6SOme9Elaqa6dLc95z4Ye2F7f3YEZMPPcPeQ178r9Wepp3YIFKrZF2Td2yL3Ks efaYSsexPtI+K+bbAkEiPBMRcqbgB98mu57U7s38gxu78O9XE6hSiMP1lIOTE/I530WcFuUoofmsK /fULQi+u3gDICj840iUGVqG4CgTQoWG1mU2oY2biM+Pfd4gSuWHwazSZ6ePRKDn9U77JaOKcqo4qz HmZhNWyqxrziunEtnPWelPTSxGAq8oij6ths3nl0nFMQomBImzNAG965M19q2oIGoh+2evTrifd3v IKRlfGEKx8BtzCQTJySw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wnUYy-000000002s5-3xSz; Sat, 25 Jul 2026 05:04:40 +0000 Received: from tor.source.kernel.org ([172.105.4.254]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wnUYx-000000002rq-35JN for linux-phy@lists.infradead.org; Sat, 25 Jul 2026 05:04:39 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by tor.source.kernel.org (Postfix) with ESMTP id E87CD60A77; Sat, 25 Jul 2026 05:04:38 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 302CF1F000E9; Sat, 25 Jul 2026 05:04:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1784955878; bh=ScRUpYKSPgrAR31jwAZGd/CQy0c2eVCu1switjuiMik=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=Hr9jAH+YvHTEq0AGIB7/3HUqt0JXUefr/Es4AhZaem2ROXOxLiRtCOXz/H2Ya9Rvf fPDO1tOSGXYYbPe3QRutjzViVyJBE8rqJikvVr+ejOkgF/NfU0mYiA7e3EOsS28Nrw Iv/LNFLxwcJ1JT8QeLSbb+WBlcHPTF3hm0n26/92bn5b/skImha7/OMYBqGvQ2nt1j 1AC5HdKn9YpXtXi4dyTNdGhv3WKLoLN9gBgf7CC4QmTODKrePOJKKdXdDq1JJZJxbs VI4IivNw8nq4zPRqqEZu8zN/CBPQ9L/PW6JfxNBFJTAG7jtlggiJSOBGheTQ2VvpFb Z0CWTsYh1EeWw== From: sashiko-bot@kernel.org Subject: Re: [PATCH RESEND 12/17] drm/spacemit: add Innosilicon DP/eDP controller bridge driver To: "Cody Kang" Cc: neil.armstrong@linaro.org, conor+dt@kernel.org, devicetree@vger.kernel.org, robh@kernel.org, linux-phy@lists.infradead.org, olteanv@gmail.com, dri-devel@lists.freedesktop.org, vkoul@kernel.org In-Reply-To: <20260725-k3-display-v1-12-6de34d80e86c@gmail.com> References: <20260725-k3-display-v1-0-6de34d80e86c@gmail.com> <20260725-k3-display-v1-12-6de34d80e86c@gmail.com> Date: Sat, 25 Jul 2026 05:04:37 +0000 Message-Id: <20260725050438.302CF1F000E9@smtp.kernel.org> X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: sashiko-reviews@lists.linux.dev MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org VGhhbmsgeW91IGZvciB5b3VyIGNvbnRyaWJ1dGlvbiEgU2FzaGlrbyBBSSByZXZpZXcgZm91bmQg MTEgcG90ZW50aWFsIGlzc3VlKHMpIHRvIGNvbnNpZGVyOgotIFtIaWdoXSBDdXN0b20gRURJRCBy ZWFkIGZ1bmN0aW9uIGJ5cGFzc2VzIERSTSBjb3JlIGFuZCBicmVha3MgSTJDIHJlcGVhdGVkLXN0 YXJ0IChNT1QpIHJ1bGVzLCBjb3JydXB0aW5nIEVESUQgcmVhZHMgZm9yIGJsb2NrcyA+IDAgb3Ig b24gYWN0aXZlIGFkYXB0ZXJzLgotIFtIaWdoXSBUaGUgaGFyZGlycSBoYW5kbGVyIHJldHVybnMg YElSUV9OT05FYCBhZnRlciBjbGVhcmluZyBoYXJkd2FyZSBpbnRlcnJ1cHQgZmxhZ3MsIHBlcm1h bmVudGx5IGRpc2FibGluZyB0aGUgSVJRIGxpbmUuCi0gW0hpZ2hdIExhdGUgYXR0YWNobWVudCBv ZiB0aGUgZURQIHBhbmVsIGJyaWRnZSB2aW9sYXRlcyBkcm1fYnJpZGdlX2Nvbm5lY3RvciBhcmNo aXRlY3R1cmUgYW5kIGJyZWFrcyBwYW5lbCBzdXBwb3J0IGlmIHRoZSBwYW5lbCBwcm9iZXMgYXN5 bmNocm9ub3VzbHkuCi0gW0hpZ2hdIERQIFRyYW5zZmVyIFVuaXQgKFRVKSBtaXNjYWxjdWxhdGlv biBkdWUgdG8gcGl4ZWwgY2xvY2sgdHJ1bmNhdGlvbi4KLSBbSGlnaF0gVGhlIElSUSBoYW5kbGVy IHJldHVybnMgYElSUV9OT05FYCB3aXRob3V0IGNsZWFyaW5nIHRoZSBoYXJkd2FyZSBpbnRlcnJ1 cHQgd2hlbiBgZHJtX2Rldl9lbnRlcigpYCBmYWlscywgbGVhZGluZyB0byBhbiBpbnRlcnJ1cHQg c3Rvcm0uCi0gW0hpZ2hdIGBzcGFjZW1pdF9kcF9icmlkZ2VfYXRvbWljX2NyZWF0ZV9zdGF0ZWAg cmV0dXJucyBhbiBlcnJvciBwb2ludGVyIGluc3RlYWQgb2YgYE5VTExgIG9uIGFsbG9jYXRpb24g ZmFpbHVyZSwgY2F1c2luZyBhIGtlcm5lbCBjcmFzaCBpbiB0aGUgRFJNIGNvcmUuCi0gW0hpZ2hd IFRoZSBoYXJkaXJxIGhhbmRsZXIgY2FsbHMgcmVnbWFwIGZ1bmN0aW9ucyB3aGljaCB1c2UgYSBz bGVlcGFibGUgbG9jayBvbiBQUkVFTVBUX1JULgotIFtNZWRpdW1dIFRoZSBhdG9taWNfY2hlY2sg YW5kIG1vZGVfdmFsaWQgY2FsbGJhY2tzIGFjY2VzcyBEUENEIGxpbmsgY2FwYWJpbGl0aWVzIHdp dGhvdXQgaG9sZGluZyBtb2RlX2xvY2ssIGxlYWRpbmcgdG8gZGF0YSByYWNlcyB3aXRoIHRoZSBo b3RwbHVnIElSUSBoYW5kbGVyLgotIFtNZWRpdW1dIFRoZSBEUCBJUlEgaGFuZGxlciBzaWxlbnRs eSBkcm9wcyBob3RwbHVnIG5vdGlmaWNhdGlvbnMgYmVjYXVzZSBkcm1fYnJpZGdlX2hwZF9ub3Rp ZnkoKSBpcyBhIG5vLW9wIHdoZW4gRFJNX0JSSURHRV9PUF9IUEQgaXMgb21pdHRlZC4KLSBbTWVk aXVtXSBDYWxsaW5nIGNsa19zZXRfcGFyZW50KCkgb24gYW4gYWxyZWFkeSBlbmFibGVkIGNsb2Nr LgotIFtNZWRpdW1dIFJlc2V0dGluZyB0aGUgQVVYIGNvbnRyb2xsZXIgd2l0aG91dCBob2xkaW5n IGF1eC0+aHdfbXV0ZXggcmFjZXMgd2l0aCBjb25jdXJyZW50IEFVWCB0cmFuc2ZlcnMuCi0tCgot LS0gUGF0Y2ggWzEyXTogW1BBVENIIFJFU0VORCAxMi8xN10gZHJtL3NwYWNlbWl0OiBhZGQgSW5u b3NpbGljb24gRFAvZURQIGNvbnRyb2xsZXIgYnJpZGdlIGRyaXZlciAtLS0KY29tbWl0IGI3ZWFj ZTM3MjI1NGFiMjdlMTIwMjEzZDM4YzNhNjU2YjJhMTk1YjgKQXV0aG9yOiBDb2R5IEthbmcgPGNv ZHlrYW5nLmhrQGdtYWlsLmNvbT4KCmRybS9zcGFjZW1pdDogYWRkIElubm9zaWxpY29uIERQL2VE UCBjb250cm9sbGVyIGJyaWRnZSBkcml2ZXIKCkFkZCB0aGUgRFAvZURQIGNvbnRyb2xsZXIgdGhh dCBzaXRzIGRvd25zdHJlYW0gb2YgdGhlIFNhdHVybiBEUFUuIFR3bwppZGVudGljYWwgaW5zdGFu Y2VzIHNoYXJlIG9uZSBjb21wYXRpYmxlOyB0aGUgZURQLXZzLURQIHJvbGUgaXMgYm9hcmQKd2ly aW5nLCBzbyBpdCBpcyB0YWtlbiBmcm9tIHRoZSBkZXZpY2V0cmVlLgoKPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL3NwYWNlbWl0L3NwYWNlbWl0X2lubm9fZHAuYyBiL2RyaXZlcnMvZ3B1 L2RybS9zcGFjZW1pdC9zcGFjZW1pdF9pbm5vX2RwLmMKPiBpbmRleCAwMDAwMDAwMDAwMDAwLi5l ODg3MzFkOWIxOGJmCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9zcGFj ZW1pdC9zcGFjZW1pdF9pbm5vX2RwLmMKPiBAQCAtMjQ4LDE2ICsyNDgsMTAgQEAKPiAgc3RhdGlj IGlubGluZSBzdHJ1Y3Qgc3BhY2VtaXRfZHBfYnJpZGdlX3N0YXRlICoKPiAgdG9fc3BhY2VtaXRf ZHBfYnJpZGdlX3N0YXRlKHN0cnVjdCBkcm1fYnJpZGdlX3N0YXRlICpzdGF0ZSkKPiAgewo+ICAJ cmV0dXJuIGNvbnRhaW5lcl9vZihzdGF0ZSwgc3RydWN0IHNwYWNlbWl0X2RwX2JyaWRnZV9zdGF0 ZSwgYmFzZSk7Cj4gIH0KPiAgCj4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBz cGFjZW1pdF9kcF9yZWdtYXBfY29uZmlnID0gewo+ICAJLm5hbWUJCT0gImRwIiwKPiAgCS5yZWdf Yml0cwk9IDMyLAo+ICAJLnZhbF9iaXRzCT0gMzIsCj4gIAkucmVnX3N0cmlkZQk9IDQsCj4gIAku bWF4X3JlZ2lzdGVyCT0gMHgzZmZjLAkvKiBmdWxsIDB4NDAwMCByZWcgcmVnaW9uIGZyb20gYmlu ZGluZyAqLwo+ICB9OwoKW1NldmVyaXR5OiBIaWdoXQpJcyBpdCBzYWZlIHRvIG9taXQgdXNlX3Jh d19zcGlubG9jayBmcm9tIHRoZSByZWdtYXAgY29uZmlndXJhdGlvbj8gQmVjYXVzZQp0aGlzIGlz IG5vdCBzZXQgdG8gdHJ1ZSwgdGhlIHJlZ21hcCBkZWZhdWx0cyB0byBhIHNsZWVwYWJsZSBsb2Nr IG9uClBSRUVNUFRfUlQuIFRoaXMgY2F1c2VzIGEgQlVHIHdoZW4gcmVnbWFwIHJlYWQvd3JpdGUg ZnVuY3Rpb25zIGFyZSBjYWxsZWQKZnJvbSB0aGUgaGFyZGlycSBoYW5kbGVyIHNwYWNlbWl0X2Rw X2lycV9oYW5kbGVyKCkuCgo+IFsgLi4uIF0KPiBAQCAtNjYxLDE2ICs2NjEsMTAgQEAKPiAgc3Rh dGljIHZvaWQgc3BhY2VtaXRfZHBfbGlua19kaXNhYmxlKHN0cnVjdCBzcGFjZW1pdF9kcF9kZXYg KmRwKQo+ICB7Cj4gIAlyZWdtYXBfd3JpdGVfYml0cyhkcC0+cmVncywgRFBfVklERU9fVlNBTVBM RV9SRUcsCj4gIAkJCSAgRFBfVklERU9fU1RSRUFNX0VOQUJMRSwKPiAgCQkJICBGSUVMRF9QUkVQ KERQX1ZJREVPX1NUUkVBTV9FTkFCTEUsIDApKTsKPiAgCXNwYWNlbWl0X2RwX3BoeV9vZmYoZHAp Owo+ICAKPiAgCXJlZ21hcF93cml0ZV9iaXRzKGRwLT5yZWdzLCBEUF9TT0ZUX1JFU0VULCBEUF9B VVhfUkVTRVQsCj4gIAkJCSAgRklFTERfUFJFUChEUF9BVVhfUkVTRVQsIDB4MSkpOwoKW1NldmVy aXR5OiBNZWRpdW1dCkNvdWxkIHRoaXMgcmVzZXQgY29ycnVwdCBjb25jdXJyZW50IEFVWCB0cmFu c2ZlcnM/IE1vZGlmeWluZyB0aGUgQVVYCmhhcmR3YXJlIGluIHNwYWNlbWl0X2RwX2xpbmtfZGlz YWJsZSgpIHdpdGhvdXQgaG9sZGluZyB0aGUgYXV4LT5od19tdXRleApjb3VsZCByYWNlIGFnYWlu c3QgYSB1c2Vyc3BhY2Ugb3IgZGVmZXJyZWQgdHJhbnNmZXIsIHBvdGVudGlhbGx5IHdlZGdpbmcK dGhlIGNvbnRyb2xsZXIuCgo+IFsgLi4uIF0KPiBAQCAtOTM2LDE1ICs5MzYsMTAgQEAKPiAgc3Rh dGljIHZvaWQgc3BhY2VtaXRfZHBfaHdfc2V0X21zYV9hbmRfZW5hYmxlX3ZpZGVvKHN0cnVjdCBz cGFjZW1pdF9kcF9kZXYgKmRwLAo+ICAJCQkJCQkgICAgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5 X21vZGUgKm1vZGUsCj4gIAkJCQkJICAgICAgIGVudW0gc3BhY2VtaXRfZHBfbGlua19yYXRlIHJh dGUsCj4gIAkJCQkJICAgICAgIGVudW0gc3BhY2VtaXRfZHBfbGFuZV9jb3VudCBsYW5lcywKPiAg CQl1MzIgY29sb3JfZm9ybWF0KQo+ICB7Cj4gIAl1NjQgaGJfbnVtOwo+ICAJdTMyIGxpbmtfcmF0 ZTsKPiAgCXUzMiBmcDsgLyogUGl4ZWwgY2xvY2sgaW4gTUh6ICovCj4gIAl1MzIgYnBwLCBtaXNj MDsKPiAgCXUzMiB0dSwgdHVfZnJhYywgdHVfaW50LCByZF90aHJlczsKPiAgCXUzMiBoc3luY19s ZW47Cj4gIAo+ICAJLyogbW9kZS0+Y2xvY2sgdW5pdCBpcyBrSHosIGZwIHVuaXQgaXMgTUh6ICov Cj4gIAlpZiAoZHAtPnVzZV9leHRfcGl4ZWxfY2xvY2spCj4gIAkJZnAgPSBkcC0+cGl4ZWxfY2xv Y2sgLyAxMDAwOwo+ICAJZWxzZQo+ICAJCWZwID0gbW9kZS0+Y2xvY2sgLyAxMDAwOwoKW1NldmVy aXR5OiBIaWdoXQpDYW4gdGhpcyB0cnVuY2F0aW9uIG9mIHRoZSBwaXhlbCBjbG9jayB0byBhbiBp bnRlZ2VyIE1IeiB2YWx1ZSBjYXVzZSBEUApGSUZPIHVuZGVyZmxvd3Mgb3Igb3ZlcmZsb3dzPyBG b3Igbm9uLWludGVnZXIgTUh6IHBpeGVsIGNsb2NrcyBsaWtlCjE0OC41IE1IeiwgdGhpcyB0cnVu Y2F0ZXMgdG8gMTQ4LCBpbnRyb2R1Y2luZyBwcmVjaXNpb24gZXJyb3JzIGluIHRoZQpUcmFuc2Zl ciBVbml0IChUVSkgY2FsY3VsYXRpb25zIHdoaWNoIHJlc3VsdHMgaW4gY29ycnVwdGVkIHZpZGVv LgoKPiBbIC4uLiBdCj4gQEAgLTEyODYsMTMgKzEyODYsMTAgQEAKPiAgc3RhdGljIGludCBzcGFj ZW1pdF9kcF9jb25uX2dldF9lZGlkX2Jsb2NrKHZvaWQgKmRhdGEsIHU4ICpidWYsCj4gIAkJCQkJ ICAgdW5zaWduZWQgaW50IGJsb2NrLCBzaXplX3QgbGVuKQo+ICB7Cj4gIAlzdHJ1Y3Qgc3BhY2Vt aXRfZHBfZGV2ICpkcCA9IGRhdGE7Cj4gIAl1bnNpZ25lZCBpbnQgc3RhcnQgPSBibG9jayAqIEVE SURfTEVOR1RIOwo+ICAJdTggc2VnbWVudCA9IGJsb2NrID4+IDE7Cj4gIAlpbnQgcmV0LCByZXRy eTsKPiAgCXNpemVfdCBvZmZzZXQ7Cj4gIAo+ICAJaWYgKHNlZ21lbnQpIHsKPiAgCQlmb3IgKHJl dHJ5ID0gMDsgcmV0cnkgPCAzOyByZXRyeSsrKSB7Cj4gIAkJCXJldCA9IHNwYWNlbWl0X2RwX2F1 eF9pMmNfd3JpdGUoZHAsCj4gIAkJCQlTUEFDRU1JVF9EUF9ERENfU0VHTUVOVF9BRERSLCAmc2Vn bWVudCwgMSk7CgpbU2V2ZXJpdHk6IEhpZ2hdCkRvZXMgdGhpcyBjdXN0b20gRURJRCByZWFkIGZ1 bmN0aW9uIGJ5cGFzcyB0aGUgTWlkZGxlLU9mLVRyYW5zYWN0aW9uIChNT1QpCnJ1bGVzIGZvciBJ MkMgcmVwZWF0ZWQtc3RhcnQ/IElzc3Vpbmcgd3JpdGVzIGFuZCByZWFkcyB3aXRob3V0IHRoZSBN T1QgZmxhZwpyZXNldHMgdGhlIEREQyBzZWdtZW50IHBvaW50ZXIgdG8gMCwgYnJlYWtpbmcgRURJ RCByZWFkcyBmb3IgZGlzcGxheXMgd2l0aAptdWx0aXBsZSBFRElEIGJsb2NrcyAoYmxvY2sgPj0g MSkgb3Igb24gYWN0aXZlIGFkYXB0ZXJzLgoKPiBbIC4uLiBdCj4gQEAgLTE2MzIsMTUgKzE2MzIs MTAgQEAKPiAgc3RhdGljIGludCBzcGFjZW1pdF9kcF9icmlkZ2VfYXRvbWljX2NoZWNrKHN0cnVj dCBkcm1fYnJpZGdlICpicmlkZ2UsCj4gIAkJCQkJICAgc3RydWN0IGRybV9icmlkZ2Vfc3RhdGUg KmJyaWRnZV9zdGF0ZSwKPiAgCQkJCSAgICAgIHN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqY3J0Y19z dGF0ZSwKPiAgCQkJCSAgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlICpjb25uX3N0YXRl KQo+ICB7Cj4gIAlzdHJ1Y3Qgc3BhY2VtaXRfZHBfZGV2ICpkcCA9IGNvbnRhaW5lcl9vZihicmlk Z2UsCj4gIAkJCQkJCSAgc3RydWN0IHNwYWNlbWl0X2RwX2RldiwKPiAgCQkJCQkJICBicmlkZ2Up Owo+ICAJc3RydWN0IHNwYWNlbWl0X2RwX2JyaWRnZV9zdGF0ZSAqc3QgPQo+ICAJCQl0b19zcGFj ZW1pdF9kcF9icmlkZ2Vfc3RhdGUoYnJpZGdlX3N0YXRlKTsKPiAgCWNvbnN0IHN0cnVjdCBkcm1f ZGlzcGxheV9tb2RlICptb2RlID0gJmNydGNfc3RhdGUtPmFkanVzdGVkX21vZGU7Cj4gIAlpbnQg YnBwOwo+ICAJdTMyIHJlcV9idzsKPiAgCWludCBpOwo+ICAKPiAgCS8qIEEgc2luZ2xlIG91dHB1 dCBidXMgZm9ybWF0LCBzZWUgLT5hdG9taWNfZ2V0X291dHB1dF9idXNfZm10cygpLiAqLwo+ICAJ c3QtPmNvbG9yX2Zvcm1hdCA9IFNPQ19WSURFT19SR0JfOEJJVDsKPiAgCWJwcCA9IHNwYWNlbWl0 X2RwX2dldF9icHAoZHAsIHN0LT5jb2xvcl9mb3JtYXQpOwo+ICAJcmVxX2J3ID0gc3BhY2VtaXRf ZHBfY2FsY19yZXF1aXJlZF9idyhtb2RlLCBicHApOwo+ICAKPiAgCS8qIE5vIGNhcHMgeWV0OiBs ZWF2ZSBpZHggdW5zZXQgYW5kIGxldCAtPmF0b21pY19lbmFibGUoKSByZXRyeS4gKi8KPiAgCWlm ICghZHAtPmxpbmsubWF4X3JhdGUgfHwgIWRwLT5saW5rLm1heF9udW1fbGFuZXMpIHsKCltTZXZl cml0eTogTWVkaXVtXQpDb3VsZCByZWFkaW5nIHRoZSBEUENEIGxpbmsgY2FwYWJpbGl0aWVzIGhl cmUgcmFjZSB3aXRoIHRoZSBob3RwbHVnIElSUQpoYW5kbGVyPyBBY2Nlc3NpbmcgdGhlIGRwLT5s aW5rIGNhcGFiaWxpdGllcyBpbgpzcGFjZW1pdF9kcF9icmlkZ2VfYXRvbWljX2NoZWNrKCkgd2l0 aG91dCBob2xkaW5nIG1vZGVfbG9jayBtaWdodCBvYnNlcnZlCmludGVybWVkaWF0ZSBvciB0b3Ju IHN0YXRlcyBpZiBhIGNvbmN1cnJlbnQgaW50ZXJydXB0IHRyaWdnZXJzIGEgY2FwYWJpbGl0eQpy ZS1yZWFkLCBsZWFkaW5nIHRvIHRyYW5zaWVudCByZWplY3Rpb25zIG9mIHZhbGlkIG1vZGVzLgoK PiBbIC4uLiBdCj4gQEAgLTE3MDUsMTAgKzE3MDUsMTAgQEAKPiAgc3RhdGljIHN0cnVjdCBkcm1f YnJpZGdlX3N0YXRlICoKPiAgc3BhY2VtaXRfZHBfYnJpZGdlX2F0b21pY19jcmVhdGVfc3RhdGUo c3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKPiAgewo+ICAJc3RydWN0IHNwYWNlbWl0X2RwX2Jy aWRnZV9zdGF0ZSAqbmV3Owo+ICAKPiAgCW5ldyA9IGt6YWxsb2Nfb2JqKCpuZXcpOwo+ICAJaWYg KCFuZXcpCj4gIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CgpbU2V2ZXJpdHk6IEhpZ2hdClNo b3VsZCB0aGlzIHJldHVybiBOVUxMIG9uIGFsbG9jYXRpb24gZmFpbHVyZSBpbnN0ZWFkIG9mIGFu IGVycm9yIHBvaW50ZXI/ClRoZSBEUk0gY29yZSdzIHJlc2V0IGhlbHBlciBhc3NpZ25zIHRoZSBy ZXR1cm5lZCBzdGF0ZSBkaXJlY3RseSB3aXRob3V0CmNoZWNraW5nIGZvciBlcnJvcnMuIFJldHVy bmluZyBhbiBlcnJvciBwb2ludGVyIGhlcmUgY2F1c2VzIGEgZmF0YWwgcGFnZQpmYXVsdCB3aGVu IHRoZSBEUk0gY29yZSBsYXRlciBkZXJlZmVyZW5jZXMgaXQuCgo+IFsgLi4uIF0KPiBAQCAtMTc0 MiwxNiArMTc0MiwxMCBAQAo+ICBzdGF0aWMgaW50IHNwYWNlbWl0X2RwX2VkcF9saW5rX3BhbmVs KHN0cnVjdCBkcm1fZHBfYXV4ICphdXgpCj4gIHsKPiAgCXN0cnVjdCBzcGFjZW1pdF9kcF9kZXYg KmRwID0gY29udGFpbmVyX29mKGF1eCwgc3RydWN0IHNwYWNlbWl0X2RwX2RldiwKPiAgCQkJCQkJ ICBhdXgpOwo+ICAJc3RydWN0IGRybV9icmlkZ2UgKm5leHQ7Cj4gIAlpbnQgcmV0Owo+ICAKPiAg CW5leHQgPSBkZXZtX2RybV9vZl9nZXRfYnJpZGdlKGRwLT5kZXYsIGRwLT5kZXYtPm9mX25vZGUs IDEsIDApOwo+ICAJaWYgKElTX0VSUihuZXh0KSkKPiAgCQlyZXR1cm4gUFRSX0VSUihuZXh0KTsK PiAgCj4gIAlkcC0+bmV4dF9icmlkZ2UgPSBuZXh0Owo+ICAKPiAgCS8qCj4gIAkgKiBBIG5vbi1O VUxMIGJyaWRnZS5lbmNvZGVyIG1lYW5zIC5hdHRhY2ggYWxyZWFkeSByYW46IGxhdGUtY2hhaW4K PiAgCSAqIHBhbmVsLWVkcC4KPiAgCSAqLwo+ICAJaWYgKGRwLT5icmlkZ2UuZW5jb2Rlcikgewo+ ICAJCXJldCA9IGRybV9icmlkZ2VfYXR0YWNoKGRwLT5icmlkZ2UuZW5jb2RlciwgbmV4dCwKPiAg CQkJCQkmZHAtPmJyaWRnZSwKPiAgCQkJCQlEUk1fQlJJREdFX0FUVEFDSF9OT19DT05ORUNUT1Ip OwoKW1NldmVyaXR5OiBIaWdoXQpEb2VzIGR5bmFtaWNhbGx5IGF0dGFjaGluZyB0aGUgcGFuZWwg YnJpZGdlIGxhdGUgYnlwYXNzIGNvbm5lY3Rvcgppbml0aWFsaXphdGlvbj8gSWYgdGhlIGVEUCBw YW5lbCBkZWZlcnMgaXRzIHByb2JlLApkcm1fYnJpZGdlX2Nvbm5lY3Rvcl9pbml0KCkgYnVpbGRz IHRoZSBjb25uZWN0b3Igd2l0aG91dCB0aGUgcGFuZWwgYnJpZGdlLgpBdHRhY2hpbmcgaXQgaGVy ZSBsYXRlciB2aW9sYXRlcyB0aGUgZHJtX2JyaWRnZV9jb25uZWN0b3IgYXJjaGl0ZWN0dXJlIGFu ZApicmVha3MgcGFuZWwgc3VwcG9ydCwgYmVjYXVzZSB0aGUgY29ubmVjdG9yIHdpbGwgbGFjayB0 aGUgcGFuZWwncyBtb2RlIG9yCkVESUQgb3BlcmF0aW9ucy4KCj4gWyAuLi4gXQo+IEBAIC0xNzgy LDEwICsxNzgyLDEwIEBACj4gIHN0YXRpYyBpcnFyZXR1cm5fdCBzcGFjZW1pdF9kcF9pcnFfaGFu ZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQo+ICB7Cj4gIAlzdHJ1Y3Qgc3BhY2VtaXRfZHBfZGV2 ICpkcCA9IGRhdGE7Cj4gIAlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKPiAgCWludCBpZHg7 Cj4gIAo+ICAJaWYgKCFkcm1fZGV2X2VudGVyKGRwLT5kcm0sICZpZHgpKQo+ICAJCXJldHVybiBJ UlFfTk9ORTsKCltTZXZlcml0eTogSGlnaF0KV2lsbCByZXR1cm5pbmcgSVJRX05PTkUgaGVyZSB3 aXRob3V0IGNsZWFyaW5nIHRoZSBoYXJkd2FyZSBpbnRlcnJ1cHQgY2F1c2UKYW4gaW50ZXJydXB0 IHN0b3JtPyBJZiBhbiBpbnRlcnJ1cHQgZmlyZXMgd2hpbGUgdGhlIERSTSBkZXZpY2UgaXMKdW5y ZWdpc3RlcmVkIChzdWNoIGFzIGR1cmluZyBtb2R1bGUgdW5sb2FkKSwgdGhlIGhhbmRsZXIgZXhp dHMgd2l0aG91dAphY2tub3dsZWRnaW5nIHRoZSBoYXJkd2FyZSBpbnRlcnJ1cHQsIGNhdXNpbmcg aXQgdG8gY29udGludW91c2x5IGZpcmUgYW5kCnN0YWxsIHRoZSBDUFUuCgo+IFsgLi4uIF0KPiBA QCAtMTc5NiwxMSArMTc5NiwxMCBAQAo+ICAJLyoKPiAgCSAqIE9ubHkgY29tcGFyZSBoZXJlOiB0 aGUgYXV0aG9yaXRhdGl2ZSBjb25uZWN0b3Jfc3RhdHVzIHVwZGF0ZQo+ICAJICogaGFwcGVucyBp biB0aGUgdGhyZWFkIHVuZGVyIG1vZGVfbG9jaywgdmlhIC5kZXRlY3QoKS4KPiAgCSAqLwo+ICAJ aWYgKHNwYWNlbWl0X2RwX2h3X2RldGVjdF9ocGQoZHApICE9IFJFQURfT05DRShkcC0+Y29ubmVj dG9yX3N0YXR1cykpCj4gIAkJcmV0ID0gSVJRX1dBS0VfVEhSRUFEOyAvKiBDYWxsIGhvdHBsdWdf ZXZlbnQgKi8KPiAgCXNwYWNlbWl0X2RwX2h3X2NsZWFuX2hwZChkcCk7Cj4gIAo+ICAJZHJtX2Rl dl9leGl0KGlkeCk7Cj4gIAlyZXR1cm4gcmV0Owo+ICB9CgpbU2V2ZXJpdHk6IEhpZ2hdCklzIGl0 IHNhZmUgdG8gcmV0dXJuIElSUV9OT05FIGFmdGVyIGNsZWFyaW5nIHRoZSBoYXJkd2FyZSBpbnRl cnJ1cHQgZmxhZ3M/CklmIHRoZSBsb2dpY2FsIHN0YXRlIGhhcyBub3QgY2hhbmdlZCAoZS5nLiBm cm9tIGEgdHJhbnNpZW50IGhhcmR3YXJlCmdsaXRjaCksIHJldHVybmluZyBJUlFfTk9ORSBjYXVz ZXMgdGhlIGtlcm5lbCdzIHNwdXJpb3VzIGludGVycnVwdCBkZXRlY3Rvcgp0byBldmVudHVhbGx5 IGRpc2FibGUgdGhlIElSUSBsaW5lLCB3aGljaCByZXN1bHRzIGluIGFsbCBmdXR1cmUgaG90cGx1 ZwpldmVudHMgYmVpbmcgcGVybWFuZW50bHkgbWlzc2VkLgoKPiBbIC4uLiBdCj4gQEAgLTE4MTMs MTEgKzE4MTMsMTAgQEAKPiAgc3RhdGljIGlycXJldHVybl90IHNwYWNlbWl0X2RwX2hvdHBsdWdf ZXZlbnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQo+ICB7Cj4gIAlzdHJ1Y3Qgc3BhY2Vt aXRfZHBfZGV2ICpkcCA9IGRhdGE7Cj4gIAllbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIHN0YXR1 czsKPiAgCWludCBpZHg7Cj4gIAo+ICAJaWYgKCFkcm1fZGV2X2VudGVyKGRwLT5kcm0sICZpZHgp KQo+ICAJCXJldHVybiBJUlFfSEFORExFRDsKPiAgCj4gIAkvKgo+ICAJICogLmRldGVjdCgpIG93 bnMgbW9kZV9sb2NrIGFuZCByZS1yZWFkcyB0aGUgc2luayBjYXBzIG9uIGEgZnJlc2ggcGx1Zwo+ ICAJICovCj4gIAlzdGF0dXMgPSBzcGFjZW1pdF9kcF9icmlkZ2VfZGV0ZWN0KCZkcC0+YnJpZGdl LCBkcC0+Y29ubmVjdG9yKTsKPiAgCWRybV9icmlkZ2VfaHBkX25vdGlmeSgmZHAtPmJyaWRnZSwg c3RhdHVzKTsKCltTZXZlcml0eTogTWVkaXVtXQpXaWxsIHRoaXMgaG90cGx1ZyBub3RpZmljYXRp b24gYmUgc2lsZW50bHkgZHJvcHBlZD8gU2luY2UKRFJNX0JSSURHRV9PUF9IUEQgaXMgbm90IHNl dCBmb3IgdGhlIERQIGJyaWRnZSBkdXJpbmcgaW5ub19kcF9wcm9iZSgpLCB0aGUKYnJpZGdlLT5o cGRfY2IgaXMgTlVMTCwgbWFraW5nIGRybV9icmlkZ2VfaHBkX25vdGlmeSgpIGEgbm8tb3AgYW5k IGZvcmNpbmcKdGhlIERSTSBjb3JlIHRvIHJlbHkgZW50aXJlbHkgb24gcGVyaW9kaWMgcG9sbGlu Zy4KCj4gWyAuLi4gXQo+IEBAIC0yMzM4LDEwICsyMzM4LDE1IEBACj4gIHN0YXRpYyBpbnQgaW5u b19kcF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICB7Cj4gIAlzdHJ1Y3Qg ZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2Owo+IFsgLi4uIF0KPiAgCWlmIChkcC0+cHhjbGspIHsK PiAgCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZHAtPnB4Y2xrKTsKPiAgCQlpZiAocmV0KSB7 Cj4gIAkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBweGNsazogJWRcbiIsIHJldCk7 Cj4gIAkJCWdvdG8gZXJyX3Jlc2V0Owo+ICAJCX0KPiAgCX0KPiBbIC4uLiBdCj4gIAlpZiAoZHAt PnB4Y2xrKSB7Cj4gIAkJcmV0ID0gY2xrX3NldF9wYXJlbnQoZHAtPnB4Y2xrLCBkcC0+cGxsX2Ns ayk7CgpbU2V2ZXJpdHk6IE1lZGl1bV0KQ2FuIGNhbGxpbmcgY2xrX3NldF9wYXJlbnQoKSBvbiBh biBhbHJlYWR5IGVuYWJsZWQgY2xvY2sgY2F1c2UgaGFyZHdhcmUKZ2xpdGNoZXM/IFRoZSBweGNs ayBpcyBwcmVwYXJlZCBhbmQgZW5hYmxlZCBlYXJsaWVyIGluIGlubm9fZHBfcHJvYmUoKSwgYW5k CnJlcGFyZW50aW5nIGEgcnVubmluZyBjbG9jayB3aXRob3V0IGhhcmR3YXJlLXNwZWNpZmljIGds aXRjaC1mcmVlIG11eGluZwpjYW4gbG9jayB1cCBkb3duc3RyZWFtIGxvZ2ljLgoKPiBbIC4uLiBd CgotLSAKU2FzaGlrbyBBSSByZXZpZXcgwrcgaHR0cHM6Ly9zYXNoaWtvLmRldi8jL3BhdGNoc2V0 LzIwMjYwNzI1LWszLWRpc3BsYXktdjEtMC02ZGUzNGQ4MGU4NmNAZ21haWwuY29tP3BhcnQ9MTIK Ci0tIApsaW51eC1waHkgbWFpbGluZyBsaXN0CmxpbnV4LXBoeUBsaXN0cy5pbmZyYWRlYWQub3Jn Cmh0dHBzOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXBoeQo=