From mboxrd@z Thu Jan 1 00:00:00 1970 From: ville.syrjala@linux.intel.com (Ville =?iso-8859-1?Q?Syrj=E4l=E4?=) Date: Fri, 30 Sep 2016 23:42:19 +0300 Subject: [PATCH] drm/sun4i: Check that the plane coordinates are not negative In-Reply-To: <20160930183348.75541582@bbrezillon> References: <20160930143320.26241-1-maxime.ripard@free-electrons.com> <20160930180826.169e3daf@bbrezillon> <20160930162211.GQ4329@intel.com> <20160930183348.75541582@bbrezillon> Message-ID: <20160930204219.GR4329@intel.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Fri, Sep 30, 2016 at 06:33:48PM +0200, Boris Brezillon wrote: > On Fri, 30 Sep 2016 19:22:11 +0300 > Ville Syrj?l? wrote: > > > On Fri, Sep 30, 2016 at 06:08:26PM +0200, Boris Brezillon wrote: > > > On Fri, 30 Sep 2016 16:33:20 +0200 > > > Maxime Ripard wrote: > > > > > > > Our planes cannot be set at negative coordinates. Make sure we reject such > > > > configuration. > > > > > > > > Reported-by: Boris Brezillon > > > > Signed-off-by: Maxime Ripard > > > > --- > > > > drivers/gpu/drm/sun4i/sun4i_layer.c | 3 +++ > > > > 1 file changed, 3 insertions(+) > > > > > > > > diff --git a/drivers/gpu/drm/sun4i/sun4i_layer.c b/drivers/gpu/drm/sun4i/sun4i_layer.c > > > > index f0035bf5efea..f5463c4c2cde 100644 > > > > --- a/drivers/gpu/drm/sun4i/sun4i_layer.c > > > > +++ b/drivers/gpu/drm/sun4i/sun4i_layer.c > > > > @@ -29,6 +29,9 @@ struct sun4i_plane_desc { > > > > static int sun4i_backend_layer_atomic_check(struct drm_plane *plane, > > > > struct drm_plane_state *state) > > > > { > > > > + if ((state->crtc_x < 0) || (state->crtc_y < 0)) > > > > + return -EINVAL; > > > > + > > > > > > Hm, I think it's a perfectly valid use case from the DRM framework and > > > DRM user PoV: you may want to place your plane at a negative CRTC > > > offset (which means part of the plane will be hidden). > > > > > > Maybe I'm wrong, but it seems you can support that by adapting the > > > start address of your framebuffer pointer and the layer size. > > > > > > Have you tried doing something like that? > > > > You shouldn't even be looking at the user provided coordinates. Also > > you can't return an error from the atomic update hook. The void return > > value should have been a decent hint ;) > > Note that Maxime is not returning a value from the atomic update > implementation (it's done in the atomic_check implem), Ah, missed that. Anyway it's still the wrong thing to check since negative coordinates are a perfectly valid thing to have. > and I'm not > checking crtc_x,y consistency at all (which is obviously wrong), I'm > just blindly patching the values in sun4i_backend helpers. > > > The right fix would be > > to move all the error handling into the atomic check hook, which > > probably should just call the helper to clip the coordinates and > > whatnot. Then the update hook can just use at the clipped > > coordinates when programming the hw registers. > > That's probably the best approach indeed, but that means having our > private sun4i_plane_state struct where we would store the patched > crtc_{w,h,x,y} info. Nope. The src/dst rects are now stored in drm_plane_state. Assuming my patches went in already. I think they did. > > Anyway, before we do that, that's probably better to check if it really > works on this HW (which is why I sent this informal patch). Most hardware can't do negative coordinates natively. But when things get clipped, the negative coordinates disappear. Then the only question left is whether the resulting coordinates are fullscreen or not, and whether the hardware can handle the "not" case. > > > > > > > > > --->8--- > > > diff --git a/drivers/gpu/drm/sun4i/sun4i_backend.c b/drivers/gpu/drm/sun4i/sun4i_backend.c > > > index 3ab560450a82..6b68804f3035 100644 > > > --- a/drivers/gpu/drm/sun4i/sun4i_backend.c > > > +++ b/drivers/gpu/drm/sun4i/sun4i_backend.c > > > @@ -110,15 +110,30 @@ int sun4i_backend_update_layer_coord(struct sun4i_backend *backend, > > > { > > > struct drm_plane_state *state = plane->state; > > > struct drm_framebuffer *fb = state->fb; > > > + int crtc_w, crtc_h, crtc_x, crtc_y; > > > > > > DRM_DEBUG_DRIVER("Updating layer %d\n", layer); > > > > > > + crtc_x = state->crtc_x; > > > + crtc_y = state->crtc_y; > > > + crtc_w = state->crtc_w; > > > + crtc_h = state->crtc_h; > > > + > > > + if (crtc_x < 0) { > > > + crtc_w += crtx_x; > > > + crtc_x = 0; > > > + } > > > + > > > + if (crtc_y < 0) { > > > + crtc_h += crtx_y; > > > + crtc_y = 0; > > > + } > > > + > > > if (plane->type == DRM_PLANE_TYPE_PRIMARY) { > > > DRM_DEBUG_DRIVER("Primary layer, updating global size W: %u H: %u\n", > > > state->crtc_w, state->crtc_h); > > > regmap_write(backend->regs, SUN4I_BACKEND_DISSIZE_REG, > > > - SUN4I_BACKEND_DISSIZE(state->crtc_w, > > > - state->crtc_h)); > > > + SUN4I_BACKEND_DISSIZE(crtc_w, crtc_h)); > > > } > > > > > > /* Set the line width */ > > > @@ -130,15 +145,13 @@ int sun4i_backend_update_layer_coord(struct sun4i_backend *backend, > > > DRM_DEBUG_DRIVER("Layer size W: %u H: %u\n", > > > state->crtc_w, state->crtc_h); > > > regmap_write(backend->regs, SUN4I_BACKEND_LAYSIZE_REG(layer), > > > - SUN4I_BACKEND_LAYSIZE(state->crtc_w, > > > - state->crtc_h)); > > > + SUN4I_BACKEND_LAYSIZE(crtc_w, crtc_h)); > > > > > > /* Set base coordinates */ > > > DRM_DEBUG_DRIVER("Layer coordinates X: %d Y: %d\n", > > > state->crtc_x, state->crtc_y); > > > regmap_write(backend->regs, SUN4I_BACKEND_LAYCOOR_REG(layer), > > > - SUN4I_BACKEND_LAYCOOR(state->crtc_x, > > > - state->crtc_y)); > > > + SUN4I_BACKEND_LAYCOOR(crtc_x, crtc_y)); > > > > > > return 0; > > > } > > > @@ -198,6 +211,12 @@ int sun4i_backend_update_layer_buffer(struct sun4i_backend *backend, > > > paddr += (state->src_x >> 16) * bpp; > > > paddr += (state->src_y >> 16) * fb->pitches[0]; > > > > > > + if (state->crtc_x < 0) > > > + paddr -= bpp * state->crtc_x; > > > + > > > + if (state->crtc_y < 0) > > > + paddr -= fb->pitches[0] * state->crtc_y; > > > + > > > DRM_DEBUG_DRIVER("Setting buffer address to %pad\n", &paddr); > > > > > > /* Write the 32 lower bits of the address (in bits) */ > > > _______________________________________________ > > > dri-devel mailing list > > > dri-devel at lists.freedesktop.org > > > https://lists.freedesktop.org/mailman/listinfo/dri-devel > > -- Ville Syrj?l? Intel OTC From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Subject: Re: [PATCH] drm/sun4i: Check that the plane coordinates are not negative Date: Fri, 30 Sep 2016 23:42:19 +0300 Message-ID: <20160930204219.GR4329@intel.com> References: <20160930143320.26241-1-maxime.ripard@free-electrons.com> <20160930180826.169e3daf@bbrezillon> <20160930162211.GQ4329@intel.com> <20160930183348.75541582@bbrezillon> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4CD1D6E1A8 for ; Fri, 30 Sep 2016 20:42:24 +0000 (UTC) Content-Disposition: inline In-Reply-To: <20160930183348.75541582@bbrezillon> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Boris Brezillon Cc: linux-arm-kernel@lists.infradead.org, Daniel Vetter , Maxime Ripard , Chen-Yu Tsai , dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org T24gRnJpLCBTZXAgMzAsIDIwMTYgYXQgMDY6MzM6NDhQTSArMDIwMCwgQm9yaXMgQnJlemlsbG9u IHdyb3RlOgo+IE9uIEZyaSwgMzAgU2VwIDIwMTYgMTk6MjI6MTEgKzAzMDAKPiBWaWxsZSBTeXJq w6Rsw6QgPHZpbGxlLnN5cmphbGFAbGludXguaW50ZWwuY29tPiB3cm90ZToKPiAKPiA+IE9uIEZy aSwgU2VwIDMwLCAyMDE2IGF0IDA2OjA4OjI2UE0gKzAyMDAsIEJvcmlzIEJyZXppbGxvbiB3cm90 ZToKPiA+ID4gT24gRnJpLCAzMCBTZXAgMjAxNiAxNjozMzoyMCArMDIwMAo+ID4gPiBNYXhpbWUg UmlwYXJkIDxtYXhpbWUucmlwYXJkQGZyZWUtZWxlY3Ryb25zLmNvbT4gd3JvdGU6Cj4gPiA+ICAg Cj4gPiA+ID4gT3VyIHBsYW5lcyBjYW5ub3QgYmUgc2V0IGF0IG5lZ2F0aXZlIGNvb3JkaW5hdGVz LiBNYWtlIHN1cmUgd2UgcmVqZWN0IHN1Y2gKPiA+ID4gPiBjb25maWd1cmF0aW9uLgo+ID4gPiA+ IAo+ID4gPiA+IFJlcG9ydGVkLWJ5OiBCb3JpcyBCcmV6aWxsb24gPGJvcmlzLmJyZXppbGxvbkBm cmVlLWVsZWN0cm9ucy5jb20+Cj4gPiA+ID4gU2lnbmVkLW9mZi1ieTogTWF4aW1lIFJpcGFyZCA8 bWF4aW1lLnJpcGFyZEBmcmVlLWVsZWN0cm9ucy5jb20+Cj4gPiA+ID4gLS0tCj4gPiA+ID4gIGRy aXZlcnMvZ3B1L2RybS9zdW40aS9zdW40aV9sYXllci5jIHwgMyArKysKPiA+ID4gPiAgMSBmaWxl IGNoYW5nZWQsIDMgaW5zZXJ0aW9ucygrKQo+ID4gPiA+IAo+ID4gPiA+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vc3VuNGkvc3VuNGlfbGF5ZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9zdW40 aS9zdW40aV9sYXllci5jCj4gPiA+ID4gaW5kZXggZjAwMzViZjVlZmVhLi5mNTQ2M2M0YzJjZGUg MTAwNjQ0Cj4gPiA+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3N1bjRpL3N1bjRpX2xheWVyLmMK PiA+ID4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vc3VuNGkvc3VuNGlfbGF5ZXIuYwo+ID4gPiA+ IEBAIC0yOSw2ICsyOSw5IEBAIHN0cnVjdCBzdW40aV9wbGFuZV9kZXNjIHsKPiA+ID4gPiAgc3Rh dGljIGludCBzdW40aV9iYWNrZW5kX2xheWVyX2F0b21pY19jaGVjayhzdHJ1Y3QgZHJtX3BsYW5l ICpwbGFuZSwKPiA+ID4gPiAgCQkJCQkgICAgc3RydWN0IGRybV9wbGFuZV9zdGF0ZSAqc3RhdGUp Cj4gPiA+ID4gIHsKPiA+ID4gPiArCWlmICgoc3RhdGUtPmNydGNfeCA8IDApIHx8IChzdGF0ZS0+ Y3J0Y195IDwgMCkpCj4gPiA+ID4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gPiA+ID4gKyAgCj4gPiA+ IAo+ID4gPiBIbSwgSSB0aGluayBpdCdzIGEgcGVyZmVjdGx5IHZhbGlkIHVzZSBjYXNlIGZyb20g dGhlIERSTSBmcmFtZXdvcmsgYW5kCj4gPiA+IERSTSB1c2VyIFBvVjogeW91IG1heSB3YW50IHRv IHBsYWNlIHlvdXIgcGxhbmUgYXQgYSBuZWdhdGl2ZSBDUlRDCj4gPiA+IG9mZnNldCAod2hpY2gg bWVhbnMgcGFydCBvZiB0aGUgcGxhbmUgd2lsbCBiZSBoaWRkZW4pLgo+ID4gPiAKPiA+ID4gTWF5 YmUgSSdtIHdyb25nLCBidXQgaXQgc2VlbXMgeW91IGNhbiBzdXBwb3J0IHRoYXQgYnkgYWRhcHRp bmcgdGhlCj4gPiA+IHN0YXJ0IGFkZHJlc3Mgb2YgeW91ciBmcmFtZWJ1ZmZlciBwb2ludGVyIGFu ZCB0aGUgbGF5ZXIgc2l6ZS4KPiA+ID4gCj4gPiA+IEhhdmUgeW91IHRyaWVkIGRvaW5nIHNvbWV0 aGluZyBsaWtlIHRoYXQ/ICAKPiA+IAo+ID4gWW91IHNob3VsZG4ndCBldmVuIGJlIGxvb2tpbmcg YXQgdGhlIHVzZXIgcHJvdmlkZWQgY29vcmRpbmF0ZXMuIEFsc28KPiA+IHlvdSBjYW4ndCByZXR1 cm4gYW4gZXJyb3IgZnJvbSB0aGUgYXRvbWljIHVwZGF0ZSBob29rLiBUaGUgdm9pZCByZXR1cm4K PiA+IHZhbHVlIHNob3VsZCBoYXZlIGJlZW4gYSBkZWNlbnQgaGludCA7KQo+IAo+IE5vdGUgdGhh dCBNYXhpbWUgaXMgbm90IHJldHVybmluZyBhIHZhbHVlIGZyb20gdGhlIGF0b21pYyB1cGRhdGUK PiBpbXBsZW1lbnRhdGlvbiAoaXQncyBkb25lIGluIHRoZSBhdG9taWNfY2hlY2sgaW1wbGVtKSwK CkFoLCBtaXNzZWQgdGhhdC4gQW55d2F5IGl0J3Mgc3RpbGwgdGhlIHdyb25nIHRoaW5nIHRvIGNo ZWNrIHNpbmNlCm5lZ2F0aXZlIGNvb3JkaW5hdGVzIGFyZSBhIHBlcmZlY3RseSB2YWxpZCB0aGlu ZyB0byBoYXZlLgoKPiBhbmQgSSdtIG5vdAo+IGNoZWNraW5nIGNydGNfeCx5IGNvbnNpc3RlbmN5 IGF0IGFsbCAod2hpY2ggaXMgb2J2aW91c2x5IHdyb25nKSwgSSdtCj4ganVzdCBibGluZGx5IHBh dGNoaW5nIHRoZSB2YWx1ZXMgaW4gc3VuNGlfYmFja2VuZCBoZWxwZXJzLgo+IAo+ID4gVGhlIHJp Z2h0IGZpeCB3b3VsZCBiZQo+ID4gdG8gbW92ZSBhbGwgdGhlIGVycm9yIGhhbmRsaW5nIGludG8g dGhlIGF0b21pYyBjaGVjayBob29rLCB3aGljaAo+ID4gcHJvYmFibHkgc2hvdWxkIGp1c3QgY2Fs bCB0aGUgaGVscGVyIHRvIGNsaXAgdGhlIGNvb3JkaW5hdGVzIGFuZAo+ID4gd2hhdG5vdC4gVGhl biB0aGUgdXBkYXRlIGhvb2sgY2FuIGp1c3QgdXNlIGF0IHRoZSBjbGlwcGVkIAo+ID4gY29vcmRp bmF0ZXMgd2hlbiBwcm9ncmFtbWluZyB0aGUgaHcgcmVnaXN0ZXJzLgo+IAo+IFRoYXQncyBwcm9i YWJseSB0aGUgYmVzdCBhcHByb2FjaCBpbmRlZWQsIGJ1dCB0aGF0IG1lYW5zIGhhdmluZyBvdXIK PiBwcml2YXRlIHN1bjRpX3BsYW5lX3N0YXRlIHN0cnVjdCB3aGVyZSB3ZSB3b3VsZCBzdG9yZSB0 aGUgcGF0Y2hlZAo+IGNydGNfe3csaCx4LHl9IGluZm8uCgpOb3BlLiBUaGUgc3JjL2RzdCByZWN0 cyBhcmUgbm93IHN0b3JlZCBpbiBkcm1fcGxhbmVfc3RhdGUuIEFzc3VtaW5nIG15CnBhdGNoZXMg d2VudCBpbiBhbHJlYWR5LiBJIHRoaW5rIHRoZXkgZGlkLgoKPiAKPiBBbnl3YXksIGJlZm9yZSB3 ZSBkbyB0aGF0LCB0aGF0J3MgcHJvYmFibHkgYmV0dGVyIHRvIGNoZWNrIGlmIGl0IHJlYWxseQo+ IHdvcmtzIG9uIHRoaXMgSFcgKHdoaWNoIGlzIHdoeSBJIHNlbnQgdGhpcyBpbmZvcm1hbCBwYXRj aCkuCgpNb3N0IGhhcmR3YXJlIGNhbid0IGRvIG5lZ2F0aXZlIGNvb3JkaW5hdGVzIG5hdGl2ZWx5 LiBCdXQgd2hlbiB0aGluZ3MKZ2V0IGNsaXBwZWQsIHRoZSBuZWdhdGl2ZSBjb29yZGluYXRlcyBk aXNhcHBlYXIuIFRoZW4gdGhlIG9ubHkgcXVlc3Rpb24KbGVmdCBpcyB3aGV0aGVyIHRoZSByZXN1 bHRpbmcgY29vcmRpbmF0ZXMgYXJlIGZ1bGxzY3JlZW4gb3Igbm90LCBhbmQKd2hldGhlciB0aGUg aGFyZHdhcmUgY2FuIGhhbmRsZSB0aGUgIm5vdCIgY2FzZS4KCj4gCj4gPiAKPiA+ID4gICAKPiA+ ID4gLS0tPjgtLS0gIAo+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3N1bjRpL3N1 bjRpX2JhY2tlbmQuYyBiL2RyaXZlcnMvZ3B1L2RybS9zdW40aS9zdW40aV9iYWNrZW5kLmMKPiA+ ID4gaW5kZXggM2FiNTYwNDUwYTgyLi42YjY4ODA0ZjMwMzUgMTAwNjQ0Cj4gPiA+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9zdW40aS9zdW40aV9iYWNrZW5kLmMKPiA+ID4gKysrIGIvZHJpdmVycy9n cHUvZHJtL3N1bjRpL3N1bjRpX2JhY2tlbmQuYwo+ID4gPiBAQCAtMTEwLDE1ICsxMTAsMzAgQEAg aW50IHN1bjRpX2JhY2tlbmRfdXBkYXRlX2xheWVyX2Nvb3JkKHN0cnVjdCBzdW40aV9iYWNrZW5k ICpiYWNrZW5kLAo+ID4gPiAgewo+ID4gPiAgICAgICAgIHN0cnVjdCBkcm1fcGxhbmVfc3RhdGUg KnN0YXRlID0gcGxhbmUtPnN0YXRlOwo+ID4gPiAgICAgICAgIHN0cnVjdCBkcm1fZnJhbWVidWZm ZXIgKmZiID0gc3RhdGUtPmZiOwo+ID4gPiArICAgICAgIGludCBjcnRjX3csIGNydGNfaCwgY3J0 Y194LCBjcnRjX3k7Cj4gPiA+ICAKPiA+ID4gICAgICAgICBEUk1fREVCVUdfRFJJVkVSKCJVcGRh dGluZyBsYXllciAlZFxuIiwgbGF5ZXIpOwo+ID4gPiAgCj4gPiA+ICsgICAgICAgY3J0Y194ID0g c3RhdGUtPmNydGNfeDsKPiA+ID4gKyAgICAgICBjcnRjX3kgPSBzdGF0ZS0+Y3J0Y195Owo+ID4g PiArICAgICAgIGNydGNfdyA9IHN0YXRlLT5jcnRjX3c7Cj4gPiA+ICsgICAgICAgY3J0Y19oID0g c3RhdGUtPmNydGNfaDsKPiA+ID4gKwo+ID4gPiArICAgICAgIGlmIChjcnRjX3ggPCAwKSB7Cj4g PiA+ICsgICAgICAgICAgICAgICBjcnRjX3cgKz0gY3J0eF94Owo+ID4gPiArICAgICAgICAgICAg ICAgY3J0Y194ID0gMDsKPiA+ID4gKyAgICAgICB9Cj4gPiA+ICsKPiA+ID4gKyAgICAgICBpZiAo Y3J0Y195IDwgMCkgewo+ID4gPiArICAgICAgICAgICAgICAgY3J0Y19oICs9IGNydHhfeTsKPiA+ ID4gKyAgICAgICAgICAgICAgIGNydGNfeSA9IDA7Cj4gPiA+ICsgICAgICAgfQo+ID4gPiArCj4g PiA+ICAgICAgICAgaWYgKHBsYW5lLT50eXBlID09IERSTV9QTEFORV9UWVBFX1BSSU1BUlkpIHsK PiA+ID4gICAgICAgICAgICAgICAgIERSTV9ERUJVR19EUklWRVIoIlByaW1hcnkgbGF5ZXIsIHVw ZGF0aW5nIGdsb2JhbCBzaXplIFc6ICV1IEg6ICV1XG4iLAo+ID4gPiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBzdGF0ZS0+Y3J0Y193LCBzdGF0ZS0+Y3J0Y19oKTsKPiA+ID4gICAg ICAgICAgICAgICAgIHJlZ21hcF93cml0ZShiYWNrZW5kLT5yZWdzLCBTVU40SV9CQUNLRU5EX0RJ U1NJWkVfUkVHLAo+ID4gPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTjRJX0JBQ0tF TkRfRElTU0laRShzdGF0ZS0+Y3J0Y193LAo+ID4gPiAtICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+Y3J0Y19oKSk7Cj4gPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgU1VONElfQkFDS0VORF9ESVNTSVpFKGNydGNfdywgY3J0Y19o KSk7Cj4gPiA+ICAgICAgICAgfQo+ID4gPiAgCj4gPiA+ICAgICAgICAgLyogU2V0IHRoZSBsaW5l IHdpZHRoICovCj4gPiA+IEBAIC0xMzAsMTUgKzE0NSwxMyBAQCBpbnQgc3VuNGlfYmFja2VuZF91 cGRhdGVfbGF5ZXJfY29vcmQoc3RydWN0IHN1bjRpX2JhY2tlbmQgKmJhY2tlbmQsCj4gPiA+ICAg ICAgICAgRFJNX0RFQlVHX0RSSVZFUigiTGF5ZXIgc2l6ZSBXOiAldSBIOiAldVxuIiwKPiA+ID4g ICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5jcnRjX3csIHN0YXRlLT5jcnRjX2gpOwo+ ID4gPiAgICAgICAgIHJlZ21hcF93cml0ZShiYWNrZW5kLT5yZWdzLCBTVU40SV9CQUNLRU5EX0xB WVNJWkVfUkVHKGxheWVyKSwKPiA+ID4gLSAgICAgICAgICAgICAgICAgICAgU1VONElfQkFDS0VO RF9MQVlTSVpFKHN0YXRlLT5jcnRjX3csCj4gPiA+IC0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBzdGF0ZS0+Y3J0Y19oKSk7Cj4gPiA+ICsgICAgICAgICAgICAgICAg ICAgIFNVTjRJX0JBQ0tFTkRfTEFZU0laRShjcnRjX3csIGNydGNfaCkpOwo+ID4gPiAgCj4gPiA+ ICAgICAgICAgLyogU2V0IGJhc2UgY29vcmRpbmF0ZXMgKi8KPiA+ID4gICAgICAgICBEUk1fREVC VUdfRFJJVkVSKCJMYXllciBjb29yZGluYXRlcyBYOiAlZCBZOiAlZFxuIiwKPiA+ID4gICAgICAg ICAgICAgICAgICAgICAgICAgIHN0YXRlLT5jcnRjX3gsIHN0YXRlLT5jcnRjX3kpOwo+ID4gPiAg ICAgICAgIHJlZ21hcF93cml0ZShiYWNrZW5kLT5yZWdzLCBTVU40SV9CQUNLRU5EX0xBWUNPT1Jf UkVHKGxheWVyKSwKPiA+ID4gLSAgICAgICAgICAgICAgICAgICAgU1VONElfQkFDS0VORF9MQVlD T09SKHN0YXRlLT5jcnRjX3gsCj4gPiA+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzdGF0ZS0+Y3J0Y195KSk7Cj4gPiA+ICsgICAgICAgICAgICAgICAgICAgIFNV TjRJX0JBQ0tFTkRfTEFZQ09PUihjcnRjX3gsIGNydGNfeSkpOwo+ID4gPiAgCj4gPiA+ICAgICAg ICAgcmV0dXJuIDA7Cj4gPiA+ICB9Cj4gPiA+IEBAIC0xOTgsNiArMjExLDEyIEBAIGludCBzdW40 aV9iYWNrZW5kX3VwZGF0ZV9sYXllcl9idWZmZXIoc3RydWN0IHN1bjRpX2JhY2tlbmQgKmJhY2tl bmQsCj4gPiA+ICAgICAgICAgcGFkZHIgKz0gKHN0YXRlLT5zcmNfeCA+PiAxNikgKiBicHA7Cj4g PiA+ICAgICAgICAgcGFkZHIgKz0gKHN0YXRlLT5zcmNfeSA+PiAxNikgKiBmYi0+cGl0Y2hlc1sw XTsKPiA+ID4gIAo+ID4gPiArICAgICAgIGlmIChzdGF0ZS0+Y3J0Y194IDwgMCkKPiA+ID4gKyAg ICAgICAgICAgICAgIHBhZGRyIC09IGJwcCAqIHN0YXRlLT5jcnRjX3g7Cj4gPiA+ICsKPiA+ID4g KyAgICAgICBpZiAoc3RhdGUtPmNydGNfeSA8IDApCj4gPiA+ICsgICAgICAgICAgICAgICBwYWRk ciAtPSBmYi0+cGl0Y2hlc1swXSAqIHN0YXRlLT5jcnRjX3k7Cj4gPiA+ICsKPiA+ID4gICAgICAg ICBEUk1fREVCVUdfRFJJVkVSKCJTZXR0aW5nIGJ1ZmZlciBhZGRyZXNzIHRvICVwYWRcbiIsICZw YWRkcik7Cj4gPiA+ICAKPiA+ID4gICAgICAgICAvKiBXcml0ZSB0aGUgMzIgbG93ZXIgYml0cyBv ZiB0aGUgYWRkcmVzcyAoaW4gYml0cykgKi8KPiA+ID4gX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KPiA+ID4gZHJpLWRldmVsIG1haWxpbmcgbGlzdAo+ID4g PiBkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4gPiA+IGh0dHBzOi8vbGlzdHMuZnJl ZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsICAKPiA+IAoKLS0gClZpbGxl IFN5cmrDpGzDpApJbnRlbCBPVEMKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRl c2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8v ZHJpLWRldmVsCg==