From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751656AbeBUIrq (ORCPT ); Wed, 21 Feb 2018 03:47:46 -0500 Received: from mail-lf0-f68.google.com ([209.85.215.68]:41008 "EHLO mail-lf0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750831AbeBUIrp (ORCPT ); Wed, 21 Feb 2018 03:47:45 -0500 X-Google-Smtp-Source: AH8x226uoXTv6/qzJpa4ZB7yfueL7L9q9mzTGY8lxWpZpzxQs04bF3pMz+I4+mPxoJnKkts6OOZrGw== Subject: Re: [PATCH 1/9] drm/xen-front: Introduce Xen para-virtualized frontend driver To: Juergen Gross , xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, airlied@linux.ie, daniel.vetter@intel.com, seanpaul@chromium.org, gustavo@padovan.org, boris.ostrovsky@oracle.com, konrad.wilk@oracle.com Cc: Oleksandr Andrushchenko References: <1519200222-20623-1-git-send-email-andr2000@gmail.com> <1519200222-20623-2-git-send-email-andr2000@gmail.com> From: Oleksandr Andrushchenko Message-ID: <91386840-c34a-31a4-2bb3-14a27ececa9c@gmail.com> Date: Wed, 21 Feb 2018 10:47:40 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 02/21/2018 10:19 AM, Juergen Gross wrote: > On 21/02/18 09:03, Oleksandr Andrushchenko wrote: >> From: Oleksandr Andrushchenko >> >> Introduce skeleton of the para-virtualized Xen display >> frontend driver. This patch only adds required >> essential stubs. >> >> Signed-off-by: Oleksandr Andrushchenko >> --- >> drivers/gpu/drm/Kconfig | 2 + >> drivers/gpu/drm/Makefile | 1 + >> drivers/gpu/drm/xen/Kconfig | 17 ++++++++ >> drivers/gpu/drm/xen/Makefile | 5 +++ >> drivers/gpu/drm/xen/xen_drm_front.c | 83 +++++++++++++++++++++++++++++++++++++ >> 5 files changed, 108 insertions(+) >> create mode 100644 drivers/gpu/drm/xen/Kconfig >> create mode 100644 drivers/gpu/drm/xen/Makefile >> create mode 100644 drivers/gpu/drm/xen/xen_drm_front.c >> >> diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig >> index deeefa7a1773..757825ac60df 100644 >> --- a/drivers/gpu/drm/Kconfig >> +++ b/drivers/gpu/drm/Kconfig >> @@ -289,6 +289,8 @@ source "drivers/gpu/drm/pl111/Kconfig" >> >> source "drivers/gpu/drm/tve200/Kconfig" >> >> +source "drivers/gpu/drm/xen/Kconfig" >> + >> # Keep legacy drivers last >> >> menuconfig DRM_LEGACY >> diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile >> index 50093ff4479b..9d66657ea117 100644 >> --- a/drivers/gpu/drm/Makefile >> +++ b/drivers/gpu/drm/Makefile >> @@ -103,3 +103,4 @@ obj-$(CONFIG_DRM_MXSFB) += mxsfb/ >> obj-$(CONFIG_DRM_TINYDRM) += tinydrm/ >> obj-$(CONFIG_DRM_PL111) += pl111/ >> obj-$(CONFIG_DRM_TVE200) += tve200/ >> +obj-$(CONFIG_DRM_XEN) += xen/ >> diff --git a/drivers/gpu/drm/xen/Kconfig b/drivers/gpu/drm/xen/Kconfig >> new file mode 100644 >> index 000000000000..4cca160782ab >> --- /dev/null >> +++ b/drivers/gpu/drm/xen/Kconfig >> @@ -0,0 +1,17 @@ >> +config DRM_XEN >> + bool "DRM Support for Xen guest OS" >> + depends on XEN >> + help >> + Choose this option if you want to enable DRM support >> + for Xen. >> + >> +config DRM_XEN_FRONTEND >> + tristate "Para-virtualized frontend driver for Xen guest OS" >> + depends on DRM_XEN >> + depends on DRM >> + select DRM_KMS_HELPER >> + select VIDEOMODE_HELPERS >> + select XEN_XENBUS_FRONTEND >> + help >> + Choose this option if you want to enable a para-virtualized >> + frontend DRM/KMS driver for Xen guest OSes. >> diff --git a/drivers/gpu/drm/xen/Makefile b/drivers/gpu/drm/xen/Makefile >> new file mode 100644 >> index 000000000000..967074d348f6 >> --- /dev/null >> +++ b/drivers/gpu/drm/xen/Makefile >> @@ -0,0 +1,5 @@ >> +# SPDX-License-Identifier: GPL-2.0 >> + >> +drm_xen_front-objs := xen_drm_front.o >> + >> +obj-$(CONFIG_DRM_XEN_FRONTEND) += drm_xen_front.o >> diff --git a/drivers/gpu/drm/xen/xen_drm_front.c b/drivers/gpu/drm/xen/xen_drm_front.c >> new file mode 100644 >> index 000000000000..fd372fb464a1 >> --- /dev/null >> +++ b/drivers/gpu/drm/xen/xen_drm_front.c >> @@ -0,0 +1,83 @@ >> +/* >> + * Xen para-virtual DRM device >> + * >> + * This program is free software; you can redistribute it and/or modify >> + * it under the terms of the GNU General Public License as published by >> + * the Free Software Foundation; either version 2 of the License, or >> + * (at your option) any later version. >> + * >> + * This program is distributed in the hope that it will be useful, >> + * but WITHOUT ANY WARRANTY; without even the implied warranty of >> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> + * GNU General Public License for more details. > Use SPDX identifier instead (same applies for all other new > sources): > > // SPDX-License-Identifier: GPL-2.0 Will update, thank you >> + * >> + * Copyright (C) 2016-2018 EPAM Systems Inc. >> + * >> + * Author: Oleksandr Andrushchenko >> + */ >> + >> +#include >> + >> +#include >> +#include >> +#include >> + >> +#include >> + >> +static void backend_on_changed(struct xenbus_device *xb_dev, >> + enum xenbus_state backend_state) >> +{ >> +} >> + >> +static int xen_drv_probe(struct xenbus_device *xb_dev, >> + const struct xenbus_device_id *id) >> +{ >> + return 0; >> +} >> + >> +static int xen_drv_remove(struct xenbus_device *dev) >> +{ >> + return 0; >> +} >> + >> +static const struct xenbus_device_id xen_drv_ids[] = { >> + { XENDISPL_DRIVER_NAME }, >> + { "" } >> +}; >> + >> +static struct xenbus_driver xen_driver = { >> + .ids = xen_drv_ids, >> + .probe = xen_drv_probe, >> + .remove = xen_drv_remove, >> + .otherend_changed = backend_on_changed, >> +}; >> + >> +static int __init xen_drv_init(void) >> +{ >> + if (!xen_domain()) >> + return -ENODEV; >> + >> + if (xen_initial_domain()) { >> + DRM_ERROR(XENDISPL_DRIVER_NAME " cannot run in initial domain\n"); >> + return -ENODEV; >> + } > Why not? Wouldn't that be possible in case of the backend living in a > driver domain? It is possible (and in my use-case backend indeed runs in a driver domain). I was just not sure if it is really a good idea to allow that. If you think this is ok, then I'll remove this check > > Juergen Thank you, Oleksandr From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: Re: [PATCH 1/9] drm/xen-front: Introduce Xen para-virtualized frontend driver Date: Wed, 21 Feb 2018 10:47:40 +0200 Message-ID: <91386840-c34a-31a4-2bb3-14a27ececa9c@gmail.com> References: <1519200222-20623-1-git-send-email-andr2000@gmail.com> <1519200222-20623-2-git-send-email-andr2000@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mail-lf0-x241.google.com (mail-lf0-x241.google.com [IPv6:2a00:1450:4010:c07::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id 15C196E561 for ; Wed, 21 Feb 2018 08:47:45 +0000 (UTC) Received: by mail-lf0-x241.google.com with SMTP id q69so1219227lfi.10 for ; Wed, 21 Feb 2018 00:47:44 -0800 (PST) In-Reply-To: Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Juergen Gross , xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, airlied@linux.ie, daniel.vetter@intel.com, seanpaul@chromium.org, gustavo@padovan.org, boris.ostrovsky@oracle.com, konrad.wilk@oracle.com Cc: Oleksandr Andrushchenko List-Id: dri-devel@lists.freedesktop.org T24gMDIvMjEvMjAxOCAxMDoxOSBBTSwgSnVlcmdlbiBHcm9zcyB3cm90ZToKPiBPbiAyMS8wMi8x OCAwOTowMywgT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gd3JvdGU6Cj4+IEZyb206IE9sZWtzYW5k ciBBbmRydXNoY2hlbmtvIDxvbGVrc2FuZHJfYW5kcnVzaGNoZW5rb0BlcGFtLmNvbT4KPj4KPj4g SW50cm9kdWNlIHNrZWxldG9uIG9mIHRoZSBwYXJhLXZpcnR1YWxpemVkIFhlbiBkaXNwbGF5Cj4+ IGZyb250ZW5kIGRyaXZlci4gVGhpcyBwYXRjaCBvbmx5IGFkZHMgcmVxdWlyZWQKPj4gZXNzZW50 aWFsIHN0dWJzLgo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbyA8 b2xla3NhbmRyX2FuZHJ1c2hjaGVua29AZXBhbS5jb20+Cj4+IC0tLQo+PiAgIGRyaXZlcnMvZ3B1 L2RybS9LY29uZmlnICAgICAgICAgICAgIHwgIDIgKwo+PiAgIGRyaXZlcnMvZ3B1L2RybS9NYWtl ZmlsZSAgICAgICAgICAgIHwgIDEgKwo+PiAgIGRyaXZlcnMvZ3B1L2RybS94ZW4vS2NvbmZpZyAg ICAgICAgIHwgMTcgKysrKysrKysKPj4gICBkcml2ZXJzL2dwdS9kcm0veGVuL01ha2VmaWxlICAg ICAgICB8ICA1ICsrKwo+PiAgIGRyaXZlcnMvZ3B1L2RybS94ZW4veGVuX2RybV9mcm9udC5jIHwg ODMgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+PiAgIDUgZmlsZXMgY2hh bmdlZCwgMTA4IGluc2VydGlvbnMoKykKPj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9n cHUvZHJtL3hlbi9LY29uZmlnCj4+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2Ry bS94ZW4vTWFrZWZpbGUKPj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3hl bi94ZW5fZHJtX2Zyb250LmMKPj4KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9LY29u ZmlnIGIvZHJpdmVycy9ncHUvZHJtL0tjb25maWcKPj4gaW5kZXggZGVlZWZhN2ExNzczLi43NTc4 MjVhYzYwZGYgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCj4+ICsrKyBi L2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCj4+IEBAIC0yODksNiArMjg5LDggQEAgc291cmNlICJk cml2ZXJzL2dwdS9kcm0vcGwxMTEvS2NvbmZpZyIKPj4gICAKPj4gICBzb3VyY2UgImRyaXZlcnMv Z3B1L2RybS90dmUyMDAvS2NvbmZpZyIKPj4gICAKPj4gK3NvdXJjZSAiZHJpdmVycy9ncHUvZHJt L3hlbi9LY29uZmlnIgo+PiArCj4+ICAgIyBLZWVwIGxlZ2FjeSBkcml2ZXJzIGxhc3QKPj4gICAK Pj4gICBtZW51Y29uZmlnIERSTV9MRUdBQ1kKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQo+PiBpbmRleCA1MDA5M2ZmNDQ3 OWIuLjlkNjY2NTdlYTExNyAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxl Cj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQo+PiBAQCAtMTAzLDMgKzEwMyw0IEBA IG9iai0kKENPTkZJR19EUk1fTVhTRkIpCSs9IG14c2ZiLwo+PiAgIG9iai0kKENPTkZJR19EUk1f VElOWURSTSkgKz0gdGlueWRybS8KPj4gICBvYmotJChDT05GSUdfRFJNX1BMMTExKSArPSBwbDEx MS8KPj4gICBvYmotJChDT05GSUdfRFJNX1RWRTIwMCkgKz0gdHZlMjAwLwo+PiArb2JqLSQoQ09O RklHX0RSTV9YRU4pICs9IHhlbi8KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS94ZW4v S2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS94ZW4vS2NvbmZpZwo+PiBuZXcgZmlsZSBtb2RlIDEw MDY0NAo+PiBpbmRleCAwMDAwMDAwMDAwMDAuLjRjY2ExNjA3ODJhYgo+PiAtLS0gL2Rldi9udWxs Cj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS94ZW4vS2NvbmZpZwo+PiBAQCAtMCwwICsxLDE3IEBA Cj4+ICtjb25maWcgRFJNX1hFTgo+PiArCWJvb2wgIkRSTSBTdXBwb3J0IGZvciBYZW4gZ3Vlc3Qg T1MiCj4+ICsJZGVwZW5kcyBvbiBYRU4KPj4gKwloZWxwCj4+ICsJICBDaG9vc2UgdGhpcyBvcHRp b24gaWYgeW91IHdhbnQgdG8gZW5hYmxlIERSTSBzdXBwb3J0Cj4+ICsJICBmb3IgWGVuLgo+PiAr Cj4+ICtjb25maWcgRFJNX1hFTl9GUk9OVEVORAo+PiArCXRyaXN0YXRlICJQYXJhLXZpcnR1YWxp emVkIGZyb250ZW5kIGRyaXZlciBmb3IgWGVuIGd1ZXN0IE9TIgo+PiArCWRlcGVuZHMgb24gRFJN X1hFTgo+PiArCWRlcGVuZHMgb24gRFJNCj4+ICsJc2VsZWN0IERSTV9LTVNfSEVMUEVSCj4+ICsJ c2VsZWN0IFZJREVPTU9ERV9IRUxQRVJTCj4+ICsJc2VsZWN0IFhFTl9YRU5CVVNfRlJPTlRFTkQK Pj4gKwloZWxwCj4+ICsJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gZW5hYmxl IGEgcGFyYS12aXJ0dWFsaXplZAo+PiArCSAgZnJvbnRlbmQgRFJNL0tNUyBkcml2ZXIgZm9yIFhl biBndWVzdCBPU2VzLgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3hlbi9NYWtlZmls ZSBiL2RyaXZlcnMvZ3B1L2RybS94ZW4vTWFrZWZpbGUKPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQK Pj4gaW5kZXggMDAwMDAwMDAwMDAwLi45NjcwNzRkMzQ4ZjYKPj4gLS0tIC9kZXYvbnVsbAo+PiAr KysgYi9kcml2ZXJzL2dwdS9kcm0veGVuL01ha2VmaWxlCj4+IEBAIC0wLDAgKzEsNSBAQAo+PiAr IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+PiArCj4+ICtkcm1feGVuX2Zyb250 LW9ianMgOj0geGVuX2RybV9mcm9udC5vCj4+ICsKPj4gK29iai0kKENPTkZJR19EUk1fWEVOX0ZS T05URU5EKSArPSBkcm1feGVuX2Zyb250Lm8KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS94ZW4veGVuX2RybV9mcm9udC5jIGIvZHJpdmVycy9ncHUvZHJtL3hlbi94ZW5fZHJtX2Zyb250 LmMKPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4gaW5kZXggMDAwMDAwMDAwMDAwLi5mZDM3MmZi NDY0YTEKPj4gLS0tIC9kZXYvbnVsbAo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0veGVuL3hlbl9k cm1fZnJvbnQuYwo+PiBAQCAtMCwwICsxLDgzIEBACj4+ICsvKgo+PiArICogIFhlbiBwYXJhLXZp cnR1YWwgRFJNIGRldmljZQo+PiArICoKPj4gKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29m dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKPj4gKyAqICAgaXQg dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJs aXNoZWQgYnkKPj4gKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKPj4gKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkg bGF0ZXIgdmVyc2lvbi4KPj4gKyAqCj4+ICsgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRl ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAo+PiArICogICBidXQgV0lUSE9V VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+PiAr ICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu ICBTZWUgdGhlCj4+ICsgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl dGFpbHMuCj4gVXNlIFNQRFggaWRlbnRpZmllciBpbnN0ZWFkIChzYW1lIGFwcGxpZXMgZm9yIGFs bCBvdGhlciBuZXcKPiBzb3VyY2VzKToKPgo+IC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wCldpbGwgdXBkYXRlLCB0aGFuayB5b3UKPj4gKyAqCj4+ICsgKiBDb3B5cmlnaHQgKEMp IDIwMTYtMjAxOCBFUEFNIFN5c3RlbXMgSW5jLgo+PiArICoKPj4gKyAqIEF1dGhvcjogT2xla3Nh bmRyIEFuZHJ1c2hjaGVua28gPG9sZWtzYW5kcl9hbmRydXNoY2hlbmtvQGVwYW0uY29tPgo+PiAr ICovCj4+ICsKPj4gKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgo+PiArCj4+ICsjaW5jbHVkZSA8eGVu L3BsYXRmb3JtX3BjaS5oPgo+PiArI2luY2x1ZGUgPHhlbi94ZW4uaD4KPj4gKyNpbmNsdWRlIDx4 ZW4veGVuYnVzLmg+Cj4+ICsKPj4gKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL2lvL2Rpc3BsaWYu aD4KPj4gKwo+PiArc3RhdGljIHZvaWQgYmFja2VuZF9vbl9jaGFuZ2VkKHN0cnVjdCB4ZW5idXNf ZGV2aWNlICp4Yl9kZXYsCj4+ICsJCWVudW0geGVuYnVzX3N0YXRlIGJhY2tlbmRfc3RhdGUpCj4+ ICt7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgeGVuX2Rydl9wcm9iZShzdHJ1Y3QgeGVuYnVz X2RldmljZSAqeGJfZGV2LAo+PiArCQljb25zdCBzdHJ1Y3QgeGVuYnVzX2RldmljZV9pZCAqaWQp Cj4+ICt7Cj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgeGVuX2Rydl9y ZW1vdmUoc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldikKPj4gK3sKPj4gKwlyZXR1cm4gMDsKPj4g K30KPj4gKwo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCB4ZW5idXNfZGV2aWNlX2lkIHhlbl9kcnZf aWRzW10gPSB7Cj4+ICsJeyBYRU5ESVNQTF9EUklWRVJfTkFNRSB9LAo+PiArCXsgIiIgfQo+PiAr fTsKPj4gKwo+PiArc3RhdGljIHN0cnVjdCB4ZW5idXNfZHJpdmVyIHhlbl9kcml2ZXIgPSB7Cj4+ ICsJLmlkcyA9IHhlbl9kcnZfaWRzLAo+PiArCS5wcm9iZSA9IHhlbl9kcnZfcHJvYmUsCj4+ICsJ LnJlbW92ZSA9IHhlbl9kcnZfcmVtb3ZlLAo+PiArCS5vdGhlcmVuZF9jaGFuZ2VkID0gYmFja2Vu ZF9vbl9jaGFuZ2VkLAo+PiArfTsKPj4gKwo+PiArc3RhdGljIGludCBfX2luaXQgeGVuX2Rydl9p bml0KHZvaWQpCj4+ICt7Cj4+ICsJaWYgKCF4ZW5fZG9tYWluKCkpCj4+ICsJCXJldHVybiAtRU5P REVWOwo+PiArCj4+ICsJaWYgKHhlbl9pbml0aWFsX2RvbWFpbigpKSB7Cj4+ICsJCURSTV9FUlJP UihYRU5ESVNQTF9EUklWRVJfTkFNRSAiIGNhbm5vdCBydW4gaW4gaW5pdGlhbCBkb21haW5cbiIp Owo+PiArCQlyZXR1cm4gLUVOT0RFVjsKPj4gKwl9Cj4gV2h5IG5vdD8gV291bGRuJ3QgdGhhdCBi ZSBwb3NzaWJsZSBpbiBjYXNlIG9mIHRoZSBiYWNrZW5kIGxpdmluZyBpbiBhCj4gZHJpdmVyIGRv bWFpbj8KSXQgaXMgcG9zc2libGUgKGFuZCBpbiBteSB1c2UtY2FzZSBiYWNrZW5kIGluZGVlZCBy dW5zIGluCmEgZHJpdmVyIGRvbWFpbikuIEkgd2FzIGp1c3Qgbm90IHN1cmUgaWYgaXQgaXMgcmVh bGx5IGEKZ29vZCBpZGVhIHRvIGFsbG93IHRoYXQuIElmIHlvdSB0aGluayB0aGlzIGlzIG9rLCB0 aGVuCkknbGwgcmVtb3ZlIHRoaXMgY2hlY2sKPgo+IEp1ZXJnZW4KVGhhbmsgeW91LApPbGVrc2Fu ZHIKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRl dmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8v bGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==