From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED 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 9D1DDC04AA7 for ; Mon, 13 May 2019 14:39:40 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 57934216FD for ; Mon, 13 May 2019 14:39:40 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=poorly.run header.i=@poorly.run header.b="P2f9emm7" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730209AbfEMOjj (ORCPT ); Mon, 13 May 2019 10:39:39 -0400 Received: from mail-ua1-f66.google.com ([209.85.222.66]:42303 "EHLO mail-ua1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730166AbfEMOjg (ORCPT ); Mon, 13 May 2019 10:39:36 -0400 Received: by mail-ua1-f66.google.com with SMTP id e9so4405700uar.9 for ; Mon, 13 May 2019 07:39:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=poorly.run; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=DnW1ppP0H82gyNZ6Cs5glLtCZWk8cSFYexcibf0PW90=; b=P2f9emm7ovZb79Po9LG8ZHUhZDgE1L3ml3jPlkEgfcaV68Y/FlYjA4oFVUFkaqvtM4 CEWraY4yb0udl/ubfpHA8zZDhRPtUUIe/bQlP3CeSBB4qRQbfaOxF+VTVJDAeq/2QqjK ICeftLm0eV5WRVGL5E2fAjePfGdWTcLnXdSh05r6NbJdtcZ4K0XIN5DF3u8UelSt8wDg jO8DYIQTNSAQncaP3KscBdKJzT+oSwLU7phfJfsD/REiFndiJT2KvTL++EWZtrGSDZoM 9yHdJaXpNAv2HLuLKZEoqLjaOYyZeZAZPJIgkDXxsv55hLqvPef0TcHCt1Ec0m9D0Cco eFHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=DnW1ppP0H82gyNZ6Cs5glLtCZWk8cSFYexcibf0PW90=; b=e6o3nFQw6gXyBx1opDkS3pByEspcUhPpnoppjDdtC5yiUMco6DjCMTsTJgWaSeMhQs c2t4zcKKQC2E6Plt+OmP6eskqzvTXv2ZPZlpqgw8pGl4lpxJzq+6NMRkdJxfs9krE5MN BgsIu04D077tskY029GC5XYOBYFI/LldDXJHT/M1w+ga24bbfQahim3s4+WKKWJaqxV0 y7C8/kO6Tf+SUlbUy0H2DAl8Q3Bc+BDaeJ8cpw22m/2EWPp6AgrjIs+soK/qql+RLfkM QK8sBaKJFZgJaxacue0D9TEX+dfxv0Aal/BSpBDLM2SVPpGnZJ4mxM1L1qsHBBduEqrL pHQw== X-Gm-Message-State: APjAAAXMzvYNRMbZFTIyWt0c9Bz5ImqPCxFVj3eF0TDhRx8AQiR4H5jR aZYVgSGZdrCJ1DZuv7FFmzV+wwTlSxONiA9i3LlNnA== X-Google-Smtp-Source: APXvYqyJVF03wXGcXK5Zg+fSgdgjHUpQlGXlNBAQMcxL+WC5oHeAgiqtzNzT+nGNX3SA2f1cCbj6Gmv50IRIVZUGNEE= X-Received: by 2002:ab0:2a4a:: with SMTP id p10mr5184294uar.90.1557758374091; Mon, 13 May 2019 07:39:34 -0700 (PDT) MIME-Version: 1.0 References: <20190502194956.218441-1-sean@poorly.run> <20190502194956.218441-5-sean@poorly.run> <20190511191202.GL13043@pendragon.ideasonboard.com> In-Reply-To: <20190511191202.GL13043@pendragon.ideasonboard.com> From: Sean Paul Date: Mon, 13 May 2019 10:38:58 -0400 Message-ID: Subject: Re: [PATCH v3 04/10] drm: Convert connector_helper_funcs->atomic_check to accept drm_atomic_state To: Laurent Pinchart Cc: dri-devel , Sean Paul , Daniel Vetter , =?UTF-8?B?VmlsbGUgU3lyasOkbMOk?= , 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 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sat, May 11, 2019 at 3:12 PM Laurent Pinchart wrote: > > Hi Sean, > > Thank you for the patch. > Hey Laurent, Thanks for looking! > 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 muc= h > > busy work for me. > > Given that drivers also access the connector state, isn't this slightly > more inefficient ? > Inefficient in terms of what? 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 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=C3=A4l=C3=A4 > > 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 =3D funcs->atomic_check(connector, new_connec= tor_state); > > + ret =3D 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 =3D funcs->atomic_check(connector, new_connec= tor_state); > > + ret =3D 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(s= truct 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 =3D > > + drm_atomic_get_new_connector_state(state, conn); > > struct intel_digital_connector_state *new_conn_state =3D > > to_intel_digital_connector_state(new_state); > > struct drm_connector_state *old_state =3D > > - 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 =3D > > 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 =3D drm_atomic_get_new_crtc_state(new_state->state, ne= w_state->crtc); > > + crtc_state =3D drm_atomic_get_new_crtc_state(state, new_state->cr= tc); > > > > /* > > * 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 inte= l_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 =3D new_conn_state->state; > > + struct drm_connector_state *new_conn_state =3D > > + drm_atomic_get_new_connector_state(state, connector); > > struct drm_connector_state *old_conn_state =3D > > drm_atomic_get_old_connector_state(state, connector); > > struct intel_connector *intel_connector =3D > > @@ -155,7 +156,7 @@ intel_dp_mst_atomic_check(struct drm_connector *con= nector, > > struct drm_dp_mst_topology_mgr *mgr; > > int ret; > > > > - ret =3D intel_digital_connector_atomic_check(connector, new_conn_= state); > > + ret =3D 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/in= tel_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(s= truct drm_connector *connector, > > struct drm_property *prop= erty, > > 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 *connecto= r); > > > > diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/i= ntel_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_sd= vo_connector_funcs =3D { > > }; > > > > static int intel_sdvo_atomic_check(struct drm_connector *conn, > > - struct drm_connector_state *new_conn_s= tate) > > + struct drm_atomic_state *state) > > { > > - struct drm_atomic_state *state =3D new_conn_state->state; > > + struct drm_connector_state *new_conn_state =3D > > + drm_atomic_get_new_connector_state(state, conn); > > struct drm_connector_state *old_conn_state =3D > > drm_atomic_get_old_connector_state(state, conn); > > struct intel_sdvo_connector_state *old_state =3D > > @@ -2356,13 +2357,13 @@ static int intel_sdvo_atomic_check(struct drm_c= onnector *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 =3D > > - drm_atomic_get_new_crtc_state(new_conn_state->sta= te, > > + drm_atomic_get_new_crtc_state(state, > > new_conn_state->crt= c); > > > > crtc_state->connectors_changed =3D 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_he= lper_funcs =3D { > > diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/int= el_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_t= v_connector_funcs =3D { > > }; > > > > 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 =3D drm_atomic_get_new_connector_state(state, connector= ); > > if (!new_state->crtc) > > return 0; > > > > - old_state =3D drm_atomic_get_old_connector_state(new_state->state= , connector); > > - new_crtc_state =3D drm_atomic_get_new_crtc_state(new_state->state= , new_state->crtc); > > + old_state =3D drm_atomic_get_old_connector_state(state, connector= ); > > + new_crtc_state =3D drm_atomic_get_new_crtc_state(state, new_state= ->crtc); > > > > if (old_state->tv.mode !=3D new_state->tv.mode || > > old_state->tv.margins.left !=3D 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 *connect= or) > > > > 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 =3D new_conn_state->state; > > struct nv50_mstc *mstc =3D nv50_mstc(connector); > > struct drm_dp_mst_topology_mgr *mgr =3D &mstc->mstm->mgr; > > + struct drm_connector_state *new_conn_state =3D > > + drm_atomic_get_new_connector_state(state, connector); > > struct drm_connector_state *old_conn_state =3D > > 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 *conn= ector, > > - struct drm_connector_state *s= tate) > > + struct drm_atomic_state *stat= e) > > { > > struct rcar_lvds *lvds =3D 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 =3D drm_atomic_get_new_connector_state(state, connecto= r); > > + 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 =3D drm_atomic_get_crtc_state(state->state, state->crt= c); > > - if (IS_ERR(crtc_state)) > > - return PTR_ERR(crtc_state); > > + crtc_state =3D drm_atomic_get_crtc_state(state, conn_state->crtc)= ; > > + if (!crtc_state) > > + return -EINVAL; > > > > if (crtc_state->mode.hdisplay !=3D panel_mode->hdisplay || > > crtc_state->mode.vdisplay !=3D panel_mode->vdisplay) > > diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_tx= p.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[] =3D { > > }; > > > > 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 =3D drm_atomic_get_new_connector_state(state, conn); > > if (!conn_state->writeback_job || !conn_state->writeback_job->fb) > > return 0; > > > > - crtc_state =3D drm_atomic_get_new_crtc_state(conn_state->state, > > - conn_state->crtc); > > + crtc_state =3D drm_atomic_get_new_crtc_state(state, conn_state->c= rtc); > > > > fb =3D conn_state->writeback_job->fb; > > if (fb->width !=3D 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: Sean Paul Subject: Re: [PATCH v3 04/10] drm: Convert connector_helper_funcs->atomic_check to accept drm_atomic_state Date: Mon, 13 May 2019 10:38:58 -0400 Message-ID: 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: In-Reply-To: <20190511191202.GL13043-N3hz7ZxfLydczECFQUw77jytWr6r+dGw0E9HWUfgJXw@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: nouveau-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Nouveau" To: Laurent Pinchart Cc: Maxime Ripard , nouveau , David Airlie , Joonas Lahtinen , Maarten Lankhorst , LKML , Jani Nikula , linux-renesas-soc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Eric Anholt , Kieran Bingham , Sean Paul , dri-devel , Daniel Vetter , Rodrigo Vivi , Intel Graphics Development , =?UTF-8?B?VmlsbGUgU3lyasOkbMOk?= , Ben Skeggs List-Id: nouveau.vger.kernel.org T24gU2F0LCBNYXkgMTEsIDIwMTkgYXQgMzoxMiBQTSBMYXVyZW50IFBpbmNoYXJ0CjxsYXVyZW50 LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5jb20+IHdyb3RlOgo+Cj4gSGkgU2VhbiwKPgo+IFRoYW5r IHlvdSBmb3IgdGhlIHBhdGNoLgo+CgpIZXkgTGF1cmVudCwKVGhhbmtzIGZvciBsb29raW5nIQoK Cj4gT24gVGh1LCBNYXkgMDIsIDIwMTkgYXQgMDM6NDk6NDZQTSAtMDQwMCwgU2VhbiBQYXVsIHdy b3RlOgo+ID4gRnJvbTogU2VhbiBQYXVsIDxzZWFucGF1bEBjaHJvbWl1bS5vcmc+Cj4gPgo+ID4g RXZlcnlvbmUgd2hvIGltcGxlbWVudHMgY29ubmVjdG9yX2hlbHBlcl9mdW5jcy0+YXRvbWljX2No ZWNrIHJlYWNoZXMKPiA+IGludG8gdGhlIGNvbm5lY3RvciBzdGF0ZSB0byBnZXQgdGhlIGF0b21p YyBzdGF0ZS4gSW5zdGVhZCBvZiBjb250aW51aW5nCj4gPiB0aGlzIHBhdHRlcm4sIGNoYW5nZSB0 aGUgY2FsbGJhY2sgc2lnbmF0dXJlIHRvIGp1c3QgZ2l2ZSBhdG9taWMgc3RhdGUKPiA+IGFuZCBs ZXQgdGhlIGRyaXZlciBkZXRlcm1pbmUgd2hhdCBpdCBkb2VzIGFuZCBkb2VzIG5vdCBuZWVkIGZy b20gaXQuCj4gPgo+ID4gRXZlbnR1YWxseSBhbGwgYXRvbWljIGZ1bmN0aW9ucyBzaG91bGQgZG8g dGhpcywgYnV0IHRoYXQncyBqdXN0IHRvbyBtdWNoCj4gPiBidXN5IHdvcmsgZm9yIG1lLgo+Cj4g R2l2ZW4gdGhhdCBkcml2ZXJzIGFsc28gYWNjZXNzIHRoZSBjb25uZWN0b3Igc3RhdGUsIGlzbid0 IHRoaXMgc2xpZ2h0bHkKPiBtb3JlIGluZWZmaWNpZW50ID8KPgoKSW5lZmZpY2llbnQgaW4gdGVy bXMgb2Ygd2hhdD8KCkFncmVlIHRoYXQgaW4gaXNvbGF0aW9uIHRoaXMgcGF0Y2ggbWlnaHQgc2Vl bSB1bm5lY2Vzc2FyeSwgYnV0IGl0IHRpZXMKaW4gd2l0aCB0aGUgZW5jb2RlciBhbmQgYnJpZGdl IENMcyB3aGljaCBhY2NlcHQgZHJtX2F0b21pY19zdGF0ZSBpbgp0aGVpciBob29rcy4gSW4gZ2Vu ZXJhbCB0aGUgaWRlYSBpcyB0byBjb252ZXJ0IGFsbCBhdG9taWMgZnVuY3Rpb25zIHRvCnRha2Ug b3ZlcmFsbCBhdG9taWMgc3RhdGUgaW5zdGVhZCBvZiBqdXN0IHRoZWlyIG9iamVjdCBzdGF0ZS4g UmVhbGl0eQpoYXMgcHJvdmVuIHRvIGJlIG1vcmUgY29tcGxpY2F0ZWQgYW5kIHdlIG5lZWQgbW9y ZSBhY2Nlc3MgdGhhbiB3aGF0CnRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHByb3ZpZGVzLgoK U2VhbgoKPiA+IENoYW5nZXMgaW4gdjM6Cj4gPiAtIEFkZGVkIHRvIHRoZSBzZXQKPiA+Cj4gPiBD YzogRGFuaWVsIFZldHRlciA8ZGFuaWVsQGZmd2xsLmNoPgo+ID4gQ2M6IFZpbGxlIFN5cmrDpGzD pCA8dmlsbGUuc3lyamFsYUBsaW51eC5pbnRlbC5jb20+Cj4gPiBDYzogSmFuaSBOaWt1bGEgPGph bmkubmlrdWxhQGxpbnV4LmludGVsLmNvbT4KPiA+IENjOiBKb29uYXMgTGFodGluZW4gPGpvb25h cy5sYWh0aW5lbkBsaW51eC5pbnRlbC5jb20+Cj4gPiBDYzogUm9kcmlnbyBWaXZpIDxyb2RyaWdv LnZpdmlAaW50ZWwuY29tPgo+ID4gQ2M6IEJlbiBTa2VnZ3MgPGJza2VnZ3NAcmVkaGF0LmNvbT4K PiA+IENjOiBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0QGlkZWFzb25ib2FyZC5j b20+Cj4gPiBDYzogS2llcmFuIEJpbmdoYW0gPGtpZXJhbi5iaW5naGFtK3JlbmVzYXNAaWRlYXNv bmJvYXJkLmNvbT4KPiA+IENjOiBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0Pgo+ID4gU2ln bmVkLW9mZi1ieTogU2VhbiBQYXVsIDxzZWFucGF1bEBjaHJvbWl1bS5vcmc+Cj4gPiAtLS0KPiA+ ICBkcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pY19oZWxwZXIuYyAgICAgIHwgIDQgKystLQo+ID4g IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2F0b21pYy5jICAgICAgfCAgOCArKysrKy0tLQo+ ID4gIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwX21zdC5jICAgICAgfCAgNyArKysrLS0t Cj4gPiAgZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmggICAgICAgICB8ICAyICstCj4g PiAgZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jICAgICAgICB8ICA5ICsrKysrLS0t LQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3R2LmMgICAgICAgICAgfCAgOCArKysr Ky0tLQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2Rpc3BudjUwL2Rpc3AuYyAgfCAgNSAr KystLQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfbHZkcy5jICAgICAgfCAxMiAr KysrKysrLS0tLS0KPiA+ICBkcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF90eHAuYyAgICAgICAgICAg IHwgIDcgKysrKy0tLQo+ID4gIGluY2x1ZGUvZHJtL2RybV9tb2Rlc2V0X2hlbHBlcl92dGFibGVz LmggfCAgMiArLQo+ID4gIDEwIGZpbGVzIGNoYW5nZWQsIDM3IGluc2VydGlvbnMoKyksIDI3IGRl bGV0aW9ucygtKQo+ID4KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21p Y19oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljX2hlbHBlci5jCj4gPiBpbmRl eCA5ZDllNDcyNzY4MzkuLmZhNWEzNjc1MDdjMSAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1 L2RybS9kcm1fYXRvbWljX2hlbHBlci5jCj4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0 b21pY19oZWxwZXIuYwo+ID4gQEAgLTY4Myw3ICs2ODMsNyBAQCBkcm1fYXRvbWljX2hlbHBlcl9j aGVja19tb2Rlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCj4gPiAgICAgICAgICAgICAgIH0K PiA+Cj4gPiAgICAgICAgICAgICAgIGlmIChmdW5jcy0+YXRvbWljX2NoZWNrKQo+ID4gLSAgICAg ICAgICAgICAgICAgICAgIHJldCA9IGZ1bmNzLT5hdG9taWNfY2hlY2soY29ubmVjdG9yLCBuZXdf Y29ubmVjdG9yX3N0YXRlKTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICByZXQgPSBmdW5jcy0+ YXRvbWljX2NoZWNrKGNvbm5lY3Rvciwgc3RhdGUpOwo+ID4gICAgICAgICAgICAgICBpZiAocmV0 KQo+ID4gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPgo+ID4gQEAgLTcyNSw3 ICs3MjUsNyBAQCBkcm1fYXRvbWljX2hlbHBlcl9jaGVja19tb2Rlc2V0KHN0cnVjdCBkcm1fZGV2 aWNlICpkZXYsCj4gPiAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cj4gPgo+ID4gICAg ICAgICAgICAgICBpZiAoZnVuY3MtPmF0b21pY19jaGVjaykKPiA+IC0gICAgICAgICAgICAgICAg ICAgICByZXQgPSBmdW5jcy0+YXRvbWljX2NoZWNrKGNvbm5lY3RvciwgbmV3X2Nvbm5lY3Rvcl9z dGF0ZSk7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgcmV0ID0gZnVuY3MtPmF0b21pY19jaGVj ayhjb25uZWN0b3IsIHN0YXRlKTsKPiA+ICAgICAgICAgICAgICAgaWYgKHJldCkKPiA+ICAgICAg ICAgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ID4gICAgICAgfQo+ID4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2F0b21pYy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5 MTUvaW50ZWxfYXRvbWljLmMKPiA+IGluZGV4IGI4NDRlODg0MGM2Zi4uZThhNWI4MmU5MjQyIDEw MDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYXRvbWljLmMKPiA+ICsr KyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2F0b21pYy5jCj4gPiBAQCAtMTAzLDEyICsx MDMsMTQgQEAgaW50IGludGVsX2RpZ2l0YWxfY29ubmVjdG9yX2F0b21pY19zZXRfcHJvcGVydHko c3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKPiA+ICB9Cj4gPgo+ID4gIGludCBpbnRl bF9kaWdpdGFsX2Nvbm5lY3Rvcl9hdG9taWNfY2hlY2soc3RydWN0IGRybV9jb25uZWN0b3IgKmNv bm4sCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJt X2Nvbm5lY3Rvcl9zdGF0ZSAqbmV3X3N0YXRlKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKQo+ID4gIHsKPiA+ ICsgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlICpuZXdfc3RhdGUgPQo+ID4gKyAgICAg ICAgICAgICBkcm1fYXRvbWljX2dldF9uZXdfY29ubmVjdG9yX3N0YXRlKHN0YXRlLCBjb25uKTsK PiA+ICAgICAgIHN0cnVjdCBpbnRlbF9kaWdpdGFsX2Nvbm5lY3Rvcl9zdGF0ZSAqbmV3X2Nvbm5f c3RhdGUgPQo+ID4gICAgICAgICAgICAgICB0b19pbnRlbF9kaWdpdGFsX2Nvbm5lY3Rvcl9zdGF0 ZShuZXdfc3RhdGUpOwo+ID4gICAgICAgc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKm9sZF9z dGF0ZSA9Cj4gPiAtICAgICAgICAgICAgIGRybV9hdG9taWNfZ2V0X29sZF9jb25uZWN0b3Jfc3Rh dGUobmV3X3N0YXRlLT5zdGF0ZSwgY29ubik7Cj4gPiArICAgICAgICAgICAgIGRybV9hdG9taWNf Z2V0X29sZF9jb25uZWN0b3Jfc3RhdGUoc3RhdGUsIGNvbm4pOwo+ID4gICAgICAgc3RydWN0IGlu dGVsX2RpZ2l0YWxfY29ubmVjdG9yX3N0YXRlICpvbGRfY29ubl9zdGF0ZSA9Cj4gPiAgICAgICAg ICAgICAgIHRvX2ludGVsX2RpZ2l0YWxfY29ubmVjdG9yX3N0YXRlKG9sZF9zdGF0ZSk7Cj4gPiAg ICAgICBzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGU7Cj4gPiBAQCAtMTE4LDcgKzEy MCw3IEBAIGludCBpbnRlbF9kaWdpdGFsX2Nvbm5lY3Rvcl9hdG9taWNfY2hlY2soc3RydWN0IGRy bV9jb25uZWN0b3IgKmNvbm4sCj4gPiAgICAgICBpZiAoIW5ld19zdGF0ZS0+Y3J0YykKPiA+ICAg ICAgICAgICAgICAgcmV0dXJuIDA7Cj4gPgo+ID4gLSAgICAgY3J0Y19zdGF0ZSA9IGRybV9hdG9t aWNfZ2V0X25ld19jcnRjX3N0YXRlKG5ld19zdGF0ZS0+c3RhdGUsIG5ld19zdGF0ZS0+Y3J0Yyk7 Cj4gPiArICAgICBjcnRjX3N0YXRlID0gZHJtX2F0b21pY19nZXRfbmV3X2NydGNfc3RhdGUoc3Rh dGUsIG5ld19zdGF0ZS0+Y3J0Yyk7Cj4gPgo+ID4gICAgICAgLyoKPiA+ICAgICAgICAqIFRoZXNl IHByb3BlcnRpZXMgYXJlIGhhbmRsZWQgYnkgZmFzdHNldCwgYW5kIG1pZ2h0IG5vdCBlbmQKPiA+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcF9tc3QuYyBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwX21zdC5jCj4gPiBpbmRleCAxOWQ4MWNlZjJhYjYuLjg5 Y2ZlYzEyOGJhMCAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rw X21zdC5jCj4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcF9tc3QuYwo+ID4g QEAgLTE0Myw5ICsxNDMsMTAgQEAgc3RhdGljIGludCBpbnRlbF9kcF9tc3RfY29tcHV0ZV9jb25m aWcoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIsCj4gPgo+ID4gIHN0YXRpYyBpbnQKPiA+ ICBpbnRlbF9kcF9tc3RfYXRvbWljX2NoZWNrKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0 b3IsCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0 ZSAqbmV3X2Nvbm5fc3RhdGUpCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJt X2F0b21pY19zdGF0ZSAqc3RhdGUpCj4gPiAgewo+ID4gLSAgICAgc3RydWN0IGRybV9hdG9taWNf c3RhdGUgKnN0YXRlID0gbmV3X2Nvbm5fc3RhdGUtPnN0YXRlOwo+ID4gKyAgICAgc3RydWN0IGRy bV9jb25uZWN0b3Jfc3RhdGUgKm5ld19jb25uX3N0YXRlID0KPiA+ICsgICAgICAgICAgICAgZHJt X2F0b21pY19nZXRfbmV3X2Nvbm5lY3Rvcl9zdGF0ZShzdGF0ZSwgY29ubmVjdG9yKTsKPiA+ICAg ICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlICpvbGRfY29ubl9zdGF0ZSA9Cj4gPiAgICAg ICAgICAgICAgIGRybV9hdG9taWNfZ2V0X29sZF9jb25uZWN0b3Jfc3RhdGUoc3RhdGUsIGNvbm5l Y3Rvcik7Cj4gPiAgICAgICBzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICppbnRlbF9jb25uZWN0b3Ig PQo+ID4gQEAgLTE1NSw3ICsxNTYsNyBAQCBpbnRlbF9kcF9tc3RfYXRvbWljX2NoZWNrKHN0cnVj dCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCj4gPiAgICAgICBzdHJ1Y3QgZHJtX2RwX21zdF90 b3BvbG9neV9tZ3IgKm1ncjsKPiA+ICAgICAgIGludCByZXQ7Cj4gPgo+ID4gLSAgICAgcmV0ID0g aW50ZWxfZGlnaXRhbF9jb25uZWN0b3JfYXRvbWljX2NoZWNrKGNvbm5lY3RvciwgbmV3X2Nvbm5f c3RhdGUpOwo+ID4gKyAgICAgcmV0ID0gaW50ZWxfZGlnaXRhbF9jb25uZWN0b3JfYXRvbWljX2No ZWNrKGNvbm5lY3Rvciwgc3RhdGUpOwo+ID4gICAgICAgaWYgKHJldCkKPiA+ICAgICAgICAgICAg ICAgcmV0dXJuIHJldDsKPiA+Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUv aW50ZWxfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaAo+ID4gaW5kZXgg ZjhjN2IyOTFmZGMzLi44ODU3MWI4ZThkNjIgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL2dwdS9k cm0vaTkxNS9pbnRlbF9kcnYuaAo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxf ZHJ2LmgKPiA+IEBAIC0yNDgxLDcgKzI0ODEsNyBAQCBpbnQgaW50ZWxfZGlnaXRhbF9jb25uZWN0 b3JfYXRvbWljX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBk cm1fcHJvcGVydHkgKnByb3BlcnR5LAo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHU2NCB2YWwpOwo+ID4gIGludCBpbnRlbF9kaWdpdGFsX2Nvbm5lY3Rv cl9hdG9taWNfY2hlY2soc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm4sCj4gPiAtICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAq bmV3X3N0YXRlKTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0 cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSk7Cj4gPiAgc3RydWN0IGRybV9jb25uZWN0b3Jf c3RhdGUgKgo+ID4gIGludGVsX2RpZ2l0YWxfY29ubmVjdG9yX2R1cGxpY2F0ZV9zdGF0ZShzdHJ1 Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKPiA+Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxf c2R2by5jCj4gPiBpbmRleCA2OGY0OTc0OTNkNDMuLjcyZWExNjRiOTcxYyAxMDA2NDQKPiA+IC0t LSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYwo+ID4gKysrIGIvZHJpdmVycy9n cHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jCj4gPiBAQCAtMjM0Miw5ICsyMzQyLDEwIEBAIHN0YXRp YyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcyBpbnRlbF9zZHZvX2Nvbm5lY3Rvcl9m dW5jcyA9IHsKPiA+ICB9Owo+ID4KPiA+ICBzdGF0aWMgaW50IGludGVsX3Nkdm9fYXRvbWljX2No ZWNrKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uLAo+ID4gLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKm5ld19jb25uX3N0YXRlKQo+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9hdG9taWNfc3Rh dGUgKnN0YXRlKQo+ID4gIHsKPiA+IC0gICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0 ZSA9IG5ld19jb25uX3N0YXRlLT5zdGF0ZTsKPiA+ICsgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9y X3N0YXRlICpuZXdfY29ubl9zdGF0ZSA9Cj4gPiArICAgICAgICAgICAgIGRybV9hdG9taWNfZ2V0 X25ld19jb25uZWN0b3Jfc3RhdGUoc3RhdGUsIGNvbm4pOwo+ID4gICAgICAgc3RydWN0IGRybV9j b25uZWN0b3Jfc3RhdGUgKm9sZF9jb25uX3N0YXRlID0KPiA+ICAgICAgICAgICAgICAgZHJtX2F0 b21pY19nZXRfb2xkX2Nvbm5lY3Rvcl9zdGF0ZShzdGF0ZSwgY29ubik7Cj4gPiAgICAgICBzdHJ1 Y3QgaW50ZWxfc2R2b19jb25uZWN0b3Jfc3RhdGUgKm9sZF9zdGF0ZSA9Cj4gPiBAQCAtMjM1Niwx MyArMjM1NywxMyBAQCBzdGF0aWMgaW50IGludGVsX3Nkdm9fYXRvbWljX2NoZWNrKHN0cnVjdCBk cm1fY29ubmVjdG9yICpjb25uLAo+ID4gICAgICAgICAgIChtZW1jbXAoJm9sZF9zdGF0ZS0+dHYs ICZuZXdfc3RhdGUtPnR2LCBzaXplb2Yob2xkX3N0YXRlLT50dikpIHx8Cj4gPiAgICAgICAgICAg IG1lbWNtcCgmb2xkX2Nvbm5fc3RhdGUtPnR2LCAmbmV3X2Nvbm5fc3RhdGUtPnR2LCBzaXplb2Yo b2xkX2Nvbm5fc3RhdGUtPnR2KSkpKSB7Cj4gPiAgICAgICAgICAgICAgIHN0cnVjdCBkcm1fY3J0 Y19zdGF0ZSAqY3J0Y19zdGF0ZSA9Cj4gPiAtICAgICAgICAgICAgICAgICAgICAgZHJtX2F0b21p Y19nZXRfbmV3X2NydGNfc3RhdGUobmV3X2Nvbm5fc3RhdGUtPnN0YXRlLAo+ID4gKyAgICAgICAg ICAgICAgICAgICAgIGRybV9hdG9taWNfZ2V0X25ld19jcnRjX3N0YXRlKHN0YXRlLAo+ID4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19jb25u X3N0YXRlLT5jcnRjKTsKPiA+Cj4gPiAgICAgICAgICAgICAgIGNydGNfc3RhdGUtPmNvbm5lY3Rv cnNfY2hhbmdlZCA9IHRydWU7Cj4gPiAgICAgICB9Cj4gPgo+ID4gLSAgICAgcmV0dXJuIGludGVs X2RpZ2l0YWxfY29ubmVjdG9yX2F0b21pY19jaGVjayhjb25uLCBuZXdfY29ubl9zdGF0ZSk7Cj4g PiArICAgICByZXR1cm4gaW50ZWxfZGlnaXRhbF9jb25uZWN0b3JfYXRvbWljX2NoZWNrKGNvbm4s IHN0YXRlKTsKPiA+ICB9Cj4gPgo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rv cl9oZWxwZXJfZnVuY3MgaW50ZWxfc2R2b19jb25uZWN0b3JfaGVscGVyX2Z1bmNzID0gewo+ID4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3R2LmMgYi9kcml2ZXJzL2dw dS9kcm0vaTkxNS9pbnRlbF90di5jCj4gPiBpbmRleCAzOTI0YzQ5NDRlMWYuLmE0MWM1YjQ2N2Mx NCAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3R2LmMKPiA+ICsr KyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3R2LmMKPiA+IEBAIC0xODE3LDE2ICsxODE3 LDE4IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcyBpbnRlbF90dl9j b25uZWN0b3JfZnVuY3MgPSB7Cj4gPiAgfTsKPiA+Cj4gPiAgc3RhdGljIGludCBpbnRlbF90dl9h dG9taWNfY2hlY2soc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKPiA+IC0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqbmV3X3N0 YXRlKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1fYXRvbWlj X3N0YXRlICpzdGF0ZSkKPiA+ICB7Cj4gPiArICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0 ZSAqbmV3X3N0YXRlOwo+ID4gICAgICAgc3RydWN0IGRybV9jcnRjX3N0YXRlICpuZXdfY3J0Y19z dGF0ZTsKPiA+ICAgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlICpvbGRfc3RhdGU7Cj4g Pgo+ID4gKyAgICAgbmV3X3N0YXRlID0gZHJtX2F0b21pY19nZXRfbmV3X2Nvbm5lY3Rvcl9zdGF0 ZShzdGF0ZSwgY29ubmVjdG9yKTsKPiA+ICAgICAgIGlmICghbmV3X3N0YXRlLT5jcnRjKQo+ID4g ICAgICAgICAgICAgICByZXR1cm4gMDsKPiA+Cj4gPiAtICAgICBvbGRfc3RhdGUgPSBkcm1fYXRv bWljX2dldF9vbGRfY29ubmVjdG9yX3N0YXRlKG5ld19zdGF0ZS0+c3RhdGUsIGNvbm5lY3Rvcik7 Cj4gPiAtICAgICBuZXdfY3J0Y19zdGF0ZSA9IGRybV9hdG9taWNfZ2V0X25ld19jcnRjX3N0YXRl KG5ld19zdGF0ZS0+c3RhdGUsIG5ld19zdGF0ZS0+Y3J0Yyk7Cj4gPiArICAgICBvbGRfc3RhdGUg PSBkcm1fYXRvbWljX2dldF9vbGRfY29ubmVjdG9yX3N0YXRlKHN0YXRlLCBjb25uZWN0b3IpOwo+ ID4gKyAgICAgbmV3X2NydGNfc3RhdGUgPSBkcm1fYXRvbWljX2dldF9uZXdfY3J0Y19zdGF0ZShz dGF0ZSwgbmV3X3N0YXRlLT5jcnRjKTsKPiA+Cj4gPiAgICAgICBpZiAob2xkX3N0YXRlLT50di5t b2RlICE9IG5ld19zdGF0ZS0+dHYubW9kZSB8fAo+ID4gICAgICAgICAgIG9sZF9zdGF0ZS0+dHYu bWFyZ2lucy5sZWZ0ICE9IG5ld19zdGF0ZS0+dHYubWFyZ2lucy5sZWZ0IHx8Cj4gPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvZGlzcG52NTAvZGlzcC5jIGIvZHJpdmVycy9n cHUvZHJtL25vdXZlYXUvZGlzcG52NTAvZGlzcC5jCj4gPiBpbmRleCA0YjE2NTBmNTE5NTUuLjdi YTM3M2Y0OTNiMiAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2Rpc3Bu djUwL2Rpc3AuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvZGlzcG52NTAvZGlz cC5jCj4gPiBAQCAtOTQ4LDExICs5NDgsMTIgQEAgbnY1MF9tc3RjX2dldF9tb2RlcyhzdHJ1Y3Qg ZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ID4KPiA+ICBzdGF0aWMgaW50Cj4gPiAgbnY1MF9t c3RjX2F0b21pY19jaGVjayhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ID4gLSAg ICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKm5ld19jb25uX3N0 YXRlKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0 YXRlKQo+ID4gIHsKPiA+IC0gICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSA9IG5l d19jb25uX3N0YXRlLT5zdGF0ZTsKPiA+ICAgICAgIHN0cnVjdCBudjUwX21zdGMgKm1zdGMgPSBu djUwX21zdGMoY29ubmVjdG9yKTsKPiA+ICAgICAgIHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5 X21nciAqbWdyID0gJm1zdGMtPm1zdG0tPm1ncjsKPiA+ICsgICAgIHN0cnVjdCBkcm1fY29ubmVj dG9yX3N0YXRlICpuZXdfY29ubl9zdGF0ZSA9Cj4gPiArICAgICAgICAgICAgIGRybV9hdG9taWNf Z2V0X25ld19jb25uZWN0b3Jfc3RhdGUoc3RhdGUsIGNvbm5lY3Rvcik7Cj4gPiAgICAgICBzdHJ1 Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqb2xkX2Nvbm5fc3RhdGUgPQo+ID4gICAgICAgICAgICAg ICBkcm1fYXRvbWljX2dldF9vbGRfY29ubmVjdG9yX3N0YXRlKHN0YXRlLCBjb25uZWN0b3IpOwo+ ID4gICAgICAgc3RydWN0IGRybV9jcnRjX3N0YXRlICpjcnRjX3N0YXRlOwo+ID4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfbHZkcy5jIGIvZHJpdmVycy9ncHUvZHJt L3JjYXItZHUvcmNhcl9sdmRzLmMKPiA+IGluZGV4IDYyMGI1MWFhYjI5MS4uNWI4MWJhMmE3ZjI3 IDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9sdmRzLmMKPiA+ ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfbHZkcy5jCj4gPiBAQCAtOTIsMTMg KzkyLDE1IEBAIHN0YXRpYyBpbnQgcmNhcl9sdmRzX2Nvbm5lY3Rvcl9nZXRfbW9kZXMoc3RydWN0 IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKPiA+ICB9Cj4gPgo+ID4gIHN0YXRpYyBpbnQgcmNh cl9sdmRzX2Nvbm5lY3Rvcl9hdG9taWNfY2hlY2soc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5l Y3RvciwKPiA+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVj dCBkcm1fY29ubmVjdG9yX3N0YXRlICpzdGF0ZSkKPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSkKPiA+ICB7 Cj4gPiAgICAgICBzdHJ1Y3QgcmNhcl9sdmRzICpsdmRzID0gY29ubmVjdG9yX3RvX3JjYXJfbHZk cyhjb25uZWN0b3IpOwo+ID4gICAgICAgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKnBh bmVsX21vZGU7Cj4gPiArICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqY29ubl9zdGF0 ZTsKPiA+ICAgICAgIHN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZTsKPiA+Cj4gPiAt ICAgICBpZiAoIXN0YXRlLT5jcnRjKQo+ID4gKyAgICAgY29ubl9zdGF0ZSA9IGRybV9hdG9taWNf Z2V0X25ld19jb25uZWN0b3Jfc3RhdGUoc3RhdGUsIGNvbm5lY3Rvcik7Cj4gPiArICAgICBpZiAo IWNvbm5fc3RhdGUtPmNydGMpCj4gPiAgICAgICAgICAgICAgIHJldHVybiAwOwo+ID4KPiA+ICAg ICAgIGlmIChsaXN0X2VtcHR5KCZjb25uZWN0b3ItPm1vZGVzKSkgewo+ID4gQEAgLTExMCw5ICsx MTIsOSBAQCBzdGF0aWMgaW50IHJjYXJfbHZkc19jb25uZWN0b3JfYXRvbWljX2NoZWNrKHN0cnVj dCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSwgaGVhZCk7Cj4gPgo+ID4gICAgICAg LyogV2UncmUgbm90IGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSByZXNvbHV0aW9uLiAqLwo+ID4gLSAg ICAgY3J0Y19zdGF0ZSA9IGRybV9hdG9taWNfZ2V0X2NydGNfc3RhdGUoc3RhdGUtPnN0YXRlLCBz dGF0ZS0+Y3J0Yyk7Cj4gPiAtICAgICBpZiAoSVNfRVJSKGNydGNfc3RhdGUpKQo+ID4gLSAgICAg ICAgICAgICByZXR1cm4gUFRSX0VSUihjcnRjX3N0YXRlKTsKPiA+ICsgICAgIGNydGNfc3RhdGUg PSBkcm1fYXRvbWljX2dldF9jcnRjX3N0YXRlKHN0YXRlLCBjb25uX3N0YXRlLT5jcnRjKTsKPiA+ ICsgICAgIGlmICghY3J0Y19zdGF0ZSkKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7 Cj4gPgo+ID4gICAgICAgaWYgKGNydGNfc3RhdGUtPm1vZGUuaGRpc3BsYXkgIT0gcGFuZWxfbW9k ZS0+aGRpc3BsYXkgfHwKPiA+ICAgICAgICAgICBjcnRjX3N0YXRlLT5tb2RlLnZkaXNwbGF5ICE9 IHBhbmVsX21vZGUtPnZkaXNwbGF5KQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92 YzQvdmM0X3R4cC5jIGIvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfdHhwLmMKPiA+IGluZGV4IGM4 Yjg5YTc4ZjlmNC4uOTZmOTFjMWI0YjZlIDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJt L3ZjNC92YzRfdHhwLmMKPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X3R4cC5jCj4g PiBAQCAtMjIxLDE3ICsyMjEsMTggQEAgc3RhdGljIGNvbnN0IHUzMiB0eHBfZm10c1tdID0gewo+ ID4gIH07Cj4gPgo+ID4gIHN0YXRpYyBpbnQgdmM0X3R4cF9jb25uZWN0b3JfYXRvbWljX2NoZWNr KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uLAo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqY29ubl9zdGF0ZSkKPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZHJtX2F0b21p Y19zdGF0ZSAqc3RhdGUpCj4gPiAgewo+ID4gKyAgICAgc3RydWN0IGRybV9jb25uZWN0b3Jfc3Rh dGUgKmNvbm5fc3RhdGU7Cj4gPiAgICAgICBzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3Rh dGU7Cj4gPiAgICAgICBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYjsKPiA+ICAgICAgIGludCBp Owo+ID4KPiA+ICsgICAgIGNvbm5fc3RhdGUgPSBkcm1fYXRvbWljX2dldF9uZXdfY29ubmVjdG9y X3N0YXRlKHN0YXRlLCBjb25uKTsKPiA+ICAgICAgIGlmICghY29ubl9zdGF0ZS0+d3JpdGViYWNr X2pvYiB8fCAhY29ubl9zdGF0ZS0+d3JpdGViYWNrX2pvYi0+ZmIpCj4gPiAgICAgICAgICAgICAg IHJldHVybiAwOwo+ID4KPiA+IC0gICAgIGNydGNfc3RhdGUgPSBkcm1fYXRvbWljX2dldF9uZXdf Y3J0Y19zdGF0ZShjb25uX3N0YXRlLT5zdGF0ZSwKPiA+IC0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uX3N0YXRlLT5jcnRjKTsKPiA+ICsgICAgIGNy dGNfc3RhdGUgPSBkcm1fYXRvbWljX2dldF9uZXdfY3J0Y19zdGF0ZShzdGF0ZSwgY29ubl9zdGF0 ZS0+Y3J0Yyk7Cj4gPgo+ID4gICAgICAgZmIgPSBjb25uX3N0YXRlLT53cml0ZWJhY2tfam9iLT5m YjsKPiA+ICAgICAgIGlmIChmYi0+d2lkdGggIT0gY3J0Y19zdGF0ZS0+bW9kZS5oZGlzcGxheSB8 fAo+ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9tb2Rlc2V0X2hlbHBlcl92dGFibGVz LmggYi9pbmNsdWRlL2RybS9kcm1fbW9kZXNldF9oZWxwZXJfdnRhYmxlcy5oCj4gPiBpbmRleCBk ZTU3ZmI0MGNiNmUuLmFkYzhiN2NmNjRiNSAxMDA2NDQKPiA+IC0tLSBhL2luY2x1ZGUvZHJtL2Ry bV9tb2Rlc2V0X2hlbHBlcl92dGFibGVzLmgKPiA+ICsrKyBiL2luY2x1ZGUvZHJtL2RybV9tb2Rl c2V0X2hlbHBlcl92dGFibGVzLmgKPiA+IEBAIC0xMDIwLDcgKzEwMjAsNyBAQCBzdHJ1Y3QgZHJt X2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3Mgewo+ID4gICAgICAgICogZGVhZGxvY2suCj4gPiAgICAg ICAgKi8KPiA+ICAgICAgIGludCAoKmF0b21pY19jaGVjaykoc3RydWN0IGRybV9jb25uZWN0b3Ig KmNvbm5lY3RvciwKPiA+IC0gICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRybV9jb25u ZWN0b3Jfc3RhdGUgKnN0YXRlKTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0 IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKTsKPiA+Cj4gPiAgICAgICAvKioKPiA+ICAgICAgICAq IEBhdG9taWNfY29tbWl0Ogo+Cj4gLS0KPiBSZWdhcmRzLAo+Cj4gTGF1cmVudCBQaW5jaGFydApf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpOb3V2ZWF1IG1h aWxpbmcgbGlzdApOb3V2ZWF1QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZy ZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL25vdXZlYXU=