From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E80EDC46470 for ; Tue, 7 Aug 2018 13:26:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8BEE72174C for ; Tue, 7 Aug 2018 13:26:55 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="qCV97SC8" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8BEE72174C Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389203AbeHGPlN (ORCPT ); Tue, 7 Aug 2018 11:41:13 -0400 Received: from mail-wr1-f68.google.com ([209.85.221.68]:33434 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388581AbeHGPlN (ORCPT ); Tue, 7 Aug 2018 11:41:13 -0400 Received: by mail-wr1-f68.google.com with SMTP id g6-v6so15811818wrp.0 for ; Tue, 07 Aug 2018 06:26:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to; bh=JrDCOTs4uQPy0GETQyB8ar1aWcDDdccYHjE8ojb7S7o=; b=qCV97SC8YOsiszSTA4QUNjJsHETF07moBLPQp0KO29VF2Njyw5EIPWOwW51Hhz1pty GntJg8hI6HcLJ2KXZtdGkVriiPAOJSn+LAnHVTtcCBce/bUs2xhZNB/T+8pLjZvS+qbj NtqrP+OiZcSax+Ch1/KScehScYH10xfqVxx6QOwz2yunsQfYV/dNEq2Teo1q+A1Veaax df/6gD/eT4DCSY2dJ5rTtCXGQLW0r0Rud7LDgzdvY9uYag0DNn4PpM+3AQgI8iEdSIU8 VCvjxLdLE8nyBY17C5OMwSRAWP+D1T3Sjpse9wrgiamzw2xV7oy36roC9f72KYPg7yE4 O98g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to; bh=JrDCOTs4uQPy0GETQyB8ar1aWcDDdccYHjE8ojb7S7o=; b=CVDdg5rtYbg7hZdFUQPWUOaVOruryyIq4pwHdDlg+PD2x7RQKr+Gp6jM7knhni0KZJ VevEV/kyhaTkn6Gna1IU6JpAsxpAovpohF1ZArEnpPUfkaXoJ5uqOr+1+EdA1pzyQhhb MDQ0JT8ZGeOB07iAkXDqWza2zqcNB9NS6OvydtNDBshaF8AWbH4yMUcmY+gDFJe6ymlG bw1gxj/WwYnmYBWaKuVH9IWsIstRRS0LCP20lTm52GjiwBedMMWgvdNItvUkjKtVXhQW J21NHbFbhTGi7lnt8smEc1J8LokUhNqH+x0w/HfwGpcd5KqmL00tVnEIT9qW6nqhXPEf ihTA== X-Gm-Message-State: AOUpUlEhX903zpB0iekJztQ96YioSZbvn5OCaeacHIZpLqtc+t5Cx92j z4+WJnXOQ7QDdFydB6QmpJXw2aH1pqtIG1hnXic= X-Google-Smtp-Source: AAOMgpeB2I/M9pSDkhE3dFXxU82xjs/T5Mo0LDcZcxvxcTOz2/XWbX4rGa3uYncfoMOQiXklIQFrNrPqZrZUB6Oqrgg= X-Received: by 2002:a5d:540d:: with SMTP id g13-v6mr13429746wrv.4.1533648411277; Tue, 07 Aug 2018 06:26:51 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a1c:178a:0:0:0:0:0 with HTTP; Tue, 7 Aug 2018 06:26:50 -0700 (PDT) In-Reply-To: <20180807122826.GU3008@phenom.ffwll.local> References: <20180724082213.25677-1-robert.foss@collabora.com> <20180803195025.GO20303@art_vandelay> <20180807122826.GU3008@phenom.ffwll.local> From: Emil Velikov Date: Tue, 7 Aug 2018 14:26:50 +0100 Message-ID: Subject: Re: [RFC] drm: Allow DRM_IOCTL_MODE_MAP_DUMB for render nodes To: Emil Velikov , Sean Paul , Tomeu Vizoso , Nicolas Norvez , Robert Foss , "Linux-Kernel@Vger. Kernel. Org" , ML dri-devel , Tomasz Figa , Eric Engestrom , David Airlie , Brian Paul , Martin Fuzzey Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 7 August 2018 at 13:28, Daniel Vetter wrote: > On Tue, Aug 07, 2018 at 12:01:50PM +0100, Emil Velikov wrote: >> On 3 August 2018 at 20:50, Sean Paul wrote: >> > On Fri, Aug 03, 2018 at 06:03:50PM +0100, Emil Velikov wrote: >> >> On 3 August 2018 at 16:06, Martin Fuzzey wrote: >> >> > Hi Emil, >> >> > >> >> > On 03/08/18 14:35, Emil Velikov wrote: >> >> >> >> >> >> Hi Martin, >> >> >> >> >> >> On 1 August 2018 at 15:24, Martin Fuzzey >> >> >> wrote: >> >> >> >> >> >> Let's start with the not-so obvious question: >> >> >> Why does one open the imx as render node? >> >> >> >> >> >> Of the top of my head: >> >> >> There is nothing in egl/android that should require an authenticated >> >> >> device. >> >> >> Hence, using a card node should be fine - the etnaviv code opens the >> >> >> render node it needs. >> >> > >> >> > >> >> > Yes, the problem is not in egl/android but in the scanout buffer allocation >> >> > code. >> >> > >> >> > etnaviv opens the render node on the *GPU* (for submitting GPU commands), >> >> > that part is fine. >> >> > >> >> > But scanout buffers need to be allocated from imx-drm not etnaviv. >> >> > >> >> > This done by renderonly_create_kms_dumb_buffer_for_resource() >> >> > [src/gallium/auxiliary/renderonly/renderonly.c] >> >> > Which uses DRM_IOCTL_MODE_CREATE_DUMB followed by >> >> > DRM_IOCTL_PRIME_FD_TO_HANDLE >> >> > on the "kms_fd" (probably poorly named because it's not actually used for >> >> > modesetting) >> >> > see imx_drm_screen_create()[ src/gallium/winsys/imx/drm/imx_drm_winsys.c] >> >> > >> >> > >> >> > If the card node is used DRM_IOCTL_MODE_CREATE_DUMB works but >> >> > DRM_IOCTL_PRIME_FD_TO_HANDLE fails, because the permissions are >> >> > DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW >> >> > >> >> Right I missed the DRM_AUTH, in the fd <> handle IOCTLs. >> >> So in order for things to work, we'd need to either: >> >> - allow dumb buffers for render nodes, or >> >> - drop the DRM_AUTH for fd <> handle imports >> >> >> >> Pointing an alternative solution, for kernel developers to analyse and >> >> make a decision. >> >> >> >> > >> >> > In android 8.1 the hardware composer runs in a seperate process and it has >> >> > to use the card node and be drm master (to use the KMS API), >> >> > therefore, when the surface flinger calls >> >> > renderonly_create_kms_dumb_buffer_for_resource() it is not authenticated. >> >> > >> >> > Making surface flinger use a render node fixes the problem for >> >> > DRM_IOCTL_PRIME_FD_TO_HANDLE (because that already has DRM_RENDER_ALLOW), >> >> > but DRM_IOCTL_MODE_CREATE_DUMB now fails without the patch. >> >> > >> >> > >> >> > This probably worked in previous versions of Android where surface flinger >> >> > and hwc were all in the same process. >> >> > >> >> There has been varying hacks for Android through the years. Bringing >> >> details into the discussion will result in a significant diversion. >> >> Something we could avoid, for the time being ;-) >> > >> > Did someone say diversion?!? The way this was handled prior to using >> > render/control nodes in drm_hwc/[drm/gbm]_gralloc is that all modesetting was >> > done via gralloc which was master. The hwc implementation was basically a proxy >> > backchanneling all of the work to gralloc. >> > >> > Anyways, we probably don't want to go back there. >> > >> Now that we got the diversion out of the way, any input on my proposal >> to drop the DRM_AUTH for fd <> imports. >> Am I missing something pretty obvious that makes the idea a no-go? > > Dropping DRM_AUTH is only relevant for the card node. And a card node > might not be sufficiently isolated against concurrent other clients, which > is why we don't allow it. > Right. I did not spot anything that would make a distinction based on the card vs render node used. > What we could do is essentially check whether your driver supports render > nodes (indicating sufficient amounts of separation), and then allow > anything for unauthenicated clients if DRM_RENDER_ALLOW is set on the > ioctl. > > But that's just reinventing render nodes on top of legacy card nodes, and > I'm not clear on what that exactly gains us. > As more of a userspace person, it makes sense to keep render nodes for GPU specifics and card ones - KMS/Display Controller. > I think the proposal for dumb render nodes (for drivers which only do dumb > kms buffers and no rendering at all) that's been discusson on irc a bit > makes a lot more sense. Ack. Thanks for shedding some light. -Emil From mboxrd@z Thu Jan 1 00:00:00 1970 From: Emil Velikov Subject: Re: [RFC] drm: Allow DRM_IOCTL_MODE_MAP_DUMB for render nodes Date: Tue, 7 Aug 2018 14:26:50 +0100 Message-ID: References: <20180724082213.25677-1-robert.foss@collabora.com> <20180803195025.GO20303@art_vandelay> <20180807122826.GU3008@phenom.ffwll.local> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wr1-x443.google.com (mail-wr1-x443.google.com [IPv6:2a00:1450:4864:20::443]) by gabe.freedesktop.org (Postfix) with ESMTPS id 950E16E1FC for ; Tue, 7 Aug 2018 13:26:52 +0000 (UTC) Received: by mail-wr1-x443.google.com with SMTP id e7-v6so15768926wrs.9 for ; Tue, 07 Aug 2018 06:26:52 -0700 (PDT) In-Reply-To: <20180807122826.GU3008@phenom.ffwll.local> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Emil Velikov , Sean Paul , Tomeu Vizoso , Nicolas Norvez , Robert Foss , "Linux-Kernel@Vger. Kernel. Org" , ML dri-devel , Tomasz Figa , Eric Engestrom , David Airlie , Brian Paul , Martin Fuzzey List-Id: dri-devel@lists.freedesktop.org T24gNyBBdWd1c3QgMjAxOCBhdCAxMzoyOCwgRGFuaWVsIFZldHRlciA8ZGFuaWVsQGZmd2xsLmNo PiB3cm90ZToKPiBPbiBUdWUsIEF1ZyAwNywgMjAxOCBhdCAxMjowMTo1MFBNICswMTAwLCBFbWls IFZlbGlrb3Ygd3JvdGU6Cj4+IE9uIDMgQXVndXN0IDIwMTggYXQgMjA6NTAsIFNlYW4gUGF1bCA8 c2VhbnBhdWxAY2hyb21pdW0ub3JnPiB3cm90ZToKPj4gPiBPbiBGcmksIEF1ZyAwMywgMjAxOCBh dCAwNjowMzo1MFBNICswMTAwLCBFbWlsIFZlbGlrb3Ygd3JvdGU6Cj4+ID4+IE9uIDMgQXVndXN0 IDIwMTggYXQgMTY6MDYsIE1hcnRpbiBGdXp6ZXkgPG1hcnRpbi5mdXp6ZXlAZmxvd2JpcmQuZ3Jv dXA+IHdyb3RlOgo+PiA+PiA+IEhpIEVtaWwsCj4+ID4+ID4KPj4gPj4gPiBPbiAwMy8wOC8xOCAx NDozNSwgRW1pbCBWZWxpa292IHdyb3RlOgo+PiA+PiA+Pgo+PiA+PiA+PiBIaSBNYXJ0aW4sCj4+ ID4+ID4+Cj4+ID4+ID4+IE9uIDEgQXVndXN0IDIwMTggYXQgMTU6MjQsIE1hcnRpbiBGdXp6ZXkg PG1hcnRpbi5mdXp6ZXlAZmxvd2JpcmQuZ3JvdXA+Cj4+ID4+ID4+IHdyb3RlOgo+PiA+PiA+Pgo+ PiA+PiA+PiBMZXQncyBzdGFydCB3aXRoIHRoZSBub3Qtc28gb2J2aW91cyBxdWVzdGlvbjoKPj4g Pj4gPj4gV2h5IGRvZXMgb25lIG9wZW4gdGhlIGlteCBhcyByZW5kZXIgbm9kZT8KPj4gPj4gPj4K Pj4gPj4gPj4gT2YgdGhlIHRvcCBvZiBteSBoZWFkOgo+PiA+PiA+PiBUaGVyZSBpcyBub3RoaW5n IGluIGVnbC9hbmRyb2lkIHRoYXQgc2hvdWxkIHJlcXVpcmUgYW4gYXV0aGVudGljYXRlZAo+PiA+ PiA+PiBkZXZpY2UuCj4+ID4+ID4+IEhlbmNlLCB1c2luZyBhIGNhcmQgbm9kZSBzaG91bGQgYmUg ZmluZSAtIHRoZSBldG5hdml2IGNvZGUgb3BlbnMgdGhlCj4+ID4+ID4+IHJlbmRlciBub2RlIGl0 IG5lZWRzLgo+PiA+PiA+Cj4+ID4+ID4KPj4gPj4gPiBZZXMsIHRoZSBwcm9ibGVtIGlzIG5vdCBp biBlZ2wvYW5kcm9pZCBidXQgaW4gdGhlIHNjYW5vdXQgYnVmZmVyIGFsbG9jYXRpb24KPj4gPj4g PiBjb2RlLgo+PiA+PiA+Cj4+ID4+ID4gZXRuYXZpdiBvcGVucyB0aGUgcmVuZGVyIG5vZGUgb24g dGhlICpHUFUqIChmb3Igc3VibWl0dGluZyBHUFUgY29tbWFuZHMpLAo+PiA+PiA+IHRoYXQgcGFy dCBpcyBmaW5lLgo+PiA+PiA+Cj4+ID4+ID4gQnV0IHNjYW5vdXQgYnVmZmVycyBuZWVkIHRvIGJl IGFsbG9jYXRlZCBmcm9tIGlteC1kcm0gbm90IGV0bmF2aXYuCj4+ID4+ID4KPj4gPj4gPiBUaGlz IGRvbmUgYnkgcmVuZGVyb25seV9jcmVhdGVfa21zX2R1bWJfYnVmZmVyX2Zvcl9yZXNvdXJjZSgp Cj4+ID4+ID4gW3NyYy9nYWxsaXVtL2F1eGlsaWFyeS9yZW5kZXJvbmx5L3JlbmRlcm9ubHkuY10K Pj4gPj4gPiBXaGljaCB1c2VzIERSTV9JT0NUTF9NT0RFX0NSRUFURV9EVU1CIGZvbGxvd2VkIGJ5 Cj4+ID4+ID4gRFJNX0lPQ1RMX1BSSU1FX0ZEX1RPX0hBTkRMRQo+PiA+PiA+IG9uIHRoZSAia21z X2ZkIiAocHJvYmFibHkgcG9vcmx5IG5hbWVkIGJlY2F1c2UgaXQncyBub3QgYWN0dWFsbHkgdXNl ZCBmb3IKPj4gPj4gPiBtb2Rlc2V0dGluZykKPj4gPj4gPiBzZWUgaW14X2RybV9zY3JlZW5fY3Jl YXRlKClbIHNyYy9nYWxsaXVtL3dpbnN5cy9pbXgvZHJtL2lteF9kcm1fd2luc3lzLmNdCj4+ID4+ ID4KPj4gPj4gPgo+PiA+PiA+IElmIHRoZSBjYXJkIG5vZGUgaXMgdXNlZCBEUk1fSU9DVExfTU9E RV9DUkVBVEVfRFVNQiB3b3JrcyBidXQKPj4gPj4gPiBEUk1fSU9DVExfUFJJTUVfRkRfVE9fSEFO RExFIGZhaWxzLCBiZWNhdXNlIHRoZSBwZXJtaXNzaW9ucyBhcmUKPj4gPj4gPiBEUk1fQVVUSHxE Uk1fVU5MT0NLRUR8RFJNX1JFTkRFUl9BTExPVwo+PiA+PiA+Cj4+ID4+IFJpZ2h0IEkgbWlzc2Vk IHRoZSBEUk1fQVVUSCwgaW4gdGhlIGZkIDw+IGhhbmRsZSBJT0NUTHMuCj4+ID4+IFNvIGluIG9y ZGVyIGZvciB0aGluZ3MgdG8gd29yaywgd2UnZCBuZWVkIHRvIGVpdGhlcjoKPj4gPj4gIC0gYWxs b3cgZHVtYiBidWZmZXJzIGZvciByZW5kZXIgbm9kZXMsIG9yCj4+ID4+ICAtIGRyb3AgdGhlIERS TV9BVVRIIGZvciBmZCA8PiBoYW5kbGUgaW1wb3J0cwo+PiA+Pgo+PiA+PiBQb2ludGluZyBhbiBh bHRlcm5hdGl2ZSBzb2x1dGlvbiwgZm9yIGtlcm5lbCBkZXZlbG9wZXJzIHRvIGFuYWx5c2UgYW5k Cj4+ID4+IG1ha2UgYSBkZWNpc2lvbi4KPj4gPj4KPj4gPj4gPgo+PiA+PiA+IEluIGFuZHJvaWQg OC4xIHRoZSBoYXJkd2FyZSBjb21wb3NlciBydW5zIGluIGEgc2VwZXJhdGUgcHJvY2VzcyBhbmQg aXQgaGFzCj4+ID4+ID4gdG8gdXNlIHRoZSBjYXJkIG5vZGUgYW5kIGJlIGRybSBtYXN0ZXIgKHRv IHVzZSB0aGUgS01TIEFQSSksCj4+ID4+ID4gdGhlcmVmb3JlLCB3aGVuIHRoZSBzdXJmYWNlIGZs aW5nZXIgY2FsbHMKPj4gPj4gPiByZW5kZXJvbmx5X2NyZWF0ZV9rbXNfZHVtYl9idWZmZXJfZm9y X3Jlc291cmNlKCkgaXQgaXMgbm90IGF1dGhlbnRpY2F0ZWQuCj4+ID4+ID4KPj4gPj4gPiBNYWtp bmcgc3VyZmFjZSBmbGluZ2VyIHVzZSBhIHJlbmRlciBub2RlIGZpeGVzIHRoZSBwcm9ibGVtIGZv cgo+PiA+PiA+IERSTV9JT0NUTF9QUklNRV9GRF9UT19IQU5ETEUgKGJlY2F1c2UgdGhhdCBhbHJl YWR5IGhhcyBEUk1fUkVOREVSX0FMTE9XKSwKPj4gPj4gPiBidXQgRFJNX0lPQ1RMX01PREVfQ1JF QVRFX0RVTUIgbm93IGZhaWxzIHdpdGhvdXQgdGhlIHBhdGNoLgo+PiA+PiA+Cj4+ID4+ID4KPj4g Pj4gPiBUaGlzIHByb2JhYmx5IHdvcmtlZCBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBBbmRyb2lk IHdoZXJlIHN1cmZhY2UgZmxpbmdlcgo+PiA+PiA+IGFuZCBod2Mgd2VyZSBhbGwgaW4gdGhlIHNh bWUgcHJvY2Vzcy4KPj4gPj4gPgo+PiA+PiBUaGVyZSBoYXMgYmVlbiB2YXJ5aW5nIGhhY2tzIGZv ciBBbmRyb2lkIHRocm91Z2ggdGhlIHllYXJzLiBCcmluZ2luZwo+PiA+PiBkZXRhaWxzIGludG8g dGhlIGRpc2N1c3Npb24gd2lsbCByZXN1bHQgaW4gYSBzaWduaWZpY2FudCBkaXZlcnNpb24uCj4+ ID4+IFNvbWV0aGluZyB3ZSBjb3VsZCBhdm9pZCwgZm9yIHRoZSB0aW1lIGJlaW5nIDstKQo+PiA+ Cj4+ID4gRGlkIHNvbWVvbmUgc2F5IGRpdmVyc2lvbj8hPyBUaGUgd2F5IHRoaXMgd2FzIGhhbmRs ZWQgcHJpb3IgdG8gdXNpbmcKPj4gPiByZW5kZXIvY29udHJvbCBub2RlcyBpbiBkcm1faHdjL1tk cm0vZ2JtXV9ncmFsbG9jIGlzIHRoYXQgYWxsIG1vZGVzZXR0aW5nIHdhcwo+PiA+IGRvbmUgdmlh IGdyYWxsb2Mgd2hpY2ggd2FzIG1hc3Rlci4gVGhlIGh3YyBpbXBsZW1lbnRhdGlvbiB3YXMgYmFz aWNhbGx5IGEgcHJveHkKPj4gPiBiYWNrY2hhbm5lbGluZyBhbGwgb2YgdGhlIHdvcmsgdG8gZ3Jh bGxvYy4KPj4gPgo+PiA+IEFueXdheXMsIHdlIHByb2JhYmx5IGRvbid0IHdhbnQgdG8gZ28gYmFj ayB0aGVyZS4KPj4gPgo+PiBOb3cgdGhhdCB3ZSBnb3QgdGhlIGRpdmVyc2lvbiBvdXQgb2YgdGhl IHdheSwgYW55IGlucHV0IG9uIG15IHByb3Bvc2FsCj4+IHRvIGRyb3AgdGhlIERSTV9BVVRIIGZv ciBmZCA8PiBpbXBvcnRzLgo+PiBBbSBJIG1pc3Npbmcgc29tZXRoaW5nIHByZXR0eSBvYnZpb3Vz IHRoYXQgbWFrZXMgdGhlIGlkZWEgYSBuby1nbz8KPgo+IERyb3BwaW5nIERSTV9BVVRIIGlzIG9u bHkgcmVsZXZhbnQgZm9yIHRoZSBjYXJkIG5vZGUuIEFuZCBhIGNhcmQgbm9kZQo+IG1pZ2h0IG5v dCBiZSBzdWZmaWNpZW50bHkgaXNvbGF0ZWQgYWdhaW5zdCBjb25jdXJyZW50IG90aGVyIGNsaWVu dHMsIHdoaWNoCj4gaXMgd2h5IHdlIGRvbid0IGFsbG93IGl0Lgo+ClJpZ2h0LiBJIGRpZCBub3Qg c3BvdCBhbnl0aGluZyB0aGF0IHdvdWxkIG1ha2UgYSBkaXN0aW5jdGlvbiBiYXNlZCBvbgp0aGUg Y2FyZCB2cyByZW5kZXIgbm9kZSB1c2VkLgoKPiBXaGF0IHdlIGNvdWxkIGRvIGlzIGVzc2VudGlh bGx5IGNoZWNrIHdoZXRoZXIgeW91ciBkcml2ZXIgc3VwcG9ydHMgcmVuZGVyCj4gbm9kZXMgKGlu ZGljYXRpbmcgc3VmZmljaWVudCBhbW91bnRzIG9mIHNlcGFyYXRpb24pLCBhbmQgdGhlbiBhbGxv dwo+IGFueXRoaW5nIGZvciB1bmF1dGhlbmljYXRlZCBjbGllbnRzIGlmIERSTV9SRU5ERVJfQUxM T1cgaXMgc2V0IG9uIHRoZQo+IGlvY3RsLgo+Cj4gQnV0IHRoYXQncyBqdXN0IHJlaW52ZW50aW5n IHJlbmRlciBub2RlcyBvbiB0b3Agb2YgbGVnYWN5IGNhcmQgbm9kZXMsIGFuZAo+IEknbSBub3Qg Y2xlYXIgb24gd2hhdCB0aGF0IGV4YWN0bHkgZ2FpbnMgdXMuCj4KQXMgbW9yZSBvZiBhIHVzZXJz cGFjZSBwZXJzb24sIGl0IG1ha2VzIHNlbnNlIHRvIGtlZXAgcmVuZGVyIG5vZGVzIGZvcgpHUFUg c3BlY2lmaWNzIGFuZCBjYXJkIG9uZXMgLSBLTVMvRGlzcGxheSBDb250cm9sbGVyLgoKPiBJIHRo aW5rIHRoZSBwcm9wb3NhbCBmb3IgZHVtYiByZW5kZXIgbm9kZXMgKGZvciBkcml2ZXJzIHdoaWNo IG9ubHkgZG8gZHVtYgo+IGttcyBidWZmZXJzIGFuZCBubyByZW5kZXJpbmcgYXQgYWxsKSB0aGF0 J3MgYmVlbiBkaXNjdXNzb24gb24gaXJjIGEgYml0Cj4gbWFrZXMgYSBsb3QgbW9yZSBzZW5zZS4K CkFjay4gVGhhbmtzIGZvciBzaGVkZGluZyBzb21lIGxpZ2h0LgoKLUVtaWwKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlz dApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0 b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==