From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_MUTT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 13D4EC04E84 for ; Thu, 16 May 2019 12:00:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D095820818 for ; Thu, 16 May 2019 12:00:22 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Y88FBRN0" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727541AbfEPMAW (ORCPT ); Thu, 16 May 2019 08:00:22 -0400 Received: from perceval.ideasonboard.com ([213.167.242.64]:34888 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726955AbfEPMAV (ORCPT ); Thu, 16 May 2019 08:00:21 -0400 Received: from pendragon.ideasonboard.com (dfj612yhrgyx302h3jwwy-3.rev.dnainternet.fi [IPv6:2001:14ba:21f5:5b00:ce28:277f:58d7:3ca4]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 47F132FD; Thu, 16 May 2019 14:00:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1558008017; bh=Dd99VVS1GEgLkFLY3PEx8Qckav8IgvhkiZG2aS5tppY=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=Y88FBRN0W/Ut2Ct1Vs0jid9Hr77uPg+zLv4L0h/2y6XDJBs8V//mehTBNuAFRzFTF a1j7wRNrongblons5cq6uRw5cmv/pik3s9NkLT/sToHaAA+YUJN6dKZ/tpcv8Qv4Ua rl5STYArHw95pU56EuOQ7aLe+Gu4kQpzEOymiJjI= Date: Thu, 16 May 2019 15:00:01 +0300 From: Laurent Pinchart To: Sean Paul Cc: dri-devel , Sean Paul , Daniel Vetter , Ville =?utf-8?B?U3lyasOkbMOk?= , Jani Nikula , Joonas Lahtinen , Rodrigo Vivi , Ben Skeggs , Kieran Bingham , Eric Anholt , Maarten Lankhorst , Maxime Ripard , David Airlie , LKML , Intel Graphics Development , nouveau , linux-renesas-soc@vger.kernel.org Subject: Re: [PATCH v3 04/10] drm: Convert connector_helper_funcs->atomic_check to accept drm_atomic_state Message-ID: <20190516120001.GH14820@pendragon.ideasonboard.com> References: <20190502194956.218441-1-sean@poorly.run> <20190502194956.218441-5-sean@poorly.run> <20190511191202.GL13043@pendragon.ideasonboard.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Sean, On Mon, May 13, 2019 at 10:38:58AM -0400, Sean Paul wrote: > On Sat, May 11, 2019 at 3:12 PM Laurent Pinchart wrote: > > On Thu, May 02, 2019 at 03:49:46PM -0400, Sean Paul wrote: > >> From: Sean Paul > >> > >> Everyone who implements connector_helper_funcs->atomic_check reaches > >> into the connector state to get the atomic state. Instead of continuing > >> this pattern, change the callback signature to just give atomic state > >> and let the driver determine what it does and does not need from it. > >> > >> Eventually all atomic functions should do this, but that's just too much > >> busy work for me. > > > > Given that drivers also access the connector state, isn't this slightly > > more inefficient ? > > Inefficient in terms of what? In terms of the operation having to lookup the connector state, when the caller has it and can easily pass it. As Daniel commented, this may be the price to pay for a cleaner API, but I wonder how much overhead all the state tracking is costing. > Agree that in isolation this patch might seem unnecessary, but it ties > in with the encoder and bridge CLs which accept drm_atomic_state in CLs ? > their hooks. In general the idea is to convert all atomic functions to > take overall atomic state instead of just their object state. Reality > has proven to be more complicated and we need more access than what > the current implementation provides. > > Sean > > >> Changes in v3: > >> - Added to the set > >> > >> Cc: Daniel Vetter > >> Cc: Ville Syrjälä > >> Cc: Jani Nikula > >> Cc: Joonas Lahtinen > >> Cc: Rodrigo Vivi > >> Cc: Ben Skeggs > >> Cc: Laurent Pinchart > >> Cc: Kieran Bingham > >> Cc: Eric Anholt > >> Signed-off-by: Sean Paul > >> --- > >> drivers/gpu/drm/drm_atomic_helper.c | 4 ++-- > >> drivers/gpu/drm/i915/intel_atomic.c | 8 +++++--- > >> drivers/gpu/drm/i915/intel_dp_mst.c | 7 ++++--- > >> drivers/gpu/drm/i915/intel_drv.h | 2 +- > >> drivers/gpu/drm/i915/intel_sdvo.c | 9 +++++---- > >> drivers/gpu/drm/i915/intel_tv.c | 8 +++++--- > >> drivers/gpu/drm/nouveau/dispnv50/disp.c | 5 +++-- > >> drivers/gpu/drm/rcar-du/rcar_lvds.c | 12 +++++++----- > >> drivers/gpu/drm/vc4/vc4_txp.c | 7 ++++--- > >> include/drm/drm_modeset_helper_vtables.h | 2 +- > >> 10 files changed, 37 insertions(+), 27 deletions(-) > >> > >> diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c > >> index 9d9e47276839..fa5a367507c1 100644 > >> --- a/drivers/gpu/drm/drm_atomic_helper.c > >> +++ b/drivers/gpu/drm/drm_atomic_helper.c > >> @@ -683,7 +683,7 @@ drm_atomic_helper_check_modeset(struct drm_device *dev, > >> } > >> > >> if (funcs->atomic_check) > >> - ret = funcs->atomic_check(connector, new_connector_state); > >> + ret = funcs->atomic_check(connector, state); > >> if (ret) > >> return ret; > >> > >> @@ -725,7 +725,7 @@ drm_atomic_helper_check_modeset(struct drm_device *dev, > >> continue; > >> > >> if (funcs->atomic_check) > >> - ret = funcs->atomic_check(connector, new_connector_state); > >> + ret = funcs->atomic_check(connector, state); > >> if (ret) > >> return ret; > >> } > >> diff --git a/drivers/gpu/drm/i915/intel_atomic.c b/drivers/gpu/drm/i915/intel_atomic.c > >> index b844e8840c6f..e8a5b82e9242 100644 > >> --- a/drivers/gpu/drm/i915/intel_atomic.c > >> +++ b/drivers/gpu/drm/i915/intel_atomic.c > >> @@ -103,12 +103,14 @@ int intel_digital_connector_atomic_set_property(struct drm_connector *connector, > >> } > >> > >> int intel_digital_connector_atomic_check(struct drm_connector *conn, > >> - struct drm_connector_state *new_state) > >> + struct drm_atomic_state *state) > >> { > >> + struct drm_connector_state *new_state = > >> + drm_atomic_get_new_connector_state(state, conn); > >> struct intel_digital_connector_state *new_conn_state = > >> to_intel_digital_connector_state(new_state); > >> struct drm_connector_state *old_state = > >> - drm_atomic_get_old_connector_state(new_state->state, conn); > >> + drm_atomic_get_old_connector_state(state, conn); > >> struct intel_digital_connector_state *old_conn_state = > >> to_intel_digital_connector_state(old_state); > >> struct drm_crtc_state *crtc_state; > >> @@ -118,7 +120,7 @@ int intel_digital_connector_atomic_check(struct drm_connector *conn, > >> if (!new_state->crtc) > >> return 0; > >> > >> - crtc_state = drm_atomic_get_new_crtc_state(new_state->state, new_state->crtc); > >> + crtc_state = drm_atomic_get_new_crtc_state(state, new_state->crtc); > >> > >> /* > >> * These properties are handled by fastset, and might not end > >> diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c > >> index 19d81cef2ab6..89cfec128ba0 100644 > >> --- a/drivers/gpu/drm/i915/intel_dp_mst.c > >> +++ b/drivers/gpu/drm/i915/intel_dp_mst.c > >> @@ -143,9 +143,10 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder, > >> > >> static int > >> intel_dp_mst_atomic_check(struct drm_connector *connector, > >> - struct drm_connector_state *new_conn_state) > >> + struct drm_atomic_state *state) > >> { > >> - struct drm_atomic_state *state = new_conn_state->state; > >> + struct drm_connector_state *new_conn_state = > >> + drm_atomic_get_new_connector_state(state, connector); > >> struct drm_connector_state *old_conn_state = > >> drm_atomic_get_old_connector_state(state, connector); > >> struct intel_connector *intel_connector = > >> @@ -155,7 +156,7 @@ intel_dp_mst_atomic_check(struct drm_connector *connector, > >> struct drm_dp_mst_topology_mgr *mgr; > >> int ret; > >> > >> - ret = intel_digital_connector_atomic_check(connector, new_conn_state); > >> + ret = intel_digital_connector_atomic_check(connector, state); > >> if (ret) > >> return ret; > >> > >> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h > >> index f8c7b291fdc3..88571b8e8d62 100644 > >> --- a/drivers/gpu/drm/i915/intel_drv.h > >> +++ b/drivers/gpu/drm/i915/intel_drv.h > >> @@ -2481,7 +2481,7 @@ int intel_digital_connector_atomic_set_property(struct drm_connector *connector, > >> struct drm_property *property, > >> u64 val); > >> int intel_digital_connector_atomic_check(struct drm_connector *conn, > >> - struct drm_connector_state *new_state); > >> + struct drm_atomic_state *state); > >> struct drm_connector_state * > >> intel_digital_connector_duplicate_state(struct drm_connector *connector); > >> > >> diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c > >> index 68f497493d43..72ea164b971c 100644 > >> --- a/drivers/gpu/drm/i915/intel_sdvo.c > >> +++ b/drivers/gpu/drm/i915/intel_sdvo.c > >> @@ -2342,9 +2342,10 @@ static const struct drm_connector_funcs intel_sdvo_connector_funcs = { > >> }; > >> > >> static int intel_sdvo_atomic_check(struct drm_connector *conn, > >> - struct drm_connector_state *new_conn_state) > >> + struct drm_atomic_state *state) > >> { > >> - struct drm_atomic_state *state = new_conn_state->state; > >> + struct drm_connector_state *new_conn_state = > >> + drm_atomic_get_new_connector_state(state, conn); > >> struct drm_connector_state *old_conn_state = > >> drm_atomic_get_old_connector_state(state, conn); > >> struct intel_sdvo_connector_state *old_state = > >> @@ -2356,13 +2357,13 @@ static int intel_sdvo_atomic_check(struct drm_connector *conn, > >> (memcmp(&old_state->tv, &new_state->tv, sizeof(old_state->tv)) || > >> memcmp(&old_conn_state->tv, &new_conn_state->tv, sizeof(old_conn_state->tv)))) { > >> struct drm_crtc_state *crtc_state = > >> - drm_atomic_get_new_crtc_state(new_conn_state->state, > >> + drm_atomic_get_new_crtc_state(state, > >> new_conn_state->crtc); > >> > >> crtc_state->connectors_changed = true; > >> } > >> > >> - return intel_digital_connector_atomic_check(conn, new_conn_state); > >> + return intel_digital_connector_atomic_check(conn, state); > >> } > >> > >> static const struct drm_connector_helper_funcs intel_sdvo_connector_helper_funcs = { > >> diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c > >> index 3924c4944e1f..a41c5b467c14 100644 > >> --- a/drivers/gpu/drm/i915/intel_tv.c > >> +++ b/drivers/gpu/drm/i915/intel_tv.c > >> @@ -1817,16 +1817,18 @@ static const struct drm_connector_funcs intel_tv_connector_funcs = { > >> }; > >> > >> static int intel_tv_atomic_check(struct drm_connector *connector, > >> - struct drm_connector_state *new_state) > >> + struct drm_atomic_state *state) > >> { > >> + struct drm_connector_state *new_state; > >> struct drm_crtc_state *new_crtc_state; > >> struct drm_connector_state *old_state; > >> > >> + new_state = drm_atomic_get_new_connector_state(state, connector); > >> if (!new_state->crtc) > >> return 0; > >> > >> - old_state = drm_atomic_get_old_connector_state(new_state->state, connector); > >> - new_crtc_state = drm_atomic_get_new_crtc_state(new_state->state, new_state->crtc); > >> + old_state = drm_atomic_get_old_connector_state(state, connector); > >> + new_crtc_state = drm_atomic_get_new_crtc_state(state, new_state->crtc); > >> > >> if (old_state->tv.mode != new_state->tv.mode || > >> old_state->tv.margins.left != new_state->tv.margins.left || > >> diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c > >> index 4b1650f51955..7ba373f493b2 100644 > >> --- a/drivers/gpu/drm/nouveau/dispnv50/disp.c > >> +++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c > >> @@ -948,11 +948,12 @@ nv50_mstc_get_modes(struct drm_connector *connector) > >> > >> static int > >> nv50_mstc_atomic_check(struct drm_connector *connector, > >> - struct drm_connector_state *new_conn_state) > >> + struct drm_atomic_state *state) > >> { > >> - struct drm_atomic_state *state = new_conn_state->state; > >> struct nv50_mstc *mstc = nv50_mstc(connector); > >> struct drm_dp_mst_topology_mgr *mgr = &mstc->mstm->mgr; > >> + struct drm_connector_state *new_conn_state = > >> + drm_atomic_get_new_connector_state(state, connector); > >> struct drm_connector_state *old_conn_state = > >> drm_atomic_get_old_connector_state(state, connector); > >> struct drm_crtc_state *crtc_state; > >> diff --git a/drivers/gpu/drm/rcar-du/rcar_lvds.c b/drivers/gpu/drm/rcar-du/rcar_lvds.c > >> index 620b51aab291..5b81ba2a7f27 100644 > >> --- a/drivers/gpu/drm/rcar-du/rcar_lvds.c > >> +++ b/drivers/gpu/drm/rcar-du/rcar_lvds.c > >> @@ -92,13 +92,15 @@ static int rcar_lvds_connector_get_modes(struct drm_connector *connector) > >> } > >> > >> static int rcar_lvds_connector_atomic_check(struct drm_connector *connector, > >> - struct drm_connector_state *state) > >> + struct drm_atomic_state *state) > >> { > >> struct rcar_lvds *lvds = connector_to_rcar_lvds(connector); > >> const struct drm_display_mode *panel_mode; > >> + struct drm_connector_state *conn_state; > >> struct drm_crtc_state *crtc_state; > >> > >> - if (!state->crtc) > >> + conn_state = drm_atomic_get_new_connector_state(state, connector); > >> + if (!conn_state->crtc) > >> return 0; > >> > >> if (list_empty(&connector->modes)) { > >> @@ -110,9 +112,9 @@ static int rcar_lvds_connector_atomic_check(struct drm_connector *connector, > >> struct drm_display_mode, head); > >> > >> /* We're not allowed to modify the resolution. */ > >> - crtc_state = drm_atomic_get_crtc_state(state->state, state->crtc); > >> - if (IS_ERR(crtc_state)) > >> - return PTR_ERR(crtc_state); > >> + crtc_state = drm_atomic_get_crtc_state(state, conn_state->crtc); > >> + if (!crtc_state) > >> + return -EINVAL; > >> > >> if (crtc_state->mode.hdisplay != panel_mode->hdisplay || > >> crtc_state->mode.vdisplay != panel_mode->vdisplay) > >> diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c > >> index c8b89a78f9f4..96f91c1b4b6e 100644 > >> --- a/drivers/gpu/drm/vc4/vc4_txp.c > >> +++ b/drivers/gpu/drm/vc4/vc4_txp.c > >> @@ -221,17 +221,18 @@ static const u32 txp_fmts[] = { > >> }; > >> > >> static int vc4_txp_connector_atomic_check(struct drm_connector *conn, > >> - struct drm_connector_state *conn_state) > >> + struct drm_atomic_state *state) > >> { > >> + struct drm_connector_state *conn_state; > >> struct drm_crtc_state *crtc_state; > >> struct drm_framebuffer *fb; > >> int i; > >> > >> + conn_state = drm_atomic_get_new_connector_state(state, conn); > >> if (!conn_state->writeback_job || !conn_state->writeback_job->fb) > >> return 0; > >> > >> - crtc_state = drm_atomic_get_new_crtc_state(conn_state->state, > >> - conn_state->crtc); > >> + crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc); > >> > >> fb = conn_state->writeback_job->fb; > >> if (fb->width != crtc_state->mode.hdisplay || > >> diff --git a/include/drm/drm_modeset_helper_vtables.h b/include/drm/drm_modeset_helper_vtables.h > >> index de57fb40cb6e..adc8b7cf64b5 100644 > >> --- a/include/drm/drm_modeset_helper_vtables.h > >> +++ b/include/drm/drm_modeset_helper_vtables.h > >> @@ -1020,7 +1020,7 @@ struct drm_connector_helper_funcs { > >> * deadlock. > >> */ > >> int (*atomic_check)(struct drm_connector *connector, > >> - struct drm_connector_state *state); > >> + struct drm_atomic_state *state); > >> > >> /** > >> * @atomic_commit: -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH v3 04/10] drm: Convert connector_helper_funcs->atomic_check to accept drm_atomic_state Date: Thu, 16 May 2019 15:00:01 +0300 Message-ID: <20190516120001.GH14820@pendragon.ideasonboard.com> References: <20190502194956.218441-1-sean@poorly.run> <20190502194956.218441-5-sean@poorly.run> <20190511191202.GL13043@pendragon.ideasonboard.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Sean Paul Cc: Maxime Ripard , nouveau , David Airlie , LKML , linux-renesas-soc@vger.kernel.org, Kieran Bingham , Sean Paul , dri-devel , Intel Graphics Development , Ben Skeggs List-Id: nouveau.vger.kernel.org SGkgU2VhbiwKCk9uIE1vbiwgTWF5IDEzLCAyMDE5IGF0IDEwOjM4OjU4QU0gLTA0MDAsIFNlYW4g UGF1bCB3cm90ZToKPiBPbiBTYXQsIE1heSAxMSwgMjAxOSBhdCAzOjEyIFBNIExhdXJlbnQgUGlu Y2hhcnQgd3JvdGU6Cj4gPiBPbiBUaHUsIE1heSAwMiwgMjAxOSBhdCAwMzo0OTo0NlBNIC0wNDAw LCBTZWFuIFBhdWwgd3JvdGU6Cj4gPj4gRnJvbTogU2VhbiBQYXVsIDxzZWFucGF1bEBjaHJvbWl1 bS5vcmc+Cj4gPj4KPiA+PiBFdmVyeW9uZSB3aG8gaW1wbGVtZW50cyBjb25uZWN0b3JfaGVscGVy X2Z1bmNzLT5hdG9taWNfY2hlY2sgcmVhY2hlcwo+ID4+IGludG8gdGhlIGNvbm5lY3RvciBzdGF0 ZSB0byBnZXQgdGhlIGF0b21pYyBzdGF0ZS4gSW5zdGVhZCBvZiBjb250aW51aW5nCj4gPj4gdGhp cyBwYXR0ZXJuLCBjaGFuZ2UgdGhlIGNhbGxiYWNrIHNpZ25hdHVyZSB0byBqdXN0IGdpdmUgYXRv bWljIHN0YXRlCj4gPj4gYW5kIGxldCB0aGUgZHJpdmVyIGRldGVybWluZSB3aGF0IGl0IGRvZXMg YW5kIGRvZXMgbm90IG5lZWQgZnJvbSBpdC4KPiA+Pgo+ID4+IEV2ZW50dWFsbHkgYWxsIGF0b21p YyBmdW5jdGlvbnMgc2hvdWxkIGRvIHRoaXMsIGJ1dCB0aGF0J3MganVzdCB0b28gbXVjaAo+ID4+ IGJ1c3kgd29yayBmb3IgbWUuCj4gPgo+ID4gR2l2ZW4gdGhhdCBkcml2ZXJzIGFsc28gYWNjZXNz IHRoZSBjb25uZWN0b3Igc3RhdGUsIGlzbid0IHRoaXMgc2xpZ2h0bHkKPiA+IG1vcmUgaW5lZmZp Y2llbnQgPwo+IAo+IEluZWZmaWNpZW50IGluIHRlcm1zIG9mIHdoYXQ/CgpJbiB0ZXJtcyBvZiB0 aGUgb3BlcmF0aW9uIGhhdmluZyB0byBsb29rdXAgdGhlIGNvbm5lY3RvciBzdGF0ZSwgd2hlbiB0 aGUKY2FsbGVyIGhhcyBpdCBhbmQgY2FuIGVhc2lseSBwYXNzIGl0LiBBcyBEYW5pZWwgY29tbWVu dGVkLCB0aGlzIG1heSBiZQp0aGUgcHJpY2UgdG8gcGF5IGZvciBhIGNsZWFuZXIgQVBJLCBidXQg SSB3b25kZXIgaG93IG11Y2ggb3ZlcmhlYWQgYWxsCnRoZSBzdGF0ZSB0cmFja2luZyBpcyBjb3N0 aW5nLgoKPiBBZ3JlZSB0aGF0IGluIGlzb2xhdGlvbiB0aGlzIHBhdGNoIG1pZ2h0IHNlZW0gdW5u ZWNlc3NhcnksIGJ1dCBpdCB0aWVzCj4gaW4gd2l0aCB0aGUgZW5jb2RlciBhbmQgYnJpZGdlIENM cyB3aGljaCBhY2NlcHQgZHJtX2F0b21pY19zdGF0ZSBpbgoKQ0xzID8KCj4gdGhlaXIgaG9va3Mu IEluIGdlbmVyYWwgdGhlIGlkZWEgaXMgdG8gY29udmVydCBhbGwgYXRvbWljIGZ1bmN0aW9ucyB0 bwo+IHRha2Ugb3ZlcmFsbCBhdG9taWMgc3RhdGUgaW5zdGVhZCBvZiBqdXN0IHRoZWlyIG9iamVj dCBzdGF0ZS4gUmVhbGl0eQo+IGhhcyBwcm92ZW4gdG8gYmUgbW9yZSBjb21wbGljYXRlZCBhbmQg d2UgbmVlZCBtb3JlIGFjY2VzcyB0aGFuIHdoYXQKPiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlv biBwcm92aWRlcy4KPiAKPiBTZWFuCj4gCj4gPj4gQ2hhbmdlcyBpbiB2MzoKPiA+PiAtIEFkZGVk IHRvIHRoZSBzZXQKPiA+Pgo+ID4+IENjOiBEYW5pZWwgVmV0dGVyIDxkYW5pZWxAZmZ3bGwuY2g+ Cj4gPj4gQ2M6IFZpbGxlIFN5cmrDpGzDpCA8dmlsbGUuc3lyamFsYUBsaW51eC5pbnRlbC5jb20+ Cj4gPj4gQ2M6IEphbmkgTmlrdWxhIDxqYW5pLm5pa3VsYUBsaW51eC5pbnRlbC5jb20+Cj4gPj4g Q2M6IEpvb25hcyBMYWh0aW5lbiA8am9vbmFzLmxhaHRpbmVuQGxpbnV4LmludGVsLmNvbT4KPiA+ PiBDYzogUm9kcmlnbyBWaXZpIDxyb2RyaWdvLnZpdmlAaW50ZWwuY29tPgo+ID4+IENjOiBCZW4g U2tlZ2dzIDxic2tlZ2dzQHJlZGhhdC5jb20+Cj4gPj4gQ2M6IExhdXJlbnQgUGluY2hhcnQgPGxh dXJlbnQucGluY2hhcnRAaWRlYXNvbmJvYXJkLmNvbT4KPiA+PiBDYzogS2llcmFuIEJpbmdoYW0g PGtpZXJhbi5iaW5naGFtK3JlbmVzYXNAaWRlYXNvbmJvYXJkLmNvbT4KPiA+PiBDYzogRXJpYyBB bmhvbHQgPGVyaWNAYW5ob2x0Lm5ldD4KPiA+PiBTaWduZWQtb2ZmLWJ5OiBTZWFuIFBhdWwgPHNl YW5wYXVsQGNocm9taXVtLm9yZz4KPiA+PiAtLS0KPiA+PiAgZHJpdmVycy9ncHUvZHJtL2RybV9h dG9taWNfaGVscGVyLmMgICAgICB8ICA0ICsrLS0KPiA+PiAgZHJpdmVycy9ncHUvZHJtL2k5MTUv aW50ZWxfYXRvbWljLmMgICAgICB8ICA4ICsrKysrLS0tCj4gPj4gIGRyaXZlcnMvZ3B1L2RybS9p OTE1L2ludGVsX2RwX21zdC5jICAgICAgfCAgNyArKysrLS0tCj4gPj4gIGRyaXZlcnMvZ3B1L2Ry bS9pOTE1L2ludGVsX2Rydi5oICAgICAgICAgfCAgMiArLQo+ID4+ICBkcml2ZXJzL2dwdS9kcm0v aTkxNS9pbnRlbF9zZHZvLmMgICAgICAgIHwgIDkgKysrKystLS0tCj4gPj4gIGRyaXZlcnMvZ3B1 L2RybS9pOTE1L2ludGVsX3R2LmMgICAgICAgICAgfCAgOCArKysrKy0tLQo+ID4+ICBkcml2ZXJz L2dwdS9kcm0vbm91dmVhdS9kaXNwbnY1MC9kaXNwLmMgIHwgIDUgKysrLS0KPiA+PiAgZHJpdmVy cy9ncHUvZHJtL3JjYXItZHUvcmNhcl9sdmRzLmMgICAgICB8IDEyICsrKysrKystLS0tLQo+ID4+ ICBkcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF90eHAuYyAgICAgICAgICAgIHwgIDcgKysrKy0tLQo+ ID4+ICBpbmNsdWRlL2RybS9kcm1fbW9kZXNldF9oZWxwZXJfdnRhYmxlcy5oIHwgIDIgKy0KPiA+ PiAgMTAgZmlsZXMgY2hhbmdlZCwgMzcgaW5zZXJ0aW9ucygrKSwgMjcgZGVsZXRpb25zKC0pCj4g Pj4KPiA+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfaGVscGVyLmMg Yi9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pY19oZWxwZXIuYwo+ID4+IGluZGV4IDlkOWU0NzI3 NjgzOS4uZmE1YTM2NzUwN2MxIDEwMDY0NAo+ID4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1f YXRvbWljX2hlbHBlci5jCj4gPj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfaGVs cGVyLmMKPiA+PiBAQCAtNjgzLDcgKzY4Myw3IEBAIGRybV9hdG9taWNfaGVscGVyX2NoZWNrX21v ZGVzZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKPiA+PiAgICAgICAgICAgICAgIH0KPiA+Pgo+ ID4+ICAgICAgICAgICAgICAgaWYgKGZ1bmNzLT5hdG9taWNfY2hlY2spCj4gPj4gLSAgICAgICAg ICAgICAgICAgICAgIHJldCA9IGZ1bmNzLT5hdG9taWNfY2hlY2soY29ubmVjdG9yLCBuZXdfY29u bmVjdG9yX3N0YXRlKTsKPiA+PiArICAgICAgICAgICAgICAgICAgICAgcmV0ID0gZnVuY3MtPmF0 b21pY19jaGVjayhjb25uZWN0b3IsIHN0YXRlKTsKPiA+PiAgICAgICAgICAgICAgIGlmIChyZXQp Cj4gPj4gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPj4KPiA+PiBAQCAtNzI1 LDcgKzcyNSw3IEBAIGRybV9hdG9taWNfaGVscGVyX2NoZWNrX21vZGVzZXQoc3RydWN0IGRybV9k ZXZpY2UgKmRldiwKPiA+PiAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cj4gPj4KPiA+ PiAgICAgICAgICAgICAgIGlmIChmdW5jcy0+YXRvbWljX2NoZWNrKQo+ID4+IC0gICAgICAgICAg ICAgICAgICAgICByZXQgPSBmdW5jcy0+YXRvbWljX2NoZWNrKGNvbm5lY3RvciwgbmV3X2Nvbm5l Y3Rvcl9zdGF0ZSk7Cj4gPj4gKyAgICAgICAgICAgICAgICAgICAgIHJldCA9IGZ1bmNzLT5hdG9t aWNfY2hlY2soY29ubmVjdG9yLCBzdGF0ZSk7Cj4gPj4gICAgICAgICAgICAgICBpZiAocmV0KQo+ ID4+ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4+ICAgICAgIH0KPiA+PiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYXRvbWljLmMgYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pbnRlbF9hdG9taWMuYwo+ID4+IGluZGV4IGI4NDRlODg0MGM2Zi4uZThh NWI4MmU5MjQyIDEwMDY0NAo+ID4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2F0 b21pYy5jCj4gPj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYXRvbWljLmMKPiA+ PiBAQCAtMTAzLDEyICsxMDMsMTQgQEAgaW50IGludGVsX2RpZ2l0YWxfY29ubmVjdG9yX2F0b21p Y19zZXRfcHJvcGVydHkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKPiA+PiAgfQo+ ID4+Cj4gPj4gIGludCBpbnRlbF9kaWdpdGFsX2Nvbm5lY3Rvcl9hdG9taWNfY2hlY2soc3RydWN0 IGRybV9jb25uZWN0b3IgKmNvbm4sCj4gPj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKm5ld19zdGF0ZSkKPiA+PiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2F0b21pY19zdGF0 ZSAqc3RhdGUpCj4gPj4gIHsKPiA+PiArICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAq bmV3X3N0YXRlID0KPiA+PiArICAgICAgICAgICAgIGRybV9hdG9taWNfZ2V0X25ld19jb25uZWN0 b3Jfc3RhdGUoc3RhdGUsIGNvbm4pOwo+ID4+ICAgICAgIHN0cnVjdCBpbnRlbF9kaWdpdGFsX2Nv bm5lY3Rvcl9zdGF0ZSAqbmV3X2Nvbm5fc3RhdGUgPQo+ID4+ICAgICAgICAgICAgICAgdG9faW50 ZWxfZGlnaXRhbF9jb25uZWN0b3Jfc3RhdGUobmV3X3N0YXRlKTsKPiA+PiAgICAgICBzdHJ1Y3Qg ZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqb2xkX3N0YXRlID0KPiA+PiAtICAgICAgICAgICAgIGRybV9h dG9taWNfZ2V0X29sZF9jb25uZWN0b3Jfc3RhdGUobmV3X3N0YXRlLT5zdGF0ZSwgY29ubik7Cj4g Pj4gKyAgICAgICAgICAgICBkcm1fYXRvbWljX2dldF9vbGRfY29ubmVjdG9yX3N0YXRlKHN0YXRl LCBjb25uKTsKPiA+PiAgICAgICBzdHJ1Y3QgaW50ZWxfZGlnaXRhbF9jb25uZWN0b3Jfc3RhdGUg Km9sZF9jb25uX3N0YXRlID0KPiA+PiAgICAgICAgICAgICAgIHRvX2ludGVsX2RpZ2l0YWxfY29u bmVjdG9yX3N0YXRlKG9sZF9zdGF0ZSk7Cj4gPj4gICAgICAgc3RydWN0IGRybV9jcnRjX3N0YXRl ICpjcnRjX3N0YXRlOwo+ID4+IEBAIC0xMTgsNyArMTIwLDcgQEAgaW50IGludGVsX2RpZ2l0YWxf Y29ubmVjdG9yX2F0b21pY19jaGVjayhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubiwKPiA+PiAg ICAgICBpZiAoIW5ld19zdGF0ZS0+Y3J0YykKPiA+PiAgICAgICAgICAgICAgIHJldHVybiAwOwo+ ID4+Cj4gPj4gLSAgICAgY3J0Y19zdGF0ZSA9IGRybV9hdG9taWNfZ2V0X25ld19jcnRjX3N0YXRl KG5ld19zdGF0ZS0+c3RhdGUsIG5ld19zdGF0ZS0+Y3J0Yyk7Cj4gPj4gKyAgICAgY3J0Y19zdGF0 ZSA9IGRybV9hdG9taWNfZ2V0X25ld19jcnRjX3N0YXRlKHN0YXRlLCBuZXdfc3RhdGUtPmNydGMp Owo+ID4+Cj4gPj4gICAgICAgLyoKPiA+PiAgICAgICAgKiBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBo YW5kbGVkIGJ5IGZhc3RzZXQsIGFuZCBtaWdodCBub3QgZW5kCj4gPj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwX21zdC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUv aW50ZWxfZHBfbXN0LmMKPiA+PiBpbmRleCAxOWQ4MWNlZjJhYjYuLjg5Y2ZlYzEyOGJhMCAxMDA2 NDQKPiA+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcF9tc3QuYwo+ID4+ICsr KyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwX21zdC5jCj4gPj4gQEAgLTE0Myw5ICsx NDMsMTAgQEAgc3RhdGljIGludCBpbnRlbF9kcF9tc3RfY29tcHV0ZV9jb25maWcoc3RydWN0IGlu dGVsX2VuY29kZXIgKmVuY29kZXIsCj4gPj4KPiA+PiAgc3RhdGljIGludAo+ID4+ICBpbnRlbF9k cF9tc3RfYXRvbWljX2NoZWNrKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCj4gPj4g LSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKm5ld19j b25uX3N0YXRlKQo+ID4+ICsgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1fYXRvbWlj X3N0YXRlICpzdGF0ZSkKPiA+PiAgewo+ID4+IC0gICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRl ICpzdGF0ZSA9IG5ld19jb25uX3N0YXRlLT5zdGF0ZTsKPiA+PiArICAgICBzdHJ1Y3QgZHJtX2Nv bm5lY3Rvcl9zdGF0ZSAqbmV3X2Nvbm5fc3RhdGUgPQo+ID4+ICsgICAgICAgICAgICAgZHJtX2F0 b21pY19nZXRfbmV3X2Nvbm5lY3Rvcl9zdGF0ZShzdGF0ZSwgY29ubmVjdG9yKTsKPiA+PiAgICAg ICBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqb2xkX2Nvbm5fc3RhdGUgPQo+ID4+ICAgICAg ICAgICAgICAgZHJtX2F0b21pY19nZXRfb2xkX2Nvbm5lY3Rvcl9zdGF0ZShzdGF0ZSwgY29ubmVj dG9yKTsKPiA+PiAgICAgICBzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICppbnRlbF9jb25uZWN0b3Ig PQo+ID4+IEBAIC0xNTUsNyArMTU2LDcgQEAgaW50ZWxfZHBfbXN0X2F0b21pY19jaGVjayhzdHJ1 Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ID4+ICAgICAgIHN0cnVjdCBkcm1fZHBfbXN0 X3RvcG9sb2d5X21nciAqbWdyOwo+ID4+ICAgICAgIGludCByZXQ7Cj4gPj4KPiA+PiAtICAgICBy ZXQgPSBpbnRlbF9kaWdpdGFsX2Nvbm5lY3Rvcl9hdG9taWNfY2hlY2soY29ubmVjdG9yLCBuZXdf Y29ubl9zdGF0ZSk7Cj4gPj4gKyAgICAgcmV0ID0gaW50ZWxfZGlnaXRhbF9jb25uZWN0b3JfYXRv bWljX2NoZWNrKGNvbm5lY3Rvciwgc3RhdGUpOwo+ID4+ICAgICAgIGlmIChyZXQpCj4gPj4gICAg ICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4+Cj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2ludGVsX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgK PiA+PiBpbmRleCBmOGM3YjI5MWZkYzMuLjg4NTcxYjhlOGQ2MiAxMDA2NDQKPiA+PiAtLS0gYS9k cml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaAo+ID4+ICsrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2ludGVsX2Rydi5oCj4gPj4gQEAgLTI0ODEsNyArMjQ4MSw3IEBAIGludCBpbnRlbF9k aWdpdGFsX2Nvbm5lY3Rvcl9hdG9taWNfc2V0X3Byb3BlcnR5KHN0cnVjdCBkcm1fY29ubmVjdG9y ICpjb25uZWN0b3IsCj4gPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHN0cnVjdCBkcm1fcHJvcGVydHkgKnByb3BlcnR5LAo+ID4+ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NjQgdmFsKTsKPiA+PiAgaW50IGludGVs X2RpZ2l0YWxfY29ubmVjdG9yX2F0b21pY19jaGVjayhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29u biwKPiA+PiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJt X2Nvbm5lY3Rvcl9zdGF0ZSAqbmV3X3N0YXRlKTsKPiA+PiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUpOwo+ID4+ICBz dHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqCj4gPj4gIGludGVsX2RpZ2l0YWxfY29ubmVjdG9y X2R1cGxpY2F0ZV9zdGF0ZShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKPiA+Pgo+ ID4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMKPiA+PiBpbmRleCA2OGY0OTc0OTNkNDMuLjcy ZWExNjRiOTcxYyAxMDA2NDQKPiA+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9z ZHZvLmMKPiA+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMKPiA+PiBA QCAtMjM0Miw5ICsyMzQyLDEwIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9m dW5jcyBpbnRlbF9zZHZvX2Nvbm5lY3Rvcl9mdW5jcyA9IHsKPiA+PiAgfTsKPiA+Pgo+ID4+ICBz dGF0aWMgaW50IGludGVsX3Nkdm9fYXRvbWljX2NoZWNrKHN0cnVjdCBkcm1fY29ubmVjdG9yICpj b25uLAo+ID4+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1fY29u bmVjdG9yX3N0YXRlICpuZXdfY29ubl9zdGF0ZSkKPiA+PiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUpCj4gPj4gIHsKPiA+PiAt ICAgICBzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUgPSBuZXdfY29ubl9zdGF0ZS0+c3Rh dGU7Cj4gPj4gKyAgICAgc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKm5ld19jb25uX3N0YXRl ID0KPiA+PiArICAgICAgICAgICAgIGRybV9hdG9taWNfZ2V0X25ld19jb25uZWN0b3Jfc3RhdGUo c3RhdGUsIGNvbm4pOwo+ID4+ICAgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlICpvbGRf Y29ubl9zdGF0ZSA9Cj4gPj4gICAgICAgICAgICAgICBkcm1fYXRvbWljX2dldF9vbGRfY29ubmVj dG9yX3N0YXRlKHN0YXRlLCBjb25uKTsKPiA+PiAgICAgICBzdHJ1Y3QgaW50ZWxfc2R2b19jb25u ZWN0b3Jfc3RhdGUgKm9sZF9zdGF0ZSA9Cj4gPj4gQEAgLTIzNTYsMTMgKzIzNTcsMTMgQEAgc3Rh dGljIGludCBpbnRlbF9zZHZvX2F0b21pY19jaGVjayhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29u biwKPiA+PiAgICAgICAgICAgKG1lbWNtcCgmb2xkX3N0YXRlLT50diwgJm5ld19zdGF0ZS0+dHYs IHNpemVvZihvbGRfc3RhdGUtPnR2KSkgfHwKPiA+PiAgICAgICAgICAgIG1lbWNtcCgmb2xkX2Nv bm5fc3RhdGUtPnR2LCAmbmV3X2Nvbm5fc3RhdGUtPnR2LCBzaXplb2Yob2xkX2Nvbm5fc3RhdGUt PnR2KSkpKSB7Cj4gPj4gICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNf c3RhdGUgPQo+ID4+IC0gICAgICAgICAgICAgICAgICAgICBkcm1fYXRvbWljX2dldF9uZXdfY3J0 Y19zdGF0ZShuZXdfY29ubl9zdGF0ZS0+c3RhdGUsCj4gPj4gKyAgICAgICAgICAgICAgICAgICAg IGRybV9hdG9taWNfZ2V0X25ld19jcnRjX3N0YXRlKHN0YXRlLAo+ID4+ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfY29ubl9zdGF0ZS0+Y3J0 Yyk7Cj4gPj4KPiA+PiAgICAgICAgICAgICAgIGNydGNfc3RhdGUtPmNvbm5lY3RvcnNfY2hhbmdl ZCA9IHRydWU7Cj4gPj4gICAgICAgfQo+ID4+Cj4gPj4gLSAgICAgcmV0dXJuIGludGVsX2RpZ2l0 YWxfY29ubmVjdG9yX2F0b21pY19jaGVjayhjb25uLCBuZXdfY29ubl9zdGF0ZSk7Cj4gPj4gKyAg ICAgcmV0dXJuIGludGVsX2RpZ2l0YWxfY29ubmVjdG9yX2F0b21pY19jaGVjayhjb25uLCBzdGF0 ZSk7Cj4gPj4gIH0KPiA+Pgo+ID4+ICBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3Jf aGVscGVyX2Z1bmNzIGludGVsX3Nkdm9fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsKPiA+PiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfdHYuYyBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2ludGVsX3R2LmMKPiA+PiBpbmRleCAzOTI0YzQ5NDRlMWYuLmE0MWM1YjQ2N2Mx NCAxMDA2NDQKPiA+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF90di5jCj4gPj4g KysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfdHYuYwo+ID4+IEBAIC0xODE3LDE2ICsx ODE3LDE4IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcyBpbnRlbF90 dl9jb25uZWN0b3JfZnVuY3MgPSB7Cj4gPj4gIH07Cj4gPj4KPiA+PiAgc3RhdGljIGludCBpbnRl bF90dl9hdG9taWNfY2hlY2soc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKPiA+PiAt ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUg Km5ld19zdGF0ZSkKPiA+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRy bV9hdG9taWNfc3RhdGUgKnN0YXRlKQo+ID4+ICB7Cj4gPj4gKyAgICAgc3RydWN0IGRybV9jb25u ZWN0b3Jfc3RhdGUgKm5ld19zdGF0ZTsKPiA+PiAgICAgICBzdHJ1Y3QgZHJtX2NydGNfc3RhdGUg Km5ld19jcnRjX3N0YXRlOwo+ID4+ICAgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlICpv bGRfc3RhdGU7Cj4gPj4KPiA+PiArICAgICBuZXdfc3RhdGUgPSBkcm1fYXRvbWljX2dldF9uZXdf Y29ubmVjdG9yX3N0YXRlKHN0YXRlLCBjb25uZWN0b3IpOwo+ID4+ICAgICAgIGlmICghbmV3X3N0 YXRlLT5jcnRjKQo+ID4+ICAgICAgICAgICAgICAgcmV0dXJuIDA7Cj4gPj4KPiA+PiAtICAgICBv bGRfc3RhdGUgPSBkcm1fYXRvbWljX2dldF9vbGRfY29ubmVjdG9yX3N0YXRlKG5ld19zdGF0ZS0+ c3RhdGUsIGNvbm5lY3Rvcik7Cj4gPj4gLSAgICAgbmV3X2NydGNfc3RhdGUgPSBkcm1fYXRvbWlj X2dldF9uZXdfY3J0Y19zdGF0ZShuZXdfc3RhdGUtPnN0YXRlLCBuZXdfc3RhdGUtPmNydGMpOwo+ ID4+ICsgICAgIG9sZF9zdGF0ZSA9IGRybV9hdG9taWNfZ2V0X29sZF9jb25uZWN0b3Jfc3RhdGUo c3RhdGUsIGNvbm5lY3Rvcik7Cj4gPj4gKyAgICAgbmV3X2NydGNfc3RhdGUgPSBkcm1fYXRvbWlj X2dldF9uZXdfY3J0Y19zdGF0ZShzdGF0ZSwgbmV3X3N0YXRlLT5jcnRjKTsKPiA+Pgo+ID4+ICAg ICAgIGlmIChvbGRfc3RhdGUtPnR2Lm1vZGUgIT0gbmV3X3N0YXRlLT50di5tb2RlIHx8Cj4gPj4g ICAgICAgICAgIG9sZF9zdGF0ZS0+dHYubWFyZ2lucy5sZWZ0ICE9IG5ld19zdGF0ZS0+dHYubWFy Z2lucy5sZWZ0IHx8Cj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2Rp c3BudjUwL2Rpc3AuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2Rpc3BudjUwL2Rpc3AuYwo+ ID4+IGluZGV4IDRiMTY1MGY1MTk1NS4uN2JhMzczZjQ5M2IyIDEwMDY0NAo+ID4+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2Rpc3BudjUwL2Rpc3AuYwo+ID4+ICsrKyBiL2RyaXZlcnMv Z3B1L2RybS9ub3V2ZWF1L2Rpc3BudjUwL2Rpc3AuYwo+ID4+IEBAIC05NDgsMTEgKzk0OCwxMiBA QCBudjUwX21zdGNfZ2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCj4g Pj4KPiA+PiAgc3RhdGljIGludAo+ID4+ICBudjUwX21zdGNfYXRvbWljX2NoZWNrKHN0cnVjdCBk cm1fY29ubmVjdG9yICpjb25uZWN0b3IsCj4gPj4gLSAgICAgICAgICAgICAgICAgICAgc3RydWN0 IGRybV9jb25uZWN0b3Jfc3RhdGUgKm5ld19jb25uX3N0YXRlKQo+ID4+ICsgICAgICAgICAgICAg ICAgICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSkKPiA+PiAgewo+ID4+IC0gICAg IHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSA9IG5ld19jb25uX3N0YXRlLT5zdGF0ZTsK PiA+PiAgICAgICBzdHJ1Y3QgbnY1MF9tc3RjICptc3RjID0gbnY1MF9tc3RjKGNvbm5lY3Rvcik7 Cj4gPj4gICAgICAgc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IgPSAmbXN0Yy0+ bXN0bS0+bWdyOwo+ID4+ICsgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlICpuZXdfY29u bl9zdGF0ZSA9Cj4gPj4gKyAgICAgICAgICAgICBkcm1fYXRvbWljX2dldF9uZXdfY29ubmVjdG9y X3N0YXRlKHN0YXRlLCBjb25uZWN0b3IpOwo+ID4+ICAgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9y X3N0YXRlICpvbGRfY29ubl9zdGF0ZSA9Cj4gPj4gICAgICAgICAgICAgICBkcm1fYXRvbWljX2dl dF9vbGRfY29ubmVjdG9yX3N0YXRlKHN0YXRlLCBjb25uZWN0b3IpOwo+ID4+ICAgICAgIHN0cnVj dCBkcm1fY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZTsKPiA+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL3JjYXItZHUvcmNhcl9sdmRzLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2Fy X2x2ZHMuYwo+ID4+IGluZGV4IDYyMGI1MWFhYjI5MS4uNWI4MWJhMmE3ZjI3IDEwMDY0NAo+ID4+ IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfbHZkcy5jCj4gPj4gKysrIGIvZHJp dmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9sdmRzLmMKPiA+PiBAQCAtOTIsMTMgKzkyLDE1IEBA IHN0YXRpYyBpbnQgcmNhcl9sdmRzX2Nvbm5lY3Rvcl9nZXRfbW9kZXMoc3RydWN0IGRybV9jb25u ZWN0b3IgKmNvbm5lY3RvcikKPiA+PiAgfQo+ID4+Cj4gPj4gIHN0YXRpYyBpbnQgcmNhcl9sdmRz X2Nvbm5lY3Rvcl9hdG9taWNfY2hlY2soc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwK PiA+PiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJt X2Nvbm5lY3Rvcl9zdGF0ZSAqc3RhdGUpCj4gPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKQo+ID4+ICB7Cj4g Pj4gICAgICAgc3RydWN0IHJjYXJfbHZkcyAqbHZkcyA9IGNvbm5lY3Rvcl90b19yY2FyX2x2ZHMo Y29ubmVjdG9yKTsKPiA+PiAgICAgICBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqcGFu ZWxfbW9kZTsKPiA+PiArICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqY29ubl9zdGF0 ZTsKPiA+PiAgICAgICBzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGU7Cj4gPj4KPiA+ PiAtICAgICBpZiAoIXN0YXRlLT5jcnRjKQo+ID4+ICsgICAgIGNvbm5fc3RhdGUgPSBkcm1fYXRv bWljX2dldF9uZXdfY29ubmVjdG9yX3N0YXRlKHN0YXRlLCBjb25uZWN0b3IpOwo+ID4+ICsgICAg IGlmICghY29ubl9zdGF0ZS0+Y3J0YykKPiA+PiAgICAgICAgICAgICAgIHJldHVybiAwOwo+ID4+ Cj4gPj4gICAgICAgaWYgKGxpc3RfZW1wdHkoJmNvbm5lY3Rvci0+bW9kZXMpKSB7Cj4gPj4gQEAg LTExMCw5ICsxMTIsOSBAQCBzdGF0aWMgaW50IHJjYXJfbHZkc19jb25uZWN0b3JfYXRvbWljX2No ZWNrKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCj4gPj4gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUsIGhlYWQpOwo+ID4+ Cj4gPj4gICAgICAgLyogV2UncmUgbm90IGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSByZXNvbHV0aW9u LiAqLwo+ID4+IC0gICAgIGNydGNfc3RhdGUgPSBkcm1fYXRvbWljX2dldF9jcnRjX3N0YXRlKHN0 YXRlLT5zdGF0ZSwgc3RhdGUtPmNydGMpOwo+ID4+IC0gICAgIGlmIChJU19FUlIoY3J0Y19zdGF0 ZSkpCj4gPj4gLSAgICAgICAgICAgICByZXR1cm4gUFRSX0VSUihjcnRjX3N0YXRlKTsKPiA+PiAr ICAgICBjcnRjX3N0YXRlID0gZHJtX2F0b21pY19nZXRfY3J0Y19zdGF0ZShzdGF0ZSwgY29ubl9z dGF0ZS0+Y3J0Yyk7Cj4gPj4gKyAgICAgaWYgKCFjcnRjX3N0YXRlKQo+ID4+ICsgICAgICAgICAg ICAgcmV0dXJuIC1FSU5WQUw7Cj4gPj4KPiA+PiAgICAgICBpZiAoY3J0Y19zdGF0ZS0+bW9kZS5o ZGlzcGxheSAhPSBwYW5lbF9tb2RlLT5oZGlzcGxheSB8fAo+ID4+ICAgICAgICAgICBjcnRjX3N0 YXRlLT5tb2RlLnZkaXNwbGF5ICE9IHBhbmVsX21vZGUtPnZkaXNwbGF5KQo+ID4+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF90eHAuYyBiL2RyaXZlcnMvZ3B1L2RybS92YzQv dmM0X3R4cC5jCj4gPj4gaW5kZXggYzhiODlhNzhmOWY0Li45NmY5MWMxYjRiNmUgMTAwNjQ0Cj4g Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfdHhwLmMKPiA+PiArKysgYi9kcml2ZXJz L2dwdS9kcm0vdmM0L3ZjNF90eHAuYwo+ID4+IEBAIC0yMjEsMTcgKzIyMSwxOCBAQCBzdGF0aWMg Y29uc3QgdTMyIHR4cF9mbXRzW10gPSB7Cj4gPj4gIH07Cj4gPj4KPiA+PiAgc3RhdGljIGludCB2 YzRfdHhwX2Nvbm5lY3Rvcl9hdG9taWNfY2hlY2soc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm4s Cj4gPj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2Nv bm5lY3Rvcl9zdGF0ZSAqY29ubl9zdGF0ZSkKPiA+PiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKQo+ID4+ICB7Cj4g Pj4gKyAgICAgc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKmNvbm5fc3RhdGU7Cj4gPj4gICAg ICAgc3RydWN0IGRybV9jcnRjX3N0YXRlICpjcnRjX3N0YXRlOwo+ID4+ICAgICAgIHN0cnVjdCBk cm1fZnJhbWVidWZmZXIgKmZiOwo+ID4+ICAgICAgIGludCBpOwo+ID4+Cj4gPj4gKyAgICAgY29u bl9zdGF0ZSA9IGRybV9hdG9taWNfZ2V0X25ld19jb25uZWN0b3Jfc3RhdGUoc3RhdGUsIGNvbm4p Owo+ID4+ICAgICAgIGlmICghY29ubl9zdGF0ZS0+d3JpdGViYWNrX2pvYiB8fCAhY29ubl9zdGF0 ZS0+d3JpdGViYWNrX2pvYi0+ZmIpCj4gPj4gICAgICAgICAgICAgICByZXR1cm4gMDsKPiA+Pgo+ ID4+IC0gICAgIGNydGNfc3RhdGUgPSBkcm1fYXRvbWljX2dldF9uZXdfY3J0Y19zdGF0ZShjb25u X3N0YXRlLT5zdGF0ZSwKPiA+PiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgY29ubl9zdGF0ZS0+Y3J0Yyk7Cj4gPj4gKyAgICAgY3J0Y19zdGF0ZSA9IGRy bV9hdG9taWNfZ2V0X25ld19jcnRjX3N0YXRlKHN0YXRlLCBjb25uX3N0YXRlLT5jcnRjKTsKPiA+ Pgo+ID4+ICAgICAgIGZiID0gY29ubl9zdGF0ZS0+d3JpdGViYWNrX2pvYi0+ZmI7Cj4gPj4gICAg ICAgaWYgKGZiLT53aWR0aCAhPSBjcnRjX3N0YXRlLT5tb2RlLmhkaXNwbGF5IHx8Cj4gPj4gZGlm ZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9tb2Rlc2V0X2hlbHBlcl92dGFibGVzLmggYi9pbmNs dWRlL2RybS9kcm1fbW9kZXNldF9oZWxwZXJfdnRhYmxlcy5oCj4gPj4gaW5kZXggZGU1N2ZiNDBj YjZlLi5hZGM4YjdjZjY0YjUgMTAwNjQ0Cj4gPj4gLS0tIGEvaW5jbHVkZS9kcm0vZHJtX21vZGVz ZXRfaGVscGVyX3Z0YWJsZXMuaAo+ID4+ICsrKyBiL2luY2x1ZGUvZHJtL2RybV9tb2Rlc2V0X2hl bHBlcl92dGFibGVzLmgKPiA+PiBAQCAtMTAyMCw3ICsxMDIwLDcgQEAgc3RydWN0IGRybV9jb25u ZWN0b3JfaGVscGVyX2Z1bmNzIHsKPiA+PiAgICAgICAgKiBkZWFkbG9jay4KPiA+PiAgICAgICAg Ki8KPiA+PiAgICAgICBpbnQgKCphdG9taWNfY2hlY2spKHN0cnVjdCBkcm1fY29ubmVjdG9yICpj b25uZWN0b3IsCj4gPj4gLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2Nvbm5l Y3Rvcl9zdGF0ZSAqc3RhdGUpOwo+ID4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0 IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKTsKPiA+Pgo+ID4+ICAgICAgIC8qKgo+ID4+ICAgICAg ICAqIEBhdG9taWNfY29tbWl0OgoKLS0gClJlZ2FyZHMsCgpMYXVyZW50IFBpbmNoYXJ0Cl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWls aW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZy ZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeA==